!
!##################################################################
!##################################################################
!######                                                      ######
!######                  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