!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE GRIBDUMP ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE gribdump(nx,ny,nz,nstyps, nchanl,filnam, grdbas, & 1,106
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,item1,temxy1,temxy2,itemxy1,itemxy2)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Write history data into channel nchanl as GRIB data.
!
! All data read in are located at the original staggered grid points.
!
! Note: coordinate fields are dumped as 3 dimensional fields which
! have been converted from meters to kilometers. This is for the
! convenience of the plotting applications.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 11/01/1995
!
! MODIFICATION HISTORY:
!
! 12/09/1998 (Donghai Wang)
! Added the snow cover.
!
! 1/07/2000 (Eric Kemp)
! Snow cover is now written as GRIB variable 66 (snow depth (m))
!
!-----------------------------------------------------------------------
!
! 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.
! filnam File name to store the GRIB messages
! grdbas Flag indicating if this is a call for the data dump
! of grid and base state arrays only. If so, grdbas=1.
!
! 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
! stypfrct Soil type fraction
! vegtyp Vegetation type
! lai Leaf Area Index
! roufns Surface roughness
! veg Vegetation fraction
!
! tsfc Skin temperature at the ground or ocean surface (K)
! tsoil Deep soil temperature (K) (in deep 1 m layer)
! 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:
!
! None.
!
! WORK ARRAY:
!
! tem1 Temporary work array.
! item1 Integer temporary work array.
! temxy1 2-D temporary work array.
! temxy2 2-D temporary work array.
! itemxy1 2-D integer temporary work array.
! itemxy2 2-D integer 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.
!
! grdout =0 or 1. If grdout =0, grid variables are not dumped.
! basout =0 or 1. If basout =0, base state variables are not dumped.
! varout =0 or 1. If varout =0, model 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 propertty arrays are not dumped.
! radout =0 or 1. If radout =0, precipitation rates are not dumped.
! flxout =0 or 1. If flxout =0, precipitation rates are not dumped.
!
! These following parameters are also passed in through common
! blocks in globcst.inc.
!
! runname,curtim,umove,vmove,xgrdorg,ygrdorg
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'mp.inc' ! Message passing parameters.
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
INTEGER :: nchanl ! FORTRAN I/O channel number for output
CHARACTER (LEN=* ) :: filnam ! File name
INTEGER :: grdbas ! If this is a grid/base state array dump
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 :: 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 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 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 :: temxy1(nx,ny) ! temporary work array
REAL :: temxy2(nx,ny) ! temporary work array
INTEGER :: item1(nx,ny,nz) ! Integer temporary work array
INTEGER :: itemxy1(nx,ny) ! Integer temporary work array
INTEGER :: itemxy2(nx,ny) ! Integer temporary work array
!
!-----------------------------------------------------------------------
!
! Parameters for GRIB packing
!
!-----------------------------------------------------------------------
!
INTEGER :: nbufsz
PARAMETER ( nbufsz = 800000 ) ! Size of GRIB buffer
INTEGER :: ipds(25) ! PDS integer array
INTEGER :: igdss(25) ! GDS integer array for s-grid
INTEGER :: igdsu(25) ! GDS integer array for u-grid
INTEGER :: igdsv(25) ! GDS integer array for v-grid
INTEGER :: ibdshd(4) ! BDS header
CHARACTER (LEN=1) :: pds(28) ! PDS ( GRIB Section 1)
CHARACTER (LEN=1) :: gds(42) ! GDS ( GRIB Section 2)
CHARACTER (LEN=1) :: bds(nbufsz) ! BDS ( GRIB Section 4)
INTEGER :: ibds(nbufsz/4) ! identical to BDS
EQUIVALENCE ( bds,ibds )
CHARACTER (LEN=1) :: mgrib(nbufsz) ! Buffer to carry GRIB messages
INTEGER :: nbytes ! Byte position to start read or write
INTEGER :: wdlen ! Length of machine word
!
!-----------------------------------------------------------------------
!
! Parameters describing this routine
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=40) :: fmtver
PARAMETER (fmtver='004.10 ARPS Data Format 10')
!
!-----------------------------------------------------------------------
!
! Variables to determine the length of machine word, wdlen
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=8) :: ctema,ctemb
INTEGER :: itema,itemb
EQUIVALENCE ( itema,ctema )
EQUIVALENCE ( itemb,ctemb )
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k,is
INTEGER :: itype ! Array type: 0 - floating, 1 - integer
INTEGER :: dflag ! Dimension flag: 0 - 3-D, 1 - 2-D
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
! include 'gribcst.inc'
!
!-----------------------------------------------------------------------
!
! Save ipds & igds for future use
!
!-----------------------------------------------------------------------
!
LOGICAL :: firstcall(0:mgrdmax)
SAVE firstcall, wdlen
DATA firstcall/ mgrdmax*.true.,.true. /
DATA ctema / '12345678' /
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! Initialize the integer array for BDS header
!
!-----------------------------------------------------------------------
!
ibdshd(1) = 0
ibdshd(2) = 0
ibdshd(3) = 0
ibdshd(4) = 0
!
!-----------------------------------------------------------------------
!
! Initialize the integer array, ipds, for PDS.
!
!-----------------------------------------------------------------------
!
CALL mkipds
( nx,ny,nz, ipds )
!
!-----------------------------------------------------------------------
!
! Initialize the GDS integer arrays for different grid type, igdsu,
! igdsv, and igdss
!
!-----------------------------------------------------------------------
!
CALL mkigds
( nx,ny,nz, 0, igdss )
CALL mkigds
( nx,ny,nz, 1, igdsu )
CALL mkigds
( nx,ny,nz, 2, igdsv )
IF (mgrid < 0 .or. mgrid > mgrdmax) THEN
mgrid = 0
ENDIF
IF ( firstcall(mgrid) ) THEN
!
!-----------------------------------------------------------------------
!
! Calculate the length of machine word, wdlen, in bytes, which will
! be used to pack the data. Assume the length has only two possible
! value: 4 and 8
!
!-----------------------------------------------------------------------
!
itemb = itema
IF ( ctema /= ctemb ) THEN
wdlen = 4
ELSE
wdlen = 8
END IF
IF (myproc == 0) WRITE (6,'(a,i2,a)') &
'The length of machine word is ',wdlen,' bytes'
!
!-----------------------------------------------------------------------
!
! Check if number of bits per datum fits size of computer word.
!
!-----------------------------------------------------------------------
!
IF ( wdlen*8 < grbpkbit ) THEN
IF (myproc == 0) WRITE (6,'(a,i3,a,i3/a,a/a)') &
'Number of bits per datum, ',grbpkbit, &
', exceeds the machine word length, ',wdlen*8, &
'Please change grbpkbit in input namelist &output ', &
'to fit the machine word length.', &
'Program stoped in GRIBDUMP'
CALL arpsstop
(" ",1)
END IF
!
!-----------------------------------------------------------------------
!
! Write the sample of GrADS control file used to display the ARPS
! GRIB files. This control file is to display the variables on the
! scalar points. The GRIB grid type was given by ipds(5)
!
!-----------------------------------------------------------------------
!
CALL gribcntl
( nx,ny,nz,x,y,z,zp, ipds(5), temxy1,temxy2 )
firstcall(mgrid) = .false.
END IF
IF (myproc == 0) WRITE(6,'(1x,a,f13.3/)') 'Writing history data at time=', curtim
!
!-----------------------------------------------------------------------
!
! Write the header of ARPS GRIB file
!
!-----------------------------------------------------------------------
!
CALL wrthishd
(nx,ny,nz,nchanl,grdbas,fmtver, x,y,z, &
wdlen,nbufsz,mgrib,nbytes)
!
!-----------------------------------------------------------------------
!
! If grdout=1 or grdbas=1, write out grid variables
!
!-----------------------------------------------------------------------
!
IF(grdout == 1 .OR. grdbas == 1 ) THEN
itype = 0 ! floating array
ibdshd(3) = itype
dflag = 0 ! 3-D array
ipds(8) = 8 ! geometric height (m)
ipds(9) = 103 ! z-coorinates
ipds(18) = 0 ! forecast time = 0 for grid and base variables
IF (myproc == 0) WRITE(6,'(a)') 'Writing zp'
CALL edgfill
(zp,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz)
CALL wrtgrib
(nx,ny,nz,1,z,zp,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
END IF ! grdout
!
!-----------------------------------------------------------------------
!
! If basout=1, write out base state variables.
!
!-----------------------------------------------------------------------
!
IF(basout == 1 .OR. grdbas == 1 ) THEN
itype = 0 ! floating array
ibdshd(3) = itype
dflag = 0 ! 3-D array
ipds(9) = 103 ! z-coorinates
ipds(18) = 0 ! forecast time = 0 for grid and base variables
ipds(8) = 33 ! u wind (m/s)
IF (myproc == 0) WRITE(6,'(a,f10.5)') 'Writing ubar ',ubar(1,1,1)
CALL edgfill
(ubar,1,nx,1,nx, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL wrtgrib
(nx,ny,nz,0,z,ubar,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdsu,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 34 ! v wind (m/s)
IF (myproc == 0) WRITE(6,'(a,f10.5)') 'Writing vbar ',vbar(1,1,1)
CALL edgfill
(vbar,1,nx,1,nx-1, 1,ny,1,ny, 1,nz,1,nz-1)
CALL wrtgrib
(nx,ny,nz,0,z,vbar,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdsv,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 13 ! potential temperature (K)
IF (myproc == 0) WRITE(6,'(a,f10.2)') 'Writing ptbar ',ptbar(1,1,1)
CALL edgfill
(ptbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL wrtgrib
(nx,ny,nz,0,z,ptbar,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 1 ! pressure (Pascal)
IF (myproc == 0) WRITE(6,'(a,f10.2)') 'Writing pbar ', pbar(1,1,1)
CALL edgfill
(pbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL wrtgrib
(nx,ny,nz,0,z,pbar,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
IF(mstout == 1) THEN
ipds(8) = 51 ! specific humidity (kg/kg)
IF (myproc == 0) WRITE(6,'(a)') 'Writing qvbar'
CALL edgfill
(qvbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL wrtgrib
(nx,ny,nz,0,z,qvbar,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
END IF
IF(landout == 1) THEN
dflag = 1 ! 2-D array
ipds(9) = 111 ! depth below land surface
IF( nstyp <= 1 ) THEN
itype = 1 ! integer array
ibdshd(3) = itype
ipds(11) = 0 ! 0 centimeter for surface
ipds(8) = 224 ! soil type
IF (myproc == 0) WRITE(6,'(a)') 'Writing soiltyp '
CALL iedgfill
(soiltyp(1,1,1),1,nx,1,nx-1, 1,ny,1,ny-1, &
1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,tem1(1,1,1),soiltyp(1,1,1), &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ELSE
itype = 1 ! integer array
ibdshd(3) = itype
ipds(8) = 224 ! soil type
IF (myproc == 0) WRITE(6,'(a)') 'Writing soiltyp '
DO is=1,nstyp
ipds(11) = is ! 0 centimeter for surface
CALL iedgfill
(soiltyp(1,1,is),1,nx,1,nx-1, 1,ny,1,ny-1, &
1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,tem1(1,1,1),soiltyp(1,1,is), &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
END DO
itype = 0 ! floating array
ibdshd(3) = itype
ipds(8) = 226 ! redefine 226 for fraction of soil types
IF (myproc == 0) WRITE(6,'(a)') 'Writing stypfrct'
DO is=1,nstyp
ipds(11) = is ! 0 centimeter for surface
CALL edgfill
(stypfrct(1,1,is),1,nx,1,nx-1, 1,ny,1,ny-1, &
1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,stypfrct(1,1,is),item1(1,1,1), &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
END DO
END IF
itype = 1 ! integer array
ibdshd(3) = itype
ipds(11) = 0
ipds(8) = 225 ! vegtyp
IF (myproc == 0) WRITE(6,'(a)') 'Writing vegtyp'
CALL iedgfill
(vegtyp ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,tem1(1,1,1),vegtyp, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
itype = 0 ! floating array
ibdshd(3) = itype
ipds(8) = 227 ! redefine 227 for LAI
IF (myproc == 0) WRITE(6,'(a)') 'Writing lai'
CALL edgfill
(lai ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,lai,item1(1,1,1), &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 83 ! surface roughness (m)
IF (myproc == 0) WRITE(6,'(a)') 'Writing roufns'
CALL edgfill
(roufns ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,roufns,item1(1,1,1), &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 87 ! vegetation (%)
IF (myproc == 0) WRITE(6,'(a)') 'Writing veg'
CALL edgfill
(veg ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
DO j = 1,ny
DO i = 1,nx
tem1(i,j,1) = veg(i,j) * 100.
END DO
END DO
CALL wrtgrib
(nx,ny,1,0,z,tem1(1,1,1),item1(1,1,1), &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
END IF
END IF
IF ( grdbas == 1 ) RETURN
ipds(18) = nint(curtim/60) ! forecast time in minutes
!
!-----------------------------------------------------------------------
!
! If varout = 1, Write out u, v, w, pt, and p.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Write out u,v and w.
!
!-----------------------------------------------------------------------
!
IF(varout == 1) THEN
itype = 0 ! floating array
ibdshd(3) = itype
dflag = 0 ! 3-D array
ipds(9) = 103 ! z-coorinates
ipds(8) = 33 ! u wind (m/s)
IF (myproc == 0) WRITE(6,'(a)') 'Writing u'
CALL edgfill
(u,1,nx,1,nx, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL wrtgrib
(nx,ny,nz,0,z,u,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdsu,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 34 ! v wind (m/s)
IF (myproc == 0) WRITE(6,'(a)') 'Writing v'
CALL edgfill
(v,1,nx,1,nx-1, 1,ny,1,ny, 1,nz,1,nz-1)
CALL wrtgrib
(nx,ny,nz,0,z,v,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdsv,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 40 ! w wind (m/s)
IF (myproc == 0) WRITE(6,'(a)') 'Writing w'
CALL edgfill
(w,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz)
CALL wrtgrib
(nx,ny,nz,1,z,w,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
!
!-----------------------------------------------------------------------
!
! Write out scalars
!
!-----------------------------------------------------------------------
!
ipds(8) = 13 ! potential temperature (K)
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)
END DO
END DO
END DO
IF (myproc == 0) WRITE(6,'(a,f10.2)') 'Writing pt ', tem1(1,1,1)
CALL edgfill
(tem1,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL wrtgrib
(nx,ny,nz,0,z,tem1,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 1 ! pressure (Pascal)
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
tem1(i,j,k) = pbar(i,j,k) + pprt(i,j,k)
END DO
END DO
END DO
CALL edgfill
(tem1,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
IF (myproc == 0) WRITE(6,'(a,f10.2)') 'Writing p ', tem1(1,1,1)
CALL wrtgrib
(nx,ny,nz,0,z,tem1,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
END IF ! varout
!
!-----------------------------------------------------------------------
!
! If mstout = 1, write out moisture scalars.
!
!-----------------------------------------------------------------------
!
IF(mstout == 1) THEN
itype = 0 ! floating array
ibdshd(3) = itype
dflag = 0 ! 3-D array
ipds(9) = 103 ! z-coorinates
ipds(8) = 51 ! specific humidity (kg/kg)
IF (myproc == 0) WRITE(6,'(a)') 'Writing qv'
CALL edgfill
(qv,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL wrtgrib
(nx,ny,nz,0,z,qv,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 153 ! cloud water mixing ratio (kg/kg)
IF (myproc == 0) WRITE(6,'(a)') 'Writing qc'
CALL edgfill
(qc,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL wrtgrib
(nx,ny,nz,0,z,qc,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 170 ! rain water mixing ratio (kg/kg)
IF (myproc == 0) WRITE(6,'(a)') 'Writing qr'
CALL edgfill
(qr,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL wrtgrib
(nx,ny,nz,0,z,qr,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
IF(iceout == 1) THEN
dflag = 0 ! 3-D
ipds(9) = 103 ! z-coorinates
ipds(8) = 178 ! ice mixing ratio (kg/kg)
IF (myproc == 0) WRITE(6,'(a)') 'Writing qi'
CALL edgfill
(qi,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL wrtgrib
(nx,ny,nz,0,z,qi,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 171 ! snow mixing ratio (kg/kg)
IF (myproc == 0) WRITE(6,'(a)') 'Writing qs'
CALL edgfill
(qs,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL wrtgrib
(nx,ny,nz,0,z,qs,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 179 ! graupel hail mixing ratio (kg/kg)
IF (myproc == 0) WRITE(6,'(a)') 'Writing qh'
CALL edgfill
(qh,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL wrtgrib
(nx,ny,nz,0,z,qh,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
END IF !iceout
IF(rainout == 1) THEN
dflag = 1 ! 2-D
ipds(9) = 1 ! at surface
ipds(8) = 62 ! large scale precipitation for raing (kg/m**2)
ipds(11) = 0 ! at surface
IF (myproc == 0) WRITE(6,'(a)') 'Writing raing'
CALL edgfill
(raing, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,raing,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 63 ! convective precipitation for rainc (kg/m**2)
ipds(11) = 0 ! at surface
IF (myproc == 0) WRITE(6,'(a)') 'Writing rainc'
CALL edgfill
(rainc,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,rainc,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
END IF !rainout
IF ( prcout == 1 ) THEN
CALL edgfill
(prcrate, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
dflag = 1 ! 2-D
ipds(8) = 59 ! precipitation rates (kg/m**2/s)
ipds(9) = 111 ! use 111 to save more than one precip. rate
ipds(11) = 1 ! total precipitation rate
IF (myproc == 0) WRITE(6,'(a)') 'Writing prcrate1'
CALL wrtgrib
(nx,ny,1,0,z,prcrate(1,1,1),item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(11) = 2 ! grid scale precipitation rates
IF (myproc == 0) WRITE(6,'(a)') 'Writing prcrate2'
CALL wrtgrib
(nx,ny,1,0,z,prcrate(1,1,2),item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(11) = 3 ! cumulus precipitation rates
IF (myproc == 0) WRITE(6,'(a)') 'Writing prcrate3'
CALL wrtgrib
(nx,ny,1,0,z,prcrate(1,1,3),item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(11) = 4 ! microphysics precipitation rates
IF (myproc == 0) WRITE(6,'(a)') 'Writing prcrate4'
CALL wrtgrib
(nx,ny,1,0,z,prcrate(1,1,4),item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
END IF ! prcout
END IF !mstout
IF( tkeout == 1 ) THEN
itype = 0 ! floating array
ibdshd(3) = itype
dflag = 0 ! 3-D
ipds(9) = 103 ! z-coorinates
ipds(8) = 158 ! tke (J kg**-1)
CALL edgfill
(tke,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL wrtgrib
(nx,ny,nz,0,z,tke,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
END IF
!
!-----------------------------------------------------------------------
!
! If trbout = 1, write out the turbulence parameter, km.
!
!-----------------------------------------------------------------------
!
IF( trbout == 1 ) THEN
itype = 0 ! floating array
ibdshd(3) = itype
dflag = 0 ! 3-D
ipds(9) = 103 ! z-coorinates
ipds(8) = 185 ! redefine 185 for kmh
IF (myproc == 0) WRITE(6,'(a)') 'Writing kmh'
CALL edgfill
(kmh,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL wrtgrib
(nx,ny,nz,0,z,kmh,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
dflag = 0 ! 3-D
ipds(9) = 103 ! z-coorinates
ipds(8) = 186 ! redefine 186 for kmv
CALL edgfill
(kmv,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL wrtgrib
(nx,ny,nz,0,z,kmv,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
END IF ! trbout
!
!-----------------------------------------------------------------------
!
! If sfcout = 1, write out the surface variables,
! tsfc, tsoil, wetsfc, wetdp, and wetcanp.
!
!-----------------------------------------------------------------------
!
IF ( sfcout == 1 ) THEN
itype = 0 ! floating array
ibdshd(3) = itype
dflag = 1 ! 2-D
ipds(9) = 111 ! below land surface
IF( nstyp <= 1 ) THEN
ipds(8) = 85 ! soil temperature (K)
ipds(11) = 1 ! 1 cm below the surface
IF (myproc == 0) WRITE(6,'(a)') 'Writing tsfc'
CALL edgfill
(tsfc(1,1,0),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,tsfc(1,1,0),item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 85 ! soil temperature (K)
ipds(11) = 100 ! 100 cm below the surface
IF (myproc == 0) WRITE(6,'(a)') 'Writing tsoil'
CALL edgfill
(tsoil(1,1,0),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,tsoil(1,1,0),item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 144 ! Soil moisture in (m**3/m**3)
ipds(11) = 1 ! 1 cm below the surface
IF (myproc == 0) WRITE(6,'(a)') 'Writing wetsfc'
CALL edgfill
(wetsfc(1,1,0),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,wetsfc(1,1,0),item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 144 ! Soil moisture in (m**3/m**3)
ipds(11) = 100 ! 100 cm below the surface
IF (myproc == 0) WRITE(6,'(a)') 'Writing wetdp'
CALL edgfill
(wetdp(1,1,0),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,wetdp(1,1,0),item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 223 ! amount of liquid water retained on canopy (m)
ipds(11) = 0 ! 0 cm below the surface
IF (myproc == 0) WRITE(6,'(a)') 'Writing wetcnpy'
CALL edgfill
(wetcanp(1,1,0),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,wetcanp(1,1,0),item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ELSE
DO is=0,nstyp
ipds(8) = 85 ! soil temperature (K)
ipds(11) = 1+is ! 1 cm below the surface
IF (myproc == 0) WRITE(6,'(a)') 'Writing tsfc'
CALL edgfill
(tsfc(1,1,is),1,nx,1,nx-1,1,ny,1,ny-1, &
1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,tsfc(1,1,is),item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 85 ! soil temperature (K)
ipds(11) = 100+is ! 100 cm below the surface
IF (myproc == 0) WRITE(6,'(a)') 'Writing tsoil'
CALL edgfill
(tsoil(1,1,is), 1,nx,1,nx-1, 1,ny,1,ny-1, &
1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,tsoil(1,1,is),item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 144 ! Soil moisture in (m**3/m**3)
ipds(11) = 1+is ! 1 cm below the surface
IF (myproc == 0) WRITE(6,'(a)') 'Writing wetsfc'
CALL edgfill
(wetsfc(1,1,is), 1,nx,1,nx-1, 1,ny,1,ny-1, &
1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,wetsfc(1,1,is),item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 144 ! Soil moisture in (m**3/m**3)
ipds(11) = 100+is ! 100 cm below the surface
IF (myproc == 0) WRITE(6,'(a)') 'Writing wetdp'
CALL edgfill
(wetdp(1,1,is),1,nx,1,nx-1, 1,ny,1,ny-1, &
1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,wetdp(1,1,is),item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 223 ! amount of liquid water retained on canopy (m)
ipds(11) = is ! 0 cm below the surface
IF (myproc == 0) WRITE(6,'(a)') 'Writing wetcnpy'
CALL edgfill
(wetcanp(1,1,is),1,nx,1,nx-1,1,ny,1,ny-1, &
1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,wetcanp(1,1,is),item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
END DO
END IF
IF (snowout == 1) THEN
itype = 0 ! floating array
ibdshd(3) = itype
ipds(8) = 66 ! Snow depth (m)
ipds(9) = 1 ! at surface
ipds(11) = 0 ! at surface
IF (myproc == 0) WRITE(6,'(a)') 'Writing snowdpth'
CALL edgfill
(snowdpth,1,nx,1,nx-1,1,ny,1,ny-1, 1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,snowdpth,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
END IF
END IF
!
!-----------------------------------------------------------------------
!
! If radout = 1, write out radiation arrays
!
!-----------------------------------------------------------------------
!
IF( radout == 1 ) THEN
itype = 0 ! integer array
ibdshd(3) = itype
dflag = 0 ! 3-D
ipds(9) = 103 ! z-coorinates
ipds(8) = 216 ! radiation forcing, radfrc
CALL edgfill
(radfrc,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL wrtgrib
(nx,ny,nz,0,z,radfrc,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
dflag = 1 ! 2-D
ipds(9) = 1 ! at surface
ipds(8) = 204 ! downward short wave radiation flux
ipds(11) = 0 ! 0 cm below the surface
CALL edgfill
(radsw,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,radsw,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
dflag = 1 ! 2-D
ipds(9) = 1 ! at surface
ipds(8) = 232 ! downward total (net) radiation flux
CALL edgfill
(rnflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,rnflx,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
END IF
!
!-----------------------------------------------------------------------
!
! If flxout = 1, write out surface fluxes
!
!-----------------------------------------------------------------------
!
IF( flxout == 1 ) THEN
itype = 0 ! integer array
ibdshd(3) = itype
dflag = 1 ! 2-D
ipds(9) = 1 ! at surface
ipds(8) = 124 ! u flux
ipds(11) = 0 ! 0 cm below the surface
CALL edgfill
(usflx,1,nx,1,nx, 1,ny,1,ny-1, 1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,usflx,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 125 ! v flux
CALL edgfill
(vsflx,1,nx,1,nx-1, 1,ny,1,ny, 1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,vsflx,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 122 ! sensible heat flux for ptsflx
CALL edgfill
(ptsflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,ptsflx,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
ipds(8) = 121 ! latent heat flux for qvsflx
CALL edgfill
(qvsflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL wrtgrib
(nx,ny,1,0,z,qvsflx,item1, &
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igdss,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,temxy1,temxy2,itemxy1,itemxy2)
END IF
RETURN
END SUBROUTINE gribdump
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE GRIBREAD ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE gribread(nx,ny,nz,nstyps, grdbas, inch, time, x,y,z,zp, & 2,63
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)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in GRIB data set created by ARPS using history dump format
! No. 10.
! All data read in are located at the original staggered grid points
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 11/01/1995
!
! MODIFICATION HISTORY:
!
! 12/09/1998 (Donghai Wang)
! Added the snow cover.
!
! 1/07/2000 (Eric Kemp)
! Subroutine now reads in GRIB variable 66 (snow depth (m))
!
!-----------------------------------------------------------------------
!
! 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
!
! grdbas Data read flag.
! =1, only grid and base state arrays will be read
! =0, all arrays will be read based on data
! parameter setting.
! inch Channel number for binary reading.
! This channel must be opened for unformatted reading
! by the calling routine.
!
! OUTPUT:
!
! time Time in seconds of data read from "filename"
!
! 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
! =0, successful read of all data
! =1, error reading data
! =2, end-of-file reached during read attempt
!
! TEMPORARY:
!
! tem1 Temporary work array.
! item1 Integer temporary work array.
! temxy1 2-D temporary work array.
! itemxy1 2-D integer temporary work array.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
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).
INTEGER :: grdbas ! Data read flag.
INTEGER :: inch ! Channel number for binary reading
REAL :: time ! Time in seconds of data read
! from "filename"
REAL :: uprt (nx,ny,nz) ! Perturbation u-velocity (m/s)
REAL :: vprt (nx,ny,nz) ! Perturbation v-velocity (m/s)
REAL :: wprt (nx,ny,nz) ! Perturbation w-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) ! Perturbation water vapor mixing
! ratio (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 :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for
REAL :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2)
! 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 mixing ratio
INTEGER :: nstyps ! Number of soil types
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)
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, allocatable :: tem1(:,:,:) ! Temporary work array
REAL, allocatable :: temxy1(:,:) ! temporary work array
INTEGER, allocatable :: item1(:,:,:) ! Integer temporary work array
INTEGER, allocatable :: itemxy1(:,:) ! Integer temporary work array
INTEGER :: ireturn
!
!-----------------------------------------------------------------------
!
! Parameters describing routine that wrote the gridded data
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Parameters for GRIB packing
!
!-----------------------------------------------------------------------
!
INTEGER :: nbufsz
PARAMETER ( nbufsz = 800000 ) ! Size of GRIB buffer
INTEGER :: ipds(25) ! PDS integer array
INTEGER :: igdss(25) ! GDS integer array for s-grid
INTEGER :: igdsu(25) ! GDS integer array for u-grid
INTEGER :: igdsv(25) ! GDS integer array for v-grid
INTEGER :: ibdshd(4) ! Integer array for BDS header
CHARACTER (LEN=1) :: bds(nbufsz) ! BDS ( GRIB Section 4)
INTEGER :: ibds(nbufsz/4) ! identical S ( GRIB Section 4)
EQUIVALENCE ( bds,ibds )
CHARACTER (LEN=1) :: mgrib(nbufsz) ! Buffer to carry GRIB messages
INTEGER :: itype ! Data type indicator
INTEGER :: dflag ! Dimension flag
!
!-----------------------------------------------------------------------
!
! Variables to determine the length of machine word, wdlen
!
!-----------------------------------------------------------------------
!
INTEGER :: wdlen ! Length of machine word
CHARACTER (LEN=8) :: ctema,ctemb
INTEGER :: itema,itemb
EQUIVALENCE ( itema,ctema )
EQUIVALENCE ( itemb,ctemb )
LOGICAL :: firstcall
SAVE firstcall, wdlen
DATA firstcall/ .true. /
DATA ctema / '12345678' /
!
!-----------------------------------------------------------------------
!
! Parameters describing this routine
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=40) :: fmtver
PARAMETER (fmtver='004.10 ARPS Data Format 10')
!
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------
!
INTEGER :: lchanl
PARAMETER (lchanl=6) ! Channel number for formatted printing.
INTEGER :: i,j,k,is
REAL :: tema1, tema2, temb1, temb2
REAL :: alatnot(2)
INTEGER :: istat, nstyp1, nstyp2
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'indtflg.inc'
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
ALLOCATE (tem1(nx,ny,nz),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "GRIBREAD: ERROR allocating tem1, returning"
RETURN
END IF
ALLOCATE (item1(nx,ny,nz),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "GRIBREAD: ERROR allocating item1, returning"
RETURN
END IF
ALLOCATE (temxy1(nx,ny),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "GRIBREAD: ERROR allocating temxy1, returning"
RETURN
END IF
ALLOCATE (itemxy1(nx,ny),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "GRIBREAD: ERROR allocating itemxy1, returning"
RETURN
END IF
IF ( firstcall ) THEN
itemb = itema
IF ( ctema /= ctemb ) THEN
wdlen = 4
ELSE
wdlen = 8
END IF
WRITE (6,'(a,i2,a)') &
'The machine word length is ',wdlen,' bytes'
firstcall = .false.
END IF
!
!-----------------------------------------------------------------------
!
! Check header info
!
!-----------------------------------------------------------------------
!
nstyp2 = nstyp
CALL rdhishd
( nx,ny,nz,inch,grdbas,fmtver,time,x,y,z, &
nbufsz,mgrib )
nstyp1 = nstyp ! value read in from data
nstyp = nstyp2 ! original value
IF ( nstyp1 < 1 ) THEN
nstyp1 = 1
END IF
!
!-----------------------------------------------------------------------
!
! Calculate the length of machine word, wdlen, in bytes, which will
! be used to pack the data. Assume the length has only two possible
! value: 4 and 8
!
!-----------------------------------------------------------------------
!
dx = x(2) - x(1)
dy = y(2) - y(1)
alatnot(1) = trulat1
alatnot(2) = trulat2
CALL setmapr
(mapproj, 1.0, alatnot, trulon)
CALL lltoxy
( 1,1, ctrlat,ctrlon, tema1, tema2 )
temb1 = tema1 - (FLOAT(nx-3)/2.) * dx
temb2 = tema2 - (FLOAT(ny-3)/2.) * dy
CALL setorig
( 1, temb1, temb2)
CALL setcornerll
( nx,ny, x,y ) ! set corner lat/lon
!
!-----------------------------------------------------------------------
!
! Initialize the integer array for BDS header
!
!-----------------------------------------------------------------------
!
ibdshd(1) = 0
ibdshd(2) = 0
ibdshd(3) = 0
ibdshd(4) = 0
!
!-----------------------------------------------------------------------
!
! Get the integer array, ipds, from the header.
!
!-----------------------------------------------------------------------
!
CALL mkipds
( nx,ny,nz, ipds )
!
!-----------------------------------------------------------------------
!
! Get the GDS integer arrays for different grid type, igdsu, igdsv,
! and igdss, from the header
!
!-----------------------------------------------------------------------
!
CALL mkigds
( nx,ny,nz, 0, igdss )
CALL mkigds
( nx,ny,nz, 1, igdsu )
CALL mkigds
( nx,ny,nz, 2, igdsv )
!
!-----------------------------------------------------------------------
!
! Get zp
!
!----------------------------------------------------------------------
!
IF( grdin == 1 .OR. grdbas == 1 ) THEN
itype = 0 ! floating array
ibdshd(3) = itype
dflag = 0 ! 3-D array
ipds(8) = 8 ! geometric height (m)
ipds(9) = 103 ! z-coorinates
ipds(18) = 0 ! forecast time = 0 for grid and base variables
CALL rdgrib
(nx,ny,nz,1,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
zp,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' zp.'
END IF ! grdin
!
!-----------------------------------------------------------------------
!
! Read in base state fields
!
!----------------------------------------------------------------------
!
IF( basin == 1 .OR. grdbas == 1 ) THEN
itype = 0 ! floating array
ibdshd(3) = itype
dflag = 0 ! 3-D array
ipds(9) = 103 ! z-coorinates
ipds(18) = 0 ! forecast time = 0 for grid and base variables
ipds(8) = 33 ! u wind (m/s)
CALL rdgrib
(nx,ny,nz,0,z,dflag,inch, wdlen, &
ipds,igdsu,ibdshd, &
nbufsz,bds,ibds,mgrib, &
ubar,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' ubar.'
ipds(8) = 34 ! v wind (m/s)
CALL rdgrib
(nx,ny,nz,0,z,dflag,inch, wdlen, &
ipds,igdsv,ibdshd, &
nbufsz,bds,ibds,mgrib, &
vbar,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' vbar.'
ipds(8) = 13 ! potential temperature (K)
CALL rdgrib
(nx,ny,nz,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
ptbar,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' ptbar.'
ipds(8) = 1 ! pressure (Pascal)
CALL rdgrib
(nx,ny,nz,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
pbar,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' pbar.'
IF( mstin == 1) THEN
ipds(8) = 51 ! specific humidity (kg/kg)
CALL rdgrib
(nx,ny,nz,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
qvbar,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' qvbar.'
END IF
IF(landin == 1) THEN
dflag = 1 ! 2-D array
ipds(9) = 111 ! depth below land surface
IF( nstyp1 <= 1 ) THEN
itype = 1 ! integer array
ibdshd(3) = itype
ipds(8) = 224 ! soil type
ipds(11) = 0 ! 0 centimeter for surface
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
tem1,soiltyp(1,1,1), temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' soiltyp.'
ELSE
itype = 1 ! integer array
ibdshd(3) = itype
ipds(8) = 224 ! soil type
DO is=1,nstyp1
ipds(11) = is ! number to identify soil types
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
tem1,soiltyp(1,1,is), temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' soiltyp.'
END DO
itype = 0 ! floating array
ibdshd(3) = itype
ipds(8) = 226 ! redefine 226 for fraction of soil types
DO is=1,nstyp1
ipds(11) = is ! fraction of different soil types
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
stypfrct(1,1,is),item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' stypfrct.'
END DO
END IF
CALL fix_stypfrct_nstyp
(nx,ny,nstyp1,nstyp,stypfrct)
itype = 1 ! integer array
ibdshd(3) = itype
ipds(8) = 225 ! vegtyp
ipds(11) = 0
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
tem1,vegtyp, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' vegtyp.'
itype = 0 ! floating array
ibdshd(3) = itype
ipds(8) = 227 ! redefine 227 for LAI
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
lai,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' lai.'
ipds(8) = 83 ! surface roughness (m)
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
roufns,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' roufns.'
ipds(8) = 87 ! vegetation (%)
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
tem1,item1, temxy1,itemxy1)
DO j = 1,ny
DO i = 1,nx
veg(i,j) = tem1(i,j,1) / 100.
END DO
END DO
WRITE(lchanl,910) ipds(8),' veg.'
END IF
END IF
IF( grdbas == 1 ) GO TO 930
ipds(18) = nint(time/60) ! forecast time in minutes
IF( varin == 1 ) THEN
!
!-----------------------------------------------------------------------
!
!
!----------------------------------------------------------------------
!
itype = 0 ! floating array
ibdshd(3) = itype
dflag = 0 ! 3-D array
ipds(9) = 103 ! z-coorinates
ipds(8) = 33 ! u wind (m/s)
CALL rdgrib
(nx,ny,nz,0,z,dflag,inch, wdlen, &
ipds,igdsu,ibdshd, &
nbufsz,bds,ibds,mgrib, &
tem1,item1, temxy1,itemxy1)
DO k = 1,nz
DO j = 1,ny
DO i = 1,nx
uprt(i,j,k) = tem1(i,j,k) - ubar(i,j,k)
END DO
END DO
END DO
WRITE(lchanl,910) ipds(8),' uprt.'
ipds(8) = 34 ! v wind (m/s)
CALL rdgrib
(nx,ny,nz,0,z,dflag,inch, wdlen, &
ipds,igdsv,ibdshd, &
nbufsz,bds,ibds,mgrib, &
tem1,item1, temxy1,itemxy1)
DO k = 1,nz
DO j = 1,ny
DO i = 1,nx
vprt(i,j,k) = tem1(i,j,k) - vbar(i,j,k)
END DO
END DO
END DO
WRITE(lchanl,910) ipds(8),' vprt.'
ipds(8) = 40 ! w wind (m/s)
CALL rdgrib
(nx,ny,nz,1,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
wprt,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' wprt.'
!
!-----------------------------------------------------------------------
!
! Read in scalars
!
!----------------------------------------------------------------------
!
ipds(8) = 13 ! potential temperature (K)
CALL rdgrib
(nx,ny,nz,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
tem1,item1, temxy1,itemxy1)
DO k = 1,nz
DO j = 1,ny
DO i = 1,nx
ptprt(i,j,k) = tem1(i,j,k) - ptbar(i,j,k)
END DO
END DO
END DO
WRITE(lchanl,910) ipds(8),' ptprt.'
ipds(8) = 1 ! pressure (Pascal)
CALL rdgrib
(nx,ny,nz,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
tem1,item1, temxy1,itemxy1)
DO k = 1,nz
DO j = 1,ny
DO i = 1,nx
pprt(i,j,k) = tem1(i,j,k) - pbar(i,j,k)
END DO
END DO
END DO
WRITE(lchanl,910) ipds(8),' pprt.'
END IF
!
!-----------------------------------------------------------------------
!
! Read in moisture variables
!
!----------------------------------------------------------------------
!
IF( mstin == 1 ) THEN
itype = 0 ! floating array
ibdshd(3) = itype
dflag = 0 ! 3-D array
ipds(9) = 103 ! z-coorinates
ipds(8) = 51 ! specific humidity (kg/kg)
CALL rdgrib
(nx,ny,nz,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
tem1,item1, temxy1,itemxy1)
DO k = 1,nz
DO j = 1,ny
DO i = 1,nx
qvprt(i,j,k) = tem1(i,j,k) - qvbar(i,j,k)
END DO
END DO
END DO
WRITE(lchanl,910) ipds(8),' qvprt.'
ipds(8) = 153 ! cloud water mixing ratio (kg/kg)
CALL rdgrib
(nx,ny,nz,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
qc,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' qc.'
ipds(8) = 170 ! rain water mixing ratio (kg/kg)
CALL rdgrib
(nx,ny,nz,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
qr,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' qr.'
IF( icein == 1 ) THEN
dflag = 0 ! 3-D
ipds(9) = 103 ! z-coorinates
ipds(8) = 178 ! ice mixing ratio (kg/kg)
CALL rdgrib
(nx,ny,nz,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
qi,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' qi.'
ipds(8) = 171 ! snow mixing ratio (kg/kg)
CALL rdgrib
(nx,ny,nz,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
qs,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' qs.'
ipds(8) = 179 ! graupel hail mixing ratio (kg/kg)
CALL rdgrib
(nx,ny,nz,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
qh,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' qh.'
END IF
IF( rainin == 1 ) THEN
dflag = 1 ! 2-D
ipds(9) = 1 ! at surface
ipds(8) = 62 ! large scale precipitation for raing (kg/m**2)
ipds(11) = 0 ! at surface
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
raing,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' raing.'
ipds(8) = 63 ! convective precipitation for rainc (kg/m**2)
ipds(11) = 0 ! at surface
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
rainc,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' rainc.'
END IF
IF( prcin == 1 ) THEN
dflag = 1 ! 2-D
ipds(8) = 59 ! precipitation rates (kg/m**2/s)
ipds(9) = 111 ! use 111 for saving more than one precip.
ipds(11) = 1 ! total precipitation rate
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
prcrate(1,1,1),item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' prcrate1.'
ipds(11) = 2 ! grid scale precipitation rate
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
prcrate(1,1,2),item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' prcrate2.'
ipds(11) = 3 ! cumulus precipitation rate
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
prcrate(1,1,3),item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' prcrate3.'
ipds(11) = 4 ! microphysics precipitation rate
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
prcrate(1,1,4),item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' prcrate4.'
END IF
END IF
IF( tkein == 1 ) THEN
dflag = 0 ! 3-D
ipds(9) = 103 ! z-coorinates
ipds(8) = 158 ! tke (J kg**-1)
CALL rdgrib
(nx,ny,nz,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
tke,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' tke.'
END IF
IF( trbin == 1 ) THEN
dflag = 0 ! 3-D
ipds(9) = 103 ! z-coorinates
ipds(8) = 185 ! redefine 185 for kmh
CALL rdgrib
(nx,ny,nz,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
kmh,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' kmh.'
dflag = 0 ! 3-D
ipds(9) = 103 ! z-coorinates
ipds(8) = 186 ! redefine 186 for kmv
CALL rdgrib
(nx,ny,nz,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
kmv,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' kmv.'
END IF
IF( sfcin == 1 ) THEN
dflag = 1 ! 2-D
ipds(9) = 111 ! below land surface
IF( nstyp1 <= 1 ) THEN
ipds(8) = 85 ! soil temperature (K)
ipds(11) = 1 ! 1 cm below the surface
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
tsfc(1,1,0),item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' tsfc.'
ipds(8) = 85 ! soil temperature (K)
ipds(11) = 100 ! 100 cm below the surface
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
tsoil(1,1,0),item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' tsoil.'
ipds(8) = 144 ! Soil moisture in (m**3/m**3)
ipds(11) = 1 ! 1 cm below the surface
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
wetsfc(1,1,0),item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' wetsfc.'
ipds(8) = 144 ! Soil moisture in (m**3/m**3)
ipds(11) = 100 ! 100 cm below the surface
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
wetdp(1,1,0),item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' wetdp.'
ipds(8) = 223 ! amount of liquid water retained on canopy (m)
ipds(11) = 0 ! 0 cm below the surface
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
wetcanp(1,1,0),item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' wetcanp.'
ELSE
DO is=0,nstyp1
ipds(8) = 85 ! soil temperature (K)
ipds(11) = 1+is ! 1 cm below the surface
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
tsfc(1,1,is),item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' tsfc.'
ipds(8) = 85 ! soil temperature (K)
ipds(11) = 100+is ! 100 cm below the surface
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
tsoil(1,1,is),item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' tsoil.'
ipds(8) = 144 ! Soil moisture in (m**3/m**3)
ipds(11) = 1+is ! 1 cm below the surface
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
wetsfc(1,1,is),item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' wetsfc.'
ipds(8) = 144 ! Soil moisture in (m**3/m**3)
ipds(11) = 100+is ! 100 cm below the surface
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
wetdp(1,1,is),item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' wetdp.'
ipds(8) = 223 ! amount of liquid water retained on canopy (m)
ipds(11) = is ! 0 cm below the surface
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
wetcanp(1,1,is),item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' wetcanp.'
END DO
END IF
CALL fix_soil_nstyp
(nx,ny,nstyp1,nstyp,tsfc,tsoil,wetsfc,wetdp,wetcanp)
IF (snowcin == 1) THEN ! Snow cover is depricated
itype = 1
ibdshd(3) = itype
ipds(8) = 143 ! Snow cover
ipds(9) = 111
ipds(11) = 0
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
tem1,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' snowcvr -- discarding.'
END IF
IF (snowin == 1) THEN
itype = 0 ! floating array
ibdshd(3) = itype
ipds(8) = 66 ! Snow depth (m)
ipds(9) = 1 ! at surface
ipds(11) = 0 ! at surface
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
snowdpth,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' snowdpth.'
END IF
END IF
IF( radin == 1 ) THEN
itype = 0 ! floating array
ibdshd(3) = itype
dflag = 0 ! 3-D
ipds(9) = 103 ! z-coorinates
ipds(8) = 216 ! radiation forcing, radfrc
CALL rdgrib
(nx,ny,nz,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
radfrc,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' radfrc.'
dflag = 1 ! 2-D
ipds(9) = 1 ! at surface
ipds(11) = 0 ! at surface
ipds(8) = 204 ! downward short wave radiation flux
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
radsw,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' radsw.'
ipds(8) = 232 ! downward total (net) radiation flux
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
rnflx,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' rnflx.'
END IF
IF( flxin == 1 ) THEN
itype = 0 ! integer array
ibdshd(3) = itype
ipds(11) = 0 ! at surface
ipds(8) = 124 ! u flux
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
usflx,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' usflx.'
ipds(8) = 125 ! v flux
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
vsflx,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' vsflx.'
ipds(8) = 122 ! sensible heat flux for ptsflx
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
ptsflx,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' ptsflx.'
ipds(8) = 121 ! latent heat flux for qvsflx
CALL rdgrib
(nx,ny,1,0,z,dflag,inch, wdlen, &
ipds,igdss,ibdshd, &
nbufsz,bds,ibds,mgrib, &
qvsflx,item1, temxy1,itemxy1)
WRITE(lchanl,910) ipds(8),' qvsflx.'
END IF
910 FORMAT(1X,'Field ',i4,' was read into array',a)
!
!-----------------------------------------------------------------------
!
! Friendly exit message
!
!----------------------------------------------------------------------
!
930 CONTINUE
WRITE(6,'(/a,F8.1,a/)') &
' Data at time=', time/60,' (min) were successfully read.'
ireturn = 0
DEALLOCATE (tem1,stat=istat)
DEALLOCATE (item1,stat=istat)
DEALLOCATE (temxy1,stat=istat)
DEALLOCATE (itemxy1,stat=istat)
RETURN
END SUBROUTINE gribread
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE WRTGRIB ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE wrtgrib(nx,ny,nz,wstag,z,fvar,ivar, & 51,3
nchanl,nbytes,wdlen,itype,dflag, &
ipds,igds,ibdshd,pds,gds, &
nbufsz,bds,ibds, &
mgrib,tem1,tem2,item1,item2)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Write variable, fvar for floating array or ivar for integer array,
! into file pointer nchanl which points to a GRIB file.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 11/01/1995
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! 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
!
! wstag Staggering flag of w-grid
! z z coordinate of grid points in computational space (m)
!
! fvar Floating array to be written into GRIB file
! ivar Integer array to be written into GRIB file
!
! nchanl FILE pointer of GRIB stream file which was opened by
! a C program, GOPEN
!
! itype Data type: 0 for floating array and 1 for integer array
! dflag Dimension flag: 0 for 3-D array and 1 for 2-D array
! nbytes Byte position at which the GRIB message starts
! wdlen Length of machine word (i.e. size of integer) in bytes
!
! ipds Integer array to carry the parameters for generating
! PDS (Section 1).
! igds Integer array to carry the parameters for generating
! GDS (Section 3).
!
! pds PDS (GRIB Section 1)
! gds GDS (GRIB Section 3)
!
! nbufsz Size of buffer of a GRIB message array
! bds BDS (GRIB Section 4)
! mgrib Working buffer of GRIB message array
!
! OUTPUT:
!
! nbtyes Position at which the next GRIB message starts
!
! WORK ARRAY:
!
! tem1 Temporary work array.
! item1 Integer temporary work array.
! tem2 Temporary work array.
! item2 Integer temporary work array.
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in x,y,z dir.
INTEGER :: wstag ! Staggering flag for w-grid
REAL :: z(nz) ! The z-coord. of the computational grid.
! Defined at w-point on the staggered grid.
REAL :: fvar(nx,ny,nz) ! Floating array
INTEGER :: ivar(nx,ny,nz) ! Integer array
INTEGER :: nchanl ! FILE pointer indicates the GRIB file
INTEGER :: itype ! Data type: 0 - floating, 1 - integer
INTEGER :: dflag ! Dimension flag: 0 - 3-D, 1 - 2-D
INTEGER :: nbytes ! Starting byte position
INTEGER :: wdlen ! Length of machine word
INTEGER :: ipds(25) ! ipds
INTEGER :: igds(25) ! igds
INTEGER :: ibdshd(4) ! BDS header
CHARACTER (LEN=1) :: pds(28) ! PDS
CHARACTER (LEN=1) :: gds(42) ! GDS
INTEGER :: nbufsz ! Size of GRIB message array
INTEGER :: ibds(nbufsz/wdlen) ! Identical to BDS
CHARACTER (LEN=1) :: bds(nbufsz) ! BDS
CHARACTER (LEN=1) :: mgrib(nbufsz) ! Working buffer
REAL :: tem1 (nx,ny) ! Temporary work array
REAL :: tem2 (nx,ny) ! Temporary work array
INTEGER :: item1(nx,ny) ! Integer temporary work array
INTEGER :: item2(nx,ny) ! Integer temporary work array
!
!-----------------------------------------------------------------------
!
! GRIB parameters
!
!-----------------------------------------------------------------------
!
INTEGER :: msglen ! Length of GRIB message
INTEGER :: npts
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k, wstag1
REAL :: tema
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
npts = nx*ny
IF ( dflag == 1 ) THEN
DO j = 1,ny
DO i = 1,nx
tem1 (i,j) = fvar(i,j,1)
item1(i,j) = ivar(i,j,1)
END DO
END DO
CALL gribenc
(itype,wdlen,grbpkbit,npts,tem1,item1, &
ipds,igds,ibdshd,pds,gds, &
nbufsz,bds,ibds,msglen,mgrib, &
tem2,item2)
WRITE (nchanl) (mgrib(i),i=1,msglen)
RETURN
END IF
IF ( wstag > 1 .OR. wstag < 0 ) THEN
WRITE(6,'(a,i1)') &
'Do not know the w-grid type, wstag = ',wstag, &
'Reset it to scalar grid.'
wstag1 = 0
ELSE
wstag1 = wstag
END IF
DO k = 1,nz-1
DO j = 1,ny
DO i = 1,nx
tem1 (i,j) = fvar(i,j,k)
item1(i,j) = ivar(i,j,k)
END DO
END DO
IF ( wstag1 == 0 ) THEN
tema = 0.5 * (z(k) + z(k+1))
ELSE
tema = z(k)
END IF
ipds(11) = nint(tema)
CALL gribenc
(itype,wdlen,grbpkbit,npts,tem1,item1, &
ipds,igds,ibdshd,pds,gds, &
nbufsz,bds,ibds,msglen,mgrib, &
tem2,item2)
WRITE (nchanl) (mgrib(i),i=1,msglen)
END DO
DO j = 1,ny
DO i = 1,nx
tem1 (i,j) = fvar(i,j,nz)
item1(i,j) = ivar(i,j,nz)
END DO
END DO
ipds(11) = nint(
CALL gribenc
(itype,wdlen,grbpkbit,npts,tem1,item1, &
ipds,igds,ibdshd,pds,gds, &
nbufsz,bds,ibds,msglen,mgrib, &
tem2,item2)
WRITE (nchanl) (mgrib(i),i=1,msglen)
RETURN
END SUBROUTINE wrtgrib
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE RDGRIB ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE rdgrib(nx,ny,nz,wstag,z,dflag,nchanl, wdlen, & 52,3
ipds,igds,ibdshd, &
nbufsz,bds,ibds,mgrib, &
fvar,ivar, tem1,item1)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Write variable, fvar for floating array or ivar for integer array,
! into file pointer nchanl which points to a GRIB file.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 11/01/1995
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! 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
!
! dflag Dimension flag, 0: 3-D, 1: 2-D
! wstag Staggering flag of w-grid
!
! nchanl FILE pointer of GRIB stream file which was opened by
! a C program, GOPEN
!
! OUTPUT:
!
! fvar Floating array to be written into GRIB file
! ivar Integer array to be written into GRIB file
!
! wdlen Length of machine word (i.e. size of integer) in bytes
!
! ipds Integer array to carry the parameters for generating
! PDS (Section 1).
! igds Integer array to carry the parameters for generating
! GDS (Section 3).
!
! nbufsz Size of buffer of a GRIB message array
! bds BDS (GRIB Section 4)
! mgrib Working buffer of GRIB message array
!
! nbtyes Position at which the next GRIB message starts
!
! WORK ARRAY:
!
! tem1 Temporary work array.
! item1 Integer temporary work array.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in x,y,z dir.
INTEGER :: wstag ! Staggering flag for w-grid
REAL :: z(nz) ! Vertical coordinates
INTEGER :: dflag ! Dimension flag, 0: 3-D, 1: 2-D
INTEGER :: nchanl ! FILE pointer indicates the GRIB file
INTEGER :: wdlen ! Length of machine word
INTEGER :: ipds(25) ! ipds
INTEGER :: igds(25) ! igds
INTEGER :: ibdshd(4) ! BDS header
INTEGER :: nbufsz ! Size of GRIB message array
CHARACTER (LEN=1) :: mgrib(nbufsz) ! GRIB message
REAL :: fvar(nx,ny,nz) ! Floating array
INTEGER :: ivar(nx,ny,nz) ! Integer array
CHARACTER (LEN=1) :: bds(nbufsz) ! BDS
INTEGER :: ibds(nbufsz/wdlen) ! Identical to BDS
REAL :: tem1 (nx,ny) ! Temporary work array
INTEGER :: item1(nx,ny) ! Integer temporary work array
!
!-----------------------------------------------------------------------
!
! GRIB parameters
!
!-----------------------------------------------------------------------
!
INTEGER :: msglen ! Length of GRIB message
INTEGER :: npts
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k, wstag1
REAL :: tema
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
npts = nx*ny
IF ( dflag == 1 ) THEN
READ (nchanl) (mgrib(i),i=1,8)
msglen = ICHAR(mgrib(5))*65536 &
+ ICHAR(mgrib(6))*256 &
+ ICHAR(mgrib(7))
BACKSPACE (nchanl)
READ (nchanl) (mgrib(i),i=1,msglen)
CALL gribdec
(npts,nz, &
wdlen,ipds,igds,ibdshd,nbufsz,mgrib, &
tem1,item1, bds,ibds)
DO j = 1,ny
DO i = 1,nx
fvar(i,j,1) = tem1 (i,j)
ivar(i,j,1) = item1(i,j)
END DO
END DO
RETURN
END IF
IF ( wstag > 1 .OR. wstag < 0 ) THEN
WRITE(6,'(a,i1)') &
'Do not know the w-grid type, wstag = ',wstag, &
'Reset it to scalar grid.'
wstag1 = 0
ELSE
wstag1 = wstag
END IF
DO k = 1,nz-1
IF ( wstag1 == 0 ) THEN
tema = 0.5 * (z(k) + z(k+1))
ELSE
tema = z(k)
END IF
ipds(11) = nint(tema)
READ (nchanl) (mgrib(i),i=1,8)
msglen = ICHAR(mgrib(5))*65536 &
+ ICHAR(mgrib(6))*256 &
+ ICHAR(mgrib(7))
BACKSPACE (nchanl)
READ (nchanl) (mgrib(i),i=1,msglen)
CALL gribdec
(npts,nz, &
wdlen,ipds,igds,ibdshd,nbufsz,mgrib, &
tem1,item1, bds,ibds)
DO j = 1,ny
DO i = 1,nx
fvar(i,j,k) = tem1 (i,j)
ivar(i,j,k) = item1(i,j)
END DO
END DO
END DO
ipds(11) = nint(
READ (nchanl) (mgrib(i),i=1,8)
msglen = ICHAR(mgrib(5))*65536 &
+ ICHAR(mgrib(6))*256 &
+ ICHAR(mgrib(7))
BACKSPACE (nchanl)
READ (nchanl) (mgrib(i),i=1,msglen)
CALL gribdec
(npts,nz, &
wdlen,ipds,igds,ibdshd,nbufsz,mgrib, &
tem1,item1, bds,ibds)
DO j = 1,ny
DO i = 1,nx
fvar(i,j,nz) = tem1 (i,j)
ivar(i,j,nz) = item1(i,j)
END DO
END DO
RETURN
END SUBROUTINE rdgrib
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE MKIPDS ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE mkipds(nx,ny,nz, ipds) 2
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Make integer product data array ipds
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 11/27/1995
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! 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:
!
! ipds IPDS array
!
! WORK ARRAY:
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
INTEGER :: ipds(25)
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
ipds(1) = 28 ! number of bytes in PDS section
ipds(2) = 0 ! parameter table version number, unknown
ipds(3) = 0 ! ID number of originating center. CAPS?
ipds(4) = 0 ! ID number of model. ARPS/CAPS?
ipds(5) = 255 ! grid ID, 255 for self-defined GDS
ipds(6) = 1 ! GDS flag, 1 = GDS section included
ipds(7) = 0 ! BMS flag, 0 = no BMS section included
ipds(8) = 0 ! indicator of parameter and unit
! (table 2), depends on variables
ipds(9) = 103 ! indicator of type of level (table 3)
! depends on which variable
! 103 for z coordinates in meters
! 111 for soil layers in centimeters
! both use two octets: ipds(10) & ipds(11)
ipds(10) = 0 ! value 1 of level, N/A
ipds(11) = 0 ! value 2 of level (value of level)
IF ( year <= 2000 ) THEN
ipds(12) = year-1900 ! year of century
ipds(23) = 20 ! century (20, change to 21 on Jan 1, 2001)
ELSE
ipds(12) = year-2000 ! year of century
ipds(23) = 21 ! century (20, change to 21 on Jan 1, 2001)
END IF
ipds(13) = month ! month of year
ipds(14) = day ! day of month
ipds(15) = hour ! hour of day
ipds(16) = minute ! minute of hour
ipds(17) = 0 ! forecast time unit, minutes
ipds(18) = 0 ! forecast time P1, or current time, curtim
ipds(19) = 0 ! forecast time P2, N/A
ipds(20) = 10 ! time range indicator,
! 10 = use two octets from ipds(18)
ipds(21) = 0 ! number include in average, N/A
ipds(22) = 0 ! number missing from average, N/A
ipds(24) = 0 ! subcenter ID number
ipds(25) = 0 ! scaling power of 10,
! depends on which variable
RETURN
END SUBROUTINE mkipds
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE MKIGDS ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE mkigds(nx,ny,nz,stagger,igds) 6,1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Make integer grid description array IGDS.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 11/01/1995
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! 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
!
! stagger Flag for staggered grid
! = 0, s-grid, for scalar grid
! = 1, u-grid, for u-vector grid
! = 0, v-grid, for v-vector grid
!
! OUTPUT:
!
! igds IPDS array
!
! WORK ARRAY:
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
INTEGER :: stagger
INTEGER :: igds(25)
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i
REAL :: swlat,swlon, nelat,nelon
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
IF ( stagger == 0 ) THEN
swlat = swlats
swlon = swlons
nelat = nelats
nelon = nelons
ELSE IF ( stagger == 1 ) THEN
swlat = swlatu
swlon = swlonu
nelat = nelatu
nelon = nelonu
ELSE IF ( stagger == 2 ) THEN
swlat = swlatv
swlon = swlonv
nelat = nelatv
nelon = nelonv
ELSE
WRITE(6,'(a)') &
'Do not know the grid type. Set the grid type to scalar grid'
END IF
IF ( mapproj == 1 ) THEN ! Polar stereographic
igds(1) = nz ! number of vertical (z) coordinates
igds(2) = 255 ! location (in octets) of vertical
! coordinate list
igds(3) = 5 ! data representation type (table 6)
igds(4) = nx ! number of x-coordinates
igds(5) = ny ! number of y-coordinates
igds(6) = nint(swlat*1000) ! latitude at southwest corner
igds(7) = nint(swlon*1000) ! longitude at southwest corner
igds(8) = 8 ! u & v relative to x & y direction
igds(9) = nint(trulon*1000) ! true longitude of projection
igds(10) = dx
igds(11) = dy
IF ( trulat1 >= 0. ) THEN
igds(12) = 0 ! northern pole on plane
ELSE
igds(12) = 1 ! southern pole on plane
END IF
igds(13) = 64 ! scanning flag, 64 for +i & +j direction
DO i = 14,25
igds(i) = 0 ! unused
END DO
ELSE IF ( mapproj == 2 .OR. mapproj == 0 ) THEN ! Lambert conformal
! and no projection too
igds( 1) = nz ! number of vertical (z) coordinates
igds( 2) = 255 ! location (in octets) of vertical
! coordinate list
igds( 3) = 3 ! data representation type (table 6)
igds( 4) = nx ! number of x-coordinates
igds( 5) = ny ! number of y-coordinates
igds( 6) = nint(swlat*1000) ! latitude at southwest corner
igds( 7) = nint(swlon*1000) ! longitude at southwest corner
igds( 8) = 8 ! u & v relative to x & y direction
igds( 9) = nint(trulon*1000) ! true longitude of projection
igds(10) = dx
igds(11) = dy
IF ( trulat1 >= 0. ) THEN
igds(12) = 0 ! northern pole on plane
ELSE
igds(12) = 1 ! southern pole on plane
END IF
igds(13) = 64 ! scanning flag, 64 for +i & +j direction
igds(14) = 0 ! unused
igds(15) = nint(trulat1*1000) ! first true latitude (millidegree)
igds(16) = nint(trulat2*1000) ! second true latitude (millidegree)
igds(17) = -90000 ! latitude of south pole (millidegree)
igds(18) = nint(trulon*1000) ! longitude of south pole (millidegree)
DO i = 19, 25
igds(i) = 0 ! unused
END DO
ELSE IF ( mapproj == 3 ) THEN ! Mercator
igds( 1) = nz ! number of vertical (z) coordinates
igds( 2) = 255 ! location (in octets) of vertical
! coordinate list
igds( 3) = 1 ! data representation type (table 6)
igds( 4) = nx ! number of x-coordinates
igds( 5) = ny ! number of y-coordinates
igds( 6) = nint(swlat*1000) ! latitude at southwest corner
igds( 7) = nint(swlon*1000) ! longitude at southwest corner
igds( 8) = 8 ! u & v relative to x & y direction
igds( 9) = nint(nelat*1000) ! latitude of last point
igds(10) = nint(nelon*1000) ! longitude of last point
igds(11) = nint((nelat-swlat)*1000./ny) ! latitude increment
igds(12) = nint((nelon-swlon)*1000./nx) ! longitude increment
igds(13) = nint(trulat1*1000) ! true latitude
igds(14) = 64 ! scanning flag, 64 for +i & +j direction
DO i = 15,25
igds(i) = 0 ! unused
END DO
ELSE
WRITE (6,'(a,i2/a)') &
'ARPS does support the type of map projection: ',mapproj, &
'Model stopped in MKIGDS.'
CALL arpsstop
(' ',1)
END IF
RETURN
END SUBROUTINE mkigds
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE GRIBCNTL ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE gribcntl(nx,ny,nz,x,y,z,zp,gdsid, temxy1,temxy2) 1,6
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! ARPS GRIB data description file for GrADS display
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 11/27/1995
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! 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
!
! x The x-coord. of the physical and computational grid.
! Defined at u-point.
! y The y-coord. of the physical and computational grid.
! Defined at v-point.
! z The z-coord. of the computational grid.
! Defined at w-point on the staggered grid.
!
! WORK ARRAY:
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
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 :: gdsid ! ID number of GRIB grid.
! (should always be 255)
REAL :: temxy1(nx,ny) ! Temporary array
REAL :: temxy2(nx,ny) ! Temporary array
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=120) :: grbctlfl
CHARACTER (LEN=120) :: grbdatfl
CHARACTER (LEN=15) :: chrstr, chr1
CHARACTER (LEN=50) :: vartit(50), varnam(50)
INTEGER :: varlev(50), varparam(50,4)
INTEGER :: varnum
INTEGER :: nchout0
CHARACTER (LEN=3) :: monnam(12) ! Name of months
DATA monnam/'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', &
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'/
CHARACTER (LEN=2) :: dtunit
INTEGER :: ntm,tinc
REAL :: lonmin,latmin,lonmax,latmax
REAL :: xbgn,ybgn,zbgn
REAL :: xinc,yinc,z0
REAL :: lat11,lat12,lon11,lon12,lat21,lat22,lon21,lon22
REAL :: latinc,loninc
INTEGER :: fnlen
INTEGER :: i,k, is
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! Open the GrADS data control file: runname.ctl
!
!-----------------------------------------------------------------------
!
IF ( mapproj /= 2 ) RETURN
fnlen = lfnkey + 9
grbctlfl(1:fnlen) = runname(1:lfnkey)//'.gribcntl'
CALL fnversn
( grbctlfl, fnlen )
CALL getunit
(nchout0)
WRITE (6,'(a)') 'The GrADS data control file is ' &
//grbctlfl(1:fnlen)
OPEN (nchout0, FILE = grbctlfl(1:fnlen), STATUS = 'unknown')
IF ( ldirnam == 0 ) THEN
ldirnam = ldirnam + 1
dirname(1:ldirnam) = '.'
END IF
fnlen = ldirnam + lfnkey + 14
grbdatfl(1:fnlen) = dirname(1:ldirnam)//'/' &
//runname(1:lfnkey)//'.grb000000'
xbgn = 0.5 * (x(1) + x(2))
ybgn = 0.5 * (y(1) + y(2))
zbgn = 0.5 * (z(1) + z(2))
xinc = (x(2) - x(1))
yinc = (y(2) - y(1))
z0 = (z(2)-z(1))/2.
CALL xytoll
(nx,ny,x,y,temxy1,temxy2)
CALL xytoll
(1,1,xbgn,ybgn,lat11,lon11)
CALL a3dmax0
(temxy1,1,nx,1,nx,1,ny,1,ny-1,1,1,1,1, &
latmax,latmin)
CALL a3dmax0
(temxy2,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
WRITE (chrstr,'(i2.2,a,i2.2,a,i2.2,a3,i4.4)') &
hour,':',minute,'Z',day,monnam(month),year
IF ( nint(thisdmp) <= 0 ) THEN
ntm = 1
ELSE
ntm = nint(tstop/thisdmp) + 1
END IF
IF ( nint(thisdmp) < 60 ) THEN
WRITE (6, '(/a/a)') &
'GrADS reqiures the smallest uint minute for time interval.', &
'Return to the caller.'
tinc = nint(thisdmp)
RETURN
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
IF ( varout == 1 ) THEN
varnum = varnum + 1
varnam(varnum) = 'u'
vartit(varnum) = 'X-velocity total wind u (m/s)'
varlev(varnum) = nz
varparam(varnum,1) = 33
varparam(varnum,2) = 103
varparam(varnum,3) = z0
varnum = varnum + 1
varnam(varnum) = 'v'
vartit(varnum) = 'Y-velocity total wind v (m/s)'
varlev(varnum) = nz
varparam(varnum,1) = 34
varparam(varnum,2) = 103
varparam(varnum,3) = z0
varnum = varnum + 1
varnam(varnum) = 'w'
vartit(varnum) = 'Z-velocity total wind w (m/s)'
varlev(varnum) = nz
varparam(varnum,1) = 40
varparam(varnum,2) = 103
varparam(varnum,3) = z0
varnum = varnum + 1
varnam(varnum) = 'pt'
vartit(varnum) = 'Potential Temperature (K)'
varlev(varnum) = nz
varparam(varnum,1) = 13
varparam(varnum,2) = 103
varparam(varnum,3) = z0
varnum = varnum + 1
varnam(varnum) = 'p'
vartit(varnum) = 'Pressure (mb)'
varlev(varnum) = nz
varparam(varnum,1) = 1
varparam(varnum,2) = 103
varparam(varnum,3) = z0
END IF
IF ( mstout == 1 ) THEN
varnum = varnum + 1
varnam(varnum) = 'qv'
vartit(varnum) = 'Water Vapor Mixing Ratio (g/kg)'
varlev(varnum) = nz
varparam(varnum,1) = 51
varparam(varnum,2) = 103
varparam(varnum,3) = z0
varnum = varnum + 1
varnam(varnum) = 'qc'
vartit(varnum) = 'Cloud Water Mixing Ratio (g/kg)'
varlev(varnum) = nz
varparam(varnum,1) = 153
varparam(varnum,2) = 103
varparam(varnum,3) = z0
varnum = varnum + 1
varnam(varnum) = 'qr'
vartit(varnum) = 'Rain Water Mixing Ratio (g/kg)'
varlev(varnum) = nz
varparam(varnum,1) = 170
varparam(varnum,2) = 103
varparam(varnum,3) = z0
IF ( iceout == 1 ) THEN
varnum = varnum + 1
varnam(varnum) = 'qi'
vartit(varnum) = 'Cloud Ice Mixing Ratio (g/kg)'
varlev(varnum) = nz
varparam(varnum,1) = 178
varparam(varnum,2) = 103
varparam(varnum,3) = z0
varnum = varnum + 1
varnam(varnum) = 'qs'
vartit(varnum) = 'Snow Mixing Ratio (g/kg)'
varlev(varnum) = nz
varparam(varnum,1) = 171
varparam(varnum,2) = 103
varparam(varnum,3) = z0
varnum = varnum + 1
varnam(varnum) = 'qh'
vartit(varnum) = 'Hail Mixing Ratio (g/kg)'
varlev(varnum) = nz
varparam(varnum,1) = 179
varparam(varnum,2) = 103
varparam(varnum,3) = z0
END IF
IF ( rainout == 1 ) THEN
varnum = varnum + 1
varnam(varnum) = 'raing'
vartit(varnum) = 'Grid Supersaturation Rain '
varlev(varnum) = 0
varparam(varnum,1) = 62
varparam(varnum,2) = 1
varparam(varnum,3) = 0
varnum = varnum + 1
varnam(varnum) = 'rainc'
vartit(varnum) = 'Cumulus Convection Rain '
varlev(varnum) = 0
varparam(varnum,1) = 63
varparam(varnum,2) = 1
varparam(varnum,3) = 0
END IF
IF ( prcout == 1 ) THEN
varnum = varnum + 1
varnam(varnum) = 'prcrt1'
vartit(varnum) = 'Total precipitation rate '
varlev(varnum) = 1
varparam(varnum,1) = 59
varparam(varnum,2) = 111
varparam(varnum,3) = 1
varnum = varnum + 1
varnam(varnum) = 'prcrt2'
vartit(varnum) = 'Grid scale precipitation rate '
varlev(varnum) = 2
varparam(varnum,1) = 59
varparam(varnum,2) = 111
varparam(varnum,3) = 2
varnum = varnum + 1
varnam(varnum) = 'prcrt3'
vartit(varnum) = 'cumulus precipitation rate '
varlev(varnum) = 3
varparam(varnum,1) = 59
varparam(varnum,2) = 111
varparam(varnum,3) = 3
varnum = varnum + 1
varnam(varnum) = 'prcrt4'
vartit(varnum) = 'Microphysics precipitation rate '
varlev(varnum) = 4
varparam(varnum,1) = 59
varparam(varnum,2) = 111
varparam(varnum,3) = 4
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
varparam(varnum,1) = 158
varparam(varnum,2) = 103
varparam(varnum,3) = z0
END IF
IF ( trbout == 1 ) THEN
varnum = varnum + 1
varnam(varnum) = 'kmh'
vartit(varnum) = 'Horiz. Turb. Mixing Coeff. for ' &
//'Momentum (m**2/s)'
varlev(varnum) = nz
varparam(varnum,1) = 185
varparam(varnum,2) = 103
varparam(varnum,3) = z0
varnum = varnum + 1
varnam(varnum) = 'kmv'
vartit(varnum) = 'Vertical Turb. Mixing Coeff. for ' &
//'Momentum (m**2/s)'
varlev(varnum) = nz
varparam(varnum,1) = 186
varparam(varnum,2) = 103
varparam(varnum,3) = z0
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
varparam(varnum,1) = 85
varparam(varnum,2) = 111
varparam(varnum,3) = 1
varnum = varnum + 1
varnam(varnum) = 't2'
vartit(varnum) = 'Deep Soil Temperature (K)'
varlev(varnum) = 0
varparam(varnum,1) = 85
varparam(varnum,2) = 111
varparam(varnum,3) = 100
varnum = varnum + 1
varnam(varnum) = 'wg'
vartit(varnum) = 'Surface Soil moisture'
varlev(varnum) = 0
varparam(varnum,1) = 144
varparam(varnum,2) = 111
varparam(varnum,3) = 1
varnum = varnum + 1
varnam(varnum) = 'w2'
vartit(varnum) = 'Deep Soil moisture'
varlev(varnum) = 0
varparam(varnum,1) = 144
varparam(varnum,2) = 111
varparam(varnum,3) = 100
varnum = varnum + 1
varnam(varnum) = 'wr'
vartit(varnum) = 'Canopy Soil moisture'
varlev(varnum) = 0
varparam(varnum,1) = 223
varparam(varnum,2) = 111
varparam(varnum,3) = 0
ELSE
DO is=0,nstyp
WRITE (chr1,'(i1)') is
varnum = varnum + 1
varnam(varnum) = 'ts'//chr1
vartit(varnum) = 'Ground Surface Temperature (K)'
varlev(varnum) = 0
varparam(varnum,1) = 85
varparam(varnum,2) = 111
varparam(varnum,3) = 1+is
varnum = varnum + 1
varnam(varnum) = 't2'//chr1
vartit(varnum) = 'Deep Soil Temperature (K)'
varlev(varnum) = 0
varparam(varnum,1) = 85
varparam(varnum,2) = 111
varparam(varnum,3) = 100+is
varnum = varnum + 1
varnam(varnum) = 'wg'//chr1
vartit(varnum) = 'Surface Soil moisture'
varlev(varnum) = 0
varparam(varnum,1) = 144
varparam(varnum,2) = 111
varparam(varnum,3) = 1+is
varnum = varnum + 1
varnam(varnum) = 'w2'//chr1
vartit(varnum) = 'Deep Soil moisture'
varlev(varnum) = 0
varparam(varnum,1) = 144
varparam(varnum,2) = 111
varparam(varnum,3) = 100+is
varnum = varnum + 1
varnam(varnum) = 'wr'//chr1
vartit(varnum) = 'Canopy Soil moisture'
varlev(varnum) = 0
varparam(varnum,1) = 223
varparam(varnum,2) = 111
varparam(varnum,3) = is
END DO
END IF
IF ( snowout == 1 ) THEN
varnum = varnum + 1
varnam(varnum) = 'snowd'
vartit(varnum) = 'Snow depth (m)'
varlev(varnum) = 0
varparam(varnum,1) = 66
varparam(varnum,2) = 1
varparam(varnum,3) = 0
END IF
END IF
IF( radout == 1 ) THEN
varnum = varnum + 1
varnam(varnum) = 'radfrc'
vartit(varnum) = 'Radiation forcing (K/s)'
varlev(varnum) = nz
varparam(varnum,1) = 216
varparam(varnum,2) = 103
varparam(varnum,3) = z0
varnum = varnum + 1
varnam(varnum) = 'radsw'
vartit(varnum) = 'Net short wave radiation flux (W/m**2)'
varlev(varnum) = 0
varparam(varnum,1) = 204
varparam(varnum,2) = 1
varparam(varnum,3) = 0
varnum = varnum + 1
varnam(varnum) = 'rnflx'
vartit(varnum) = 'Total radiation flux (W/m**2)'
varlev(varnum) = 0
varparam(varnum,1) = 232
varparam(varnum,2) = 1
varparam(varnum,3) = 0
END IF
IF( flxout == 1 ) THEN
varnum = varnum + 1
varnam(varnum) = 'uflx'
vartit(varnum) = 'u flux'
varlev(varnum) = 0
varparam(varnum,1) = 124
varparam(varnum,2) = 1
varparam(varnum,3) = 0
varnum = varnum + 1
varnam(varnum) = 'vflx'
vartit(varnum) = 'v flux'
varlev(varnum) = 0
varparam(varnum,1) = 125
varparam(varnum,2) = 1
varparam(varnum,3) = 0
varnum = varnum + 1
varnam(varnum) = 'ptflx'
vartit(varnum) = 'pt flux'
varlev(varnum) = 0
varparam(varnum,1) = 122
varparam(varnum,2) = 1
varparam(varnum,3) = 0
varnum = varnum + 1
varnam(varnum) = 'qvflx'
vartit(varnum) = 'qv flux'
varlev(varnum) = 0
varparam(varnum,1) = 121
varparam(varnum,2) = 1
varparam(varnum,3) = 0
END IF
DO i=1,varnum
varparam(i,4) = 0
END DO
WRITE (nchout0,'(a/a)') &
'TITLE ARPS 4.0 GRIB Control for GrADS Display of ' &
//runname(1:lfnkey)//' (a sample)','*'
WRITE (nchout0,'(a,a)') &
'DSET ',grbdatfl(1:fnlen)
WRITE (nchout0,'(a,i4)') &
'DTYPE GRIB ',gdsid
WRITE (nchout0,'(a)') &
'OPTIONS template'
WRITE (nchout0,'(a)') &
'INDEX '//runname(1:lfnkey)//'.gribmap'
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
END IF
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
WRITE (nchout0,'(a,1x,i8,a)') &
'ZDEF',nz,' LEVELS '
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'
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 i = 1, varnum
WRITE (nchout0,'(a6,1x,i3,2x,i3.3,a,i4.4,a,i3.3,2x,a)') &
varnam(i),varlev(i), varparam(i,1),',',varparam(i,2),',', &
varparam(i,3),vartit(i)
END DO
WRITE (nchout0,'(a)') &
'ENDVARS'
CLOSE (nchout0)
CALL retunit(nchout0)
RETURN
END SUBROUTINE gribcntl