!
!##################################################################
!##################################################################
!###### ######
!###### PROGRAM ARPSINTRP_LS ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
PROGRAM arpsintrp_ls,117
!
!-----------------------------------------------------------------------
!
! 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 :: nzsoil ! 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 :: nzsoil1 ! Number of output grid points in the z-direction
INTEGER :: nxyz,nxy,nxyz1,nxy1
INTEGER :: nxyzsoil, nxyzsoil1
!
!-----------------------------------------------------------------------
!
! 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 :: tsoil_tmp(:,:,:,:) ! 4-D real array read in
REAL, ALLOCATABLE :: qsoil_tmp(:,:,:,:) ! 4-D real array read in
REAL, ALLOCATABLE :: a4din(:,:,:,:) ! 4-D real array read in
REAL, ALLOCATABLE :: tsoilin(:,:,:,:) ! 4-D real array read in
REAL, ALLOCATABLE :: qsoilin(:,:,:,:) ! 4-D real array read in
REAL, ALLOCATABLE :: wetcanpin(:,:,:) ! 3-D real array read in
REAL, ALLOCATABLE :: a3dsoilin(:,:,:) ! 3-D real array read in
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 :: zpsoil(:,:,:) ! The physical height coordinate defined at
! w-point on the staggered grid.
! 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 :: a4dout(:,:,:,:)! 4-D real array interpolated from
! a4din.
REAL, ALLOCATABLE :: tsoilout(:,:,:,:)
REAL, ALLOCATABLE :: qsoilout(:,:,:,:)
REAL, ALLOCATABLE :: wetcanpout(:,:,:) ! 3-D real array read in
REAL, ALLOCATABLE :: a3dsoilout(:,:,:) ! 3-D real array interpolated
! from a3dsoilin.
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 :: zpsoil1(:,:,:)! The physical height coordinate defined at
! w-point on the staggered grid.
REAL, ALLOCATABLE :: j3soil1(:,:,:)! Jacobian
REAL, ALLOCATABLE :: j3soilinv1(:,:,:)! Jacobian inverse
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=256) :: basdmpfn
INTEGER :: lbasdmpf
CHARACTER (LEN=256) :: 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=256) :: grdbasfn,hisfile(nhisfile_max)
INTEGER :: ireturn
INTEGER :: houtfmt
CHARACTER (LEN=256) :: filename
INTEGER :: grdbas
REAL :: time
INTEGER :: nfilemax
PARAMETER (nfilemax=200)
CHARACTER (LEN=256) :: 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 :: nxin,nyin,nzin,nzsoilin
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
REAL :: dzsoil1,zrefsoil1
! INTEGER :: soilstrhopt
! REAL :: soildzmin,soildlayer1,soildlayer2,soilstrhtune
NAMELIST /newgrid_soil/ nzsoil1,dzsoil1,zrefsoil1,soilstrhopt, &
soildzmin,soildlayer1,soildlayer2, &
soilstrhtune
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! 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)
CALL get_dims_from_data
(hinfmt,grdbasfn(1:lengbf), &
nx,ny,nz,nzsoil,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
WRITE(6,'(4(a,i5))') 'nx =',nx,', ny=',ny,', nz=',nz,', nzsoil=',nzsoil
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 output_dims successfully read.'
READ(5,newgrid_soil, END=105)
WRITE(6,'(/a,a/)') &
'NAMELIST block newgrid_soil successfully read.'
! WRITE(6,'(3(a,i5))') 'nx1=',nx1,', ny1=',ny1,', nz1=',nz1
WRITE(6,'(4(a,i5))') 'nx1=',nx1,', ny1=',ny1,', nz1=',nz1, &
', nzsoil1=',nzsoil1
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(a4din(nx,ny,nzsoil,0:nstyps))
! a4din = 0.0
ALLOCATE(tsoilin(nx,ny,nzsoil,0:nstyps))
tsoilin = 0.0
ALLOCATE(qsoilin(nx,ny,nzsoil,0:nstyps))
qsoilin = 0.0
ALLOCATE(wetcanpin(nx,ny,nzsoil))
wetcanpin = 0.0
ALLOCATE(a3dsoilin(nx,ny,nzsoil))
a3dsoilin = 0.0
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(tsoil_tmp(nx,ny,nzsoil1,0:nstyps))
tsoil_tmp = 0.0
allocate(qsoil_tmp(nx,ny,nzsoil1,0:nstyps))
qsoil_tmp = 0.0
ALLOCATE(tsoilout(nx1,ny1,nzsoil1,0:nstyps))
tsoilout = 0.0
ALLOCATE(qsoilout(nx1,ny1,nzsoil1,0:nstyps))
qsoilout = 0.0
ALLOCATE(wetcanpout(nx1,ny1,nzsoil1))
wetcanpout = 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(zpsoil1 (nx1,ny1,nzsoil1))
zpsoil1=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, nzsoilin
IF( nxin /= nx .OR. nyin /= ny .OR. nzin /= nz .OR. &
nzsoilin /= nzsoil) THEN
WRITE(6,'(1x,a)') &
' Dimensions in ARPSINTRP inconsistent with data.'
WRITE(6,'(1x,a,4I15)') ' Read were: ', nxin, nyin, nzin, nzsoilin
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.'
READ(inch,ERR=9110,END=9120) label
READ(inch,ERR=9110,END=9120) zpsoil
WRITE(6,'(1x,a,a12,a)') &
'Field ',label,' was read into array zpsoil.'
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
DO k=1,nzsoil1
DO j=1,ny1
DO i=1,nx1
zpsoil1(i,j,k) = zpsoil(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)
CALL inisoilgrd
(nx1,ny1,nzsoil1,hterain1,zpsoil1, &
j3soil1,j3soilinv1)
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 (cmnt(nocmnt),'(a,i4,a,i4,a,i4,a,i4)') &
' nx =',nx1,', ny =',ny1,', nz =',nz1,', nzsoil =',nzsoil1
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
WRITE(nchanl) 'zpsoil coor r3d0'
WRITE(nchanl) zpsoil1
CALL a3dmax0
(zpsoil1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nzsoil1,1,nzsoil1, &
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
READ(inch,ERR=9115,END=9125) nxin, nyin, nzin, nzsoilin
! 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
IF( nxin /= nx .OR. nyin /= ny .OR. nzin /= nz .OR. &
nzsoilin /= nzsoil ) THEN
WRITE(6,'(1x,a)') &
' Dimensions in ARPSINTRP inconsistent with data.'
WRITE(6,'(1x,a,4I15)') ' Read were: ', nxin, nyin, nzin, nzsoilin
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) mapproj, 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.'
READ(inch,ERR=9115,END=9125) label
READ(inch,ERR=9115,END=9125) zpsoil
WRITE(6,'(1x,a,a12,a)') &
'Field ',label,' was read into array zpsoil.'
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
WRITE(nchanl) 'zpsoil coor r3d0'
WRITE(nchanl) zpsoil1
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
READ(inch,ERR=9115,END=9125) label
READ(inch,ERR=9115,END=9125) &
(((tsoilin(i,j,k,0),i=1,nx),j=1,ny),k=1,nzsoil)
WRITE(nchanl) 'tsoil rs3d0'
DO k = 1,nzsoil
a2din(:,:) = tsoilin(:,:,k,0)
CALL intrp2d
(nx,ny,nx1,ny1,x,y,x1,y1,samgrd,a2din,a2dout)
WRITE(nchanl) ((a2dout(i,j),i=1,nx1),j=1,ny1)
IF ( lsoildmp ) WRITE(soilchanl) a2dout
END DO
READ(inch,ERR=9115,END=9125) label
READ(inch,ERR=9115,END=9125) &
(((qsoilin(i,j,k,0),i=1,nx),j=1,ny),k=1,nzsoil)
WRITE(nchanl) 'qsoil rs3d0'
DO k = 1,nzsoil
a2din(:,:) = qsoilin(:,:,k,0)
CALL intrp2d
(nx,ny,nx1,ny1,x,y,x1,y1,samgrd,a2din,a2dout)
WRITE(nchanl) ((a2dout(i,j),i=1,nx1),j=1,ny1)
IF ( lsoildmp ) WRITE(soilchanl) a2dout
END DO
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
IF (is <= nstyps) THEN
READ(inch,ERR=9115,END=9125) label
READ(inch,ERR=9115,END=9125) &
(((tsoilin(i,j,k,is),i=1,nx),j=1,ny),k=1,nzsoil)
WRITE(nchanl) 'tsoil rs3d0'
DO k = 1,nzsoil
a2din(:,:) = tsoilin(:,:,k,is)
CALL intrp2d
(nx,ny,nx1,ny1,x,y,x1,y1,samgrd,a2din,a2dout)
WRITE(nchanl) ((a2dout(i,j),i=1,nx1),j=1,ny1)
IF ( lsoildmp ) WRITE(soilchanl) a2dout
END DO
READ(inch,ERR=9115,END=9125) label
READ(inch,ERR=9115,END=9125) &
(((qsoilin(i,j,k,is),i=1,nx),j=1,ny),k=1,nzsoil)
WRITE(nchanl) 'qsoil rs3d0'
DO k = 1,nzsoil
a2din(:,:) = qsoilin(:,:,k,is)
CALL intrp2d
(nx,ny,nx1,ny1,x,y,x1,y1,samgrd,a2din,a2dout)
WRITE(nchanl) ((a2dout(i,j),i=1,nx1),j=1,ny1)
IF ( lsoildmp ) WRITE(soilchanl) a2dout
END DO
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
ENDIF
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, & 16
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