! !################################################################## !################################################################## !###### ###### !###### PROGRAM ARPSINTRP_LS ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! PROGRAM arpsintrp_ls,119 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! This program interpolates gridded data from one ARPS grid to another. ! It can be used to prepare data for running ARPS in a one-way nested ! mode. It's exepcted to replace ARPSR2H in this capacity. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! ! 3/27/1997. Written based on ARPSR2H and ARPSCVT. ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! !----------------------------------------------------------------------- ! nx, ny, nz: Dimensions of input grid. ! nx1, ny1, nz1: Dimensions of output grid. !----------------------------------------------------------------------- ! INTEGER :: nx ! Number of input grid points in the x-direction INTEGER :: ny ! Number of input grid points in the y-direction INTEGER :: nz ! Number of input grid points in the z-direction INTEGER :: nx1 ! Number of output grid points in the x-direction INTEGER :: ny1 ! Number of output grid points in the y-direction INTEGER :: nz1 ! Number of output grid points in the z-direction INTEGER :: nxyz,nxy,nxyz1,nxy1 ! !----------------------------------------------------------------------- ! ! Parameters for the utput grid. ! !----------------------------------------------------------------------- ! INTEGER :: nstyps PARAMETER (nstyps=1) INTEGER :: samgrd ! Are the output and the input grids the same? ! =1, the grids are the same ! =0, the grids are different REAL :: xorig1, yorig1, zorig1 REAL :: xctr1 , yctr1 REAL :: dx1,dy1 ! Grid intervals of the refined grid. INTEGER :: strhopt1 ! Vertical grid stretching option. ! = 0, no stretching in vertical. ! >= 1, with stretching in vertical. REAL :: dz1 ! Average grid spacing in vertical direction in ! transformed computational space (m). REAL :: dzmin1 ! Minimun grid spacing in vertical direction in ! physcal space (m). REAL :: zrefsfc1 ! The reference height of the surface ! (ground level) (m) REAL :: dlayer11 ! The depth of the lower layer with uniform ! (dz=dzmin) vertical spacing (m) REAL :: dlayer21 ! The depth of the mid layer with stetched ! vertical spacing (m) REAL :: strhtune1 ! Tuning parameter for stretching option 2 ! A Value between 0.2 and 5.0 is appropriate. ! A larger value gives a more linear stretching. REAL :: zflat1 ! The height at which the grid levels ! becomes flat in the terrain-following ! coordinate transformation (m). ! !----------------------------------------------------------------------- ! ! Note: ! ! Given nx1, ny1 and nz1, the physical doma3din size of the refined ! grid will be xl1=(nx1-3)*dx1 by yl1=(ny1-3)*dy1 by zh1=(nz1-3)*dz1. ! Dx1, dy1 and dz1 are the grid intervals of the refined grid. ! !----------------------------------------------------------------------- ! REAL, ALLOCATABLE :: a3din(:,:,:) ! 3-D real array read in INTEGER, ALLOCATABLE :: i2din(:,:) ! 2-D integer array read in REAL, ALLOCATABLE :: a2din(:,:) ! 2-D real array read in REAL, ALLOCATABLE :: x (:) ! The x-coord. of the physical and ! computational grid. Defined at u-point. REAL, ALLOCATABLE :: y (:) ! The y-coord. of the physical and ! computational grid. Defined at v-point. REAL, ALLOCATABLE :: z (:) ! The z-coord. of the computational grid. ! Defined at w-point on the staggered grid. REAL, ALLOCATABLE :: zp (:,:,:) ! The physical height coordinate defined at ! w-point on the staggered grid. REAL, ALLOCATABLE :: hterain(:,:) ! The height of terrain. REAL, ALLOCATABLE :: tem3d(:,:,:) ! Work array ! !----------------------------------------------------------------------- ! ! Arrays on the new grid: ! !----------------------------------------------------------------------- ! REAL, ALLOCATABLE :: a3dout(:,:,:) ! 3-D real array interpolated from a3din. INTEGER, ALLOCATABLE :: i2dout(:,:)! 2-D integer array derived from i2din REAL, ALLOCATABLE :: a2dout(:,:) ! 2-D real array interpolated from a2din REAL, ALLOCATABLE :: x1 (:) ! New grid x-coord. on the original grid REAL, ALLOCATABLE :: x11 (:) ! New grid x-coord. set for new grid REAL, ALLOCATABLE :: y1 (:) ! New grid y-coord. on the original grid REAL, ALLOCATABLE :: y11 (:) ! New grid y-coord. set for new grid REAL, ALLOCATABLE :: z1 (:) ! The z-coord. of the computational grid. ! Defined at w-point on the staggered grid. REAL, ALLOCATABLE :: zp1 (:,:,:) ! The physical height coordinate defined at ! w-point on the staggered grid. REAL, ALLOCATABLE :: hterain1(:,:) ! Terrain height (m) REAL, ALLOCATABLE :: tem3d1(:,:,:) ! Work array REAL, ALLOCATABLE :: zp1d1 (:) ! Temporary array REAL, ALLOCATABLE :: dzp1d1(:) ! Temporary array REAL :: zflat11,za,zb ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j, k INTEGER :: is, js REAL :: s1,s2,s3,s4 REAL :: amin, amax REAL :: xs1,ys1 CHARACTER (LEN=80) :: basdmpfn INTEGER :: lbasdmpf CHARACTER (LEN=80) :: ternfn,sfcoutfl,soiloutfl,temchar INTEGER :: lternfn,lfn ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' INCLUDE 'bndry.inc' INCLUDE 'indtflg.inc' INTEGER :: hinfmt,nhisfile_max,nhisfile,lengbf,nf,lenfil PARAMETER (nhisfile_max=200) CHARACTER (LEN=132) :: grdbasfn,hisfile(nhisfile_max) INTEGER :: ireturn INTEGER :: houtfmt CHARACTER (LEN=132) :: filename INTEGER :: grdbas REAL :: time INTEGER :: nfilemax PARAMETER (nfilemax=200) CHARACTER (LEN=80) :: exbcfn CHARACTER (LEN=80) :: timsnd CHARACTER (LEN=80) :: new_runname INTEGER :: tmstrln CHARACTER (LEN=15) :: ctime INTEGER :: nfile, length REAL :: xeps, yeps REAL :: ctrx,ctry,swx,swy,alatpro(2),sclf,dxscl,dyscl REAL :: ctrlat1,ctrlon1,latitud1 CHARACTER (LEN=40) :: fmtver PARAMETER (fmtver='004.10 Binary Data') CHARACTER (LEN=40) :: fmtverin CHARACTER (LEN=10) :: tmunit CHARACTER (LEN=12) :: label INTEGER :: nxin,nyin,nzin INTEGER :: stgr,oldver INTEGER :: inch,nchanl,exbchanl,sfchanl,soilchanl,trnchanl INTEGER :: iyr, imon, idy, ihr, imin, isec INTEGER :: ierr, itema INTEGER :: varout1,mstout1,rainout1,prcout1,iceout1,tkeout1,trbout1 INTEGER :: sfcout1,landout1 REAL :: xgrdorg1,ygrdorg1 INTEGER :: idummy REAL :: rdummy INTEGER :: istat LOGICAL :: fexist, dmpexbc, lsfcdmp, lsoildmp ! !----------------------------------------------------------------------- ! ! namelist Declarations: ! !----------------------------------------------------------------------- ! NAMELIST /INPUT/ hinfmt,nhisfile, grdbasfn, hisfile NAMELIST /output_dims/ nx1,ny1,nz1 NAMELIST /jobname/ runname NAMELIST /newgrid/ samgrd,strhopt1,xctr1,yctr1, & dx1,dy1,dz1,dzmin1, & zrefsfc1,dlayer11,dlayer21,strhtune1,zflat1 NAMELIST /output/ dirname,exbcdmp,hdmpfmt,grbpkbit, & grdout,basout,varout,mstout,rainout,prcout,iceout, & tkeout, trbout,sfcout,landout, & qcexout,qrexout,qiexout,qsexout,qhexout, & totout,filcmprs ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! mgrid = 1 nestgrd = 0 WRITE(6,'(/9(/5x,a)/)') & '###############################################################', & '###############################################################', & '### ###', & '### Welcome to ARPSINTRP ###', & '### This program converts the history dump data ###', & '### sets generated by ARPS, between various formats. ###', & '### ###', & '###############################################################', & '###############################################################' ! !----------------------------------------------------------------------- ! Get the names of the input data files. !----------------------------------------------------------------------- ! CALL get_input_file_names(hinfmt,grdbasfn,hisfile,nhisfile) lengbf = len_trim(grdbasfn) CALL get_dims_from_data(hinfmt,grdbasfn(1:lengbf), & nx,ny,nz,nstyps, ireturn) IF( ireturn /= 0 ) THEN PRINT*,'Problem occured when trying to get dimensions from data.' PRINT*,'Program stopped.' STOP END IF WRITE(6,'(3(a,i5))') 'nx =',nx,', ny=',ny,', nz=',nz IF( nhisfile > nhisfile_max) THEN WRITE(6,'(1x,a,i3,/1x,a,/1x,a,/1x,a)') & 'The number of history files to be processed exceeded ', & nhisfile_max,' please reduce the number of files to be processed',& 'in a single job, or edit the program and re-set parameter ', & 'nhisfile_max to a larger value. ' STOP 9010 END IF length = LEN_trim( grdbasfn ) WRITE(6,'(1x,a,a)') ' grdbasfn =', grdbasfn(1:length) DO i=1,nhisfile length = LEN_trim( hisfile(i) ) WRITE(6,'(1x,a,i3,a,a)') ' hisfile(',i,')=',hisfile(i)(1:length) END DO !----------------------------------------------------------------------- ! Read output grid dimensions !----------------------------------------------------------------------- READ(5,output_dims, END=105) WRITE(6,'(/a,a/)') & 'NAMELIST block intrp_dims sucessfully read.' WRITE(6,'(3(a,i5))') 'nx1=',nx1,', ny1=',ny1,', nz1=',nz1 GO TO 10 105 WRITE(6,'(/a,a/)') & 'Error reading NAMELIST block intrp_dims. ', & 'Program ARPSINTRP stopped.' STOP 1 10 CONTINUE READ (5,jobname,ERR=9000) WRITE(6,'(/5x,a,a)') 'The name of this run is: ', runname new_runname = runname CALL gtlfnkey(new_runname, lfnkey) ! !----------------------------------------------------------------------- ! ! Set the output grid and the variable control parameters ! !----------------------------------------------------------------------- ! READ (5,newgrid,ERR=9000) PRINT* PRINT*,' Input parameters for the new refined grid:' PRINT* PRINT*,' Input samgrd:' PRINT*,' Input was ',samgrd PRINT*,' Input dx1:' PRINT*,' Input was ',dx1 PRINT*,' Input dy1:' PRINT*,' Input was ',dy1 PRINT*,' Input strhopt1:' PRINT*,' Input was ',strhopt1 PRINT*,' Input dz1:' PRINT*,' Input was ',dz1 PRINT*,' Input dzmin1:' PRINT*,' Input was ',dzmin1 PRINT*,' Input xctr1:' PRINT*,' Input was ',xctr1 PRINT*,' Input yctr1:' PRINT*,' Input was ',yctr1 ! !----------------------------------------------------------------------- ! ! Set the control parameters for output: ! !----------------------------------------------------------------------- ! WRITE(6,'(/a/)') & ' Reading in control parameters for the output data files..' READ (5,output,ERR=9000) houtfmt = hdmpfmt IF( houtfmt /= 1 ) THEN WRITE(6,'(/1x,a,a/)') 'Output format is not 1. Reset it to 1.' houtfmt = 1 END IF totout = 1 basout = 0 ldirnam=LEN_trim(dirname) lengbf=LEN_trim(grdbasfn) WRITE(6,'(/a,a)')' The grid/base name is ', grdbasfn(1:lengbf) INQUIRE(FILE=grdbasfn(1:lengbf), EXIST = fexist ) IF( fexist ) GO TO 110 INQUIRE(FILE=grdbasfn(1:lengbf)//'.Z', EXIST = fexist ) IF( fexist ) THEN CALL uncmprs( grdbasfn(1:lengbf)//'.Z' ) GO TO 110 END IF INQUIRE(FILE=grdbasfn(1:lengbf)//'.gz', EXIST = fexist ) IF( fexist ) THEN CALL uncmprs( grdbasfn(1:lengbf)//'.gz' ) GO TO 110 END IF WRITE(6,'(/1x,a,/1x,a/)') & 'File '//grdbasfn(1:lengbf)// & ' or its compressed version not found.', & 'Program stopped in ARPSINTRP.' STOP 9011 110 CONTINUE ALLOCATE(a3din(nx,ny,nz)) a3din = 0.0 ALLOCATE(i2din(nx,ny)) i2din = 0 ALLOCATE(a2din(nx,ny)) a2din =0.0 ALLOCATE(x (nx)) ALLOCATE(y (ny)) ALLOCATE(z (nz)) x = 0.0 y = 0.0 z = 0.0 ALLOCATE(zp (nx,ny,nz)) zp = 0.0 ALLOCATE(hterain(nx,ny)) hterain=0.0 ALLOCATE(tem3d(nx,ny,nz)) tem3d=0.0 ! ALLOCATE(a3dout(nx1,ny1,nz1)) a3dout=0.0 ALLOCATE(i2dout(nx1,ny1)) i2dout=0.0 ALLOCATE(a2dout(nx1,ny1)) a2dout=0.0 ALLOCATE(x1 (nx1)) x1=0.0 ALLOCATE(x11 (nx1)) x11=0.0 ALLOCATE(y1 (ny1)) y1=0.0 ALLOCATE(y11 (ny1)) y11=0.0 ALLOCATE(z1 (nz1)) z1=0.0 ALLOCATE(zp1 (nx1,ny1,nz1)) zp1=0.0 ALLOCATE(hterain1(nx1,ny1)) hterain1=0.0 ALLOCATE(tem3d1(nx1,ny1,nz1)) tem3d1=0.0 ALLOCATE(zp1d1 (nz1)) zp1d1=0.0 ALLOCATE(dzp1d1(nz1)) dzp1d1=0.0 ! !----------------------------------------------------------------------- ! ! Get the IO unit numbers for input grid and base state file ! !----------------------------------------------------------------------- ! CALL getunit( inch ) ! !----------------------------------------------------------------------- ! ! Cray routines to force binary data file to be in the IEEE format ! !----------------------------------------------------------------------- ! CALL asnctl ('NEWLOCAL', 1, ierr) CALL asnfile(grdbasfn(1:lengbf), '-F f77 -N ieee', ierr) ! !----------------------------------------------------------------------- ! ! Open the input grdbas file ! !----------------------------------------------------------------------- ! grdbas = 1 OPEN(UNIT=inch,FILE=grdbasfn(1:lengbf), & STATUS='old',FORM='unformatted',IOSTAT=istat) IF( istat /= 0 ) GO TO 9001 READ(inch,ERR=9110,END=9120) fmtverin READ(inch,ERR=9110,END=9120) runname READ(inch,ERR=9110,END=9120) nocmnt IF( nocmnt > 0 ) THEN DO i=1,nocmnt READ(inch,ERR=9110,END=9120) cmnt(i) END DO END IF READ(inch,ERR=9110,END=9120) time,tmunit curtim = time ! !----------------------------------------------------------------------- ! ! Get dimensions of data in binary file and check against ! the dimensions defined in dims.inc ! !----------------------------------------------------------------------- ! READ(inch,ERR=9110,END=9120) nxin, nyin, nzin IF( nxin /= nx .OR. nyin /= ny .OR. nzin /= nz ) THEN WRITE(6,'(1x,a)') & ' Dimensions in ARPSINTRP inconsistent with data.' WRITE(6,'(1x,a,3I15)') ' Read were: ', nxin, nyin, nzin WRITE(6,'(1x,a)') & ' Program aborted in ARPSINTRP.' STOP END IF WRITE(6,'(1x,a,f8.1,a,f8.3,a/)') & 'To read grid and base state data at time ', time, & ' secs = ',(time/60.),' mins.' READ(inch,ERR=9110,END=9120) & grdin,basin,varin,mstin,icein, & trbin,idummy,idummy,landin,totin, & tkein,idummy,idummy,mapproj,month, & day, year, hour, minute, second IF ( grdin /= 1 .OR. basin /= 1 ) THEN WRITE(6,'(1x,a,a,a/a)') & 'File '//grdbasfn(1:lengbf)//' is not .bingrdbas file', & 'A .bingrdbas file is required. Program stoped in ARPSINTRP' STOP 9012 END IF IF ( varin == 1 ) THEN varout1 = varout ELSE varout1 = 0 END IF IF ( mstin == 1 ) THEN mstout1 = mstout ELSE mstout1 = 0 END IF IF ( icein == 1 ) THEN iceout1 = iceout ELSE iceout1 = 0 END IF IF ( tkein == 1 ) THEN tkeout1 = tkeout ELSE tkeout1 = 0 END IF IF ( trbin == 1 ) THEN trbout1 = trbout ELSE trbout1 = 0 END IF IF ( sfcin == 1 ) THEN sfcout1 = sfcout ELSE sfcout1 = 0 END IF IF ( landin == 1 ) THEN landout1 = landout ELSE landout1 = 0 END IF READ(inch,ERR=9110,END=9120) & umove,vmove,xgrdorg,ygrdorg,trulat1, & trulat2,trulon,sclfct,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & tstop,thisdmp,latitud,ctrlat,ctrlon IF ( totin /= 0 ) THEN ! !----------------------------------------------------------------------- ! ! Read in additional parameters for ARPS history dump 4.0 or later ! version. ! !----------------------------------------------------------------------- ! READ(inch,ERR=9110,END=9120) & nstyp, prcout,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy IF ( nstyp < 1 ) THEN nstyp = 1 END IF IF ( prcin == 1 ) THEN prcout1 = prcout ELSE prcout1 = 0 END IF READ(inch,ERR=9110,END=9120) & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy END IF ! !----------------------------------------------------------------------- ! ! Read in x,y and z at grid cell centers (scalar points). ! !---------------------------------------------------------------------- ! IF( grdin == 1 .OR. grdbas == 1 ) THEN READ(inch,ERR=9110,END=9120) label READ(inch,ERR=9110,END=9120) x WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array x.' READ(inch,ERR=9110,END=9120) label READ(inch,ERR=9110,END=9120) y WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array y.' READ(inch,ERR=9110,END=9120) label READ(inch,ERR=9110,END=9120) z WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array z.' READ(inch,ERR=9110,END=9120) label READ(inch,ERR=9110,END=9120) zp WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array zp.' END IF ! grdin ! !----------------------------------------------------------------------- ! ! Set up the map projection of the input grid. ! !----------------------------------------------------------------------- ! alatpro(1)=trulat1 alatpro(2)=trulat2 dx = x(2)-x(1) dy = y(2)-y(1) IF( sclfct /= 1.0) THEN sclf = 1.0/sclfct dxscl = dx*sclf dyscl = dy*sclf ELSE sclf = 1.0 dxscl = dx dyscl = dy END IF PRINT*,mapproj,sclf,alatpro,trulon,ctrlat,ctrlon CALL setmapr( mapproj,sclf,alatpro,trulon ) CALL lltoxy( 1,1, ctrlat,ctrlon, ctrx, ctry ) swx = ctrx - (FLOAT(nx-3)/2.)*dxscl swy = ctry - (FLOAT(ny-3)/2.)*dyscl CALL setorig( 1, swx, swy) ! set up the model origin to the coord. DO j=1,ny DO i=1,nx hterain(i,j) = zp(i,j,2) END DO END DO dx = x(2) - x(1) dy = y(2) - y(1) dz = z(2) - z(1) xorig = x(2) yorig = y(2) zorig = z(2) WRITE(6,'(1x,a,3f15.3)') 'xorig, yorig, zorig =', & xorig, yorig, zorig ! !----------------------------------------------------------------------- ! ! If the new grid is same as the original one, no need to ! interpolate ! !----------------------------------------------------------------------- ! IF ( samgrd == 1 ) THEN DO i=1,nx1 x1(i)=x(i) x11(i)=x(i) END DO DO j=1,ny1 y1(j)=y(j) y11(j)=y(j) END DO DO k=1,nz1 z1(k)=z(k) END DO DO j=1,ny1 DO i=1,nx1 hterain1(i,j) = hterain(i,j) END DO END DO DO k=1,nz1 DO j=1,ny1 DO i=1,nx1 zp1(i,j,k) = zp(i,j,k) END DO END DO END DO ctrlat1 = ctrlat ctrlon1 = ctrlon latitud1 = latitud xgrdorg1 = xgrdorg ygrdorg1 = ygrdorg ELSE ebc = 3 wbc = 3 sbc = 3 nbc = 3 ! !----------------------------------------------------------------------- ! ! If output grid differs from the input grid, perform spatial ! interpolations. ! !----------------------------------------------------------------------- ! xorig1 = xctr1 - (nx1-3)*dx1*0.5 yorig1 = yctr1 - (ny1-3)*dy1*0.5 zorig1 = zorig DO i=1,nx1 x1(i)=xorig1+(i-2)*dx1 END DO DO j=1,ny1 y1(j)=xorig1+(j-2)*dy1 END DO DO k=1,nz1 z1(k)=zorig1+(k-2)*dz1 END DO xeps = 0.01*dx yeps = 0.01*dy IF(x1(1) < x(1)-xeps.OR.x1(nx1) > x(nx)+xeps.OR. & y1(1) < y(1)-yeps.OR.y1(ny1) > y(ny)+yeps) THEN WRITE(6,'(3(/5x,a),/5x,2(a,f12.4),2(a,i6),2(a,f12.4)/5x,a)') & 'Sorry, at least part of your new grid is outside the border of', & 'the original grid, please check input parameters', & 'dx1,dy1, nx1, ny1, xctr1 and yctr1. Currently,', & 'dx1=',dx1,', dy1=',dy1,', nx1=',nx1,', ny1=',ny1, & ', xctr1=',xctr1,', yctr1=',yctr1, & 'Job stopped in ARPSINTRP.' WRITE(6,'(1x,4(a,f12.4)/1x,4(a,f12.4))') & 'x1(1) =',x1(1),' x1(nx1) =',x1(nx1), & 'y1(1) =',y1(1),' y1(ny1) =',y1(ny1), & 'x (1) =',x (1),' x (nx) =',x (nx), & 'y (1) =',y (1),' y (ny) =',y (ny) STOP 9013 END IF CALL xytoll(1,1,xctr1,yctr1,ctrlat1,ctrlon1) PRINT*,'ctrlat1=',ctrlat1,', ctrlon1=',ctrlon1 latitud1 = ctrlat1 CALL xytoll(1,1,xorig1,yorig1,swx,swy) ! Find the lat/lon of ! the new grid origin CALL setorig( 2, swx,swy ) ! Set the new origin xgrdorg1 = 0.0 ygrdorg1 = 0.0 DO i=1,nx1 x11(i)=x1(i)-xorig1 END DO DO j=1,ny1 y11(j)=y1(j)-yorig1 END DO ! !----------------------------------------------------------------------- ! ! Intepolate terrain to the new grid ! !----------------------------------------------------------------------- ! DO i=1,nx1-1 DO j=1,ny1-1 xs1= (x1(i)+x1(i+1))*0.5 ys1= (y1(j)+y1(j+1))*0.5 is = MAX(1, MIN(nx-2, INT((xs1-(x(1)+x(2))*0.5)/dx)+1 )) js = MAX(1, MIN(ny-2, INT((ys1-(y(1)+y(2))*0.5)/dy)+1 )) s1=ABS((xs1-(x(is )+x(is+1))*0.5)*(ys1-(y(js )+y(js+1))*0.5)) s2=ABS((xs1-(x(is+1)+x(is+2))*0.5)*(ys1-(y(js )+y(js+1))*0.5)) s3=ABS((xs1-(x(is+1)+x(is+2))*0.5)*(ys1-(y(js+1)+y(js+2))*0.5)) s4=ABS((xs1-(x(is )+x(is+1))*0.5)*(ys1-(y(js+1)+y(js+2))*0.5)) hterain1(i,j) = & (hterain(is ,js )*s3+hterain(is+1,js )*s4 & +hterain(is+1,js+1)*s1+hterain(is ,js+1)*s2) & /(s1+s2+s3+s4) END DO END DO ! !----------------------------------------------------------------------- ! ! Set up a stretched vertical grid for the output grid. ! ! For strhopt1=1, function y = a+b*x**3 is used to specify dz as a ! function of k. ! For strhopt1=2, function y = c + a*tanh(b*x) is used to specify dz ! as a function of k. ! !----------------------------------------------------------------------- ! IF ( strhopt1 == 0 ) THEN DO k=1,nz1 zp1d1(k) = z1(k) END DO ELSE IF ( strhopt1 == 1 .OR.strhopt1 == 2 ) THEN za = zrefsfc1 + MAX(0.0, MIN(dlayer11, z1(nz1-2)-zrefsfc1 )) zb = za + MAX(0.0, MIN(dlayer21, z1(nz1-1)-za )) IF( dlayer11 >= (nz1-3)*dzmin1 ) THEN WRITE(6,'(/1x,a,f13.3,/a,f13.3,a,a)') & 'Can not setup a vertical grid with uniform dz=',dzmin1, & ' over the depth of ',dlayer11,' please specify a smaller ', & 'value of dlayer11. Program stopped ARPSINTRP.' STOP 9014 END IF CALL strhgrd(nz1,strhopt1,zrefsfc1,za,zb,z1(nz1-1), & dzmin1,strhtune1, zp1d1,dzp1d1) ELSE WRITE(6,'(1x,a,i3,a/)') & 'Invalid vertical grid stretching option, strhopt1 was ',strhopt1, & '. Program stopped in ARPSINTRP.' STOP 9015 END IF ! !----------------------------------------------------------------------- ! ! Physical height of computational grid defined as ! ! Zp=(z-zrefsfc)*(Zm-hterain)/(Zm-zrefsfc)+hterain for z=<Zm. ! ZP=z for z>Zm ! ! where Zm the height at which the grid levels becomes flat. ! Hm < Zm =< Ztop, hm is the height of mounta3din and Ztop the height ! of model top. ! !----------------------------------------------------------------------- ! DO k=nz1-1,2,-1 IF(zp1d1(k) <= zflat1) THEN zflat11 = zp1d1(k) EXIT END IF END DO 300 CONTINUE zflat11=MAX(MIN(z1(nz1-1),zflat11),zrefsfc1) DO k=2,nz1-1 IF(zp1d1(k) > zflat11) THEN DO j=1,ny1-1 DO i=1,nx1-1 zp1(i,j,k)=zp1d1(k) END DO END DO ELSE DO j=1,ny1-1 DO i=1,nx1-1 zp1(i,j,k)=(zp1d1(k)-zrefsfc1)*(zflat11-hterain1(i,j)) & /(zflat11-zrefsfc1)+hterain1(i,j) END DO END DO END IF END DO DO j=1,ny1-1 DO i=1,nx1-1 zp1(i,j,2)=hterain1(i,j) zp1(i,j,1)=2.0*zp1(i,j,2)-zp1(i,j,3) zp1(i,j,nz1)=2.0*zp1(i,j,nz1-1)-zp1(i,j,nz1-2) END DO END DO ! CALL jacob(nx1,ny1,nz1,x11,y11,z1,zp1,j11,j21,j31) END IF ! samgrd ! !----------------------------------------------------------------------- ! ! Write out terrain data ! !----------------------------------------------------------------------- ! CALL getunit( trnchanl ) ternfn = new_runname(1:lfnkey)//".trndata" lternfn = lfnkey + 8 IF( dirname /= ' ' ) THEN temchar = ternfn ternfn = dirname(1:ldirnam)//'/'//temchar lternfn = lternfn + ldirnam + 1 END IF CALL fnversn(ternfn, lternfn ) PRINT *, 'Write terrain data to ',ternfn(1:lternfn) CALL asnctl ('NEWLOCAL', 1, ierr) CALL asnfile(ternfn, '-F f77 -N ieee', ierr) OPEN(trnchanl,FILE=ternfn,FORM='unformatted',STATUS='new') WRITE(trnchanl) nx1,ny1 WRITE(trnchanl) idummy,mapproj,idummy,idummy,idummy, & idummy,idummy, idummy,idummy,idummy, & idummy,idummy, idummy,idummy,idummy, & idummy,idummy, idummy,idummy,idummy WRITE(trnchanl) dx1, dy1,ctrlat1,ctrlon1,rdummy, & rdummy,trulat1,trulat2, trulon,sclfct, & rdummy, rdummy, rdummy, rdummy,rdummy, & rdummy, rdummy, rdummy, rdummy,rdummy WRITE(trnchanl) hterain1 CLOSE ( trnchanl ) CALL retunit ( trnchanl ) ! !----------------------------------------------------------------------- ! ! Open the surface property data file ! !----------------------------------------------------------------------- ! lsfcdmp = .false. IF ( landin == 1 ) THEN ! take care of soil and veg data sfcoutfl = new_runname(1:lfnkey)//".sfcdata" lfn = lfnkey + 8 IF( dirname /= ' ' ) THEN temchar = sfcoutfl sfcoutfl = dirname(1:ldirnam)//'/'//temchar lfn = lfn + ldirnam + 1 END IF CALL fnversn(sfcoutfl, lfn) PRINT *, 'Write surface property data in ',sfcoutfl(1:lfn) CALL getunit ( sfchanl ) CALL asnctl ('NEWLOCAL', 1, ierr) CALL asnfile(sfcoutfl, '-F f77 -N ieee', ierr) OPEN (UNIT=sfchanl,FILE=sfcoutfl(1:lfn), STATUS = 'new', & FORM='unformatted', ACCESS = 'sequential') WRITE(sfchanl) nx1,ny1 WRITE(sfchanl) mapproj, 1, 1, 1, 1, & 1,idummy, nstyp,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy WRITE(sfchanl) dx1, dy1,ctrlat1,ctrlon1,trulat1, & trulat2,trulon, sclfct, rdummy, rdummy, & rdummy,rdummy, rdummy, rdummy, rdummy, & rdummy,rdummy, rdummy, rdummy, rdummy lsfcdmp = .true. END IF ! !----------------------------------------------------------------------- ! ! Open the grid base state data file for the new grid ! !----------------------------------------------------------------------- ! CALL gtbasfn(new_runname(1:lfnkey),dirname,ldirnam,hdmpfmt, & 1,0,basdmpfn,lbasdmpf) PRINT* PRINT*,'Output grid/base state file is ', basdmpfn(1:lbasdmpf) ! !----------------------------------------------------------------------- ! ! Get the IO unit numbers for input grid and base state file ! !----------------------------------------------------------------------- ! CALL getunit( nchanl ) CALL asnctl ('NEWLOCAL', 1, ierr) CALL asnfile(basdmpfn(1:lbasdmpf), '-F f77 -N ieee', ierr) ! !----------------------------------------------------------------------- ! ! Open the output grdbas file ! !----------------------------------------------------------------------- ! OPEN(UNIT=nchanl,FILE=basdmpfn(1:lbasdmpf), & STATUS='new',FORM='unformatted',IOSTAT=istat) IF( istat /= 0 ) GO TO 9002 ! !----------------------------------------------------------------------- ! ! Read in other base state arrays and interpolate them into new grid ! !----------------------------------------------------------------------- ! WRITE (cmnt(nocmnt),'(a,i4,a,i4,a,i4)') & ' nx =',nx1,', ny =',ny1,', nz =',nz1 WRITE(nchanl) fmtver WRITE(nchanl) new_runname WRITE(nchanl) nocmnt IF( nocmnt > 0 ) THEN DO i=1,nocmnt WRITE(nchanl) cmnt(i) WRITE(6,'(1x,a)') cmnt(i) END DO END IF WRITE(nchanl) time,tmunit WRITE(nchanl) nx1,ny1,nz1 WRITE(nchanl) 1, 1, 0,mstout1, 0, & 0, 0, 0,landout1,totout, & idummy, idummy, idummy, mapproj, month, & day, year, hour, minute, second WRITE(nchanl) umove,vmove,xgrdorg1,ygrdorg1,trulat1, & trulat2,trulon,sclfct,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & tstop,thisdmp,latitud1,ctrlat1,ctrlon1 IF ( totout /= 0 ) THEN WRITE(nchanl) nstyp, idummy, idummy, idummy, idummy, & idummy, idummy, idummy, idummy, idummy, & idummy, idummy, idummy, idummy, idummy, & idummy, idummy, idummy, idummy, idummy WRITE(nchanl) rdummy, rdummy, rdummy, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy END IF WRITE(6,'(/1x,a/)') & 'Min. and max. of input data interpolated to the new grid:' WRITE(nchanl) 'x coord r1d1' WRITE(nchanl) x11 CALL a3dmax0(x11,1,nx1,1,nx1,1,1,1,1,1,1,1,1, amax,amin) WRITE(6,'(/1x,2(a,e13.6))') 'xmin = ', amin,', xmax =',amax WRITE(nchanl) 'y coord r1d2' WRITE(nchanl) y11 CALL a3dmax0(y11,1,ny1,1,ny1,1,1,1,1,1,1,1,1, amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'ymin = ', amin,', ymax =',amax WRITE(nchanl) 'z coord r1d3' WRITE(nchanl) z1 CALL a3dmax0(z1,1,nz1,1,nz1,1,1,1,1,1,1,1,1, amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'zmin = ', amin,', zmax =',amax WRITE(nchanl) 'zp coor r3d0' WRITE(nchanl) zp1 CALL a3dmax0(zp1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'zpmin = ', amin,', zpmax =',amax ! !----------------------------------------------------------------------- ! ! Read in base state arrays, interpolate them into new grid, and ! dump them into the new history file ! !----------------------------------------------------------------------- ! READ(inch,ERR=9110,END=9120) label READ(inch,ERR=9110,END=9120) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' stgr = 1 ! U-points CALL intrp3d( nx,ny,nz,nx1,ny1,nz1,x,y,z,zp,x1,y1,z1,zp1, & samgrd,stgr,a3din,a3dout,tem3d,tem3d1 ) WRITE(nchanl) 'ubar r3d1' WRITE(nchanl) a3dout CALL a3dmax0(a3dout,1,nx1,1,nx1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'ubarmin = ', amin,', ubarmax =',amax READ(inch,ERR=9110,END=9120) label READ(inch,ERR=9110,END=9120) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' stgr = 2 ! V-points CALL intrp3d( nx,ny,nz,nx1,ny1,nz1,x,y,z,zp,x1,y1,z1,zp1, & samgrd,stgr,a3din,a3dout,tem3d,tem3d1 ) WRITE(nchanl) 'vbar r3d1' WRITE(nchanl) a3dout CALL a3dmax0(a3dout,1,nx1,1,nx1-1,1,ny1,1,ny1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'vbarmin = ', amin,', vbarmax =',amax READ(inch,ERR=9110,END=9120) label READ(inch,ERR=9110,END=9120) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' stgr = 3 ! W-points CALL intrp3d( nx,ny,nz,nx1,ny1,nz1,x,y,z,zp,x1,y1,z1,zp1, & samgrd,stgr,a3din,a3dout,tem3d,tem3d1 ) WRITE(nchanl) 'wbar r3d1' WRITE(nchanl) a3dout READ(inch,ERR=9110,END=9120) label READ(inch,ERR=9110,END=9120) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' stgr = 4 ! S-points CALL intrp3d( nx,ny,nz,nx1,ny1,nz1,x,y,z,zp,x1,y1,z1,zp1, & samgrd,stgr,a3din,a3dout,tem3d,tem3d1 ) WRITE(nchanl) 'ptbar r3d1' WRITE(nchanl) a3dout CALL a3dmax0(a3dout,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'ptbarmin= ', amin,', ptbarmax=',amax READ(inch,ERR=9110,END=9120) label READ(inch,ERR=9110,END=9120) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' stgr = 4 ! S-points CALL intrp3d( nx,ny,nz,nx1,ny1,nz1,x,y,z,zp,x1,y1,z1,zp1, & samgrd,stgr,a3din,a3dout,tem3d,tem3d1 ) WRITE(nchanl) 'pbar r3d1' WRITE(nchanl) a3dout CALL a3dmax0(a3dout,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'pbarmin = ', amin,', pbarmax =',amax IF ( mstin == 1 ) THEN READ(inch,ERR=9110,END=9120) label READ(inch,ERR=9110,END=9120) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' IF ( mstout1 == 1 ) THEN stgr = 4 ! S-points CALL intrp3d( nx,ny,nz,nx1,ny1,nz1,x,y,z,zp,x1,y1,z1,zp1, & samgrd,stgr,a3din,a3dout,tem3d,tem3d1 ) WRITE(nchanl) 'qvbar r3d1' WRITE(nchanl) a3dout CALL a3dmax0(a3dout,1,nx1,1,nx1-1,1,ny1,1,ny1-1, & 1,nz1,1,nz1-1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') & 'qvbarmin= ', amin,', qvbarmax=',amax END IF END IF IF ( landin == 1 ) THEN IF (nstyp == 1) THEN READ(inch,ERR=9110,END=9120) label READ(inch,ERR=9110,END=9120) ((i2din(i,j),i=1,nx),j=1,ny) WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array i2din' CALL dist2d(nx,ny,nx1,ny1,x,y,x1,y1,samgrd,i2din,i2dout) WRITE(nchanl) 'soiltyp i2d0' WRITE(nchanl) ((i2dout(i,j),i=1,nx1),j=1,ny1) IF ( lsfcdmp ) WRITE(sfchanl) ((i2dout(i,j),i=1,nx1),j=1,ny1) ELSE DO is=1,nstyp READ(inch,ERR=9110,END=9120) label READ(inch,ERR=9110,END=9120) & ((i2din(i,j),i=1,nx),j=1,ny) WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array i2din' CALL dist2d(nx,ny,nx1,ny1,x,y,x1,y1, & samgrd,i2din,i2dout) WRITE(nchanl) 'soiltyp i2d0' WRITE(nchanl) ((i2dout(i,j),i=1,nx1),j=1,ny1) IF( lsfcdmp ) WRITE(sfchanl) ((i2dout(i,j),i=1,nx1),j=1,ny1) READ(inch,ERR=9110,END=9120) label READ(inch,ERR=9110,END=9120) & ((a2din(i,j),i=1,nx),j=1,ny) WRITE(6,'(1x,a,a12,a,i2)') & 'Field ',label,' was read into array a2din for is=',is CALL intrp2d( nx,ny,nx1,ny1,x,y,x1,y1, & samgrd,a2din,a2dout ) WRITE(nchanl) 'stypfrct r2d0' WRITE(nchanl) ((a2dout(i,j),i=1,nx1),j=1,ny1) IF( lsfcdmp ) WRITE(sfchanl) ((a2dout(i,j),i=1,nx1),j=1,ny1) END DO END IF READ(inch,ERR=9110,END=9120) label READ(inch,ERR=9110,END=9120) i2din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array i2din' CALL dist2d(nx,ny,nx1,ny1,x,y,x1,y1,samgrd,i2din,i2dout) WRITE(nchanl) 'vegtyp i2d0' WRITE(nchanl) i2dout IF ( lsfcdmp ) WRITE(sfchanl) i2dout READ(inch,ERR=9110,END=9120) label READ(inch,ERR=9110,END=9120) a2din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a2din.' CALL intrp2d( nx,ny,nx1,ny1,x,y,x1,y1, samgrd,a2din,a2dout ) WRITE(nchanl) 'lai r2d0' WRITE(nchanl) a2dout IF ( lsfcdmp ) WRITE(sfchanl) a2dout READ(inch,ERR=9110,END=9120) label READ(inch,ERR=9110,END=9120) a2din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a2din.' CALL intrp2d( nx,ny,nx1,ny1,x,y,x1,y1, samgrd,a2din,a2dout ) WRITE(nchanl) 'roufns r2d0' WRITE(nchanl) a2dout IF ( lsfcdmp ) WRITE(sfchanl) a2dout READ(inch,ERR=9110,END=9120) label READ(inch,ERR=9110,END=9120) a2din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a2din.' CALL intrp2d( nx,ny,nx1,ny1,x,y,x1,y1, samgrd,a2din,a2dout ) WRITE(nchanl) 'veg r2d0' WRITE(nchanl) a2dout IF ( lsfcdmp ) WRITE(sfchanl) a2dout END IF CLOSE (inch) CLOSE (nchanl) IF ( lsfcdmp ) CLOSE (sfchanl) CALL retunit( inch ) CALL retunit( nchanl ) IF ( lsfcdmp ) CALL retunit (sfchanl) ! !----------------------------------------------------------------------- ! ! Loop over time dependent data files ! !----------------------------------------------------------------------- ! grdbas = 0 DO nfile = 1,nhisfile filename = hisfile(nfile) lenfil=LEN_trim(filename) WRITE(6,'(/a,a,a)') & ' Data set ', filename(1:lenfil) ,' to be processed.' INQUIRE(FILE=filename(1:lenfil), EXIST = fexist ) IF( fexist ) THEN GO TO 370 END IF WRITE(6,'(a/a)') & 'File '//filename(1:lenfil)//' does not exist.', & 'Check if compressed file '//filename(1:lenfil)//'.Z' & //' exists.' INQUIRE(FILE=filename(1:lenfil)//'.Z',EXIST = fexist ) IF( fexist ) THEN CALL uncmprs( filename(1:lenfil)//'.Z' ) GO TO 370 END IF WRITE(6,'(a/a)') & 'File '//filename(1:lenfil)//'.Z'//' does not exist.', & 'Check if compressed file '//filename(1:lenfil)//'.gz' & //' exists.' INQUIRE(FILE=filename(1:lenfil)//'.gz',EXIST = fexist ) IF( .NOT.fexist ) THEN CALL uncmprs( filename(1:lenfil)//'.gz' ) GO TO 370 END IF WRITE(6,'(a/a)') & 'File '//filename(1:lenfil) & //' or its compressed version not found.', & 'Program stopped.' STOP 370 CONTINUE ! also continue to read another time recode ! from GrADS file ! !----------------------------------------------------------------------- ! ! Get the IO unit numbers for input files ! !----------------------------------------------------------------------- ! CALL getunit( inch ) ! !----------------------------------------------------------------------- ! ! Cray routines to force binary data file to be in the IEEE format ! !----------------------------------------------------------------------- ! CALL asnctl ('NEWLOCAL', 1, ierr) CALL asnfile(filename(1:lenfil), '-F f77 -N ieee', ierr) ! !----------------------------------------------------------------------- ! ! Open the input data file ! !----------------------------------------------------------------------- ! OPEN(UNIT=inch,FILE=filename(1:lenfil), & STATUS='old',FORM='unformatted',IOSTAT=istat) IF( istat /= 0 ) GO TO 9003 ! !----------------------------------------------------------------------- ! ! Read all input data header ! !----------------------------------------------------------------------- ! READ(inch,ERR=9115,END=9125) fmtverin IF ( fmtverin == fmtver ) THEN oldver = 0 ELSE oldver = 1 END IF READ(inch,ERR=9115,END=9125) runname READ(inch,ERR=9115,END=9125) nocmnt IF( nocmnt > 0 ) THEN DO i=1,nocmnt READ(inch,ERR=9115,END=9125) cmnt(i) END DO END IF READ(inch,ERR=9115,END=9125) time,tmunit READ(inch,ERR=9115,END=9125) nxin, nyin, nzin IF( nxin /= nx .OR. nyin /= ny .OR. nzin /= nz ) THEN WRITE(6,'(1x,a)') & ' Dimensions in ARPSINTRP inconsistent with data.' WRITE(6,'(1x,a,3I15)') ' Read were: ', nxin, nyin, nzin WRITE(6,'(1x,a)') & ' Program aborted in ARPSINTRP.' STOP END IF WRITE(6,'(1x,a,f8.1,a,f8.3,a/)') & 'To read data at time ', time, & ' secs = ',(time/60.),' mins.' READ(inch,ERR=9115,END=9125) & grdin,basin,varin,mstin,icein, & trbin, sfcin,rainin,landin,totin, & tkein,idummy,idummy,mapproj, month, & day, year, hour, minute, second IF ( varin == 1 ) THEN varout1 = varout ELSE varout1 = 0 END IF IF ( mstin == 1 ) THEN mstout1 = mstout ELSE mstout1 = 0 END IF IF ( icein == 1 ) THEN iceout1 = iceout ELSE iceout1 = 0 END IF IF ( tkein == 1 ) THEN tkeout1 = tkeout ELSE tkeout1 = 0 END IF IF ( trbin == 1 ) THEN trbout1 = trbout ELSE trbout1 = 0 END IF IF ( rainin == 1 ) THEN rainout1 = rainout ELSE rainout1 = 0 END IF IF ( sfcin == 1 ) THEN sfcout1 = sfcout ELSE sfcout1 = 0 END IF IF ( landin == 1 ) THEN landout1 = landout ELSE landout1 = 0 END IF READ(inch,ERR=9115,END=9125) & umove,vmove,xgrdorg,ygrdorg,trulat1, & trulat2,trulon,sclfct,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & tstop,thisdmp,latitud,ctrlat,ctrlon IF ( totin /= 0 ) THEN ! !----------------------------------------------------------------------- ! ! Read in additional parameters for ARPS history dump 4.0 or later ! version. ! !----------------------------------------------------------------------- ! READ(inch,ERR=9115,END=9125) & nstyp, prcin,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy IF ( nstyp < 1 ) THEN nstyp = 1 END IF IF ( prcin == 1 ) THEN prcout1 = prcout ELSE prcout1 = 0 END IF READ(inch,ERR=9115,END=9125) & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy END IF curtim = time ! !----------------------------------------------------------------------- ! ! Get the history file name for the new grid at time curtim ! !----------------------------------------------------------------------- ! runname = new_runname CALL gtdmpfn(runname(1:lfnkey),dirname, & ldirnam,curtim,houtfmt,1,0, hdmpfn, ldmpf) CALL getunit( nchanl ) CALL asnctl ('NEWLOCAL', 1, ierr) CALL asnfile(hdmpfn(1:ldmpf), '-F f77 -N ieee', ierr) OPEN(UNIT=nchanl,FILE=hdmpfn(1:ldmpf), & STATUS='new',FORM='unformatted',IOSTAT=istat) IF( istat /= 0 ) GO TO 9004 ! !----------------------------------------------------------------------- ! ! Open the surface property data file ! !----------------------------------------------------------------------- ! lsoildmp = .false. IF ( sfcin == 1 ) THEN ! take care of soil variables CALL cvttsnd( curtim, timsnd, tmstrln ) soiloutfl = runname(1:lfnkey)//".soilvar."//timsnd(1:tmstrln) lfn = lfnkey + 9 + tmstrln IF( dirname /= ' ' ) THEN temchar = soiloutfl soiloutfl = dirname(1:ldirnam)//'/'//temchar lfn = lfn + ldirnam + 1 END IF CALL fnversn(soiloutfl, lfn) PRINT *, 'Write soil initial data to ',soiloutfl(1:lfn) CALL getunit ( soilchanl ) CALL asnctl ('NEWLOCAL', 1, ierr) CALL asnfile(soiloutfl, '-F f77 -N ieee', ierr) OPEN (UNIT=soilchanl,FILE=soiloutfl(1:lfn), STATUS = 'new', & FORM='unformatted', ACCESS = 'sequential') WRITE(soilchanl) nx1,ny1 WRITE(soilchanl) mapproj, 1, 1, 1, 1, & 1,idummy, nstyp,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy WRITE(soilchanl) dx1, dy1,ctrlat1,ctrlon1,trulat1, & trulat2,trulon, sclfct, rdummy, rdummy, & rdummy,rdummy, rdummy, rdummy, rdummy, & rdummy,rdummy, rdummy, rdummy, rdummy lsoildmp = .true. END IF IF ( exbcdmp == 1 ) THEN ! !----------------------------------------------------------------------- ! ! Open the EXBC file to dump the data ! !----------------------------------------------------------------------- ! dmpexbc = .true. IF ( varin == 0 ) THEN WRITE(6,'(1x,a,a)') & 'The data file does not contain the variables needed ', & 'for EXBC data file' dmpexbc = .false. GO TO 385 END IF IF ( mstout1 == 0 ) THEN qcexout = 0 qrexout = 0 qiexout = 0 qsexout = 0 qhexout = 0 ELSE IF ( iceout1 == 0 ) THEN qiexout = 0 qsexout = 0 qhexout = 0 END IF CALL ctim2abss( year,month,day,hour,minute,second, itema ) itema = itema + INT(curtim) CALL abss2ctim( itema,iyr,imon,idy,ihr,imin,isec ) WRITE (ctime,'(i4.4,2i2.2,a,3i2.2)') & iyr,imon,idy,'.',ihr,imin,isec exbcfn = runname(1:lfnkey)//'.'//ctime length = lfnkey + 16 IF( dirname /= ' ' ) THEN temchar = exbcfn exbcfn = dirname(1:ldirnam)//'/'//temchar length = length + ldirnam + 1 END IF CALL fnversn(exbcfn,length) WRITE(6,'(1x,a,a)') & 'The external boundary data file is ',exbcfn(1:length) CALL getunit( exbchanl ) CALL asnctl ('NEWLOCAL', 1, ierr) CALL asnfile(exbcfn(1:length), '-F f77 -N ieee', ierr) OPEN(UNIT=exbchanl,FILE=exbcfn(1:length), & STATUS='new',FORM='unformatted',IOSTAT=istat) IF( istat /= 0 ) GO TO 9005 WRITE(exbchanl) nx1,ny1,nz1,dx1,dy1,dz1,ctrlat1,ctrlon1 WRITE(exbchanl) ctime WRITE(exbchanl) varin,varin,varin,varin,varin, & mstout1,qcexout,qrexout,qiexout,qsexout, & qhexout,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy END IF 385 CONTINUE ! !----------------------------------------------------------------------- ! ! Write out the header information for new grid ! !----------------------------------------------------------------------- ! WRITE(nchanl) fmtver WRITE(nchanl) new_runname WRITE(nchanl) nocmnt WRITE (cmnt(nocmnt),'(a,i4,a,i4,a,i4)') & ' nx =',nx1,', ny =',ny1,', nz =',nz1 IF( nocmnt > 0 ) THEN DO i=1,nocmnt WRITE(nchanl) cmnt(i) WRITE(6,'(1x,a)') cmnt(i) END DO END IF WRITE(nchanl) time,tmunit WRITE(nchanl) nx1,ny1,nz1 ! !----------------------------------------------------------------------- ! ! Write the flags for different data groups. ! !----------------------------------------------------------------------- ! WRITE(nchanl) grdout, 0, varout1, mstout1, iceout1, & trbout1, sfcout1,rainout1,landout1,totout, & tkeout1, idummy, idummy, mapproj, month, & day, year, hour, minute, second rdummy = 0.0 WRITE(nchanl) umove, vmove,xgrdorg1,ygrdorg1, trulat1, & trulat2, trulon, sclfct, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy, & tstop, thisdmp,latitud1, ctrlat1, ctrlon1 ! !----------------------------------------------------------------------- ! ! If totout=1, write additional parameters to history dump files. ! This is for ARPS version 4.1.2 or later. ! !----------------------------------------------------------------------- ! IF ( totout == 1 ) THEN WRITE(nchanl) nstyp, prcout1, idummy, idummy, idummy, & idummy, idummy, idummy, idummy, idummy, & idummy, idummy, idummy, idummy, idummy, & idummy, idummy, idummy, idummy, idummy WRITE(nchanl) rdummy, rdummy, rdummy, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy END IF ! !----------------------------------------------------------------------- ! ! Read in x,y and z at grid cell centers (scalar points). ! !---------------------------------------------------------------------- ! IF( grdin == 1 .OR. grdbas == 1 ) THEN READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) x WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array x.' READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) y WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array y.' READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) z WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array z.' READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) zp WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array zp.' END IF ! grdin ! !----------------------------------------------------------------------- ! ! If grdout=1 or grdbas=1, write out grid variables ! !----------------------------------------------------------------------- ! IF(grdout == 1 .OR. grdbas == 1 ) THEN WRITE(nchanl) 'x coord r1d1' WRITE(nchanl) x11 WRITE(nchanl) 'y coord r1d2' WRITE(nchanl) y11 WRITE(nchanl) 'z coord r1d3' WRITE(nchanl) z1 WRITE(nchanl) 'zp coor r3d0' WRITE(nchanl) zp1 END IF ! grdout ! !----------------------------------------------------------------------- ! ! Read in base state fields ! !---------------------------------------------------------------------- ! IF( basin == 1 .OR. grdbas == 1 ) THEN READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' IF( mstin == 1) THEN READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' END IF IF (landin == 1) THEN IF (nstyp == 1) THEN READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) & ((i2din(i,j),i=1,nx),j=1,ny) WRITE(6,'(1x,a,a12,a,i2)') & 'Field ',label,' was read into array soiltyp for is=',is ELSE DO is=1,nstyp READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) & ((i2din(i,j),i=1,nx),j=1,ny) WRITE(6,'(1x,a,a12,a,i2)') & 'Field ',label,' was read into array i2din for is=',is READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) & ((a2din(i,j),i=1,nx),j=1,ny) WRITE(6,'(1x,a,a12,a,i2)') & 'Field ',label,' was read into array a2din for is=',is END DO END IF READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) i2din WRITE(6,'(1x,a,a12,a,i2)') & 'Field ',label,' was read into array i2din for is=',is READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a2din WRITE(6,'(1x,a,a12,a,i2)') & 'Field ',label,' was read into array a2din for is=',is READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a2din WRITE(6,'(1x,a,a12,a,i2)') & 'Field ',label,' was read into array a2din for is=',is READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a2din WRITE(6,'(1x,a,a12,a,i2)') & 'Field ',label,' was read into array a2din for is=',is END IF END IF ! !----------------------------------------------------------------------- ! ! Read in arrays for interpolations ! !---------------------------------------------------------------------- ! READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' stgr = 1 ! U-points CALL intrp3d( nx,ny,nz,nx1,ny1,nz1,x,y,z,zp,x1,y1,z1,zp1, & samgrd,stgr,a3din,a3dout,tem3d,tem3d1 ) WRITE(nchanl) 'u r3d1' WRITE(nchanl) a3dout CALL a3dmax0(a3dout,1,nx1,1,nx1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'umin = ', amin,', umax =',amax IF ( dmpexbc ) WRITE(exbchanl) a3dout READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' stgr = 2 ! V-points CALL intrp3d( nx,ny,nz,nx1,ny1,nz1,x,y,z,zp,x1,y1,z1,zp1, & samgrd,stgr,a3din,a3dout,tem3d,tem3d1 ) WRITE(nchanl) 'v r3d1' WRITE(nchanl) a3dout CALL a3dmax0(a3dout,1,nx1,1,nx1-1,1,ny1,1,ny1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'vmin = ', amin,', vmax =',amax IF ( dmpexbc ) WRITE(exbchanl) a3dout READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' stgr = 3 ! W-points CALL intrp3d( nx,ny,nz,nx1,ny1,nz1,x,y,z,zp,x1,y1,z1,zp1, & samgrd,stgr,a3din,a3dout,tem3d,tem3d1 ) WRITE(nchanl) 'w r3d1' WRITE(nchanl) a3dout CALL a3dmax0(a3dout,1,nx1,1,nx1-1,1,ny1,1,ny1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'wmin = ', amin,', wmax =',amax IF ( dmpexbc ) WRITE(exbchanl) a3dout READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' stgr = 4 ! S-points CALL intrp3d( nx,ny,nz,nx1,ny1,nz1,x,y,z,zp,x1,y1,z1,zp1, & samgrd,stgr,a3din,a3dout,tem3d,tem3d1 ) WRITE(nchanl) 'pt r3d1' WRITE(nchanl) a3dout CALL a3dmax0(a3dout,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'ptmin = ', amin,', ptmax =',amax IF ( dmpexbc ) WRITE(exbchanl) a3dout READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' stgr = 4 ! S-points CALL intrp3d( nx,ny,nz,nx1,ny1,nz1,x,y,z,zp,x1,y1,z1,zp1, & samgrd,stgr,a3din,a3dout,tem3d,tem3d1 ) WRITE(nchanl) 'p r3d1' WRITE(nchanl) a3dout CALL a3dmax0(a3dout,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'pmin = ', amin,', pmax =',amax IF ( dmpexbc ) WRITE(exbchanl) a3dout IF( mstin == 1 ) THEN READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' IF ( mstout == 1 ) THEN stgr = 4 ! S-points CALL intrp3d( nx,ny,nz,nx1,ny1,nz1,x,y,z,zp,x1,y1,z1,zp1, & samgrd,stgr,a3din,a3dout,tem3d,tem3d1 ) WRITE(nchanl) 'qv r3d1' WRITE(nchanl) a3dout CALL a3dmax0(a3dout,1,nx1,1,nx1-1,1,ny1,1,ny1-1, & 1,nz1,1,nz1-1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') & 'qvmin = ', amin,', qvmax =',amax IF ( dmpexbc ) WRITE(exbchanl) a3dout END IF READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' IF ( mstout == 1 ) THEN stgr = 4 ! S-points CALL intrp3d( nx,ny,nz,nx1,ny1,nz1,x,y,z,zp,x1,y1,z1,zp1, & samgrd,stgr,a3din,a3dout,tem3d,tem3d1 ) WRITE(nchanl) 'qc r3d1' WRITE(nchanl) a3dout CALL a3dmax0(a3dout,1,nx1,1,nx1-1,1,ny1,1,ny1-1, & 1,nz1,1,nz1-1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') & 'qcmin = ', amin,', qcmax =',amax IF ( dmpexbc .AND. qcexout == 1 ) WRITE(exbchanl) a3dout END IF READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' IF ( mstout == 1 ) THEN stgr = 4 ! S-points CALL intrp3d( nx,ny,nz,nx1,ny1,nz1,x,y,z,zp,x1,y1,z1,zp1, & samgrd,stgr,a3din,a3dout,tem3d,tem3d1 ) WRITE(nchanl) 'qr r3d1' WRITE(nchanl) a3dout CALL a3dmax0(a3dout,1,nx1,1,nx1-1,1,ny1,1,ny1-1, & 1,nz1,1,nz1-1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') & 'qrmin = ', amin,', qrmax =',amax IF ( dmpexbc .AND. qrexout == 1 ) WRITE(exbchanl) a3dout END IF IF( rainin == 1 ) THEN READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a2din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a2din.' IF ( mstout == 1 .AND. rainout == 1 ) THEN CALL intrp2d( nx,ny,nx1,ny1,x,y,x1,y1, & samgrd,a2din,a2dout ) WRITE(nchanl) 'raing r3d1' WRITE(nchanl) a2dout CALL a3dmax0(a2dout,1,nx1,1,nx1-1,1,ny1,1,ny1-1, & 1,1,1,1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') & 'raingmin= ', amin,', raingmax=',amax END IF READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a2din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a2din.' IF ( mstout == 1 .AND. rainout == 1 ) THEN CALL intrp2d( nx,ny,nx1,ny1,x,y,x1,y1, & samgrd,a2din,a2dout ) WRITE(nchanl) 'rainc r3d1' WRITE(nchanl) a2dout CALL a3dmax0(a2dout,1,nx1,1,nx1-1,1,ny1,1,ny1-1, & 1,1,1,1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') & 'raincmin= ', amin,', raincmax=',amax END IF END IF IF( prcin == 1 ) THEN READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a2din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a2din.' IF ( mstout == 1 .AND. prcout == 1 ) THEN CALL intrp2d( nx,ny,nx1,ny1,x,y,x1,y1, & samgrd,a2din,a2dout ) WRITE(nchanl) 'prcrt1 r3d1' WRITE(nchanl) a2dout CALL a3dmax0(a2dout,1,nx1,1,nx1-1,1,ny1,1,ny1-1, & 1,1,1,1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') & 'prcr1min= ', amin,', prcr1max=',amax END IF READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a2din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a2din.' IF ( mstout == 1 .AND. prcout == 1 ) THEN CALL intrp2d( nx,ny,nx1,ny1,x,y,x1,y1, & samgrd,a2din,a2dout ) WRITE(nchanl) 'prcrt2 r3d1' WRITE(nchanl) a2dout CALL a3dmax0(a2dout,1,nx1,1,nx1-1,1,ny1,1,ny1-1, & 1,1,1,1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') & 'prcr2min= ', amin,', prcr1max=',amax END IF READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a2din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a2din.' IF ( mstout == 1 .AND. prcout == 1 ) THEN CALL intrp2d( nx,ny,nx1,ny1,x,y,x1,y1, & samgrd,a2din,a2dout ) WRITE(nchanl) 'prcrt3 r3d1' WRITE(nchanl) a2dout CALL a3dmax0(a2dout,1,nx1,1,nx1-1,1,ny1,1,ny1-1, & 1,1,1,1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') & 'prcr3min= ', amin,', prcr1max=',amax END IF READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a2din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a2din.' IF ( mstout == 1 .AND. prcout == 1 ) THEN CALL intrp2d( nx,ny,nx1,ny1,x,y,x1,y1, & samgrd,a2din,a2dout ) WRITE(nchanl) 'prcrt4 r3d1' WRITE(nchanl) a2dout CALL a3dmax0(a2dout,1,nx1,1,nx1-1,1,ny1,1,ny1-1, & 1,1,1,1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') & 'prcr4min= ', amin,', prcr1max=',amax END IF END IF IF( icein == 1 ) THEN READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' IF ( mstout == 1 .AND. iceout == 1 ) THEN stgr = 4 ! S-points CALL intrp3d( nx,ny,nz,nx1,ny1,nz1,x,y,z,zp,x1,y1,z1,zp1, & samgrd,stgr,a3din,a3dout,tem3d,tem3d1 ) WRITE(nchanl) 'qi r3d1' WRITE(nchanl) a3dout CALL a3dmax0(a3dout,1,nx1,1,nx1-1,1,ny1,1,ny1-1, & 1,nz1,1,nz1-1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') & 'qimin = ', amin,', qimax =',amax IF ( dmpexbc .AND. qiexout == 1 ) WRITE(exbchanl) a3dout END IF READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' IF ( mstout == 1 .AND. iceout == 1 ) THEN stgr = 4 ! S-points CALL intrp3d( nx,ny,nz,nx1,ny1,nz1,x,y,z,zp,x1,y1,z1,zp1, & samgrd,stgr,a3din,a3dout,tem3d,tem3d1 ) WRITE(nchanl) 'qs r3d1' WRITE(nchanl) a3dout CALL a3dmax0(a3dout,1,nx1,1,nx1-1,1,ny1,1,ny1-1, & 1,nz1,1,nz1-1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') & 'qsmin = ', amin,', qsmax =',amax IF ( dmpexbc .AND. qsexout == 1 ) WRITE(exbchanl) a3dout END IF READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' IF ( mstout == 1 .AND. iceout == 1 ) THEN stgr = 4 ! S-points CALL intrp3d( nx,ny,nz,nx1,ny1,nz1,x,y,z,zp,x1,y1,z1,zp1, & samgrd,stgr,a3din,a3dout,tem3d,tem3d1 ) WRITE(nchanl) 'qh r3d1' WRITE(nchanl) a3dout CALL a3dmax0(a3dout,1,nx1,1,nx1-1,1,ny1,1,ny1-1, & 1,nz1,1,nz1-1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') & 'qhmin = ', amin,', qhmax =',amax IF ( dmpexbc .AND. qhexout == 1 ) WRITE(exbchanl) a3dout END IF END IF END IF IF( tkein == 1 ) THEN READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' IF ( mstout == 1 .AND. iceout == 1 ) THEN stgr = 4 ! S-points CALL intrp3d( nx,ny,nz,nx1,ny1,nz1,x,y,z,zp,x1,y1,z1,zp1, & samgrd,stgr,a3din,a3dout,tem3d,tem3d1 ) WRITE(nchanl) 'tke r3d1' WRITE(nchanl) a3dout CALL a3dmax0(a3dout,1,nx1,1,nx1-1,1,ny1,1,ny1-1, & 1,nz1,1,nz1-1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') & 'tkemin = ', amin,', tkemax =',amax END IF END IF IF( trbin == 1 ) THEN READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' IF ( mstout == 1 .AND. iceout == 1 ) THEN stgr = 4 ! S-points CALL intrp3d( nx,ny,nz,nx1,ny1,nz1,x,y,z,zp,x1,y1,z1,zp1, & samgrd,stgr,a3din,a3dout,tem3d,tem3d1 ) WRITE(nchanl) 'kmh r3d1' WRITE(nchanl) a3dout CALL a3dmax0(a3dout,1,nx1,1,nx1-1,1,ny1,1,ny1-1, & 1,nz1,1,nz1-1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') & 'kmhmin = ', amin,', kmhmax =',amax END IF IF ( oldver == 0 ) THEN READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) a3din WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a3din.' IF ( mstout == 1 .AND. iceout == 1 ) THEN stgr = 4 ! S-points CALL intrp3d( nx,ny,nz,nx1,ny1,nz1,x,y,z,zp,x1,y1,z1,zp1, & samgrd,stgr,a3din,a3dout,tem3d,tem3d1 ) WRITE(nchanl) 'kmv r3d1' WRITE(nchanl) a3dout CALL a3dmax0(a3dout,1,nx1,1,nx1-1,1,ny1,1,ny1-1, & 1,nz1,1,nz1-1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') & 'kmvmin = ', amin,', kmvmax =',amax END IF END IF END IF IF( sfcin == 1 ) THEN IF (nstyp == 1) THEN READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) ((a2din(i,j),i=1,nx),j=1,ny) WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a2din.' CALL intrp2d(nx,ny,nx1,ny1,x,y,x1,y1,samgrd,a2din,a2dout) WRITE(nchanl) 'tsfc i2d0' WRITE(nchanl) ((a2dout(i,j),i=1,nx1),j=1,ny1) IF ( lsoildmp ) WRITE(soilchanl) a2dout READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) ((a2din(i,j),i=1,nx),j=1,ny) WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a2din.' CALL intrp2d(nx,ny,nx1,ny1,x,y,x1,y1,samgrd,a2din,a2dout) WRITE(nchanl) 'tsoil i2d0' WRITE(nchanl) ((a2dout(i,j),i=1,nx1),j=1,ny1) IF ( lsoildmp ) WRITE(soilchanl) a2dout READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) ((a2din(i,j),i=1,nx),j=1,ny) WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a2din.' CALL intrp2d(nx,ny,nx1,ny1,x,y,x1,y1,samgrd,a2din,a2dout) WRITE(nchanl) 'wetsfc i2d0' WRITE(nchanl) ((a2dout(i,j),i=1,nx1),j=1,ny1) IF ( lsoildmp ) WRITE(soilchanl) a2dout READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) ((a2din(i,j),i=1,nx),j=1,ny) WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a2din.' CALL intrp2d(nx,ny,nx1,ny1,x,y,x1,y1,samgrd,a2din,a2dout) WRITE(nchanl) 'wetdp i2d0' WRITE(nchanl) ((a2dout(i,j),i=1,nx1),j=1,ny1) IF ( lsoildmp ) WRITE(soilchanl) a2dout READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) ((a2din(i,j),i=1,nx),j=1,ny) WRITE(6,'(1x,a,a12,a)') & 'Field ',label,' was read into array a2din.' CALL intrp2d(nx,ny,nx1,ny1,x,y,x1,y1,samgrd,a2din,a2dout) WRITE(nchanl) 'wetcanp i2d0' WRITE(nchanl) ((a2dout(i,j),i=1,nx1),j=1,ny1) IF ( lsoildmp ) WRITE(soilchanl) a2dout ELSE DO is=0,nstyp READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) ((a2din(i,j),i=1,nx),j=1,ny) WRITE(6,'(1x,a,a12,a,i2)') & 'Field ',label,' was read into array a2din for is=',is CALL intrp2d(nx,ny,nx1,ny1,x,y,x1,y1, samgrd,a2din,a2dout) WRITE(nchanl) 'tsfc i2d0' WRITE(nchanl) ((a2dout(i,j),i=1,nx1),j=1,ny1) IF ( lsoildmp .AND. is == 0 ) WRITE(soilchanl) a2dout READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) ((a2din(i,j),i=1,nx),j=1,ny) WRITE(6,'(1x,a,a12,a,i2)') & 'Field ',label,' was read into array a2din for is=',is CALL intrp2d(nx,ny,nx1,ny1,x,y,x1,y1, samgrd,a2din,a2dout) WRITE(nchanl) 'tsoil i2d0' WRITE(nchanl) ((a2dout(i,j),i=1,nx1),j=1,ny1) IF ( lsoildmp .AND. is == 0 ) WRITE(soilchanl) a2dout READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) ((a2din(i,j),i=1,nx),j=1,ny) WRITE(6,'(1x,a,a12,a,i2)') & 'Field ',label,' was read into array a2din for is=',is CALL intrp2d(nx,ny,nx1,ny1,x,y,x1,y1, samgrd,a2din,a2dout) WRITE(nchanl) 'wetsfc i2d0' WRITE(nchanl) ((a2dout(i,j),i=1,nx1),j=1,ny1) IF ( lsoildmp .AND. is == 0 ) WRITE(soilchanl) a2dout READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) ((a2din(i,j),i=1,nx),j=1,ny) WRITE(6,'(1x,a,a12,a,i2)') & 'Field ',label,' was read into array a2din for is=',is CALL intrp2d(nx,ny,nx1,ny1,x,y,x1,y1, samgrd,a2din,a2dout) WRITE(nchanl) 'wetdp i2d0' WRITE(nchanl) ((a2dout(i,j),i=1,nx1),j=1,ny1) IF ( lsoildmp .AND. is == 0 ) WRITE(soilchanl) a2dout READ(inch,ERR=9115,END=9125) label READ(inch,ERR=9115,END=9125) ((a2din(i,j),i=1,nx),j=1,ny) WRITE(6,'(1x,a,a12,a,i2)') & 'Field ',label,' was read into array a2din for is=',is CALL intrp2d(nx,ny,nx1,ny1,x,y,x1,y1, samgrd,a2din,a2dout) WRITE(nchanl) 'wetcanp i2d0' WRITE(nchanl) ((a2dout(i,j),i=1,nx1),j=1,ny1) IF ( lsoildmp .AND. is == 0 ) WRITE(soilchanl) a2dout END DO END IF END IF CLOSE ( inch ) CLOSE ( nchanl ) IF ( dmpexbc ) CLOSE ( exbchanl ) IF ( lsoildmp ) CLOSE ( soilchanl ) CALL retunit ( inch ) CALL retunit ( nchanl ) IF ( dmpexbc ) CALL retunit ( exbchanl ) IF ( lsoildmp ) CALL retunit ( soilchanl ) END DO STOP 9000 CONTINUE WRITE(6,'(1x,a,i2,/1x,a)') & 'Namelist read error. Job stopped in ARPSINTRP.' STOP 9000 ! !----------------------------------------------------------------------- ! ! Error during read ! !---------------------------------------------------------------------- ! 9001 CONTINUE WRITE(6,'(/a,a/)') & ' Error in openning file ',grdbasfn(1:lengbf) STOP 9001 9002 CONTINUE WRITE(6,'(/a,a/)') & ' Error in openning file ',basdmpfn(1:lbasdmpf) STOP 9002 9003 CONTINUE WRITE(6,'(/a,a/)') & ' Error in openning file ',filename(1:lenfil) STOP 9003 9004 CONTINUE WRITE(6,'(/a,a/)') & ' Error in openning file ',hdmpfn(1:ldmpf) STOP 9004 9005 CONTINUE WRITE(6,'(/a,a/)') & ' Error in openning file ',exbcfn(1:length) STOP 9005 9110 CONTINUE WRITE(6,'(/a,a/)') ' Error in reading file ',basdmpfn(1:lbasdmpf) STOP 9110 9115 CONTINUE WRITE(6,'(/a,a/)') ' Error in reading file ',filename(1:lenfil) STOP 9115 ! !----------------------------------------------------------------------- ! ! End-of-file during read ! !---------------------------------------------------------------------- ! 9120 CONTINUE WRITE(6,'(/a,a/)') & ' Unexpected End of File reached in reading file ', & basdmpfn(1:lbasdmpf) STOP 9120 9125 CONTINUE WRITE(6,'(/a,a/)') & ' Unexpected End of File reached in reading file ', & filename(1:lenfil) STOP 9125 END PROGRAM arpsintrp_ls ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE INTRP3D ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE intrp3d( nx,ny,nz,nx1,ny1,nz1,x,y,z,zp,x1,y1,z1,zp1, & 20,4 samgrd,stgr,a3din,a3dout,tem3d,tem3d1 ) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Interpolate a 3-d array from an ARPS grid into a new ARPS grid. ! ! !----------------------------------------------------------------------- ! ! AUTHOR: Yuhe Liu ! 08/05/1997 ! ! MODIFICATION HISTORY: ! ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! !----------------------------------------------------------------------- ! ! Parameters for the utput grid. ! !----------------------------------------------------------------------- ! INTEGER :: nx,ny,nz INTEGER :: nx1,ny1,nz1 REAL :: x(nx) REAL :: y(ny) REAL :: z(nz) REAL :: zp(nx,ny,nz) REAL :: x1(nx1) REAL :: y1(ny1) REAL :: z1(nz1) REAL :: zp1(nx1,ny1,nz1) REAL :: a3din(nx,ny,nz) REAL :: a3dout(nx1,ny1,nz1) REAL :: tem3d(nx,ny,nz) REAL :: tem3d1(nx1,ny1,nz1) INTEGER :: samgrd,stgr ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j, k REAL :: s1,s2,s3,s4,sgrdinv REAL :: vgridinv,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6,tmp7,tmp8 REAL :: xu1,yu1,zu1,xv1,yv1,zv1,xw1,yw1,zw1,xs1,ys1,zs1 INTEGER :: iu,ju,ku,iv,jv,kv,iw,jw,kw,is,js,ks INTEGER :: kk REAL :: zupper,zlower ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' INCLUDE 'bndry.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! IF ( samgrd == 1 ) THEN DO k=1,nz1 DO j=1,ny1 DO i=1,nx1 a3dout(i,j,k) = a3din(i,j,k) END DO END DO END DO RETURN END IF IF ( stgr == 1 ) THEN ! for u-points DO k=1,nz-1 DO j=1,ny-1 DO i=2,nx-1 tem3d(i,j,k) = 0.25*(zp(i ,j,k)+zp(i ,j,k+1) & +zp(i-1,j,k)+zp(i-1,j,k+1)) END DO END DO END DO CALL bcsu(nx,ny,nz,1,ny,1,nz,ebc,wbc,tem3d) DO k=1,nz1-1 DO j=1,ny1-1 DO i=2,nx1-1 tem3d1(i,j,k) = 0.25*(zp1(i ,j,k)+zp1(i ,j,k+1) & +zp1(i-1,j,k)+zp1(i-1,j,k+1)) END DO END DO END DO CALL bcsu(nx1,ny1,nz1,1,ny1,1,nz1,ebc,wbc,tem3d1) DO i=1,nx1 DO j=1,ny1-1 DO k=1,nz1-1 xu1=x1(i) yu1=(y1(j+1)+y1(j))*0.5 zu1= tem3d1(i,j,k) iu = MAX(1, MIN(nx-1, INT((xu1-x(1))/dx)+1 )) ju = MAX(1, MIN(ny-2, INT((yu1-(y(1)+y(2))*0.5)/dy)+1 )) s1 = ABS((xu1-x(iu ))*(yu1-(y(ju )+y(ju+1))*0.5)) s2 = ABS((xu1-x(iu+1))*(yu1-(y(ju )+y(ju+1))*0.5)) s3 = ABS((xu1-x(iu+1))*(yu1-(y(ju+1)+y(ju+2))*0.5)) s4 = ABS((xu1-x(iu ))*(yu1-(y(ju+1)+y(ju+2))*0.5)) sgrdinv = 1.0/(s1+s2+s3+s4) ku = 1 DO kk=nz-2,1,-1 IF(zu1 >= (tem3d(iu ,ju ,kk)*s3+tem3d(iu+1,ju ,kk)*s4 & +tem3d(iu+1,ju+1,kk)*s1+tem3d(iu ,ju+1,kk)*s2) & *sgrdinv) THEN ku = kk EXIT END IF END DO 130 CONTINUE zlower = (tem3d(iu ,ju ,ku)*s3+tem3d(iu+1,ju ,ku)*s4 & +tem3d(iu+1,ju+1,ku)*s1+tem3d(iu ,ju+1,ku)*s2) & *sgrdinv zupper = (tem3d(iu ,ju ,ku+1)*s3+tem3d(iu+1,ju ,ku+1)*s4 & +tem3d(iu+1,ju+1,ku+1)*s1+tem3d(iu ,ju+1,ku+1)*s2) & *sgrdinv tmp1 = ABS(s1*(zu1-zlower)) tmp2 = ABS(s2*(zu1-zlower)) tmp3 = ABS(s3*(zu1-zlower)) tmp4 = ABS(s4*(zu1-zlower)) tmp5 = ABS(s1*(zu1-zupper)) tmp6 = ABS(s2*(zu1-zupper)) tmp7 = ABS(s3*(zu1-zupper)) tmp8 = ABS(s4*(zu1-zupper)) vgridinv=1.0/(tmp1+tmp2+tmp3+tmp4+tmp5+tmp6+tmp7+tmp8) a3dout(i,j,k) = & (a3din(iu ,ju ,ku )*tmp7+a3din(iu+1,ju ,ku )*tmp8 & +a3din(iu+1,ju+1,ku )*tmp5+a3din(iu ,ju+1,ku )*tmp6 & +a3din(iu ,ju ,ku+1)*tmp3+a3din(iu+1,ju ,ku+1)*tmp4 & +a3din(iu+1,ju+1,ku+1)*tmp1+a3din(iu ,ju+1,ku+1)*tmp2) & *vgridinv END DO END DO END DO ELSE IF ( stgr == 2 ) THEN DO k=1,nz-1 DO j=2,ny-1 DO i=1,nx-1 tem3d(i,j,k) = 0.25*(zp(i,j ,k)+zp(i,j ,k+1) & +zp(i,j-1,k)+zp(i,j-1,k+1)) END DO END DO END DO CALL bcsu(nx,ny,nz,1,nx,1,nz,nbc,sbc,tem3d) DO k=1,nz1-1 DO j=2,ny1-1 DO i=1,nx1-1 tem3d1(i,j,k) = 0.25*(zp1(i,j ,k)+zp1(i,j ,k+1) & +zp1(i,j-1,k)+zp1(i,j-1,k+1)) END DO END DO END DO CALL bcsv(nx1,ny1,nz1,1,nx1,1,nz1,nbc,sbc,tem3d1) DO i=1,nx1-1 DO j=1,ny1 DO k=1,nz1-1 xv1=(x1(i+1)+x1(i))*0.5 yv1= y1(j) zv1= tem3d1(i,j,k) iv = MAX(1, MIN(nx-2, INT((xv1-(x(1)+x(2))*0.5)/dx)+1 )) jv = MAX(1, MIN(ny-1, INT((yv1- y(1))/dy)+1 )) s1 = ABS((xv1-(x(iv )+x(iv+1))*0.5)*(yv1-y(jv ))) s2 = ABS((xv1-(x(iv+1)+x(iv+2))*0.5)*(yv1-y(jv ))) s3 = ABS((xv1-(x(iv+1)+x(iv+2))*0.5)*(yv1-y(jv+1))) s4 = ABS((xv1-(x(iv )+x(iv+1))*0.5)*(yv1-y(jv+1))) sgrdinv = 1.0/(s1+s2+s3+s4) kv = 1 DO kk=nz-2,1,-1 IF(zv1 >= (tem3d(iv ,jv ,kk)*s3+tem3d(iv+1,jv ,kk)*s4 & +tem3d(iv+1,jv+1,kk)*s1+tem3d(iv ,jv+1,kk)*s2) & *sgrdinv) THEN kv = kk EXIT END IF END DO 230 CONTINUE zlower = (tem3d(iv ,jv ,kv)*s3+tem3d(iv+1,jv ,kv)*s4 & +tem3d(iv+1,jv+1,kv)*s1+tem3d(iv ,jv+1,kv)*s2) & *sgrdinv zupper = (tem3d(iv ,jv ,kv+1)*s3+tem3d(iv+1,jv ,kv+1)*s4 & +tem3d(iv+1,jv+1,kv+1)*s1+tem3d(iv ,jv+1,kv+1)*s2) & *sgrdinv tmp1 = ABS(s1*(zv1-zlower)) tmp2 = ABS(s2*(zv1-zlower)) tmp3 = ABS(s3*(zv1-zlower)) tmp4 = ABS(s4*(zv1-zlower)) tmp5 = ABS(s1*(zv1-zupper)) tmp6 = ABS(s2*(zv1-zupper)) tmp7 = ABS(s3*(zv1-zupper)) tmp8 = ABS(s4*(zv1-zupper)) vgridinv=1.0/(tmp1+tmp2+tmp3+tmp4+tmp5+tmp6+tmp7+tmp8) a3dout(i,j,k) = & (a3din(iv ,jv ,kv )*tmp7+a3din(iv+1,jv ,kv )*tmp8 & +a3din(iv+1,jv+1,kv )*tmp5+a3din(iv ,jv+1,kv )*tmp6 & +a3din(iv ,jv ,kv+1)*tmp3+a3din(iv+1,jv ,kv+1)*tmp4 & +a3din(iv+1,jv+1,kv+1)*tmp1+a3din(iv ,jv+1,kv+1)*tmp2) & *vgridinv END DO END DO END DO ELSE IF ( stgr == 3 ) THEN DO i=1,nx1-1 DO j=1,ny1-1 DO k=1,nz1 xw1= (x1(i)+x1(i+1))*0.5 yw1= (y1(j)+y1(j+1))*0.5 zw1= zp1(i,j,k) iw = MAX(1, MIN(nx-2, INT((xw1-(x(1)+x(2))*0.5)/dx)+1 )) jw = MAX(1, MIN(ny-2, INT((yw1-(y(1)+y(2))*0.5)/dy)+1 )) s1=ABS((xw1-(x(iw )+x(iw+1))*0.5) & *(yw1-(y(jw )+y(jw+1))*0.5)) s2=ABS((xw1-(x(iw+1)+x(iw+2))*0.5) & *(yw1-(y(jw )+y(jw+1))*0.5)) s3=ABS((xw1-(x(iw+1)+x(iw+2))*0.5) & *(yw1-(y(jw+1)+y(jw+2))*0.5)) s4=ABS((xw1-(x(iw )+x(iw+1))*0.5) & *(yw1-(y(jw+1)+y(jw+2))*0.5)) sgrdinv = 1.0/(s1+s2+s3+s4) kw = 1 DO kk=nz-1,1,-1 IF(zw1 >= (zp(iw ,jw ,kk)*s3+zp(iw+1,jw ,kk)*s4 & +zp(iw+1,jw+1,kk)*s1+zp(iw ,jw+1,kk)*s2) & *sgrdinv) THEN kw = kk EXIT END IF END DO 320 CONTINUE zlower = (zp(iw ,jw ,kw)*s3+zp(iw+1,jw ,kw)*s4 & +zp(iw+1,jw+1,kw)*s1+zp(iw ,jw+1,kw)*s2) & *sgrdinv zupper = (zp(iw ,jw ,kw+1)*s3+zp(iw+1,jw ,kw+1)*s4 & +zp(iw+1,jw+1,kw+1)*s1+zp(iw ,jw+1,kw+1)*s2) & *sgrdinv tmp1 = ABS(s1*(zw1-zlower)) tmp2 = ABS(s2*(zw1-zlower)) tmp3 = ABS(s3*(zw1-zlower)) tmp4 = ABS(s4*(zw1-zlower)) tmp5 = ABS(s1*(zw1-zupper)) tmp6 = ABS(s2*(zw1-zupper)) tmp7 = ABS(s3*(zw1-zupper)) tmp8 = ABS(s4*(zw1-zupper)) vgridinv = 1.0/(tmp1+tmp2+tmp3+tmp4+tmp5+tmp6+tmp7+tmp8) a3dout(i,j,k) = & (a3din(iw ,jw ,kw )*tmp7+a3din(iw+1,jw ,kw )*tmp8 & +a3din(iw+1,jw+1,kw )*tmp5+a3din(iw ,jw+1,kw )*tmp6 & +a3din(iw ,jw ,kw+1)*tmp3+a3din(iw+1,jw ,kw+1)*tmp4 & +a3din(iw+1,jw+1,kw+1)*tmp1+a3din(iw ,jw+1,kw+1)*tmp2) & *vgridinv END DO END DO END DO ELSE IF ( stgr == 4 ) THEN DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 tem3d(i,j,k) = 0.5*(zp(i,j,k)+zp(i,j,k+1)) END DO END DO END DO DO k=1,nz1-1 DO j=1,ny1-1 DO i=1,nx1-1 tem3d1(i,j,k) = 0.5*(zp1(i,j,k)+zp1(i,j,k+1)) END DO END DO END DO DO i=1,nx1-1 DO j=1,ny1-1 DO k=1,nz1-1 xs1= (x1(i)+x1(i+1))*0.5 ys1= (y1(j)+y1(j+1))*0.5 zs1= tem3d1(i,j,k) is = MAX(1, MIN(nx-2, INT((xs1-(x(1)+x(2))*0.5)/dx)+1 )) js = MAX(1, MIN(ny-2, INT((ys1-(y(1)+y(2))*0.5)/dy)+1 )) s1 =ABS((xs1-(x(is )+x(is+1))*0.5) & *(ys1-(y(js )+y(js+1))*0.5)) s2 =ABS((xs1-(x(is+1)+x(is+2))*0.5) & *(ys1-(y(js )+y(js+1))*0.5)) s3 =ABS((xs1-(x(is+1)+x(is+2))*0.5) & *(ys1-(y(js+1)+y(js+2))*0.5)) s4 =ABS((xs1-(x(is )+x(is+1))*0.5) & *(ys1-(y(js+1)+y(js+2))*0.5)) sgrdinv = 1.0/(s1+s2+s3+s4) ks = 1 DO kk=nz-2,1,-1 IF(zs1 >= (tem3d(is ,js ,kk)*s3+tem3d(is+1,js ,kk)*s4 & +tem3d(is+1,js+1,kk)*s1+tem3d(is ,js+1,kk)*s2) & *sgrdinv ) THEN ks = kk EXIT END IF END DO 430 CONTINUE zlower = (tem3d(is ,js ,ks)*s3+tem3d(is+1,js ,ks)*s4 & +tem3d(is+1,js+1,ks)*s1+tem3d(is ,js+1,ks)*s2) & *sgrdinv zupper = (tem3d(is ,js ,ks+1)*s3+tem3d(is+1,js ,ks+1)*s4 & +tem3d(is+1,js+1,ks+1)*s1+tem3d(is ,js+1,ks+1)*s2) & *sgrdinv tmp1 = ABS(s1*(zs1-zlower)) tmp2 = ABS(s2*(zs1-zlower)) tmp3 = ABS(s3*(zs1-zlower)) tmp4 = ABS(s4*(zs1-zlower)) tmp5 = ABS(s1*(zs1-zupper)) tmp6 = ABS(s2*(zs1-zupper)) tmp7 = ABS(s3*(zs1-zupper)) tmp8 = ABS(s4*(zs1-zupper)) vgridinv=1.0/(tmp1+tmp2+tmp3+tmp4+tmp5+tmp6+tmp7+tmp8) a3dout(i,j,k) = & (a3din(is ,js ,ks )*tmp7+a3din(is+1,js ,ks )*tmp8 & +a3din(is+1,js+1,ks )*tmp5+a3din(is ,js+1,ks )*tmp6 & +a3din(is ,js ,ks+1)*tmp3+a3din(is+1,js ,ks+1)*tmp4 & +a3din(is+1,js+1,ks+1)*tmp1+a3din(is ,js+1,ks+1)*tmp2) & *vgridinv END DO END DO END DO END IF RETURN END SUBROUTINE intrp3d ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE INTRP2D ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE intrp2d( nx,ny,nx1,ny1,x,y,x1,y1, & 20 samgrd,a2din,a2dout ) ! !----------------------------------------------------------------------- ! ! Interpolate a 2-d array from an ARPS grid into a new ARPS grid. ! !----------------------------------------------------------------------- ! ! AUTHOR: Yuhe Liu ! 08/05/1997 ! ! MODIFICATION HISTORY: ! ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! !----------------------------------------------------------------------- ! ! Parameters for the utput grid. ! !----------------------------------------------------------------------- ! INTEGER :: nx,ny INTEGER :: nx1,ny1 REAL :: x(nx) REAL :: y(ny) REAL :: x1(nx1) REAL :: y1(ny1) REAL :: a2din(nx,ny) REAL :: a2dout(nx1,ny1) INTEGER :: samgrd ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j REAL :: s1,s2,s3,s4,sgrdinv REAL :: xs1,ys1 INTEGER :: is,js ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! IF ( samgrd == 1 ) THEN DO j=1,ny1 DO i=1,nx1 a2dout(i,j) = a2din(i,j) END DO END DO RETURN END IF DO i=1,nx1-1 DO j=1,ny1-1 xs1= (x1(i)+x1(i+1))*0.5 ys1= (y1(j)+y1(j+1))*0.5 is = MAX(1, MIN(nx-2, INT((xs1-(x(1)+x(2))*0.5)/dx)+1 )) js = MAX(1, MIN(ny-2, INT((ys1-(y(1)+y(2))*0.5)/dy)+1 )) s1=ABS((xs1-(x(is )+x(is+1))*0.5)*(ys1-(y(js )+y(js+1))*0.5)) s2=ABS((xs1-(x(is+1)+x(is+2))*0.5)*(ys1-(y(js )+y(js+1))*0.5)) s3=ABS((xs1-(x(is+1)+x(is+2))*0.5)*(ys1-(y(js+1)+y(js+2))*0.5)) s4=ABS((xs1-(x(is )+x(is+1))*0.5)*(ys1-(y(js+1)+y(js+2))*0.5)) sgrdinv = 1.0/(s1+s2+s3+s4) a2dout(i,j) = & (a2din(is ,js )*s3+a2din(is+1,js )*s4 & +a2din(is+1,js+1)*s1+a2din(is ,js+1)*s2) & *sgrdinv END DO END DO RETURN END SUBROUTINE intrp2d ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE DIST2D ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE dist2d( nx,ny,nx1,ny1,x,y,x1,y1, & 3 samgrd,i2din,i2dout ) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Re-distribute a 2-d integer array from an ARPS grid into another ! grid. ! !----------------------------------------------------------------------- ! ! AUTHOR: Yuhe Liu ! 08/05/1997 ! ! MODIFICATION HISTORY: ! ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! !----------------------------------------------------------------------- ! ! Parameters for the utput grid. ! !----------------------------------------------------------------------- ! INTEGER :: nx,ny INTEGER :: nx1,ny1 REAL :: x(nx) REAL :: y(ny) REAL :: x1(nx1) REAL :: y1(ny1) INTEGER :: i2din(nx,ny) INTEGER :: i2dout(nx1,ny1) INTEGER :: samgrd ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j REAL :: xs1,ys1 INTEGER :: is,js ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! IF ( samgrd == 1 ) THEN DO j=1,ny1 DO i=1,nx1 i2dout(i,j) = i2din(i,j) END DO END DO RETURN END IF DO i=1,nx1-1 DO j=1,ny1-1 xs1= (x1(i)+x1(i+1))*0.5 ys1= (y1(j)+y1(j+1))*0.5 is = MAX(1, MIN(nx-2, INT((xs1-(x(1)+x(2))*0.5)/dx)+1 )) js = MAX(1, MIN(ny-2, INT((ys1-(y(1)+y(2))*0.5)/dy)+1 )) i2dout(i,j) = i2din(is,js) END DO END DO RETURN END SUBROUTINE dist2d