!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE DTAREAD ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE dtaread(nx,ny,nz,nstyps, & 23,130
hinfmt, nchanl,grdbasfn,lengbf,datafn,lendtf, time, &
x,y,z,zp, uprt ,vprt ,wprt ,ptprt, pprt , &
qvprt, qc, qr, qi, qs, qh, tke, kmh,kmv, &
ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
ireturn, tem1, tem2, tem3)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Coordinate the reading of history data of various formats.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 2/19/1992.
!
! MODIFICATION HISTORY:
!
! 10/06/1992 (K. Brewster)
! Added ENTRY SETGBRD to allow the reading of
! more than one grid-base file in a program.
!
! 4/23/93 (M. Xue)
! New data format.
!
! 3/30/94 (M.Xue)
! GrADS data format and surface fields.
!
! 12/01/95 (Yuhe Liu)
! Fixed a bug in netread call for dumping grid and base data file.
! The file name was previously given to datafn, instead of grdbasfn.
!
! 12/01/95 (Yuhe Liu)
! Changed the order of reading grid and base file and history files.
! Previously the code read history file first and then checked if
! need to read the grid and base file. In order to cooperate with
! GRIB data format which no longer contains perturbation variables,
! the base fields have to ready so that the perturbation fields can
! be derived from total fields substracting the base fields.
!
! 12/07/95 (Yuhe Liu)
! Added a new data dumping format, GRIB. The parameter definitions
! is mostly in consistance with NMC standard, despite those
! variables which are not in the WMO and NMC's tables (Table 2)
!
! 01/22/1996 (Yuhe Liu)
! Changed the ARPS history dumpings to dump the total values of
! ARPS variables, instead of the perturbated values.
!
! 12/09/1998 (Donghai Wang)
! Added the snow cover.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx,ny,nz The dimension of data arrays
!
! hinfmt The format of the history data dump
! =1, machine dependent unformatted binary dump,
! =2, formatted ascii dump,
! =3, NCSA HDF file format.
! =4, machine dependent packed unformatted binary dump
!
! nchanl FORTRAN I/O channel number for history data output.
!
! grdbasfn Name of the grid/base state array file
! lengbf Length of the grid/base state data file name string
! datafn Name of the other time dependent data file
! lendtf Length of the data file name string
!
! DATA ARRAYS READ IN:
!
! x x coordinate of grid points in physical/comp. space (m)
! y y coordinate of grid points in physical/comp. space (m)
! z z coordinate of grid points in computational space (m)
! zp z coordinate of grid points in physical space (m)
!
! uprt x component of perturbation velocity (m/s)
! vprt y component of perturbation velocity (m/s)
! wprt vertical component of perturbation velocity
! in Cartesian coordinates (m/s).
!
! ptprt perturbation potential temperature (K)
! pprt perturbation pressure (Pascal)
! qvprt perturbation water vapor mixing ratio (kg/kg)
!
! qc Cloud water mixing ratio (kg/kg)
! qr Rainwater mixing ratio (kg/kg)
! qi Cloud ice mixing ratio (kg/kg)
! qs Snow mixing ratio (kg/kg)
! qh Hail mixing ratio (kg/kg)
! tke Turbulent Kinetic Energy ((m/s)**2)
!
! kmh Horizontal turb. mixing coef. for momentum ( m**2/s )
! kmv Vertical turb. mixing coef. for momentum ( m**2/s )
!
! ubar Base state x velocity component (m/s)
! vbar Base state y velocity component (m/s)
! wbar Base state z velocity component (m/s)
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
! rhobar Base state air density (kg/m**3)
! qvbar Base state water vapor mixing ratio (kg/kg)
!
! soiltyp Soil type
! stypfrct Soil type fraction
! vegtyp Vegetation type
! lai Leaf Area Index
! roufns Surface roughness
! veg Vegetation fraction
!
! tsfc Temperature at surface (K)
! tsoil Deep soil temperature (K)
! wetsfc Surface soil moisture
! wetdp Deep soil moisture
! wetcanp Canopy water amount
!
! raing Grid supersaturation rain
! rainc Cumulus convective rain
! prcrate Precipitation rates
!
! radfrc Radiation forcing (K/s)
! radsw Solar radiation reaching the surface
! rnflx Net radiation flux absorbed by surface
!
! usflx Surface flux of u-momentum (kg/(m*s**2))
! vsflx Surface flux of v-momentum (kg/(m*s**2))
! ptsflx Surface heat flux (K*kg/(m**2 * s ))
! qvsflx Surface moisture flux of (kg/(m**2 * s))
!
! OUTPUT:
!
! time The time of the input data (s)
! x x coordinate of grid points in physical/comp. space (m)
! y y coordinate of grid points in physical/comp. space (m)
! z z coordinate of grid points in computational space (m)
! zp z coordinate of grid points in physical space (m)
!
! uprt x component of perturbation velocity (m/s)
! vprt y component of perturbation velocity (m/s)
! wprt vertical component of perturbation velocity in
! Cartesian coordinates (m/s).
!
! ptprt perturbation potential temperature (K)
! pprt perturbation pressure (Pascal)
!
! qvprt perturbation water vapor mixing ratio (kg/kg)
! qc Cloud water mixing ratio (kg/kg)
! qr Rainwater mixing ratio (kg/kg)
! qi Cloud ice mixing ratio (kg/kg)
! qs Snow mixing ratio (kg/kg)
! qh Hail mixing ratio (kg/kg)
! tke Turbulent Kinetic Energy ((m/s)**2)
!
! kmh Horizontal turb. mixing coef. for momentum ( m**2/s )
! kmv Vertical turb. mixing coef. for momentum ( m**2/s )
!
! ubar Base state x velocity component (m/s)
! vbar Base state y velocity component (m/s)
! wbar Base state z velocity component (m/s)
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
! rhobar Base state air density (kg/m**3)
! qvbar Base state water vapor mixing ratio (kg/kg)
!
! soiltyp Soil type
! stypfrct Soil type fraction
! vegtyp Vegetation type
! lai Leaf Area Index
! roufns Surface roughness
! veg Vegetation fraction
!
! tsfc Temperature at surface (K)
! tsoil Deep soil temperature (K)
! wetsfc Surface soil moisture
! wetdp Deep soil moisture
! wetcanp Canopy water amount
!
! raing Grid supersaturation rain
! rainc Cumulus convective rain
! prcrate Precipitation rates
!
! radfrc Radiation forcing (K/s)
! radsw Solar radiation reaching the surface
! rnflx Net radiation flux absorbed by surface
!
! usflx Surface flux of u-momentum (kg/(m*s**2))
! vsflx Surface flux of v-momentum (kg/(m*s**2))
! ptsflx Surface heat flux (K*kg/(m**2 * s ))
! qvsflx Surface moisture flux of (kg/(m**2 * s))
!
! ireturn Return status indicator
!
! WORK ARRAYS:
!
! tem1 Temporary work array.
! tem2 Temporary work array.
! tem3 Temporary work array.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
REAL :: time ! The time of the input data (s)
INTEGER :: hinfmt ! The format of the history data dump
INTEGER :: lengbf ! Length of the grid/base state data
! file name string
INTEGER :: lendtf ! Length of the data file name string
CHARACTER(LEN=*) :: grdbasfn ! Name of the grid/base state array file
CHARACTER(LEN=*) :: datafn ! Name of the other time dependent
! data file
REAL :: x (nx) ! x-coord. of the physical and compu
! -tational grid. Defined at u-point(m).
REAL :: y (ny) ! y-coord. of the physical and compu
! -tational grid. Defined at v-point(m).
REAL :: z (nz) ! z-coord. of the computational grid.
! Defined at w-point on the staggered
! grid(m).
REAL :: zp (nx,ny,nz) ! Physical height coordinate defined at
! w-point of the staggered grid(m).
REAL :: uprt (nx,ny,nz) ! x component of perturbation velocity
! (m/s)
REAL :: vprt (nx,ny,nz) ! y component of perturbation velocity
! (m/s)
REAL :: wprt (nx,ny,nz) ! vertical component of perturbation
! velocity in Cartesian coordinates
! (m/s).
REAL :: ptprt(nx,ny,nz) ! perturbation potential temperature (K)
REAL :: pprt (nx,ny,nz) ! perturbation pressure (Pascal)
REAL :: qvprt(nx,ny,nz) ! perturbation water vapor mixing ratio
! (kg/kg)
REAL :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg)
REAL :: qr (nx,ny,nz) ! Rainwater mixing ratio (kg/kg)
REAL :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg)
REAL :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg)
REAL :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg)
REAL :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2)
REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for
! momentum. ( m**2/s )
REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for
! momentum. ( m**2/s )
REAL :: ubar (nx,ny,nz) ! Base state x velocity component (m/s)
REAL :: vbar (nx,ny,nz) ! Base state y velocity component (m/s)
REAL :: wbar (nx,ny,nz) ! Base state z velocity component (m/s)
REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3)
REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal)
REAL :: qvbar (nx,ny,nz) ! Base state water vapor mixing ratio
! (kg/kg)
INTEGER :: nstyps ! Number of soil type
INTEGER :: soiltyp (nx,ny,nstyps) ! Soil type
REAL :: stypfrct(nx,ny,nstyps) ! Soil type
INTEGER :: vegtyp (nx,ny) ! Vegetation type
REAL :: lai (nx,ny) ! Leaf Area Index
REAL :: roufns (nx,ny) ! Surface roughness
REAL :: veg (nx,ny) ! Vegetation fraction
REAL :: tsfc (nx,ny,0:nstyps) ! Temperature at surface (K)
REAL :: tsoil (nx,ny,0:nstyps) ! Deep soil temperature (K)
REAL :: wetsfc (nx,ny,0:nstyps) ! Surface soil moisture
REAL :: wetdp (nx,ny,0:nstyps) ! Deep soil moisture
REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount
REAL :: snowdpth(nx,ny) ! Snow depth (m)
REAL :: raing(nx,ny) ! Grid supersaturation rain
REAL :: rainc(nx,ny) ! Cumulus convective rain
REAL :: prcrate(nx,ny,4) ! precipitation rate (kg/(m**2*s))
! prcrate(1,1,1) = total precip. rate
! prcrate(1,1,2) = grid scale precip. rate
! prcrate(1,1,3) = cumulus precip. rate
! prcrate(1,1,4) = microphysics precip. rate
REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s)
REAL :: radsw (nx,ny) ! Solar radiation reaching the surface
REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface
REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2))
REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2))
REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m*s**2))
REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s))
REAL :: tem1(nx,ny,nz) ! Temporary work array
REAL :: tem2(nx,ny,nz) ! Temporary work array
REAL :: tem3(nx,ny,nz) ! Temporary work array
INTEGER :: grdread,iread
SAVE grdread
INTEGER :: nchanl ! FORTRAN I/O channel number for output
INTEGER :: istat
INTEGER :: ireturn ! Return status indicator
INTEGER :: grdbas ! Wether this is a grid/base state
! array dump
REAL :: btime ! The time of the base state data
REAL :: p0inv, amin, amax
INTEGER :: i,j,k
INTEGER :: ierr
LOGICAL :: fexist
INTEGER :: packed
CHARACTER (LEN=80) :: rname
INTEGER :: is
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'indtflg.inc'
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
INCLUDE 'mp.inc' ! mpi parameters.
INCLUDE 'phycst.inc'
DATA grdread /0/
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
ireturn = 0
p0inv=1./p0
IF (lengbf < 1) lengbf = len_trim(grdbasfn)
IF (lendtf < 1) lendtf = len_trim(datafn)
!
!-----------------------------------------------------------------------
!
! Open and read grid and base state data file depending on the
! values of parameters grdin and basin, which are read in from the
! time dependent data set. If grdin or basin is zero, the grid and
! base state arrays have to be read in from a separate file.
!
!-----------------------------------------------------------------------
!
IF ( hinfmt == 9 ) GO TO 500
IF( grdread == 0 ) THEN
grdbas = 1
rname = runname
INQUIRE(FILE=trim(grdbasfn(1:lengbf)), EXIST = fexist )
IF( fexist ) GO TO 200
INQUIRE(FILE=trim(grdbasfn(1:lengbf))//'.Z', EXIST = fexist )
IF( fexist ) THEN
CALL uncmprs
( trim(grdbasfn(1:lengbf))//'.Z' )
GO TO 200
END IF
INQUIRE(FILE=trim(grdbasfn(1:lengbf))//'.gz', EXIST = fexist )
IF( fexist ) THEN
CALL uncmprs
( trim(grdbasfn(1:lengbf))//'.gz' )
GO TO 200
END IF
WRITE(6,'(/1x,a,/1x,a/)') &
'File '//trim(grdbasfn(1:lengbf))// &
' or its compressed version not found.', &
'Program stopped in DTAREAD.'
CALL arpsstop
('arpsstop called from dtaread during base state read',1)
200 CONTINUE
!
!-----------------------------------------------------------------------
!
! Read grid and base state fields.
!
!-----------------------------------------------------------------------
!
IF( hinfmt == 1 ) THEN
CALL getunit
( nchanl )
!
!-----------------------------------------------------------------------
!
! Cray routines to force binary data file to be in the IEEE format
!
!-----------------------------------------------------------------------
!
CALL asnctl
('NEWLOCAL', 1, ierr)
CALL asnfile
(trim(grdbasfn(1:lengbf)), '-F f77 -N ieee', ierr)
OPEN(UNIT=nchanl,FILE=trim(trim(grdbasfn(1:lengbf))), &
STATUS='old',FORM='unformatted',IOSTAT=istat)
IF( istat /= 0 ) GO TO 999
CALL binread
(nx,ny,nz,nstyps, grdbas, nchanl, btime, x,y,z,zp, &
uprt ,vprt ,wprt ,ptprt, pprt, &
qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, &
ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
ireturn)
CLOSE(UNIT=nchanl)
CALL retunit( nchanl )
ELSE IF( hinfmt == 2 ) THEN
CALL getunit
( nchanl )
OPEN(UNIT=nchanl,FILE=trim(trim(grdbasfn(1:lengbf))), &
STATUS='old',FORM='formatted',IOSTAT=istat)
IF( istat /= 0 ) GO TO 999
CALL ascread
(nx,ny,nz,nstyps,grdbas,nchanl,btime,x,y,z,zp, &
uprt ,vprt ,wprt ,ptprt, pprt, &
qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, &
ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
ireturn)
CLOSE(UNIT=nchanl)
CALL retunit( nchanl )
ELSE IF( hinfmt == 3 ) THEN
CALL hdfread
(nx,ny,nz,nstyps,grdbas, trim(grdbasfn(1:lengbf)), &
btime,x,y,z,zp, &
uprt ,vprt ,wprt ,ptprt, pprt, &
qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, &
ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
ireturn, tem1)
ELSE IF( hinfmt == 4 ) THEN
CALL getunit
( nchanl )
OPEN(UNIT=nchanl,FILE=trim(trim(grdbasfn(1:lengbf))), &
STATUS='old',FORM='unformatted',IOSTAT=istat)
IF( istat /= 0 ) GO TO 999
! CALL pakread(nx,ny,nz,nstyps,grdbas,nchanl,btime,x,y,z,zp, &
! uprt ,vprt ,wprt ,ptprt, pprt, &
! qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, &
! ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, &
! soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
! tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
! raing,rainc,prcrate, &
! radfrc,radsw,rnflx, &
! usflx,vsflx,ptsflx,qvsflx, &
! ireturn, tem1,tem2)
CALL pakread
CLOSE(UNIT=nchanl)
CALL retunit( nchanl )
ELSE IF( hinfmt == 6 ) THEN
CALL getunit
( nchanl )
OPEN(UNIT=nchanl,FILE=trim(trim(grdbasfn(1:lengbf))), &
STATUS='old',FORM='unformatted',IOSTAT=istat)
IF( istat /= 0 ) GO TO 999
CALL bn2read
(nx,ny,nz,nstyps,grdbas,nchanl,btime,x,y,z,zp, &
uprt ,vprt ,wprt ,ptprt, pprt, &
qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, &
ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
ireturn)
CLOSE(UNIT=nchanl)
CALL retunit( nchanl )
ELSE IF (hinfmt == 7) THEN ! NetCDF format
packed = 0
! CALL netread(trim(grdbasfn(1:lengbf)),nx,ny,nz,nstyps,packed, &
! grdbas, x, y, z, zp, &
! uprt ,vprt ,wprt ,ptprt, pprt , &
! qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, &
! ubar, vbar, wbar, ptbar, pbar, &
! rhobar, qvbar, &
! soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
! tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
! raing,rainc,prcrate, &
! radfrc,radsw,rnflx, &
! usflx,vsflx,ptsflx,qvsflx, &
! tem1, tem2, tem3)
CALL netread
ELSE IF (hinfmt == 8) THEN ! NetCDF packed format
packed = 1
! CALL netread(trim(grdbasfn(1:lengbf)),nx,ny,nz,nstyps,packed, &
! grdbas, x, y, z, zp, &
! uprt ,vprt ,wprt ,ptprt, pprt , &
! qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, &
! ubar, vbar, wbar, ptbar, pbar, &
! rhobar, qvbar, &
! soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
! tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
! raing,rainc,prcrate, &
! radfrc,radsw,rnflx, &
! usflx,vsflx,ptsflx,qvsflx, &
! tem1, tem2, tem3)
CALL netread
ELSE IF( hinfmt == 10 ) THEN
!
!-----------------------------------------------------------------------
!
! Cray routines to force binary data file to be in the IEEE format
!
!-----------------------------------------------------------------------
!
CALL asnctl
('NEWLOCAL', 1, ierr)
CALL asnfile
(trim(grdbasfn(1:lengbf)), '-F f77 -N ieee', ierr)
CALL getunit
( nchanl )
OPEN(UNIT=nchanl,FILE=trim(trim(grdbasfn(1:lengbf))),STATUS='old', &
FORM='unformatted',IOSTAT= istat )
CALL gribread
(nx,ny,nz,nstyps,grdbas,nchanl,btime,x,y,z,zp, &
uprt ,vprt ,wprt ,ptprt, pprt , &
qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, &
ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx)
CLOSE(UNIT=nchanl)
CALL retunit( nchanl )
ELSE
WRITE(6,'(a,i3,a)') &
' Data format flag had an invalid value ', &
hinfmt ,' program stopped.'
CALL arpsstop
('arpsstop called from dtaread during base state &
&read',1)
END IF
grdread = 1
runname = rname
END IF
500 CONTINUE
!
!-----------------------------------------------------------------------
!
! Read data fields.
!
!-----------------------------------------------------------------------
!
grdbas = 0
INQUIRE(FILE=trim(datafn(1:lendtf)), EXIST = fexist )
IF( fexist ) GO TO 100
INQUIRE(FILE=trim(datafn(1:lendtf))//'.Z', EXIST = fexist )
IF( fexist ) THEN
CALL uncmprs
( trim(datafn(1:lendtf))//'.Z' )
GO TO 100
END IF
INQUIRE(FILE=trim(datafn(1:lendtf))//'.gz', EXIST = fexist )
IF( fexist ) THEN
CALL uncmprs
( trim(datafn(1:lendtf))//'.gz' )
GO TO 100
END IF
WRITE(6,'(/1x,a,/1x,a/)') &
'File '//trim(datafn(1:lendtf)) &
//' or its compressed version not found.', &
'Program stopped in DTAREAD.'
CALL arpsstop
('arpsstop called from dtaread during base read-2',1)
100 CONTINUE
IF( hinfmt == 1 ) THEN
!
!-----------------------------------------------------------------------
!
! Cray routines to force binary data file to be in the IEEE format
!
!-----------------------------------------------------------------------
!
CALL asnctl
('NEWLOCAL', 1, ierr)
CALL asnfile
(trim(datafn(1:lendtf)), '-F f77 -N ieee', ierr)
CALL getunit
( nchanl )
OPEN(UNIT=nchanl,FILE=trim(trim(datafn(1:lendtf))), &
STATUS='old',FORM='unformatted',IOSTAT=istat)
IF( istat /= 0 ) GO TO 998
CALL binread
(nx,ny,nz,nstyps,grdbas, nchanl, time, x,y,z,zp, &
uprt ,vprt ,wprt ,ptprt, pprt, &
qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, &
ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
ireturn)
CLOSE(UNIT=nchanl)
CALL retunit( nchanl )
ELSE IF( hinfmt == 2 ) THEN
CALL getunit
( nchanl )
OPEN(UNIT=nchanl,FILE=trim(trim(datafn(1:lendtf))), &
STATUS='old',FORM='formatted',IOSTAT=istat)
IF( istat /= 0 ) GO TO 998
CALL ascread
(nx,ny,nz,nstyps,grdbas,nchanl,time,x,y,z,zp, &
uprt ,vprt ,wprt ,ptprt, pprt, &
qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, &
ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
ireturn)
CLOSE(UNIT=nchanl)
CALL retunit( nchanl )
ELSE IF( hinfmt == 3 ) THEN
CALL hdfread
(nx,ny,nz,nstyps,grdbas,trim(datafn(1:lendtf)), &
time,x,y,z,zp, &
uprt ,vprt ,wprt ,ptprt, pprt, &
qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, &
ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
ireturn, tem1)
ELSE IF( hinfmt == 4 ) THEN
CALL getunit
( nchanl )
OPEN(UNIT=nchanl,FILE=trim(trim(datafn(1:lendtf))), &
STATUS='old',FORM='unformatted',IOSTAT=istat)
IF( istat /= 0 ) GO TO 998
! CALL pakread(nx,ny,nz,nstyps,grdbas,nchanl,time,x,y,z,zp, &
! uprt ,vprt ,wprt ,ptprt, pprt, &
! qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, &
! ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, &
! soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
! tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
! raing,rainc,prcrate, &
! radfrc,radsw,rnflx, &
! usflx,vsflx,ptsflx,qvsflx, &
! ireturn, tem1,tem2)
CALL pakread
CLOSE(UNIT=nchanl)
CALL retunit( nchanl )
ELSE IF( hinfmt == 6 ) THEN
CALL getunit
( nchanl )
OPEN(UNIT=nchanl,FILE=trim(trim(datafn(1:lendtf))), &
STATUS='old',FORM='unformatted',IOSTAT=istat)
IF( istat /= 0 ) GO TO 998
CALL bn2read
(nx,ny,nz,nstyps,grdbas, nchanl, time, x,y,z,zp, &
uprt ,vprt ,wprt ,ptprt, pprt , &
qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, &
ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
ireturn)
CLOSE(UNIT=nchanl)
CALL retunit( nchanl )
ELSE IF (hinfmt == 7) THEN ! NetCDF format
packed = 0
! CALL netread(trim(datafn(1:lendtf)),nx,ny,nz,nstyps,packed, &
! grdbas, x, y, z, zp, &
! uprt ,vprt ,wprt ,ptprt, pprt , &
! qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, &
! ubar, vbar, wbar, ptbar, pbar, &
! rhobar, qvbar, &
! soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
! tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
! raing,rainc,prcrate, &
! radfrc,radsw,rnflx, &
! usflx,vsflx,ptsflx,qvsflx, &
! tem1, tem2, tem3)
CALL netread
ELSE IF (hinfmt == 8) THEN ! NetCDF packed format
packed = 1
! CALL netread(trim(datafn(1:lendtf)),nx,ny,nz,nstyps,packed, &
! grdbas, x, y, z, zp, &
! uprt ,vprt ,wprt ,ptprt, pprt , &
! qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, &
! ubar, vbar, wbar, ptbar, pbar, &
! rhobar, qvbar, &
! soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
! tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
! raing,rainc,prcrate, &
! radfrc,radsw,rnflx, &
! usflx,vsflx,ptsflx,qvsflx, &
! tem1, tem2, tem3)
CALL netread
ELSE IF( hinfmt == 9 ) THEN
!
!-----------------------------------------------------------------------
!
! hinfmt = 9, read GrADS format data file. Since the DTAREAD
! subroutine doesn't define u, v, w, pt, p, qv, we have to use
! those base variables such ubar, vbar, wbar, ptbar, pbar, and
! qvbar as temporary arrays to store u, v, w, pt, p, qv.
!
!-----------------------------------------------------------------------
!
CALL gradsread
(nx,ny,nz,nstyps, &
nchanl, trim(datafn(1:lendtf)), time, &
x,y,z,zp, uprt,vprt,wprt,ptprt,pprt, &
qvprt,qc,qr,qi,qs,qh, tke,kmh,kmv, &
ubar,vbar,ptbar,pbar,rhobar,qvbar, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
ireturn, tem1)
DO k = 1, nz
DO j = 1, ny
DO i = 1, nx
ubar (i,j,k) = ubar (i,j,k) - uprt (i,j,k)
vbar (i,j,k) = vbar (i,j,k) - vprt (i,j,k)
wbar (i,j,k) = 0.0
pbar (i,j,k) = pbar (i,j,k) - pprt (i,j,k)
ptbar(i,j,k) = ptbar(i,j,k) - ptprt(i,j,k)
qvbar(i,j,k) = qvbar(i,j,k) - qvprt(i,j,k)
END DO
END DO
END DO
grdin = 1
ELSE IF( hinfmt == 10 ) THEN
!
!-----------------------------------------------------------------------
!
! hinfmt = 10, read GRIB format data file.
!
!-----------------------------------------------------------------------
!
CALL asnctl
('NEWLOCAL', 1, ierr)
CALL asnfile
(trim(datafn(1:lendtf)), '-F f77 -N ieee', ierr)
CALL getunit
( nchanl )
OPEN(UNIT=nchanl,FILE=trim(trim(datafn(1:lendtf))),STATUS='old', &
FORM='unformatted',IOSTAT= istat )
CALL gribread
(nx,ny,nz,nstyps, grdbas, nchanl, time, x,y,z,zp, &
uprt ,vprt ,wprt ,ptprt, pprt , &
qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, &
ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx)
CLOSE(UNIT=nchanl)
CALL retunit( nchanl )
ELSE
WRITE(6,'(a,i3,a)') &
' Data format flag had an invalid value ', &
hinfmt ,' program stopped.'
CALL arpsstop
('arpsstop called from dtaread during read',1)
END IF
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
rhobar(i,j,k)= pbar(i,j,k)/ &
( rd * ptbar(i,j,k)*(pbar(i,j,k)*p0inv)**rddcp )
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Set dx, dy and dz from read-in data
!
!-----------------------------------------------------------------------
!
dx = x(2) - x(1)
dy = y(2) - y(1)
dz = z(2) - z(1)
!
IF (myproc == 0) &
WRITE(6,'(/1x,a/)') 'Min. and max. of the data arrays read in:'
CALL edgfill
(x,1,nx,1,nx,1,1,1,1,1,1,1,1)
CALL a3dmax0lcl
(x,1,nx,1,nx,1,1,1,1,1,1,1,1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(/1x,2(a,e13.6))') 'xmin = ', amin,', xmax =',amax
CALL edgfill
(y,1,ny,1,ny,1,1,1,1,1,1,1,1)
CALL a3dmax0lcl
(y,1,ny,1,ny,1,1,1,1,1,1,1,1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') 'ymin = ', amin,', ymax =',amax
CALL edgfill
(z,1,nz,1,nz,1,1,1,1,1,1,1,1)
CALL a3dmax0lcl
(z,1,nz,1,nz,1,1,1,1,1,1,1,1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') 'zmin = ', amin,', zmax =',amax
CALL edgfill
(zp,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz)
CALL a3dmax0lcl
(zp,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') 'zpmin = ', amin,', zpmax =',amax
CALL edgfill
(ubar,1,nx,1,nx,1,ny,1,ny-1,1,nz,1,nz-1)
CALL a3dmax0lcl
(ubar,1,nx,1,nx,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') 'ubarmin = ', amin,', ubarmax =',amax
CALL edgfill
(vbar,1,nx,1,nx-1,1,ny,1,ny,1,nz,1,nz-1)
CALL a3dmax0lcl
(vbar,1,nx,1,nx-1,1,ny,1,ny,1,nz,1,nz-1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') 'vbarmin = ', amin,', vbarmax =',amax
CALL edgfill
(wbar,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz)
CALL a3dmax0lcl
(wbar,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') 'wbarmin = ', amin,', wbarmax =',amax
CALL edgfill
(ptbar,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
CALL a3dmax0lcl
(ptbar,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') 'ptbarmin= ', amin,', ptbarmax=',amax
CALL edgfill
(pbar,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
CALL a3dmax0lcl
(pbar,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') 'pbarmin = ', amin,', pbarmax =',amax
IF( mstin == 1) THEN
CALL edgfill
(qvbar,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
CALL a3dmax0lcl
(qvbar,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') 'qvbarmin= ', amin, ', qvbarmax=',amax
END IF
CALL edgfill
(uprt,1,nx,1,nx,1,ny,1,ny-1,1,nz,1,nz-1)
CALL a3dmax0lcl
(uprt,1,nx,1,nx,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') 'uprtmin = ', amin,', uprtmax =',amax
CALL edgfill
(vprt,1,nx,1,nx-1,1,ny,1,ny,1,nz,1,nz-1)
CALL a3dmax0lcl
(vprt,1,nx,1,nx-1,1,ny,1,ny,1,nz,1,nz-1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') 'vprtmin = ', amin,', vprtmax =',amax
CALL edgfill
(wprt,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz)
CALL a3dmax0lcl
(wprt,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') 'wprtmin = ', amin,', wprtmax =',amax
CALL edgfill
(ptprt,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
CALL a3dmax0lcl
(ptprt,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') 'ptprtmin= ', amin,', ptprtmax=',amax
CALL edgfill
(pprt,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
CALL a3dmax0lcl
(pprt,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') 'pprtmin = ', amin,', pprtmax =',amax
IF( mstin == 1) THEN
CALL edgfill
(qvprt,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
CALL a3dmax0lcl
(qvprt,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') 'qvprtmin= ', amin, &
', qvprtmax=',amax
CALL edgfill
(qc,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
CALL a3dmax0lcl
(qc,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') 'qcmin = ', amin, &
', qcmax =',amax
CALL edgfill
(qr,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
CALL a3dmax0lcl
(qr,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') 'qrmin = ', amin, &
', qrmax =',amax
IF( icein == 1) THEN
CALL edgfill
(qi,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
CALL a3dmax0lcl
(qi,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') 'qimin = ', amin, &
', qimax =',amax
CALL edgfill
(qs,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
CALL a3dmax0lcl
(qs,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') 'qsmin = ', amin, &
', qsmax =',amax
CALL edgfill
(qh,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
CALL a3dmax0lcl
(qh,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') 'qhmin = ', amin, &
', qhmax =',amax
END IF
IF(rainin == 1) THEN
CALL edgfill
(raing,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL a3dmax0lcl
(raing,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') &
'raingmin= ', amin,', raingmax=',amax
CALL edgfill
(rainc,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL a3dmax0lcl
(rainc,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') &
'raincmin= ', amin,', raincmax=',amax
END IF
IF( prcin == 1 ) THEN
CALL edgfill
(prcrate(1,1,1),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL a3dmax0lcl
(prcrate(1,1,1),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') &
'prcr1min= ', amin,', prcr1max=',amax
CALL edgfill
(prcrate(1,1,2),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL a3dmax0lcl
(prcrate(1,1,2),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') &
'prcr2min= ', amin,', prcr2max=',amax
CALL edgfill
(prcrate(1,1,3),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL a3dmax0lcl
(prcrate(1,1,3),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') &
'prcr3min= ', amin,', prcr3max=',amax
CALL edgfill
(prcrate(1,1,4),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL a3dmax0lcl
(prcrate(1,1,4),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') &
'prcr4min= ', amin,', prcr4max=',amax
END IF
END IF
IF (tkein == 1) THEN
CALL edgfill
(tke,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
CALL a3dmax0lcl
(tke,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.4))') &
'tkemin = ', amin,', tkemax =',amax
END IF
IF (trbin == 1) THEN
CALL edgfill
(kmh,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
CALL a3dmax0lcl
(kmh,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.4))') &
'kmhmin = ', amin,', kmhmax =',amax
CALL edgfill
(kmv,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
CALL a3dmax0lcl
(kmv,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.4))') &
'kmvmin = ', amin,', kmvmax =',amax
END IF
IF( sfcin == 1 ) THEN
DO is = 0, nstyp
IF(myproc == 0) &
PRINT*,'Max/min of soil model variables for type index ', is
CALL edgfill
(tsfc(1,1,is),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL a3dmax0lcl
(tsfc(1,1,is),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
IF(myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') &
'tsfcmin = ', amin,', tsfcmax =',amax
CALL edgfill
(tsoil(1,1,is),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL a3dmax0lcl
(tsoil(1,1,is),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
IF(myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') &
'tsoilmin= ', amin,', tsoilmax=',amax
CALL edgfill
(wetsfc(1,1,is),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL a3dmax0lcl
(wetsfc(1,1,is),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
IF(myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') &
'wetsmin = ', amin,', wetsmax =',amax
CALL edgfill
(wetdp(1,1,is),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL a3dmax0lcl
(wetdp(1,1,is),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
IF(myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') &
'wetdmin = ', amin,', wetdmax =',amax
CALL edgfill
(wetcanp(1,1,is),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL a3dmax0lcl
(wetcanp(1,1,is),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
IF(myproc == 0) &
WRITE(6,'(1x,2(a,e13.6))') &
'wetcmin = ', amin,', wetcmax =',amax
END DO
END IF
IF ( radin == 1 ) THEN
CALL edgfill
(radfrc,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1)
CALL a3dmax0lcl
(radfrc,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.4))') &
'radfmin = ', amin,', radfmax =',amax
CALL edgfill
(radsw,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL a3dmax0lcl
(radsw,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.4))') &
'radswmin= ', amin,', radswmax=',amax
CALL edgfill
(rnflx,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL a3dmax0lcl
(rnflx,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.4))') &
'rnflxmin= ', amin,', rnflxmax=',amax
END IF
IF ( flxin == 1 ) THEN
CALL edgfill
(usflx,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL a3dmax0lcl
(usflx,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.4))') &
'usflxmin= ', amin,', usflxmax=',amax
CALL edgfill
(vsflx,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL a3dmax0lcl
(vsflx,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.4))') &
'vsflxmin= ', amin,', vsflxmax=',amax
CALL edgfill
(ptsflx,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL a3dmax0lcl
(ptsflx,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.4))') &
'ptflxmin= ', amin,', ptflxmax=',amax
CALL edgfill
(qvsflx,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL a3dmax0lcl
(qvsflx,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
IF (myproc == 0) &
WRITE(6,'(1x,2(a,e13.4))') &
'qvflxmin= ', amin,', qvflxmax=',amax
END IF
RETURN
!##################################################################
!##################################################################
!###### ######
!###### ENTRY SETGBRD ######
!###### ######
!##################################################################
!##################################################################
ENTRY setgbrd (iread)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Set the gridread parameter so that the grid/base state file
! will (iread=0) or will not (iread=1) be read. This is useful
! if more than one history file is to be accessed during a run
! (primarily in data assimilation experiments).
!
! As a default, the grid/base file is read on the first call to
! dtaread and not on subsequent calls. dtaread resets grdread
! to 1 after each time a grid/base file is read.
!
!-----------------------------------------------------------------------
!
grdread=iread
RETURN
! 997 CONTINUE
WRITE(6,'(1x,a,a,/1x,i3,a)') &
'Error occured when opening GRIB file ',trim(datafn(1:lendtf)), &
'with the FILE pointer ',nchanl,' Program stopped in DTAREAD.'
CALL arpsstop
('arpsstop called from dtaread during Grid read',1)
998 CONTINUE
WRITE(6,'(1x,a,a,/1x,i3,a)') &
'Error occured when opening file ',trim(datafn(1:lendtf)), &
'using FORTRAN unit ',nchanl,' Program stopped in DTAREAD.'
CALL arpsstop
('arpsstop called from dtaread during file read',1)
999 CONTINUE
WRITE(6,'(1x,a,a,/1x,i3,a)') &
'Error occured when opening file ',trim(grdbasfn(1:lengbf)), &
'using FORTRAN unit ',nchanl,' Program stopped in DTAREAD.'
CALL arpsstop
('arpsstop called from dtaread during file read',1)
END SUBROUTINE dtaread
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE DTADUMP ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE dtadump(nx,ny,nz,nstyps, & 24,35
houtfmt,nchout,filnam,grdbas,flcmprs, &
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke,kmh,kmv, &
ubar,vbar,wbar,ptbar,pbar,rhobar,qvbar, &
x,y,z,zp,hterain, j1,j2,j3, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
tem1,tem2,tem3)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Coordinate the history data dump in various data formats by
! calling the appropriate history dump routine.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 8/23/1992
!
! MODIFICATION HISTORY:
!
! 4/4/93 (M. Xue)
! Modified, so that data on the original staggered grid are written
! out. Averaging to the volume center is no longer done.
!
! 9/1/94 (Y. Lu)
! Cleaned up documentation.
!
! 4/22/1995 (M. Xue)
! Modified external boundary condition file naming format, so
! that the files can be directed to directory 'dirname'.
!
! 4/24/1995 (M. Xue)
! Changed boundary file naming convention.
!
! 12/07/95 (Yuhe Liu)
! Added a new data dumping format, GRIB. The parameter definitions
! is mostly in consistance with NMC standard, despite those
! variables which are not in the WMO and NMC's tables (Table 2)
!
! 01/22/1996 (Yuhe Liu)
! Changed the ARPS history dumpings to dump the total values of
! ARPS variables, instead of the perturbated values.
!
! 04/30/1997 (Fanyou Kong -- CMRP)
! Add Vis5D format conversion
!
! 12/09/1998 (Donghai Wang)
! Added the snow cover.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! nstyps number of soil type
!
! houtfmt The format flag of history data dump
! nchout FORTRAN I/O channel number for history data output.
! filnam The name of history data dump file
! grdbas Flag indicating if this is a call for the data dump
! of grid and base state arrays only. If so, grdbas=1.
! flcmprs Option for file compression (0 or 1), not used in this
! routine. A identical variable, filcmprs, is passed
! through include file globcst.inc
!
! u x component of velocity at a given time level (m/s)
! v y component of velocity at a given time level (m/s)
! w Vertical component of Cartesian velocity at a given
! time level (m/s)
! ptprt Perturbation potential temperature at a given time
! level (K)
! pprt Perturbation pressure at a given time level (Pascal)
! qv Water vapor specific humidity at a given time level (kg/kg)
! qc Cloud water mixing ratio at a given time level (kg/kg)
! qr Rainwater mixing ratio at a given time level (kg/kg)
! qi Cloud ice mixing ratio at a given time level (kg/kg)
! qs Snow mixing ratio at a given time level (kg/kg)
! qh Hail mixing ratio at a given time level (kg/kg)
! tke Turbulent Kinetic Energy ((m/s)**2)
!
! kmh Horizontal turb. mixing coef. for momentum ( m**2/s )
! kmv Vertical turb. mixing coef. for momentum ( m**2/s )
!
! ubar Base state x-velocity component (m/s)
! vbar Base state y-velocity component (m/s)
! wbar Base state vertical velocity component (m/s)
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
! rhobar Base state density (kg/m**3)
! qvbar Base state water vapor specific humidity (kg/kg)
!
! x x coordinate of grid points in physical/comp. space (m)
! y y coordinate of grid points in physical/comp. space (m)
! z z coordinate of grid points in computational space (m)
! zp Vertical coordinate of grid points in physical space (m)
! hterain Terrain height (m)
!
! j1 Coordinate transformation Jacobian -d(zp)/dx
! j2 Coordinate transformation Jacobian -d(zp)/dy
! j3 Coordinate transformation Jacobian d(zp)/dz
!
! soiltyp Soil type
! vegtyp Vegetation type
! lai Leaf Area Index
! roufns Surface roughness
! veg Vegetation fraction
!
! tsfc Temperature at ground (K) (in top 1 cm layer)
! tsoil Deep soil temperature (K) (in deep 1 m layer)
! wetsfc Surface soil moisture in the top 1 cm layer
! wetdp Deep soil moisture in the deep 1 m layer
! wetcanp Canopy water amount
!
! raing Grid supersaturation rain
! rainc Cumulus convective rain
! prcrate Precipitation rates
!
! radfrc Radiation forcing (K/s)
! radsw Solar radiation reaching the surface
! rnflx Net radiation flux absorbed by surface
!
! usflx Surface flux of u-momentum (kg/(m*s**2))
! vsflx Surface flux of v-momentum (kg/(m*s**2))
! ptsflx Surface heat flux (K*kg/(m**2 * s ))
! qvsflx Surface moisture flux of (kg/(m**2 * s))
!
! OUTPUT:
!
! None.
!
! WORK ARRAY:
!
! tem1 Temporary work array.
! tem2 Temporary work array.
! tem3 Temporary work array.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
INTEGER :: houtfmt ! Flag of history data dump format
INTEGER :: nchout ! FORTRAN I/O channel number for output
CHARACTER (LEN=80) :: filnam ! The name of history dump data file
INTEGER :: grdbas ! If this is a grid/base state array dump
INTEGER :: flcmprs ! Option for file compression (0 or 1).
REAL :: u (nx,ny,nz) ! Total u-velocity (m/s)
REAL :: v (nx,ny,nz) ! Total v-velocity (m/s)
REAL :: w (nx,ny,nz) ! Total w-velocity (m/s)
REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K)
REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal)
REAL :: qv (nx,ny,nz) ! Water vapor specific humidity (kg/kg)
REAL :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg)
REAL :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg)
REAL :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg)
REAL :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg)
REAL :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg)
REAL :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2)
REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for
! momentum. ( m**2/s )
REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for
! momentum. ( m**2/s )
REAL :: ubar (nx,ny,nz) ! Base state x-velocity (m/s)
REAL :: vbar (nx,ny,nz) ! Base state y-velocity (m/s)
REAL :: wbar (nx,ny,nz) ! Base state z-velocity (m/s)
REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal)
REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3)
REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific humidity
! (kg/kg)
REAL :: x (nx) ! The x-coord. of the physical and
! computational grid. Defined at u-point.
REAL :: y (ny) ! The y-coord. of the physical and
! computational grid. Defined at v-point.
REAL :: z (nz) ! The z-coord. of the computational grid.
! Defined at w-point on the staggered grid.
REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at
! w-point of the staggered grid.
REAL :: hterain(nx,ny) ! Terrain height.
REAL :: j1 (nx,ny,nz) ! Coordinate transformation Jacobian defined
! as - d( zp )/d( x )
REAL :: j2 (nx,ny,nz) ! Coordinate transformation Jacobian defined
! as - d( zp )/d( y )
REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z )
INTEGER :: nstyps ! Number of soil types
INTEGER :: soiltyp(nx,ny,nstyps) ! Soil type
REAL :: stypfrct(nx,ny,nstyps) ! Soil type fractions
INTEGER :: vegtyp (nx,ny) ! Vegetation type
REAL :: lai (nx,ny) ! Leaf Area Index
REAL :: roufns (nx,ny) ! Surface roughness
REAL :: veg (nx,ny) ! Vegetation fraction
REAL :: tsfc (nx,ny,0:nstyps) ! Temperature at surface (K)
REAL :: tsoil (nx,ny,0:nstyps) ! Deep soil temperature (K)
REAL :: wetsfc (nx,ny,0:nstyps) ! Surface soil moisture
REAL :: wetdp (nx,ny,0:nstyps) ! Deep soil moisture
REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount
REAL :: snowdpth(nx,ny) ! Snow depth (m)
REAL :: raing(nx,ny) ! Grid supersaturation rain
REAL :: rainc(nx,ny) ! Cumulus convective rain
REAL :: prcrate(nx,ny,4) ! precipitation rates (kg/(m**2*s))
! prcrate(1,1,1) = total precip. rate
! prcrate(1,1,2) = grid scale precip. rate
! prcrate(1,1,3) = cumulus precip. rate
! prcrate(1,1,4) = microphysics precip. rate
REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s)
REAL :: radsw (nx,ny) ! Solar radiation reaching the surface
REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface
REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2))
REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2))
REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m*s**2))
REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s))
REAL :: tem1 (nx,ny,nz) ! Temporary work array
REAL :: tem2 (nx,ny,nz) ! Temporary work array
REAL :: tem3 (nx,ny,nz) ! Temporary work array
CHARACTER (LEN=256) :: filnamr
INTEGER :: istat, nchout0, nchout1
INTEGER :: ierr
INTEGER :: packed
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc.
REAL :: zpmax
!
!-----------------------------------------------------------------------
!
! Declaration for dumping the external boundary variables
!
!-----------------------------------------------------------------------
!
INTEGER :: i, j, k
INTEGER :: itema, lenstr
INTEGER :: iyr, imon, idy, ihr, imin, isec
CHARACTER (LEN=15) :: ctime
CHARACTER (LEN=80) :: exbcfn
CHARACTER (LEN=80) :: temchar
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
INCLUDE 'bndry.inc'
INCLUDE 'mp.inc' ! Message passing parameters.
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc.
INCLUDE 'exbc.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
IF (sfcout == 1) snowout = 1 ! snowout only independetly zero
! for pre-snow cover versions.
!
! IF( houtfmt.eq.0 ) RETURN ! No data dump
!
!
IF( houtfmt == 1 ) THEN ! Unformatted binary data dump.
!
!-----------------------------------------------------------------------
!
! History dump of unformatted binary data
!
!-----------------------------------------------------------------------
!
CALL getunit
( nchout )
!
!-----------------------------------------------------------------------
!
! Cray routines to force binary data file to be in the IEEE format
!
!-----------------------------------------------------------------------
!
CALL asnctl
('NEWLOCAL', 1, ierr)
CALL asnfile
(filnam, '-F f77 -N ieee', ierr)
OPEN(UNIT=nchout,FILE=trim(filnam),STATUS='new', &
FORM='unformatted',IOSTAT= istat )
IF( istat /= 0) GO TO 999
CALL bindump
(nx,ny,nz,nstyps,nchout, grdbas, &
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
kmh,kmv, ubar,vbar,ptbar,pbar,rhobar,qvbar, &
x,y,z,zp,hterain, j1,j2,j3, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
tem1)
CLOSE(UNIT=nchout)
CALL retunit( nchout )
ELSE IF( houtfmt == 2 ) THEN ! Formatted ASCII data dump
!
!-----------------------------------------------------------------------
!
! History dump of formatted ASCII data
!
!-----------------------------------------------------------------------
!
CALL getunit
( nchout )
OPEN(UNIT=nchout,FILE=trim(filnam),STATUS='new', &
FORM='formatted',IOSTAT= istat )
IF( istat /= 0) GO TO 999
CALL ascdump
(nx,ny,nz,nstyps, nchout, grdbas, &
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
kmh,kmv, ubar,vbar,ptbar,pbar,rhobar,qvbar, &
x,y,z,zp,hterain, j1,j2,j3, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
tem1)
CLOSE(UNIT=nchout)
CALL retunit( nchout )
ELSE IF( houtfmt == 3 ) THEN ! HDF4 format dump.
!
!-----------------------------------------------------------------------
!
! History data dump in NCSA HDF4 file format.
!
!-----------------------------------------------------------------------
!
CALL hdfdump
(nx,ny,nz,nstyps,filnam, grdbas, &
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
kmh,kmv,ubar,vbar,ptbar,pbar,rhobar,qvbar, &
x,y,z,zp,hterain, j1,j2,j3, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
tem1)
ELSE IF( houtfmt == 4 ) THEN ! Packed binary data dump.
!
!-----------------------------------------------------------------------
!
! History dump of packed unformatted binary data
!
!-----------------------------------------------------------------------
!
CALL getunit
( nchout )
OPEN(UNIT=nchout,FILE=trim(filnam),STATUS='new', &
FORM='unformatted',IOSTAT= istat )
IF( istat /= 0) GO TO 999
! CALL pakdump(nx,ny,nz,nstyps,nchout, grdbas, &
! u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
! kmh,kmv, ubar,vbar,ptbar,pbar,rhobar,qvbar, &
! x,y,z,zp,hterain, j1,j2,j3, &
! soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
! tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
! raing,rainc,prcrate, &
! radfrc,radsw,rnflx, &
! usflx,vsflx,ptsflx,qvsflx, &
! tem1, tem2)
CALL pakdump
CLOSE(UNIT=nchout)
CALL retunit( nchout )
ELSE IF( houtfmt == 5 ) THEN ! Data dump for Savi3D
!
!-----------------------------------------------------------------------
!
! History dump for Savi3D.
! Data at all time levels are dumped into a single file.
!
!-----------------------------------------------------------------------
!
nchout0 = 79
CALL svidump
(nx,ny,nz,nstyps,nchout0,filnam, grdbas, &
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
kmh,kmv,ubar,vbar,wbar,ptbar,pbar,rhobar,qvbar, &
x,y,z,zp,hterain, j1,j2,j3, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
tem1,tem2)
ELSE IF( houtfmt == 6 ) THEN ! Unformatted binary data dump.
!
!-----------------------------------------------------------------------
!
! History dump of unformatted binary data
!
!-----------------------------------------------------------------------
!
CALL getunit
( nchout )
OPEN(UNIT=nchout,FILE=trim(filnam),STATUS='new', &
FORM='unformatted',IOSTAT= istat )
IF( istat /= 0) GO TO 999
CALL bn2dump
(nx,ny,nz,nstyps, nchout, grdbas, &
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
kmh,kmv, ubar,vbar,ptbar,pbar,rhobar,qvbar, &
x,y,z,zp,hterain, j1,j2,j3, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
tem1)
CLOSE(UNIT=nchout)
CALL retunit( nchout )
!
!-----------------------------------------------------------------------
!
! NetCDF format dump.
!
!-----------------------------------------------------------------------
!
ELSE IF (houtfmt == 7) THEN ! NetCDF format
packed = 0
! CALL netdump(filnam, nx,ny,nz,nstyps,packed, grdbas, &
! u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
! kmh,kmv, ubar,vbar,wbar,ptbar,pbar,rhobar,qvbar, &
! x,y,z,zp,hterain, j1,j2,j3, &
! soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
! tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
! raing,rainc,prcrate, &
! radfrc,radsw,rnflx, &
! usflx,vsflx,ptsflx,qvsflx, &
! tem1,tem2,tem3)
CALL netdump
!
!-----------------------------------------------------------------------
!
! Packed NetCDF format dump.
!
!-----------------------------------------------------------------------
!
ELSE IF (houtfmt == 8) THEN ! Packed NetCDF format
packed = 1
! CALL netdump(filnam, nx,ny,nz,nstyps,packed, grdbas, &
! u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
! kmh,kmv, ubar,vbar,wbar,ptbar,pbar,rhobar,qvbar, &
! x,y,z,zp,hterain, j1,j2,j3, &
! soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
! tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
! raing,rainc,prcrate, &
! radfrc,radsw,rnflx, &
! usflx,vsflx,ptsflx,qvsflx, &
! tem1,tem2,tem3)
CALL netdump
ELSE IF( houtfmt == 9 ) THEN ! Unformatted binary data dump.
!
CALL gradsdump
(nx,ny,nz,nstyps,nchout, filnam, istager, &
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
kmh,kmv,ubar,vbar,wbar,ptbar,pbar,rhobar,qvbar, &
x,y,z,zp,hterain, j1,j2,j3, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
tem1,tem2)
ELSE IF( houtfmt == 10 ) THEN ! GRIB data dump.
!
!-----------------------------------------------------------------------
!
! History dump of GRIB format data
!
!-----------------------------------------------------------------------
!
lenstr = 80
CALL strlnth
( filnam, lenstr )
CALL asnctl
('NEWLOCAL', 1, ierr)
CALL asnfile
(filnam, '-F f77 -N ieee', ierr)
CALL getunit
( nchout )
OPEN(UNIT=nchout,FILE=trim(filnam),STATUS='new', &
FORM='unformatted',IOSTAT= istat )
IF( istat /= 0) GO TO 999
!
CALL gribdump
(nx,ny,nz,nstyps, &
nchout, filnam(1:lenstr),grdbas, &
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke,kmh,kmv, &
ubar,vbar,ptbar,pbar,rhobar,qvbar, &
x,y,z,zp,hterain, j1,j2,j3, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
tem1,tem2, &
tem3(1,1,1),tem3(1,1,2), &
tem3(1,1,3),tem3(1,1,4))
CLOSE(UNIT=nchout)
CALL retunit( nchout )
ELSE IF( houtfmt == 11 ) THEN ! Vis5D data dump.
lenstr = 80
CALL strlnth
( filnam, lenstr )
CALL v5ddump
(nx,ny,nz, nstyps,filnam(1:lenstr), istager, &
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
kmh,kmv,ubar,vbar,wbar,ptbar,pbar,rhobar,qvbar, &
x,y,z,zp,hterain, j1,j2,j3, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
tem1,tem2)
END IF ! houtfmt switches
!
!-----------------------------------------------------------------------
!
! Compress file except for Savi3D dump.
!
!-----------------------------------------------------------------------
!
IF( houtfmt /= 0 .AND. houtfmt /= 5 .AND. &
houtfmt /= 9 .AND. houtfmt /= 11 .AND. filcmprs == 1 ) &
CALL cmprs
( filnam )
!
!-----------------------------------------------------------------------
!
! Create ready file, indicating history dump writing is complete
!
!-----------------------------------------------------------------------
!
IF (readyfl == 1 .AND. houtfmt /= 0) THEN
WRITE (filnamr,'(a)') trim(filnam) // "_ready"
CALL getunit
( nchout1 )
OPEN (UNIT=nchout1,FILE=trim(filnamr))
WRITE (nchout1,'(a)') trim(filnam)
CLOSE (nchout1)
CALL retunit ( nchout1 )
END IF
!
!-----------------------------------------------------------------------
!
! Write u,v,w,pt,p, and qv to an additional file for
! external boundary conditions.
!
!-----------------------------------------------------------------------
!
IF ( exbcdmp /= 0 .AND. grdbas /= 1 ) THEN
!
!-----------------------------------------------------------------------
!
! Write the ARPS predicted fields into external boundary format
! files. The purpose for doing so is to produce external boundary
! conditions from ARPS. They can be used to test the external
! BC code, as well as to run the experiments with the ARPS generated
! external external boundary conditions.
!
!-----------------------------------------------------------------------
!
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
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
tem1(i,j,k) = ptbar(i,j,k) + ptprt(i,j,k)
tem2(i,j,k) = pbar (i,j,k) + pprt (i,j,k)
END DO
END DO
END DO
CALL edgfill
(u, 1,nx,1,nx, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL edgfill
(v, 1,nx,1,nx-1, 1,ny,1,ny, 1,nz,1,nz-1)
CALL edgfill
(w, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz )
CALL edgfill
(tem1,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL edgfill
(tem2,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL edgfill
(qv, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
exbcfn = runname(1:lfnkey)//'.'//ctime
lenstr = lfnkey + 16
IF (mp_opt > 0) THEN
WRITE(exbcfn,'(a,a,a,a,2i2.2)') &
runname(1:lfnkey),'.',ctime,'_',loc_x,loc_y
lenstr = lenstr + 5
END IF
IF( dirname /= ' ' ) THEN
temchar = exbcfn
exbcfn = dirname(1:ldirnam)//'/'//temchar
lenstr = lenstr + ldirnam + 1
END IF
CALL fnversn
(exbcfn,lenstr)
WRITE(6,'(1x,a,a)') &
'Dumping to the external boundary format file: ', &
exbcfn(1:lenstr)
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc.
! Calculate rayklow, needed for exbcdmp=4 format, if not computed already
IF ( exbcdmp == 4 .and. rayklow <= 0) THEN
rayklow = nz-1
DO k=nz-1,2,-1
zpmax = zp(1,1,k)
DO j=1,ny-1
DO i=1,nx-1
zpmax = MAX( zp(i,j,k), zpmax )
END DO
END DO
IF( zpmax < zbrdmp ) THEN
rayklow = MAX(2, k+1)
EXIT
END IF
END DO
END IF
CALL writexbc
(nx,ny,nz,exbcfn,lenstr,ctime, &
1,1,1,1,1,1, &
qcexout,qrexout,qiexout,qsexout,qhexout, &
u,v,w,tem1,tem2,qv,qc,qr,qi,qs,qh)
END IF
RETURN
999 CONTINUE
WRITE(6,'(1x,a,a,a,/1x,i3)') &
'Error occured when opening file ',filnam, &
'using FORTRAN unit ',nchout
CALL arpsstop
(' Program stopped in DTADUMP.',1)
END SUBROUTINE dtadump
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE GET_DIMS_FROM_DATA ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE get_dims_from_data(hinfmt,grdbasfn, nx,ny,nz,nstyps, ireturn) 14,17
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in grid dimensions from base state/grid history data.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 7/17/2000
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! hinfmt The format of the history data dump
! grdbasfn Name of the grid/base state array file
!
! OUTPUT:
!
! nx,ny,nz The dimension of data arrays
! nstyps The number of soil types
! ireturn Return status indicator
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: hinfmt ! The format of the history data dump
CHARACTER (LEN=* ) :: grdbasfn ! Name of the grid/base state array file
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
INTEGER :: nstyps ! Number of soil types
INTEGER :: ireturn,lengbf,nchanl,ierr,istat,packed,i
LOGICAL :: fexist
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
ireturn = 0
!
!-----------------------------------------------------------------------
!
! Open and read grid and base state data file depending on the
! values of parameters grdin and basin, which are read in from the
! time dependent data set. If grdin or basin is zero, the grid and
! base state arrays have to be read in from a separate file.
!
!-----------------------------------------------------------------------
!
! IF ( hinfmt.eq.9 ) GOTO 500
INQUIRE(FILE=trim(grdbasfn), EXIST = fexist )
IF( fexist ) GO TO 200
INQUIRE(FILE=trim(grdbasfn)//'.Z', EXIST = fexist )
IF( fexist ) THEN
CALL uncmprs
( trim(grdbasfn)//'.Z' )
GO TO 200
END IF
INQUIRE(FILE=trim(grdbasfn)//'.gz', EXIST = fexist )
IF( fexist ) THEN
CALL uncmprs
( trim(grdbasfn)//'.gz' )
GO TO 200
END IF
WRITE(6,'(/1x,a,/1x,a/)') &
'File '//trim(grdbasfn)// &
' or its compressed version not found.', &
'Program stopped in get_dims_from_data.'
CALL arpsstop
('arpsstop called from get_dims_from_data',1)
200 CONTINUE
!
!-----------------------------------------------------------------------
!
! Read grid and base state fields.
!
!-----------------------------------------------------------------------
!
IF( hinfmt == 1 .OR. hinfmt == 6 ) THEN
CALL getunit
( nchanl )
!
!-----------------------------------------------------------------------
!
! Cray routines to force binary data file to be in the IEEE format
!
!-----------------------------------------------------------------------
!
CALL asnctl
('NEWLOCAL', 1, ierr)
CALL asnfile
(trim(grdbasfn), '-F f77 -N ieee', ierr)
OPEN(UNIT=nchanl,FILE=trim(grdbasfn), &
STATUS='old',FORM='unformatted',IOSTAT=istat)
IF( istat /= 0 ) GO TO 999
CALL bin_getdims
(nchanl, nx,ny,nz,nstyps, ireturn)
CLOSE(UNIT=nchanl)
CALL retunit( nchanl )
ELSE IF( hinfmt == 2 ) THEN
CALL getunit
( nchanl )
OPEN(UNIT=nchanl,FILE=trim(grdbasfn), &
STATUS='old',FORM='formatted',IOSTAT=istat)
IF( istat /= 0 ) GO TO 999
CALL asc_getdims
(nchanl, nx,ny,nz,nstyps, ireturn)
CLOSE(UNIT=nchanl)
CALL retunit( nchanl )
ELSE IF( hinfmt == 3 ) THEN
CALL hdf_getdims(trim(grdbasfn),nx,ny,nz,nstyps, ireturn)
ELSE IF( hinfmt == 4 ) THEN
CALL getunit
( nchanl )
OPEN(UNIT=nchanl,FILE=trim(grdbasfn), &
STATUS='old',FORM='unformatted',IOSTAT=istat)
IF( istat /= 0 ) GO TO 999
CALL pak_getdims
(nchanl, nx,ny,nz,nstyps, ireturn)
CLOSE(UNIT=nchanl)
CALL retunit( nchanl )
ELSE IF (hinfmt == 7.OR.hinfmt == 8) THEN ! NetCDF format
PRINT*,'NetCDF format is no longer supported by ARPS.'
PRINT*,'Please check the specified inupt data format.'
STOP
packed = 0
! CALL net_getdims(nchanl, packed, nx,ny,nz,nstyps, ireturn)
ELSE IF( hinfmt == 10 ) THEN
!
!-----------------------------------------------------------------------
!
! Cray routines to force binary data file to be in the IEEE format
!
!-----------------------------------------------------------------------
!
CALL asnctl
('NEWLOCAL', 1, ierr)
CALL asnfile
(trim(grdbasfn), '-F f77 -N ieee', ierr)
CALL getunit
( nchanl )
OPEN(UNIT=nchanl,FILE=trim(grdbasfn),STATUS='old', &
FORM='unformatted',IOSTAT= istat )
CALL grib_getdims
(nchanl, nx,ny,nz,nstyps, ireturn)
CLOSE(UNIT=nchanl)
CALL retunit( nchanl )
ELSE
WRITE(6,'(a,i3,a)') &
' Data format flag had an invalid value ', &
hinfmt ,' program stopped.'
CALL arpsstop
('arpsstop called from get_dims_from_data-wrong flag',1)
END IF
! 500 CONTINUE
RETURN
999 CONTINUE
WRITE(6,'(1x,a,a,/1x,i3,a)') &
'Error occured when opening file ',trim(grdbasfn), &
'using FORTRAN unit ',nchanl,' Program stopped in get_dims_from_data.'
CALL arpsstop
('arpsstop called from get_dims_from_data opening file',1)
END SUBROUTINE get_dims_from_data
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE BIN_GETDIMS ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE bin_getdims(inch, nx,ny,nz,nstyps, ireturn) 1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
! Read in grid dimensions from base state/grid history data.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 7/17/2000.
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT :
!
! inch Channel number for binary reading.
!
! OUTPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! nstyps Number of soil types
!
! ireturn Return status indicator
! =0, successful read of all data
! =1, error reading data
! =2, end-of-file reached during read attempt
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
INTEGER :: nstyps ! Number of soil types
INTEGER :: inch ! Channel number for binary reading
INTEGER :: ireturn ! Return status indicator
CHARACTER (LEN=10) :: tmunit
CHARACTER (LEN=40) :: fmtverin
INTEGER :: i,nocmnt
REAL :: time
CHARACTER (LEN=80) :: runname
INTEGER :: idummy,totin
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
READ(inch,ERR=110,END=120) fmtverin
READ(inch,ERR=110,END=120) runname
WRITE(6,'(//'' THE NAME OF THIS RUN IS: '',A//)') runname
READ(inch,ERR=110,END=120) nocmnt
IF( nocmnt > 0 ) THEN
DO i=1,nocmnt
READ(inch,ERR=110,END=120)
END DO
END IF
READ(inch,ERR=110,END=120) time,tmunit
READ(inch,ERR=110,END=120) nx, ny, nz
WRITE(6,'(a,3i5,a)') 'nx,ny,nz read in from data are ',nx,ny,nz, &
' respectively.'
READ(inch,ERR=110,END=120) idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,totin, &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy
IF (totin /= 0) THEN
READ(inch,ERR=110,END=120) ! block of 20 REALs ...
READ(inch,ERR=110,END=120) nstyps,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy
WRITE (6,*) "nstyps read in as",nstyps
ELSE
WRITE (6,*) "nstyps not defined in data, set to 4"
nstyps = 4
ENDIF
ireturn = 0
RETURN
110 CONTINUE
WRITE(6,'(/a/)') ' Error reading data in BIN_GETDIMS'
ireturn=1
RETURN
120 CONTINUE
WRITE(6,'(/a/)') ' End of file reached in BIN_GETDIMS'
ireturn=2
RETURN
END SUBROUTINE bin_getdims
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE ASC_GETDIMS ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE asc_getdims(inch, nx,ny,nz,nstyps, ireturn) 1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 7/17/2000.
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT :
!
! inch Channel number for ASCII reading.
!
! OUTPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! nstyps Number of soil types
!
! ireturn Return status indicator
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
INTEGER :: nstyps ! Number of soil types
INTEGER :: inch ! Channel number for binary reading
INTEGER :: ireturn ! Return status indicator
CHARACTER (LEN=40) :: fmtverin
CHARACTER (LEN=10) :: tmunit
INTEGER :: i,nocmnt
REAL :: time
CHARACTER (LEN=80) :: runname
INTEGER :: idummy,totin
REAL:: rdummy
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
READ(inch,'(1x,a40)',ERR=110,END=120) fmtverin
READ(inch,'(1x,a80)',ERR=110,END=120) runname
WRITE(6,'(//'' THE NAME OF THIS RUN IS: '',A//)') runname
READ(inch,'(1x,i4)',ERR=110,END=120) nocmnt
IF( nocmnt > 0 ) THEN
DO i=1,nocmnt
READ(inch,'(1x,a80)',ERR=110,END=120)
END DO
END IF
READ(inch,'(1x,e16.8,1x,a10)',ERR=110,END=120) time,tmunit
READ(inch,'(1x, 3i12)',ERR=110,END=120) nx,ny,nz
WRITE(6,'(a,3i5,a)') 'nx,ny,nz read in from data are ',nx,ny,nz, &
' respectively.'
READ(inch,'(1x,10i8)',ERR=110,END=120) &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,totin, & !should be modified
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy
READ(inch,'(1x,8E16.10)',ERR=110,END=120) &
rdummy,rdummy,rdummy,rdummy,rdummy, &
rdummy,rdummy,rdummy,rdummy,rdummy, &
rdummy,rdummy,rdummy,rdummy,rdummy, &
rdummy,rdummy,rdummy,rdummy,rdummy
IF (totin /= 0) THEN
READ(inch,'(1x,10i8)',ERR=110,END=120) &
nstyps,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy
READ(inch,'(1x,8E16.10)',ERR=110,END=120) ! block of 20 REALs ...
WRITE (6,*) "nstyps read in as",nstyps
ELSE
WRITE (6,*) "nstyps not defined in data, set to 4"
nstyps = 4
ENDIF
ireturn = 0
RETURN
110 CONTINUE
WRITE(6,'(/a/)') ' Error reading data in ASC_GETDIMS.'
ireturn=1
RETURN
120 CONTINUE
WRITE(6,'(/a/)') ' End of file reached in ASC_GETDIMS.'
ireturn=2
RETURN
END SUBROUTINE asc_getdims
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDF_GETDIMS ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdf_getdims(filename, nx,ny,nz,nstyps, ireturn),6
!
!-----------------------------------------------------------------------
!
! PURPOSE:
! Read in grid dimensions from base state/grid history data.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 7/17/2000.
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT :
!
! filename Channel number for binary reading.
!
! OUTPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! ireturn Return status indicator
! =0, successful read of all data
! =1, error reading data
! =2, end-of-file reached during read attempt
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: stat, sd_id, sds_id
CHARACTER (LEN=*) :: filename
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
INTEGER :: nstyps
INTEGER :: ireturn ! Return status indicator
CHARACTER (LEN=10) :: tmunit
CHARACTER (LEN=40) :: fmtverin
INTEGER :: i,nocmnt
REAL :: time
CHARACTER (LEN=80) :: runname
CHARACTER (LEN=80 ) :: cmnt(50) ! String of comments on this model run
INTEGER istat
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
CALL hdfopen
(filename,1,sd_id)
IF (sd_id < 0) THEN
WRITE (6,*) "HDFREAD: ERROR opening ", &
trim(filename)," for reading."
GO TO 110
END IF
!-----------------------------------------------------------------------
!
! Get dimensions of data in binary file and check against
! the dimensions passed to HDFREAD
!
!-----------------------------------------------------------------------
CALL hdfrdi
(sd_id,"nx",nx,istat)
CALL hdfrdi
(sd_id,"ny",ny,istat)
CALL hdfrdi
(sd_id,"nz",nz,istat)
CALL hdfrdi
(sd_id,"nstyp",nstyps,istat)
WRITE(6,'(a,3i5,a)') 'nx,ny,nz read in from data are ',nx,ny,nz, &
' respectively.'
WRITE (6,*) "nstyps read in as",nstyps
ireturn = 0
GO TO 130
!-----------------------------------------------------------------------
!
! Error during read
!
!-----------------------------------------------------------------------
110 CONTINUE
WRITE(6,'(/a/)') ' Error reading data in HDF_GETDIMS.'
ireturn=1
GO TO 130
!-----------------------------------------------------------------------
!
! End-of-file during read
!
!-----------------------------------------------------------------------
! 120 CONTINUE
! WRITE(6,'(/a/)') ' End of file reached in HDF_GETDIMS.'
! ireturn=2
130 CONTINUE
!tmp stat = sfendacc(sd_id) ! is this necessary?
CALL hdfclose
(sd_id,stat)
RETURN
END SUBROUTINE hdf_getdims
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE PAK_GETDIMS ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE pak_getdims(inch, nx,ny,nz,nstyps, ireturn) 1,1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
! Read in grid dimensions from base state/grid history data.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 7/17/2000.
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT :
!
! inch Channel number for binary reading.
!
! OUTPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! ireturn Return status indicator
! =0, successful read of all data
! =1, error reading data
! =2, end-of-file reached during read attempt
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
INTEGER :: nstyps ! Number of soil types
INTEGER :: inch ! Channel number for binary reading
INTEGER :: ireturn ! Return status indicator
CHARACTER (LEN=10) :: tmunit
CHARACTER (LEN=40) :: fmtverin
INTEGER :: i,nocmnt
REAL :: time
CHARACTER (LEN=80) :: runname
INTEGER :: bgrdin,bbasin,bvarin,mstin,brainin,bicein,btkein, &
btrbin,bsfcin,landin,totin,prcin,radin,flxin, &
snowcin,snowin
INTEGER :: ihdlen,ilen
PARAMETER (ihdlen=5000)
INTEGER :: ihead(ihdlen)
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
READ(inch,ERR=110,END=120) ihead
! CALL decdhdr(nx,ny,nz,ihdlen,ihead,ilen,time, &
! bgrdin,bbasin,bvarin,mstin,brainin,bicein,btkein, &
! btrbin,bsfcin,landin,totin,prcin,radin,flxin, &
! snowcin,snowin,fmtverin,tmunit)
CALL decdhdr
WRITE (6,*) "nstyps not defined in data, set to 4"
nstyps = 4
ireturn =0
RETURN
110 CONTINUE
WRITE(6,'(/a/)') ' Error reading data in PAK_GETDIMS.'
ireturn=1
RETURN
120 CONTINUE
WRITE(6,'(/a/)') ' End of file reached in PAK_GETDIMS.'
ireturn=2
RETURN
END SUBROUTINE pak_getdims
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE GRIB_GETDIMS ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE grib_getdims(inch, nx,ny,nz,nstyps, ireturn) 1,1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
! Read in grid dimensions from base state/grid history data.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 7/17/2000.
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT :
!
! inch Channel number for binary reading.
!
! OUTPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! nstyps NUmber of soil types.
!
! ireturn Return status indicator
! =0, successful read of all data
! =1, error reading data
! =2, end-of-file reached during read attempt
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: inch
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
INTEGER :: nstyps ! Number of soil types
INTEGER :: ireturn ! Return status indicator
CHARACTER (LEN=10) :: tmunit
CHARACTER (LEN=40) :: fmtverin
INTEGER :: i,j,nocmnt
REAL :: time
CHARACTER (LEN=80) :: runname
CHARACTER (LEN=80 ) :: cmnt(50) ! String of comments on this model run
!
!-----------------------------------------------------------------------
!
! Parameters for GRIB packing
!
!-----------------------------------------------------------------------
!
INTEGER :: nbufsz
PARAMETER ( nbufsz = 800000 ) ! Size of GRIB buffer
CHARACTER (LEN=1) :: mgrib(nbufsz) ! Buffer to carry GRIB messages
INTEGER :: npos,hhdlen
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
READ (inch,ERR=110,END=120) (mgrib(i),i=1,3)
npos = 0
hhdlen = ICHAR(mgrib(npos+1))*65536 &
+ ICHAR(mgrib(npos+2))*256 &
+ ICHAR(mgrib(npos+3))
BACKSPACE (inch)
READ (inch,ERR=110,END=120) (mgrib(i),i=1,hhdlen)
npos = npos + 3
DO i=1,40
fmtverin(i:i) = mgrib(npos+i)
END DO
npos = npos + 40
DO i=1,80
runname(i:i) = mgrib(npos+i)
END DO
npos = npos + 80
nocmnt = ICHAR(mgrib(npos+1))
npos = npos + 1
IF( nocmnt > 0 ) THEN
DO j=1,nocmnt
DO i=1,80
cmnt(j)(i:i) = mgrib(npos+i)
END DO
npos = npos + 80
END DO
END IF
CALL ibm2flt
( mgrib(npos+1), time )
npos = npos + 4
nx = ICHAR(mgrib(npos+1))*256 + ICHAR(mgrib(npos+2))
npos = npos + 2
ny = ICHAR(mgrib(npos+1))*256 + ICHAR(mgrib(npos+2))
npos = npos + 2
nz = ICHAR(mgrib(npos+1))*256 + ICHAR(mgrib(npos+2))
npos = npos + 2
WRITE (6,*) "nstyps not defined in data, set to 4"
nstyps = 4
ireturn = 0
RETURN
110 CONTINUE
WRITE(6,'(/a/)') ' Error reading data in GRIB_GETDIMS'
ireturn=1
RETURN
120 CONTINUE
WRITE(6,'(/a/)') ' End of file reached in GRIB_GETDIMS'
ireturn=2
RETURN
RETURN
END SUBROUTINE grib_getdims
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE EDGFILL ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE edgfill(a,nx1,nx2,ibgn,iend,ny1,ny2,jbgn,jend, & 451
nz1,nz2,kbgn,kend)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Fill in the edges of a data array from the valid interior grid
! points so that the arrays are completely filled. This is done primarily
! for the benefit of the compression routine which must have a valid
! value in each array location.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! 7/14/92.
!
! 9/1/94 (Y. Lu)
! Cleaned up documentation.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! a Array to have edges filled in
!
! nx1:nx2 Dimensioned range of the first index of array "a"
! ny1:ny2 Dimensioned range of the second index of array "a"
! nz1:nz2 Dimensioned range of the third index of array "a"
!
! ibgn,iend Valued range of the first index of array "a"
! jgbn,jend Valued range of the second index of array "a"
! kbgn,kend Valued range of the third index of array "a"
!
IMPLICIT NONE
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
INTEGER :: nx1,nx2,ny1,ny2,nz1,nz2
REAL :: a(nx1:nx2,ny1:ny2,nz1:nz2)
INTEGER :: ibgn,iend,jbgn,jend,kbgn,kend
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! Fill in top and bottom grid levels, as needed.
!
!-----------------------------------------------------------------------
!
IF( kbgn > nz1 ) THEN
DO k=nz1,(kbgn-1)
DO j=jbgn,jend
DO i=ibgn,iend
a(i,j,k)=a(i,j,kbgn)
END DO
END DO
END DO
END IF
IF( kend < nz2 ) THEN
DO k=(kend+1),nz2
DO j=jbgn,jend
DO i=ibgn,iend
a(i,j,k)=a(i,j,kend)
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Fill in north and south edges, as needed.
!
!-----------------------------------------------------------------------
!
IF( jbgn > ny1 ) THEN
DO k=nz1,nz2
DO j=ny1,(jbgn-1)
DO i=ibgn,iend
a(i,j,k)=a(i,jbgn,k)
END DO
END DO
END DO
END IF
IF( jend < ny2 ) THEN
DO k=nz1,nz2
DO j=(jend+1),ny2
DO i=ibgn,iend
a(i,j,k)=a(i,jend,k)
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Fill in east and west edges, as needed.
!
!-----------------------------------------------------------------------
!
IF( ibgn > nx1 ) THEN
DO k=nz1,nz2
DO j=ny1,ny2
DO i=nx1,(ibgn-1)
a(i,j,k)=a(ibgn,j,k)
END DO
END DO
END DO
END IF
IF( iend < nx2 ) THEN
DO k=nz1,nz2
DO j=ny1,ny2
DO i=(iend+1),nx2
a(i,j,k)=a(iend,j,k)
END DO
END DO
END DO
END IF
RETURN
END SUBROUTINE edgfill
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE IEDGFILL ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE iedgfill(a,nx1,nx2,ibgn,iend,ny1,ny2,jbgn,jend, & 17
nz1,nz2,kbgn,kend)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Fill in the edges of a data array from the valid interior grid
! points so that the arrays are completely filled. This is done primarily
! for the benefit of the compression routine which must have a valid
! value in each array location.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! 7/14/92.
!
! 9/1/94 (Y. Lu)
! Cleaned up documentation.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! a Array to have edges filled in
!
! nx1:nx2 Dimensioned range of the first index of array "a"
! ny1:ny2 Dimensioned range of the second index of array "a"
! nz1:nz2 Dimensioned range of the third index of array "a"
!
! ibgn,iend Valued range of the first index of array "a"
! jgbn,jend Valued range of the second index of array "a"
! kbgn,kend Valued range of the third index of array "a"
!
IMPLICIT NONE
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
INTEGER :: nx1,nx2,ny1,ny2,nz1,nz2
INTEGER :: a(nx1:nx2,ny1:ny2,nz1:nz2)
INTEGER :: ibgn,iend,jbgn,jend,kbgn,kend
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! Fill in top and bottom grid levels, as needed.
!
!-----------------------------------------------------------------------
!
IF( kbgn > nz1 ) THEN
DO k=nz1,(kbgn-1)
DO j=jbgn,jend
DO i=ibgn,iend
a(i,j,k)=a(i,j,kbgn)
END DO
END DO
END DO
END IF
IF( kend < nz2 ) THEN
DO k=(kend+1),nz2
DO j=jbgn,jend
DO i=ibgn,iend
a(i,j,k)=a(i,j,kend)
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Fill in north and south edges, as needed.
!
!-----------------------------------------------------------------------
!
IF( jbgn > ny1 ) THEN
DO k=nz1,nz2
DO j=ny1,(jbgn-1)
DO i=ibgn,iend
a(i,j,k)=a(i,jbgn,k)
END DO
END DO
END DO
END IF
IF( jend < ny2 ) THEN
DO k=nz1,nz2
DO j=(jend+1),ny2
DO i=ibgn,iend
a(i,j,k)=a(i,jend,k)
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Fill in east and west edges, as needed.
!
!-----------------------------------------------------------------------
!
IF( ibgn > nx1 ) THEN
DO k=nz1,nz2
DO j=ny1,ny2
DO i=nx1,(ibgn-1)
a(i,j,k)=a(ibgn,j,k)
END DO
END DO
END DO
END IF
IF( iend < nx2 ) THEN
DO k=nz1,nz2
DO j=ny1,ny2
DO i=(iend+1),nx2
a(i,j,k)=a(iend,j,k)
END DO
END DO
END DO
END IF
RETURN
END SUBROUTINE iedgfill