!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE GRADSREAD ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE gradsread(nx,ny,nz,nstyps, & 1,7
nchanl, filnam, time, &
x,y,z,zp, uprt,vprt,w,ptprt,pprt, &
qvprt,qc,qr,qi,qs,qh, tke,kmh,kmv, &
u,v,pt,p,rhobar,qv, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
ireturn, tem1)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read history data into the file "filnam" in the GrADS format.
!
! X_center(i) = ( X_edge(i) + X_edge(i+1) )/2, i = 1, n-1, 1
!
! The last edge value were kept unchanged so that it can be used to
! restore the stagger grid point values.
!
! X_edge(n) = X_center(n)
! X_edge(i) = 2*X_center(i) - X_edge(i+1), i = n-1, 1, -1
!
! Therefore, when you display the data by GrADS, set the x, y, and
! z dimension not to exceed the Max-1.
!
! Since total and perturbation variables will be dumped, the base
! state variables can be obtained by Xbar = X - Xprt.
!
! The smallest time unit of the current version GrADS is minutes.
! Therefore, the time intervals for history data dumping, thisdmp,
! should be multiples of 60 seconds.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 10/25/93.
!
! MODIFICATIONS:
!
! 10/10/94 (Y. Liu)
! Added an option (flag istgr) so that the history data can be
! dumped out at stager points.
!
! 02/06/95 (Y. Liu)
! Added map projection parameters into the GrADS dumping
!
! 03/27/1995 (Yuhe Liu)
! Added physical vertical coordinates array, zp(nx,ny,nz) into the
! display data sets in order for the GrADS to display zp and any
! other variables (interpolated) in the physical coordinates.
!
! 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
!
! OUTPUT:
!
! nchanl FORTRAN I/O channel number for history data output.
! filnam The name of history data dump file
! time Model starting time
!
! 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)
!
! uprt x component of velocity (m/s)
! vprt y component of velocity (m/s)
! ptprt Perturbation potential temperature (K)
! pprt Perturbation pressure (Pascal)
! qvprt Perturbation water vapor specific humidity (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 )
!
! u x component of velocity (m/s)
! v y component of velocity (m/s)
! w Vertical component of Cartesian velocity (m/s)
! pt Potential temperature (K)
! p Pressure (Pascal)
! rhobar Base state density (kg/m**3)
! qv Water vapor specific humidity (kg/kg)
!
! 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))
!
! ireturn Return status indicator
!
! WORK ARRAY:
!
! tem1 Temporary work array.
!
!-----------------------------------------------------------------------
!
! The following parameters are passed into this subroutine through
! a common block in globcst.inc, and they determine which
! variables are output.
!
! varout =0 or 1. If varout=0, dynamical variables are not dumped.
! mstout =0 or 1. If mstout=0, water variables are not dumped.
! rainout=0 or 1. If rainout=0, rain variables are not dumped.
! prcout =0 or 1. If prcout=0, precipitation rates are not dumped.
! iceout =0 or 1. If iceout=0, qi, qs and qh are not dumped.
! tkeout =0 or 1. If tkeout=0, tke is not dumped.
! trbout =0 or 1. If trbout=0, kmh and kmv are not dumped.
! sfcout =0 or 1. If sfcout=0, surface variables are not dumped.
! landout=0 or 1. If landout=0, surface property arrays are not dumped.
! radout =0 or 1. If radout =0, radiation arrays are not dumped.
! flxout =0 or 1. If flxout =0, surface flux arrays are not dumped.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
INTEGER :: nchanl ! FORTRAN I/O channel number for output
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 :: pt (nx,ny,nz) ! Potential temperature (K)
REAL :: p (nx,ny,nz) ! 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 :: uprt (nx,ny,nz) ! Total u-velocity (m/s)
REAL :: vprt (nx,ny,nz) ! Total v-velocity (m/s)
REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K)
REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal)
REAL :: qvprt (nx,ny,nz) ! Water vapor specific humidity (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 :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3)
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.
INTEGER :: nstyps
INTEGER :: soiltyp (nx,ny,nstyps) ! Soil type
REAL :: stypfrct(nx,ny,nstyps) ! Soil type fraction
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)
! (in top 1 cm layer)
REAL :: tsoil (nx,ny,0:nstyps) ! Deep soil temperature (K)
! (in deep 1 m layer)
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
!
!-----------------------------------------------------------------------
!
! Parameters describing this routine
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=40) :: fmtver,fmtverin
PARAMETER (fmtver='004.10 GrADS Binary Data')
CHARACTER (LEN=10) :: tmunit
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
INCLUDE 'indtflg.inc'
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
REAL :: time ! Model starting time
INTEGER :: nxin,nyin,nzin ! # of 3-D grid points in data file
INTEGER :: ireturn, ierr
INTEGER :: i,j,k,l, istat,is
INTEGER :: idummy
REAL :: rdummy,time0
INTEGER :: filen
CHARACTER (LEN=* ) :: filnam ! File name of data file
INTEGER :: varnum ! # of variables in data file
CHARACTER (LEN=60) :: vartit(50)
CHARACTER (LEN=8) :: varnam(50)
INTEGER :: hdbyte, lev ! # of bytes in the header of data file
INTEGER :: istgr
INTEGER :: nstyp1
LOGICAL :: firstcall
SAVE firstcall,time0
DATA firstcall/.true./
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
IF (firstcall) THEN
CALL getunit
( nchanl )
filen = LEN(filnam)
CALL strlnth
( filnam, filen )
CALL asnctl
('OLDLOCAL', 1, ierr)
CALL asnfile
(filnam(1:filen), '-F f77 -N ieee', ierr)
OPEN (UNIT=nchanl,FILE=trim(filnam(1:filen)),STATUS='old', &
FORM='unformatted',ACCESS='sequential',IOSTAT= istat )
hdbyte = 0
READ (nchanl,ERR=910,END=920) fmtverin
hdbyte = hdbyte + 8 + 1*40
IF( fmtverin /= fmtver ) THEN
WRITE(6,'(/1x,a,/1x,2a,/1x,3a)') &
'Data format incompatible with the data reader.', &
'Format of data is ',fmtverin,' Format of reader is ',fmtver, &
'. Job stopped.'
CALL arpsstop
('arpsstop called from gradsread at initial read',1)
END IF
READ (nchanl,ERR=910,END=920) runname
hdbyte = hdbyte + 8 + 1*80
READ (nchanl,ERR=910,END=920) nocmnt
hdbyte = hdbyte + 8 + 1*4
IF ( nocmnt > 0 ) THEN
DO l = 1, nocmnt
READ (nchanl,ERR=910,END=920) cmnt(l)
END DO
hdbyte = hdbyte + nocmnt * ( 8 + 80 )
END IF
READ (nchanl,ERR=910,END=920) nxin,nyin,nzin
hdbyte = hdbyte + 8 + 3*4
IF ( nxin /= nx .OR. nyin /= ny .OR. nzin /= nz ) THEN
WRITE (6, '(1x,a/1X,a,i4,a,i4,a,i4/1X,a,i4,a,i4,a,i4/1X,a)' ) &
' Dimensions in GRADSREAD inconsistent with data.', &
' nx = ',nx, ' ny = ',ny, ' nz = ',nz, &
' nxin = ',nxin,' nyin = ',nyin,' nzin = ',nzin, &
' Program aborted in GRADSREAD.'
END IF
READ (nchanl,ERR=910,END=920) time0,tmunit
hdbyte = hdbyte + 8 + 1*4 + 10
READ (nchanl,ERR=910,END=920) &
varin, mstin, icein, trbin, sfcin, &
rainin, landin, idummy, idummy, totin, &
tkein , idummy,mapproj, istgr, month, &
day, year, hour, minute, second
hdbyte = hdbyte + 8 + 20*4
READ (nchanl,ERR=910,END=920) &
umove, vmove, xgrdorg, ygrdorg, trulat1, &
trulat2, trulon, sclfct, rdummy, rdummy, &
rdummy, rdummy, rdummy, rdummy, rdummy, &
tstop, thisdmp, latitud, ctrlat, ctrlon
hdbyte = hdbyte + 8 + 20*4
IF ( totin /= 0 ) THEN
READ (nchanl,ERR=910,END=920) &
hdmpopt,nstyp1, prcin, radin, flxin, &
snowcin,snowin, idummy, idummy, idummy, &
idummy, idummy, idummy, idummy, idummy, &
idummy, idummy, idummy, idummy, idummy
hdbyte = hdbyte + 8 + 20*4
IF ( nstyp1 < 1 ) THEN
nstyp1 = 1
END IF
READ (nchanl,ERR=910,END=920) &
tstrtdmp,rdummy, rdummy, rdummy, rdummy, &
rdummy, rdummy, rdummy, rdummy, rdummy, &
rdummy, rdummy, rdummy, rdummy, rdummy, &
rdummy, rdummy, rdummy, rdummy, rdummy
hdbyte = hdbyte + 8 + 20*4
END IF
IF ( hdmpopt == 2 ) THEN
READ (nchanl,ERR=910,END=920) numhdmp
hdbyte = hdbyte + 8 + 4
IF ( numhdmp > 0 ) THEN
READ (nchanl,ERR=910,END=920) (hdmptim(i),i=1,numhdmp)
hdbyte = hdbyte + 8 + numhdmp*4
END IF
END IF
READ (nchanl,ERR=910,END=920) x
hdbyte = hdbyte + 8 + nx*4
READ (nchanl,ERR=910,END=920) y
hdbyte = hdbyte + 8 + ny*4
READ (nchanl,ERR=910,END=920) z
hdbyte = hdbyte + 8 + nz*4
READ (nchanl,ERR=910,END=920) varnum
hdbyte = hdbyte + 8 + 1*4
WRITE (6, '(a//a/)' ) &
' The following variables will be read from the data file', &
' Variables Description'
DO l = 1, varnum
READ (nchanl,ERR=910,END=920) varnam(l),lev,vartit(l)
WRITE (6, '(5x,a8,7x,a60)' ) varnam(l),vartit(l)
END DO
hdbyte = hdbyte + varnum*( 8 + 8 + 4 + 60 )
IF(landin == 1) THEN
IF (nstyp1 == 1) THEN
READ (nchanl,ERR=910,END=920) &
((soiltyp(i,j,1),i=1,nx),j=1,ny)
ELSE
DO is=1,nstyp1
IF (is <= nstyps) THEN
READ (nchanl,ERR=910,END=920) &
((soiltyp (i,j,is),i=1,nx),j=1,ny)
READ (nchanl,ERR=910,END=920) &
((stypfrct(i,j,is),i=1,nx),j=1,ny)
ELSE
READ (nchanl,ERR=910,END=920)
READ (nchanl,ERR=910,END=920)
ENDIF
END DO
END IF
CALL fix_stypfrct_nstyp
(nx,ny,nstyp1,nstyp,stypfrct)
READ (nchanl,ERR=910,END=920) ((vegtyp (i,j),i=1,nx),j=1,ny)
READ (nchanl,ERR=910,END=920) ((lai (i,j),i=1,nx),j=1,ny)
READ (nchanl,ERR=910,END=920) ((roufns (i,j),i=1,nx),j=1,ny)
READ (nchanl,ERR=910,END=920) ((veg (i,j),i=1,nx),j=1,ny)
hdbyte = hdbyte + 5 * ( 8 + nx*ny*4 )
END IF
nhisdmp = 1
firstcall = .false.
time = time0
ELSE IF ( hdmpopt == 1 ) THEN ! not firstcall
IF ( tstrtdmp > time0 ) THEN
time = tstrtdmp
ELSE
time = tstrtdmp + nhisdmp*thisdmp
END IF
nhisdmp = nhisdmp + 1
ELSE IF ( hdmpopt == 2 ) THEN ! not firstcall and not hdmpopt=1
nhisdmp = nhisdmp + 1
IF ( nhisdmp <= numhdmp ) THEN
time = hdmptim(nhisdmp)
ELSE
WRITE (6,'(a)') 'No more data in this file'
GO TO 920
END IF
END IF
!
!-----------------------------------------------------------------------
!
! Read in data from the GrADS data file
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Read the physical vertical coordinates into the data set.
!
!-----------------------------------------------------------------------
!
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((tem1(i,j,k),i=1,nx),j=1,ny)
END DO
IF ( istgr == 0 ) THEN
DO i=1,nx
DO j=1,ny
zp(i,j,nz) = tem1(i,j,nz)
DO k=nz-1,1,-1
zp(i,j,k) = 2.*tem1(i,j,k) - zp(i,j,k+1)
END DO
END DO
END DO
ELSE
DO k=1,nz
DO i=1,nx
DO j=1,ny
zp(i,j,k) = tem1(i,j,k)
END DO
END DO
END DO
END IF
IF ( varin == 1 ) THEN
!
!-----------------------------------------------------------------------
!
! If varin = 1, read in u, uprt, v, vprt, w, wprt,
! pt, ptprt, p, pprt, vort, and div.
!
!-----------------------------------------------------------------------
!
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((tem1(i,j,k),i=1,nx),j=1,ny)
END DO
IF ( istgr == 0 ) THEN
DO j=1,ny
DO k=1,nz
u(nx,j,k) = tem1(nx,j,k)
DO i=nx-1,1,-1
u(i,j,k) = 2.*tem1(i,j,k) - u(i+1,j,k)
END DO
END DO
END DO
ELSE
DO k=1,nz
DO j=1,ny
DO i=1,nx
u(i,j,k) = tem1(i,j,k)
END DO
END DO
END DO
END IF
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((tem1(i,j,k),i=1,nx),j=1,ny)
END DO
IF ( istgr == 0 ) THEN
DO j=1,ny
DO k=1,nz
uprt(nx,j,k) = tem1(nx,j,k)
DO i=nx-1,1,-1
uprt(i,j,k) = 2.*tem1(i,j,k) - uprt(i+1,j,k)
END DO
END DO
END DO
ELSE
DO k=1,nz
DO j=1,ny
DO i=1,nx
uprt(i,j,k) = tem1(i,j,k)
END DO
END DO
END DO
END IF
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((tem1(i,j,k),i=1,nx),j=1,ny)
END DO
IF ( istgr == 0 ) THEN
DO i=1,nx
DO k=1,nz
v(i,ny,k) = tem1(i,ny,k)
DO j=ny-1,1,-1
v(i,j,k) = 2.*tem1(i,j,k) - v(i,j+1,k)
END DO
END DO
END DO
ELSE
DO k=1,nz
DO j=1,ny
DO i=1,nx
v(i,j,k) = tem1(i,j,k)
END DO
END DO
END DO
END IF
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((tem1(i,j,k),i=1,nx),j=1,ny)
END DO
IF ( istgr == 0 ) THEN
DO i=1,nx
DO k=1,nz
vprt(i,ny,k) = tem1(i,ny,k)
DO j=ny-1,1,-1
vprt(i,j,k) = 2.*tem1(i,j,k) - vprt(i,j+1,k)
END DO
END DO
END DO
ELSE
DO k=1,nz
DO j=1,ny
DO i=1,nx
vprt(i,j,k) = tem1(i,j,k)
END DO
END DO
END DO
END IF
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((tem1(i,j,k),i=1,nx),j=1,ny)
END DO
IF ( istgr == 0 ) THEN
DO i=1,nx
DO j=1,ny
w(i,j,nz) = tem1(i,j,nz)
DO k=nz-1,1,-1
w(i,j,k) = 2.*tem1(i,j,k) - w(i,j,k+1)
END DO
END DO
END DO
ELSE
DO k=1,nz
DO i=1,nx
DO j=1,ny
w(i,j,k) = tem1(i,j,k)
END DO
END DO
END DO
END IF
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((pt (i,j,k),i=1,nx),j=1,ny)
END DO
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((ptprt(i,j,k),i=1,nx),j=1,ny)
END DO
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((p (i,j,k),i=1,nx),j=1,ny)
END DO
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((pprt(i,j,k),i=1,nx),j=1,ny)
END DO
!-----------------------------------------------------------------------
!
! Vorticity:
!
!-----------------------------------------------------------------------
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((tem1(i,j,k),i=1,nx),j=1,ny)
END DO
!-----------------------------------------------------------------------
!
! Divergernce:
!
!-----------------------------------------------------------------------
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((tem1(i,j,k),i=1,nx),j=1,ny)
END DO
END IF ! End varin
IF ( mstin == 1 ) THEN
!
!-----------------------------------------------------------------------
!
! Read in moist variables qv, qvprt, qc, qr, qi, qs, and qh
!
!-----------------------------------------------------------------------
!
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((qv (i,j,k),i=1,nx),j=1,ny)
END DO
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((qvprt(i,j,k),i=1,nx),j=1,ny)
END DO
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((qc(i,j,k),i=1,nx),j=1,ny)
END DO
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((qr(i,j,k),i=1,nx),j=1,ny)
END DO
IF ( icein == 1 ) THEN
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((qi(i,j,k),i=1,nx),j=1,ny)
END DO
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((qs(i,j,k),i=1,nx),j=1,ny)
END DO
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((qh(i,j,k),i=1,nx),j=1,ny)
END DO
END IF ! End icein
IF ( rainin == 1 ) THEN
READ (nchanl,ERR=910,END=920) ((raing(i,j),i=1,nx),j=1,ny)
READ (nchanl,ERR=910,END=920) ((rainc(i,j),i=1,nx),j=1,ny)
END IF ! End rainin
IF ( prcin == 1 ) THEN
READ (nchanl,ERR=910,END=920) ((prcrate(i,j,1),i=1,nx),j=1,ny)
READ (nchanl,ERR=910,END=920) ((prcrate(i,j,2),i=1,nx),j=1,ny)
READ (nchanl,ERR=910,END=920) ((prcrate(i,j,3),i=1,nx),j=1,ny)
READ (nchanl,ERR=910,END=920) ((prcrate(i,j,4),i=1,nx),j=1,ny)
END IF ! End prcin
END IF ! End mstin
IF ( tkein == 1 ) THEN
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((tke(i,j,k),i=1,nx),j=1,ny)
END DO
END IF
IF ( trbin == 1 ) THEN
!
!-----------------------------------------------------------------------
!
! If trbin = 1, read in the turbulence parameter, km.
!
!-----------------------------------------------------------------------
!
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((kmh(i,j,k),i=1,nx),j=1,ny)
END DO
DO k=1,nz
READ (nchanl,ERR=910,END=920) ((kmv(i,j,k),i=1,nx),j=1,ny)
END DO
END IF ! trbin
IF ( sfcin == 1 ) THEN
IF (nstyp1 == 1) THEN
READ (nchanl,ERR=910,END=920) &
((tsfc(i,j,0),i=1,nx),j=1,ny)
READ (nchanl,ERR=910,END=920) &
((tsoil(i,j,0),i=1,nx),j=1,ny)
READ (nchanl,ERR=910,END=920) &
((wetsfc(i,j,0),i=1,nx),j=1,ny)
READ (nchanl,ERR=910,END=920) &
((wetdp(i,j,0),i=1,nx),j=1,ny)
READ (nchanl,ERR=910,END=920) &
((wetcanp(i,j,0),i=1,nx),j=1,ny)
ELSE
DO is=0,nstyp1
IF (is <= nstyps) THEN
READ (nchanl,ERR=910,END=920) &
((tsfc(i,j,is),i=1,nx),j=1,ny)
READ (nchanl,ERR=910,END=920) &
((tsoil(i,j,is),i=1,nx),j=1,ny)
READ (nchanl,ERR=910,END=920) &
((wetsfc(i,j,is),i=1,nx),j=1,ny)
READ (nchanl,ERR=910,END=920) &
((wetdp(i,j,is),i=1,nx),j=1,ny)
READ (nchanl,ERR=910,END=920) &
((wetcanp(i,j,is),i=1,nx),j=1,ny)
ELSE
READ (nchanl,ERR=910,END=920)
READ (nchanl,ERR=910,END=920)
READ (nchanl,ERR=910,END=920)
READ (nchanl,ERR=910,END=920)
READ (nchanl,ERR=910,END=920)
ENDIF
END DO
END IF
CALL fix_soil_nstyp
(nx,ny,nstyp1,nstyp,tsfc,tsoil,wetsfc,wetdp,wetcanp)
IF (snowcin == 1) THEN
READ (nchanl,ERR=910,END=920)
END IF
IF (snowin == 1) THEN
READ (nchanl,ERR=910,END=920) &
((snowdpth(i,j),i=1,nx),j=1,ny)
END IF
END IF
IF ( radin == 1 ) THEN
DO k=1,nz
READ (nchanl,ERR=910,END=920) &
((radfrc(i,j,k),i=1,nx),j=1,ny)
END DO
READ (nchanl,ERR=910,END=920) ((radsw(i,j),i=1,nx),j=1,ny)
READ (nchanl,ERR=910,END=920) ((rnflx(i,j),i=1,nx),j=1,ny)
END IF ! End radin
IF ( flxin == 1 ) THEN
READ (nchanl,ERR=910,END=920) ((usflx(i,j),i=1,nx),j=1,ny)
READ (nchanl,ERR=910,END=920) ((vsflx(i,j),i=1,nx),j=1,ny)
READ (nchanl,ERR=910,END=920) ((ptsflx(i,j),i=1,nx),j=1,ny)
READ (nchanl,ERR=910,END=920) ((qvsflx(i,j),i=1,nx),j=1,ny)
END IF ! End flxin
ireturn=0
RETURN
!
!-----------------------------------------------------------------------
!
! Error during read
!
!-----------------------------------------------------------------------
!
910 CONTINUE
WRITE(6,'(/a/)') ' Error reading data in GRADSREAD'
ireturn=1
RETURN
!
!-----------------------------------------------------------------------
!
! End-of-file during read
!
!----------------------------------------------------------------------
!
920 CONTINUE
WRITE(6,'(/a/)') ' End of file reached in GRADSREAD'
ireturn=2
END SUBROUTINE gradsread
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE GRADSDUMP ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE gradsdump(nx,ny,nz,nstyps, nchanl, filnam, istgr, & 1,60
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)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Write history data into the file "filnam" in the GrADS format.
!
! All output data are located at the grid cell centers.
!
! X_center(i) = ( X_edge(i) + X_edge(i+1) )/2, i = 1, n-1, 1
!
! The last edge value were kept unchanged so that it can be used to
! restore the stagger grid point values.
!
! X_edge(n) = X_center(n)
! X_edge(i) = 2*X_center(i) - X_edge(i+1), i = n-1, 1, -1
!
! Therefore, when you display the data by GrADS, set the x, y, and
! z dimension not to exceed the Max-1.
!
! Since total and perturbation variables will be dumped, the base
! state variables can be obtained by Xbar = X - Xprt.
!
! The smallest time unit of the current version GrADS is minutes.
! Therefore, the time intervals for history data dumping, thisdmp,
! should be multiples of 60 seconds.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 7/20/93.
!
!
! MODIFICATION HISTORY:
!
! 9/1/94 (Y. Lu)
! Cleaned up documentation.
!
! 10/10/94 (Y. Liu)
! Added an option (flag istgr) so that the history data can be
! dumped out at stager points.
!
! 02/06/95 (Y. Liu)
! Added map projection parameters into the GrADS dumping
!
! 03/27/1995 (Yuhe Liu)
! Added physical vertical coordinates array, zp(nx,ny,nz) into the
! display data sets in order for the GrADS to display zp and any
! other variables (interpolated) in the physical coordinates.
!
!-----------------------------------------------------------------------
!
! 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
!
! nchanl FORTRAN I/O channel number for history data output.
!
! 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 zonal velocity component (m/s)
! vbar Base state meridional 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.
!
!
!-----------------------------------------------------------------------
!
! The following parameters are passed into this subroutine through
! a common block in globcst.inc, and they determine which
! variables are output.
!
! varout =0 or 1. If varout=0, model perturbation variables are not
! dumped.
! mstout =0 or 1. If mstout =0, water variables are not dumped.
! rainout=0 or 1. If rainout=0, rain variables are not dumped.
! prcout =0 or 1. If prcout =0, precipitation rates are not dumped.
! iceout =0 or 1. If iceout =0, qi, qs and qh are not dumped.
! tkeout =0 or 1. If tkeout =0, tke is not dumped.
! trbout =0 or 1. If trbout =0, kmh and kmv are not dumped
! sfcout =0 or 1. If sfcout =0, surface variables are not dumped.
! landout=0 or 1. If landout=0, surface property arrays are not dumped.
! radout =0 or 1. If radout =0, radiation arrays are not dumped.
! flxout =0 or 1. If flxout =0, surface fluxes are not dumped.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
INTEGER :: istgr ! Flag for dumping stager point data
INTEGER :: nchanl ! FORTRAN I/O channel number for output
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 u-velocity (m/s)
REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s)
REAL :: wbar (nx,ny,nz) ! Base state w-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) ! x-coord. of the physical and
! computational grid. Defined at u-point.
REAL :: y (ny) ! y-coord. of the physical and
! computational grid. Defined at v-point.
REAL :: z (nz) ! z-coord. of the computational grid.
! Defined at w-point on the staggered grid.
REAL :: zp (nx,ny,nz) ! 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
! ddefined as ( zp )/d( z )
INTEGER :: nstyps
INTEGER :: soiltyp(nx,ny,nstyps) ! Soil type
REAL :: stypfrct(nx,ny,nstyps) ! Fraction of soil types
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)
! (in top 1 cm layer)
REAL :: tsoil (nx,ny,0:nstyps) ! Deep soil temperature (K)
! (in deep 1 m layer)
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
!
!-----------------------------------------------------------------------
!
! Parameters describing this routine
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=40) :: fmtver
PARAMETER (fmtver='004.10 GrADS Binary Data')
CHARACTER (LEN=10) :: tmunit
PARAMETER (tmunit='seconds ')
CHARACTER (LEN=2) :: dtunit
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: varnumax
PARAMETER ( varnumax = 100 )
CHARACTER (LEN=8) :: varnam(varnumax)
CHARACTER (LEN=60) :: vartit(varnumax)
CHARACTER (LEN=10) :: varparam(varnumax)
INTEGER :: varlev(varnumax)
INTEGER :: i,j,k,l,m, istat, ierr,is
INTEGER :: varnum
INTEGER :: tinc,ntm
INTEGER :: idummy
REAL :: rdummy
REAL :: xbgn,ybgn,zbgn, xinc,yinc,zinc
REAL :: lat11, lon11
REAL :: latmin, latmax, lonmin, lonmax, latinc, loninc
CHARACTER (LEN=*) :: filnam
CHARACTER (LEN=80) :: gradscntl
INTEGER :: filen, cntlen
CHARACTER (LEN=20) :: chrstr
INTEGER :: hdbyte
INTEGER :: nchout0
INTEGER :: year1, month1, day1, jday1, loopdy
INTEGER :: hour1, minute1, second1
CHARACTER (LEN=3) :: monnam(12) ! Name of months
DATA monnam/'jan', 'feb', 'mar', 'apr', 'may', 'jun', &
'jul', 'aug', 'sep', 'oct', 'nov', 'dec'/
INTEGER :: mndys(12) ! days for each months
DATA mndys/0,31,59,90,120,151,181,212,243,273,304,334/
LOGICAL :: firstcall
DATA firstcall/.true./
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
!
!-----------------------------------------------------------------------
!
SAVE firstcall
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IF ( firstcall ) THEN
DO l = 1, varnumax
varparam(l) = '99' ! Current version GrADS does not use.
! It can be any integer
END DO
CALL getunit
( nchanl )
filen = LEN(filnam)
CALL strlnth
( filnam, filen )
CALL asnctl
('NEWLOCAL', 1, ierr)
CALL asnfile
(filnam(1:filen), '-F f77 -N ieee', ierr)
OPEN (UNIT=nchanl,FILE=trim(filnam(1:filen)),STATUS='new', &
FORM='unformatted',ACCESS='sequential',IOSTAT= istat )
!
!-----------------------------------------------------------------------
!
! Write header info. This should be done only one time.
!
!-----------------------------------------------------------------------
!
xbgn = (x(1) + x(2))/2.
ybgn = (y(1) + y(2))/2.
zbgn = (z(1) + z(2))/2.
xinc = (x(2) - x(1))
yinc = (y(2) - y(1))
zinc = (z(2) - z(1))
CALL xytoll
(nx,ny,x,y,tem1(1,1,1),tem1(1,1,2))
CALL xytoll
(1,1,xbgn,ybgn,lat11,lon11)
CALL a3dmax0
(tem1(1,1,1),1,nx,1,nx,1,ny,1,ny-1,1,1,1,1, &
latmax,latmin)
CALL a3dmax0
(tem1(1,1,2),1,nx,1,nx,1,ny,1,ny-1,1,1,1,1, &
lonmax,lonmin)
latinc = (latmax-latmin)/(ny-1)
loninc = (lonmax-lonmin)/(nx-1)
WRITE (6,'(a,f10.4,a,f10.4,a,f10.4)') &
'latmin:latmax:latinc = ', &
latmin,':',latmax,':',latinc
WRITE (6,'(a,f10.4,a,f10.4,a,f10.4)') &
'lonmin:lonmax:loninc = ', &
lonmin,':',lonmax,':',loninc
IF ( thisdmp <= 0.0 ) THEN
ntm = 1
ELSE
ntm = nint((tstop-tstart)/thisdmp) + 1
END IF
IF (thisdmp < 60.) THEN
WRITE (6, '(/a/a)') &
'GrADS reqiures the smallest uint minute for time interval.', &
'Here we use uint MN to represent the second.'
tinc = nint(thisdmp)
dtunit = 'MN'
ELSE IF (thisdmp < 3600.) THEN
tinc = nint(thisdmp/60.)
dtunit = 'MN'
ELSE IF (thisdmp < 86400.) THEN
tinc = nint(thisdmp/3600.)
dtunit = 'HR'
ELSE
tinc = nint(thisdmp/86400.)
dtunit = 'DY'
END IF
varnum = 0
varnum = varnum + 1
varnam(varnum) = 'zp '
vartit(varnum) = 'Physical vertical coordinates (m)'
varlev(varnum) = nz
IF ( varout == 1 ) THEN
varnum = varnum + 1
varnam(varnum) = 'u '
vartit(varnum) = 'X-velocity total wind (m/s)'
varlev(varnum) = nz
varnum = varnum + 1
varnam(varnum) = 'uprt '
vartit(varnum) = 'X-velocity perturbation (m/s)'
varlev(varnum) = nz
varnum = varnum + 1
varnam(varnum) = 'v '
vartit(varnum) = 'Y-velocity total wind (m/s)'
varlev(varnum) = nz
varnum = varnum + 1
varnam(varnum) = 'vprt '
vartit(varnum) = 'Y-velocity perturbation (m/s)'
varlev(varnum) = nz
varnum = varnum + 1
varnam(varnum) = 'w '
vartit(varnum) = 'Z-velocity total wind (m/s)'
varlev(varnum) = nz
varnum = varnum + 1
varnam(varnum) = 'pt '
vartit(varnum) = 'Potential Temperature (K)'
varlev(varnum) = nz
varnum = varnum + 1
varnam(varnum) = 'ptprt '
vartit(varnum) = 'Perturbation Potential Temperature (K)'
varlev(varnum) = nz
varnum = varnum + 1
varnam(varnum) = 'p '
vartit(varnum) = 'Pressure (pascal)'
varlev(varnum) = nz
varnum = varnum + 1
varnam(varnum) = 'pprt '
vartit(varnum) = 'Perturbation Pressure (pascal)'
varlev(varnum) = nz
varnum = varnum + 1
varnam(varnum) = 'vort '
vartit(varnum) = 'Vertical vorticity (1/s)'
varlev(varnum) = nz
varnum = varnum + 1
varnam(varnum) = 'div '
vartit(varnum) = 'Horizontal divergence (1/s)'
varlev(varnum) = nz
END IF
IF ( mstout == 1 ) THEN
varnum = varnum + 1
varnam(varnum) = 'qv '
vartit(varnum) = 'Water Vapor Mixing Ratio (g/kg)'
varlev(varnum) = nz
varnum = varnum + 1
varnam(varnum) = 'qvprt '
vartit(varnum) = 'Water Vapor Mixing Ratio '// &
'Perturbation (g/kg)'
varlev(varnum) = nz
varnum = varnum + 1
varnam(varnum) = 'qc '
vartit(varnum) = 'Cloud Water Mixing Ratio (g/kg)'
varlev(varnum) = nz
varnum = varnum + 1
varnam(varnum) = 'qr '
vartit(varnum) = 'Rain Water Mixing Ratio (g/kg)'
varlev(varnum) = nz
IF ( iceout == 1 ) THEN
varnum = varnum + 1
varnam(varnum) = 'qi '
vartit(varnum) = 'Cloud Ice Mixing Ratio (g/kg)'
varlev(varnum) = nz
varnum = varnum + 1
varnam(varnum) = 'qs '
vartit(varnum) = 'Snow Mixing Ratio (g/kg)'
varlev(varnum) = nz
varnum = varnum + 1
varnam(varnum) = 'qh '
vartit(varnum) = 'Hail Mixing Ratio (g/kg)'
varlev(varnum) = nz
END IF
IF ( rainout == 1 ) THEN
varnum = varnum + 1
varnam(varnum) = 'raing '
vartit(varnum) = 'Grid Supersaturation Rain '
varlev(varnum) = 0
varnum = varnum + 1
varnam(varnum) = 'rainc'
vartit(varnum) = 'Cumulus Convection Rain '
varlev(varnum) = 0
END IF
IF ( prcout == 1 ) THEN
varnum = varnum + 1
varnam(varnum) = 'prcrt1 '
vartit(varnum) = 'Total precipitation rate '
varlev(varnum) = 0
varnum = varnum + 1
varnam(varnum) = 'prcrt2 '
vartit(varnum) = 'Grid scale precipitation rate '
varlev(varnum) = 0
varnum = varnum + 1
varnam(varnum) = 'prcrt3 '
vartit(varnum) = 'Cumulative precipitation rate '
varlev(varnum) = 0
varnum = varnum + 1
varnam(varnum) = 'prcrt4 '
vartit(varnum) = 'Microphysics precipitation rate '
varlev(varnum) = 0
END IF
END IF
IF ( tkeout == 1 ) THEN
varnum = varnum + 1
varnam(varnum) = 'tke '
vartit(varnum) ='Turbulent kinetic energy (m**2/s)'
varlev(varnum) = nz
END IF
IF ( trbout == 1 ) THEN
varnum = varnum + 1
varnam(varnum) = 'kmh '
vartit(varnum) ='Horizontal Turb. Mixing Coefficient for ' &
//'Momentum (m**2/s)'
varlev(varnum) = nz
varnum = varnum + 1
varnam(varnum) = 'kmv '
vartit(varnum) = 'Vertical Turb. Mixing Coefficient for ' &
//'Momentum (m**2/s)'
varlev(varnum) = nz
END IF
IF ( sfcout == 1 ) THEN
IF ( nstyp <= 1 ) THEN
varnum = varnum + 1
varnam(varnum) = 'ts '
vartit(varnum) = 'Ground Surface Temperature (K)'
varlev(varnum) = 0
varnum = varnum + 1
varnam(varnum) = 't2 '
vartit(varnum) = 'Deep Soil Temperature (K)'
varlev(varnum) = 0
varnum = varnum + 1
varnam(varnum) = 'wg '
vartit(varnum) = 'Surface Soil moisture'
varlev(varnum) = 0
varnum = varnum + 1
varnam(varnum) = 'w2 '
vartit(varnum) = 'Deep Soil moisture'
varlev(varnum) = 0
varnum = varnum + 1
varnam(varnum) = 'wr '
vartit(varnum) = 'Canopy Soil moisture'
varlev(varnum) = 0
ELSE
DO is=0,nstyp
WRITE (chrstr,'(i1)') is
varnum = varnum + 1
varnam(varnum) = 'ts'//chrstr(1:1)//' '
vartit(varnum) = 'Ground Surface Temperature (K)'
varlev(varnum) = 0
varnum = varnum + 1
varnam(varnum) = 't2'//chrstr(1:1)//' '
vartit(varnum) = 'Deep Soil Temperature (K)'
varlev(varnum) = 0
varnum = varnum + 1
varnam(varnum) = 'wg'//chrstr(1:1)//' '
vartit(varnum) = 'Surface Soil moisture'
varlev(varnum) = 0
varnum = varnum + 1
varnam(varnum) = 'w2'//chrstr(1:1)//' '
vartit(varnum) = 'Deep Soil moisture'
varlev(varnum) = 0
varnum = varnum + 1
varnam(varnum) = 'wr'//chrstr(1:1)//' '
vartit(varnum) = 'Canopy Soil moisture'
varlev(varnum) = 0
END DO
END IF
IF ( snowout == 1 ) THEN
varnum = varnum + 1
varnam(varnum) = 'snowd '
vartit(varnum) = 'Snow depth (m)'
varlev(varnum) = 0
END IF
END IF
IF ( radout == 1 ) THEN
varnum = varnum + 1
varnam(varnum) = 'radfrc '
vartit(varnum) = 'Total radiation forcing (K/s)'
varlev(varnum) = nz
varnum = varnum + 1
varnam(varnum) = 'radsw '
vartit(varnum) = 'Incoming solar rad. at surface (W/m**2)'
varlev(varnum) = 0
varnum = varnum + 1
varnam(varnum) = 'rnflx '
vartit(varnum) = 'Surface radiation heat flux (W/m**2)'
varlev(varnum) = 0
END IF
IF ( flxout == 1 ) THEN
varnum = varnum + 1
varnam(varnum) = 'usflx '
vartit(varnum) = 'Surface u-momentum flux (kg/m*s**2)'
varlev(varnum) = 0
varnum = varnum + 1
varnam(varnum) = 'vsflx '
vartit(varnum) = 'Surface v-momentum flux (kg/m*s**2)'
varlev(varnum) = 0
varnum = varnum + 1
varnam(varnum) = 'ptsflx '
vartit(varnum) = 'Surface heat flux (K*kg/s*m**2)'
varlev(varnum) = 0
varnum = varnum + 1
varnam(varnum) = 'qvsflx '
vartit(varnum) = 'Surface moisture flux (kg/s*m**2)'
varlev(varnum) = 0
END IF
hdbyte = 0
WRITE(nchanl) fmtver
hdbyte = hdbyte + 8 + 1*40
WRITE(nchanl) runname
hdbyte = hdbyte + 8 + 1*80
WRITE(nchanl) nocmnt
hdbyte = hdbyte + 8 + 1*4
IF ( nocmnt > 0 ) THEN
DO l = 1, nocmnt
WRITE(nchanl) cmnt(l)
END DO
hdbyte = hdbyte + nocmnt * ( 8 + 80 )
END IF
WRITE(nchanl) nx,ny,nz
hdbyte = hdbyte + 8 + 3*4
WRITE(nchanl) curtim,tmunit
hdbyte = hdbyte + 8 + 4 + 10
idummy = 0
rdummy = 0.0
WRITE(nchanl) varout, mstout, iceout, trbout, sfcout, &
rainout, landout, idummy, idummy, totout, &
tkeout, idummy, mapproj, istgr, month, &
day, year, hour, minute, second
hdbyte = hdbyte + 8 + 20*4
WRITE(nchanl) umove, vmove, xgrdorg, ygrdorg, trulat1, &
trulat2, trulon, sclfct, rdummy, rdummy, &
rdummy, rdummy, rdummy, rdummy, rdummy, &
tstop, thisdmp, latitud, ctrlat, ctrlon
hdbyte = hdbyte + 8 + 20*4
IF ( totout /= 0 ) THEN
WRITE(nchanl) hdmpopt, nstyp, prcout, radout, flxout, &
0,snowout,idummy, idummy, idummy, & ! 0 for snowcvr
idummy, idummy, idummy, idummy, idummy, &
idummy, idummy, idummy, idummy, idummy
hdbyte = hdbyte + 8 + 20*4
WRITE(nchanl) tstrtdmp,rdummy, rdummy, rdummy, rdummy, &
rdummy, rdummy, rdummy, rdummy, rdummy, &
rdummy, rdummy, rdummy, rdummy, rdummy, &
rdummy, rdummy, rdummy, rdummy, rdummy
hdbyte = hdbyte + 8 + 20*4
END IF
IF ( hdmpopt == 2 ) THEN
WRITE (nchanl) numhdmp
hdbyte = hdbyte + 8 + 4
IF ( numhdmp > 0 ) THEN
WRITE (nchanl) (hdmptim(i),i=1,numhdmp)
hdbyte = hdbyte + 8 + numhdmp*4
END IF
END IF
WRITE(nchanl) x
hdbyte = hdbyte + 8 + nx*4
WRITE(nchanl) y
hdbyte = hdbyte + 8 + ny*4
WRITE(nchanl) z
hdbyte = hdbyte + 8 + nz*4
WRITE(nchanl) varnum
hdbyte = hdbyte + 8 + 1*4
DO l = 1, varnum
WRITE(nchanl) varnam(l),varlev(l),vartit(l)
END DO
hdbyte = hdbyte + varnum*( 8 + 8 + 4 + 60 )
IF(landout == 1) THEN
IF (nstyp <= 1) THEN
CALL iedgfill
(soiltyp(1,1,1),1,nx,1,nx-1, 1,ny,1,ny-1, &
1,1,1,1)
WRITE (nchanl) ((soiltyp(i,j,1),i=1,nx),j=1,ny)
hdbyte = hdbyte + ( 8 + nx*ny*4 )
ELSE
DO is=1,nstyp
CALL iedgfill
(soiltyp(1,1,is),1,nx,1,nx-1, 1,ny,1,ny-1, &
1,1,1,1)
WRITE (nchanl) ((soiltyp(i,j,is),i=1,nx),j=1,ny)
hdbyte = hdbyte + ( 8 + nx*ny*4 )
CALL edgfill
(stypfrct(1,1,is),1,nx,1,nx-1, 1,ny,1,ny-1, &
1,1,1,1)
WRITE (nchanl) ((stypfrct(i,j,is),i=1,nx),j=1,ny)
hdbyte = hdbyte + ( 8 + nx*ny*4 )
END DO
END IF
CALL iedgfill
(vegtyp ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
WRITE (nchanl) ((vegtyp (i,j),i=1,nx),j=1,ny)
hdbyte = hdbyte + ( 8 + nx*ny*4 )
CALL edgfill
(lai ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
WRITE (nchanl) ((lai (i,j),i=1,nx),j=1,ny)
hdbyte = hdbyte + ( 8 + nx*ny*4 )
CALL edgfill
(roufns ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
WRITE (nchanl) ((roufns (i,j),i=1,nx),j=1,ny)
hdbyte = hdbyte + ( 8 + nx*ny*4 )
CALL edgfill
(veg ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
WRITE (nchanl) ((veg (i,j),i=1,nx),j=1,ny)
hdbyte = hdbyte + ( 8 + nx*ny*4 )
END IF
!
!-----------------------------------------------------------------------
!
! Open the GrADS data control file: runname.ctl
!
!-----------------------------------------------------------------------
!
cntlen = lfnkey + 10
gradscntl(1:cntlen) = runname(1:lfnkey)//'.gradscntl'
CALL fnversn
( gradscntl, cntlen )
CALL getunit
(nchout0)
WRITE (6,'(a)') 'The GrADS data control file is ' &
//gradscntl(1:cntlen)
OPEN (nchout0, FILE = gradscntl(1:cntlen), STATUS = 'unknown')
!
WRITE (nchout0,'(a,a)') &
'DSET ',filnam(1:filen)
WRITE (nchout0,'(a/a)') &
'TITLE ARPS model 5.0 output for '//runname(1:lfnkey),'*'
WRITE (nchout0,'(a)') &
'OPTIONS sequential cray_32bit_ieee'
WRITE (nchout0,'(a,i10)') &
'FILEHEADER ',hdbyte
WRITE (nchout0,'(a/a)') &
'UNDEF -9.e+33','*'
IF ( mapproj == 2 ) THEN
WRITE (nchout0,'(a)') &
'* For lat-lon-lev display, umcomment the following 4 lines.'
WRITE (nchout0,'(a,1x,i8,1x,i3,a,2f12.6,2i3,3f12.6,2f12.2)') &
'PDEF',nx,ny,' LCC',lat11,lon11,1,1, &
trulat1,trulat2,trulon,xinc,yinc
WRITE (nchout0,'(a,1x,i8,a,f10.4,1x,f10.4)') &
'XDEF',nx,' LINEAR ',lonmin,loninc
WRITE (nchout0,'(a,1x,i8,a,f10.4,1x,f10.4)') &
'YDEF',ny,' LINEAR ',latmin,latinc
ELSE
WRITE (nchout0,'(a)') &
'* For i-j-k display, umcomment the following 3 lines.'
WRITE (nchout0,'(a,1x,i8,a,2i10)') &
'* XDEF',nx,' LINEAR ',1,1
WRITE (nchout0,'(a,1x,i8,a,2i10)') &
'* YDEF',ny,' LINEAR ',1,1
WRITE (nchout0,'(a,1x,i8,a,2i10/a)') &
'* ZDEF',nz,' LINEAR ',1,1,'*'
WRITE (nchout0,'(a)') &
'* For x-y-z display, umcomment the following 3 lines.'
WRITE (nchout0,'(a,1x,i8,a,2f15.4)') &
'XDEF',nx,' LINEAR ',xbgn/1000.,xinc/1000.
WRITE (nchout0,'(a,1x,i8,a,2f15.4)') &
'YDEF',ny,' LINEAR ',ybgn/1000.,yinc/1000.
END IF
WRITE (nchout0,'(a,1x,i8,a)') &
'ZDEF',nz,' LEVELS '
IF ( ternopt == 0 ) THEN
WRITE (nchout0,'(8f10.2)') &
((zp(1,1,k)+zp(1,1,k+1))/2.,k=1,nz-1),zp(1,1,nz)
ELSE
WRITE (nchout0,'(8f10.2)') &
((z(k)+z(k+1))/2.,k=1,nz-1),z(nz)
WRITE (nchout0,'(a/a/a)') &
'* WARNING& ! The vertical levels were set to computational ', &
'* coordinates, z(k), because zp is not uniform in ', &
'* horizontal when terrain option was turned on'
END IF
IF ( initopt /= 2 ) THEN
WRITE (chrstr,'(i2.2,a,i2.2,a,i2.2,a3,i4.4)') &
hour,':',minute,'Z',day,monnam(month),year
ELSE
second1 = MOD( second + nint(tstart), 60 )
minute1 = ( second + nint(tstart) ) / 60
minute1 = MOD( minute + minute1, 60 )
hour1 = ( minute + ( second + nint(tstart) ) / 60 ) /60
hour1 = MOD( hour + hour1, 24 )
day1 = ( hour + ( minute &
+ ( second + nint(tstart) ) / 60 ) /60 ) / 24
jday1 = jday + day1
loopdy = 0
IF ( MOD( year, 4 ) == 0 ) loopdy = 1
year1 = year + jday1 / ( 365 + loopdy )
jday1 = MOD( jday1, 365 + loopdy )
month1 = 1
DO m = 2, 11
IF (jday1>mndys(m) .AND. jday1<=mndys(m+1)+loopdy) month1 = m
END DO
day1 = jday1 - mndys(month1)
WRITE (chrstr,'(i2.2,a,i2.2,a,i2.2,a3,i4.4)') &
hour1,':',minute1,'Z',day1,monnam(month1),year1
END IF
IF ( hdmpopt == 1 ) THEN
WRITE (nchout0,'(a/a,f10.2,a/a)') &
'* WARNING: The time interval is applied after the time ', &
'* level at ',tstrtdmp,' model seconds.', &
'* The first time level was the model initial data.'
ELSE IF ( hdmpopt == 2 ) THEN
WRITE (nchout0,'(a/a/a/a)') &
'* WARNING& ! The actual time levels in the data file may not ', &
'* necessarily be in a constant increment. It was ', &
'* written for the model times listed in the ', &
'* following:'
DO i=1,numhdmp
WRITE (nchout0,'(a,f10.2)') &
'* ',hdmptim(i)
END DO
END IF
WRITE (nchout0,'(a,1x,i8,a,a,3x,i2.2,a/a)') &
'TDEF',ntm,' LINEAR ',chrstr,tinc,dtunit,'*'
WRITE (nchout0,'(a,1x,i3)') &
'VARS',varnum
DO l = 1, varnum
WRITE (nchout0,'(a8,1x,i3,1x,a10,2x,a)') &
varnam(l),varlev(l),varparam(l),vartit(l)
END DO
WRITE (nchout0,'(a)') &
'ENDVARS'
CLOSE (nchout0)
CALL retunit(nchout0)
firstcall = .false.
END IF
!
!-----------------------------------------------------------------------
!
! Write data into the GrADS data file
!
!-----------------------------------------------------------------------
!
IF ( varout == 1 ) THEN
!
!-----------------------------------------------------------------------
!
! If varout = 1, Write out u, uprt, v, vprt, w, wprt,
! pt, ptprt, p, pprt, vort, and div.
!
!-----------------------------------------------------------------------
!
CALL edgfill
(zp ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz)
IF ( istgr == 0 ) THEN
DO j=1,ny
DO i=1,nx
DO k=1,nz-1
tem1(i,j,k) = .5 * ( zp(i,j,k) + zp(i,j,k+1) )
END DO
tem1(i,j,nz) = zp(i,j,nz)
END DO
END DO
ELSE
DO j=1,ny
DO i=1,nx
DO k=1,nz
tem1(i,j,k) = zp(i,j,k)
END DO
END DO
END DO
END IF
DO k=1,nz
WRITE(nchanl) ((tem1(i,j,k),i=1,nx),j=1,ny)
END DO
CALL edgfill
(u, 1,nx,1,nx, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL edgfill
(ubar,1,nx,1,nx, 1,ny,1,ny-1, 1,nz,1,nz-1)
IF ( istgr == 0 ) THEN
DO k=1,nz
DO j=1,ny
DO i=1,nx-1
tem1(i,j,k) = .5 * ( u(i,j,k) + u(i+1,j,k) )
tem2(i,j,k) = tem1(i,j,k) &
- .5 * ( ubar(i,j,k) + ubar(i+1,j,k) )
END DO
tem1(nx,j,k) = u(nx,j,k)
tem2(nx,j,k) = u(nx,j,k) - ubar(nx,j,k)
END DO
END DO
ELSE
DO k=1,nz
DO j=1,ny
DO i=1,nx
tem1(i,j,k) = u(i,j,k)
tem2(i,j,k) = u(i,j,k) - ubar(i,j,k)
END DO
END DO
END DO
END IF
DO k=1,nz
WRITE(nchanl) ((tem1(i,j,k),i=1,nx),j=1,ny)
END DO
DO k=1,nz
WRITE(nchanl) ((tem2(i,j,k),i=1,nx),j=1,ny)
END DO
CALL edgfill
(v, 1,nx,1,nx-1, 1,ny,1,ny, 1,nz,1,nz-1)
CALL edgfill
(vbar,1,nx,1,nx-1, 1,ny,1,ny, 1,nz,1,nz-1)
IF ( istgr == 0 ) THEN
DO k=1,nz
DO i=1,nx
DO j=1,ny-1
tem1(i,j,k) = .5 * ( v(i,j,k) + v(i,j+1,k) )
tem2(i,j,k) = tem1(i,j,k) &
- .5 * ( vbar(i,j,k) + vbar(i,j+1,k) )
END DO
tem1(i,ny,k) = v(i,ny,k)
tem2(i,ny,k) = v(i,ny,k) - vbar(i,ny,k)
END DO
END DO
ELSE
DO k=1,nz
DO j=1,ny
DO i=1,nx
tem1(i,j,k) = v(i,j,k)
tem2(i,j,k) = v(i,j,k) - vbar(i,j,k)
END DO
END DO
END DO
END IF
DO k=1,nz
WRITE(nchanl) ((tem1(i,j,k),i=1,nx),j=1,ny)
END DO
DO k=1,nz
WRITE(nchanl) ((tem2(i,j,k),i=1,nx),j=1,ny)
END DO
CALL edgfill
(w ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz)
IF ( istgr == 0 ) THEN
DO j=1,ny
DO i=1,nx
DO k=1,nz-1
tem1(i,j,k) = .5 * ( w(i,j,k) + w(i,j,k+1) )
END DO
tem1(i,j,nz) = w(i,j,nz)
END DO
END DO
ELSE
DO j=1,ny
DO i=1,nx
DO k=1,nz
tem1(i,j,k) = w(i,j,k)
END DO
END DO
END DO
END IF
DO k=1,nz
WRITE(nchanl) ((tem1(i,j,k),i=1,nx),j=1,ny)
END DO
CALL edgfill
(ptprt,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL edgfill
(ptbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
DO k=1,nz
DO j=1,ny
DO i=1,nx
tem1(i,j,k) = ptprt(i,j,k) + ptbar(i,j,k)
END DO
END DO
END DO
DO k=1,nz
WRITE(nchanl) ((tem1(i,j,k),i=1,nx),j=1,ny)
END DO
DO k=1,nz
WRITE(nchanl) ((ptprt(i,j,k),i=1,nx),j=1,ny)
END DO
CALL edgfill
(pprt,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL edgfill
(pbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
DO k=1,nz
DO j=1,ny
DO i=1,nx
tem1(i,j,k) = pprt(i,j,k) + pbar(i,j,k)
END DO
END DO
END DO
DO k=1,nz
WRITE(nchanl) ((tem1(i,j,k),i=1,nx),j=1,ny)
END DO
DO k=1,nz
WRITE(nchanl) ((pprt(i,j,k),i=1,nx),j=1,ny)
END DO
!-----------------------------------------------------------------------
!
! Vorticity:
!
!-----------------------------------------------------------------------
DO k=2,nz-2
DO j=2,ny-2
DO i=2,nx-2
tem1(i,j,k)= &
(v(i+1,j,k)-v(i-1,j,k)+v(i+1,j+1,k)-v(i-1,j+1,k))/ &
(4*(x(i+1)-x(i)))- &
(u(i,j+1,k)-u(i,j-1,k)+u(i+1,j+1,k)-u(i+1,j-1,k))/ &
(4*(y(j+1)-y(j)))
END DO
END DO
END DO
DO j=2,ny-2
DO i=2,nx-2
tem1(i,j, 1)=tem1(i,j, 2)
tem1(i,j,nz-1)=tem1(i,j,nz-2)
END DO
END DO
DO k=1,nz-1
DO j=2,ny-2
tem1( 1,j,k)=tem1( 2,j,k)
tem1(nx-1,j,k)=tem1(nx-2,j,k)
END DO
END DO
DO k=1,nz-1
DO i=1,nx-1
tem1(i, 1,k)=tem1(i, 2,k)
tem1(i,ny-1,k)=tem1(i,ny-2,k)
END DO
END DO
CALL edgfill
(tem1,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
DO k=1,nz
WRITE(nchanl) ((tem1(i,j,k),i=1,nx),j=1,ny)
END DO
!-----------------------------------------------------------------------
!
! Divergernce:
!
!-----------------------------------------------------------------------
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k) = (u(i+1,j,k)-u(i,j,k))/(x(i+1)-x(i)) &
+ (v(i,j+1,k)-v(i,j,k))/(y(j+1)-y(j))
END DO
END DO
END DO
CALL edgfill
(tem1,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
DO k=1,nz
WRITE(nchanl) ((tem1(i,j,k),i=1,nx),j=1,ny)
END DO
END IF ! End varout
IF ( mstout == 1 ) THEN
!
!-----------------------------------------------------------------------
!
! Write out moist variables qv, qvprt, qc, qr, qi, qs, and qh
!
!-----------------------------------------------------------------------
!
CALL edgfill
(qv, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL edgfill
(qvbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
DO k=1,nz
DO j=1,ny
DO i=1,nx
tem1(i,j,k) = qv(i,j,k) - qvbar(i,j,k)
END DO
END DO
END DO
DO k=1,nz
WRITE(nchanl) ((qv(i,j,k),i=1,nx),j=1,ny)
END DO
DO k=1,nz
WRITE(nchanl) ((tem1(i,j,k),i=1,nx),j=1,ny)
END DO
CALL edgfill
(qc,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
DO k=1,nz
WRITE(nchanl) ((qc(i,j,k),i=1,nx),j=1,ny)
END DO
CALL edgfill
(qr,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
DO k=1,nz
WRITE(nchanl) ((qr(i,j,k),i=1,nx),j=1,ny)
END DO
IF ( iceout == 1 ) THEN
CALL edgfill
(qi,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
DO k=1,nz
WRITE(nchanl) ((qi(i,j,k),i=1,nx),j=1,ny)
END DO
CALL edgfill
(qs,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
DO k=1,nz
WRITE(nchanl) ((qs(i,j,k),i=1,nx),j=1,ny)
END DO
CALL edgfill
(qh,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
DO k=1,nz
WRITE(nchanl) ((qh(i,j,k),i=1,nx),j=1,ny)
END DO
END IF ! End iceout
IF ( rainout == 1 ) THEN
CALL edgfill
(raing,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
WRITE(nchanl) ((raing(i,j),i=1,nx),j=1,ny)
CALL edgfill
(rainc,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
WRITE(nchanl) ((rainc(i,j),i=1,nx),j=1,ny)
END IF ! End rainout
IF ( prcout == 1 ) THEN
CALL edgfill
(prcrate,1,nx,1,nx-1, 1,ny,1,ny-1, 1,4,1,4)
WRITE(nchanl) ((prcrate(i,j,1),i=1,nx),j=1,ny)
WRITE(nchanl) ((prcrate(i,j,2),i=1,nx),j=1,ny)
WRITE(nchanl) ((prcrate(i,j,3),i=1,nx),j=1,ny)
WRITE(nchanl) ((prcrate(i,j,4),i=1,nx),j=1,ny)
END IF ! End prcout
END IF ! End mstout
IF ( tkeout == 1 ) THEN
CALL edgfill
(tke,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
DO k=1,nz
WRITE(nchanl) ((tke(i,j,k),i=1,nx),j=1,ny)
END DO
END IF
IF ( trbout == 1 ) THEN
!
!-----------------------------------------------------------------------
!
! If trbout = 1, write out the turbulence parameter, km.
!
!-----------------------------------------------------------------------
!
CALL edgfill
(kmh,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
DO k=1,nz
WRITE(nchanl) ((kmh(i,j,k),i=1,nx),j=1,ny)
END DO
CALL edgfill
(kmv,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
DO k=1,nz
WRITE(nchanl) ((kmv(i,j,k),i=1,nx),j=1,ny)
END DO
END IF ! trbout
IF ( sfcout == 1 ) THEN
!
!-----------------------------------------------------------------------
!
! Write out surface variables tsfc, tsoil, wetsfc, wetdp, wetcanp
!
!-----------------------------------------------------------------------
!
IF (nstyp <= 1) THEN
CALL edgfill
(tsfc(1,1,0), 1,nx,1,nx-1, 1,ny,1,ny-1, &
1,1,1,1)
WRITE(nchanl) ((tsfc (i,j,0),i=1,nx),j=1,ny)
CALL edgfill
(tsoil(1,1,0), 1,nx,1,nx-1, 1,ny,1,ny-1, &
1,1,1,1)
WRITE(nchanl) ((tsoil (i,j,0),i=1,nx),j=1,ny)
CALL edgfill
(wetsfc(1,1,0), 1,nx,1,nx-1, 1,ny,1,ny-1, &
1,1,1,1)
WRITE(nchanl) ((wetsfc (i,j,0),i=1,nx),j=1,ny)
CALL edgfill
(wetdp(1,1,0), 1,nx,1,nx-1, 1,ny,1,ny-1, &
1,1,1,1)
WRITE(nchanl) ((wetdp (i,j,0),i=1,nx),j=1,ny)
CALL edgfill
(wetcanp(1,1,0),1,nx,1,nx-1, 1,ny,1,ny-1, &
1,1,1,1)
WRITE(nchanl) ((wetcanp(i,j,0),i=1,nx),j=1,ny)
ELSE
DO is=0,nstyp
CALL edgfill
(tsfc (1,1,is),1,nx,1,nx-1,1,ny,1,ny-1, &
1,1,1,1)
WRITE(nchanl) ((tsfc (i,j,is),i=1,nx),j=1,ny)
CALL edgfill
(tsoil (1,1,is),1,nx,1,nx-1,1,ny,1,ny-1, &
1,1,1,1)
WRITE(nchanl) ((tsoil (i,j,is),i=1,nx),j=1,ny)
CALL edgfill
(wetsfc (1,1,is),1,nx,1,nx-1,1,ny,1,ny-1, &
1,1,1,1)
WRITE(nchanl) ((wetsfc (i,j,is),i=1,nx),j=1,ny)
CALL edgfill
(wetdp (1,1,is),1,nx,1,nx-1,1,ny,1,ny-1, &
1,1,1,1)
WRITE(nchanl) ((wetdp (i,j,is),i=1,nx),j=1,ny)
CALL edgfill
(wetcanp(1,1,is),1,nx,1,nx-1,1,ny,1,ny-1, &
1,1,1,1)
WRITE(nchanl) ((wetcanp(i,j,is),i=1,nx),j=1,ny)
END DO
END IF
IF (snowout == 1) THEN
CALL edgfill
(snowdpth(1,1),1,nx,1,nx-1,1,ny,1,ny-1, &
1,1,1,1)
WRITE(nchanl) ((snowdpth(i,j),i=1,nx),j=1,ny)
END IF
END IF ! End sfcout
!
!-----------------------------------------------------------------------
!
! If radout = 1, write out the radiation arrays
!
!-----------------------------------------------------------------------
!
IF ( radout == 1 ) THEN
CALL edgfill
(radfrc,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
DO k=1,nz
WRITE(nchanl) ((radfrc(i,j,k),i=1,nx),j=1,ny)
END DO
CALL edgfill
(radsw,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
WRITE(nchanl) ((radsw(i,j),i=1,nx),j=1,ny)
CALL edgfill
(rnflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
WRITE(nchanl) ((rnflx(i,j),i=1,nx),j=1,ny)
END IF ! radout
!
!-----------------------------------------------------------------------
!
! If flxout = 1, write out the surface fluxes
!
!-----------------------------------------------------------------------
!
IF ( flxout == 1 ) THEN
CALL edgfill
(usflx,1,nx,1,nx, 1,ny,1,ny-1, 1,1,1,1)
WRITE(nchanl) ((usflx(i,j),i=1,nx),j=1,ny)
CALL edgfill
(vsflx,1,nx,1,nx-1, 1,ny,1,ny, 1,1,1,1)
WRITE(nchanl) ((vsflx(i,j),i=1,nx),j=1,ny)
CALL edgfill
(ptsflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
WRITE(nchanl) ((ptsflx(i,j),i=1,nx),j=1,ny)
CALL edgfill
(qvsflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
WRITE(nchanl) ((qvsflx(i,j),i=1,nx),j=1,ny)
END IF ! flxout
RETURN
END SUBROUTINE gradsdump