!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE NETREAD ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE netread(netid,packed,itime,grdbas,time, & 3,116
nx,ny,nz,nzsoil,nstyps, x, y, z, zp,zpsoil, &
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, &
tsoil,qsoil,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx,radswnet,radlwin, &
usflx,vsflx,ptsflx,qvsflx, &
tem1, ireturn)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read ARPS history data from NetCDF file.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER, INTENT(IN) :: netid
INTEGER, INTENT(IN) :: packed
INTEGER, INTENT(IN) :: itime
INTEGER, INTENT(IN) :: grdbas ! Data read flag.
INTEGER, INTENT(IN) :: nx,ny,nz ! Number of grid points in 3 directions
INTEGER, INTENT(IN) :: nzsoil ! Number of grid points in the soil
INTEGER, INTENT(IN) :: nstyps ! Number of soil type
REAL, INTENT(OUT) :: time ! Time in seconds of data read
! from "filename"
REAL, INTENT(OUT) :: x (nx) ! x-coord. of the physical and compu
! -tational grid. Defined at u-point(m).
REAL, INTENT(OUT) :: y (ny) ! y-coord. of the physical and compu
! -tational grid. Defined at v-point(m).
REAL, INTENT(OUT) :: z (nz) ! z-coord. of the computational grid.
! Defined at w-point on the staggered
! grid(m).
REAL, INTENT(OUT) :: zp (nx,ny,nz) ! Physical height coordinate defined at
! w-point of the staggered grid(m).
REAL, INTENT(OUT) :: zpsoil(nx,ny,nzsoil) ! Physical height coordinate defined at
! w-point of the soil (m)
REAL, INTENT(OUT) :: uprt (nx,ny,nz) ! Perturbation u-velocity (m/s)
REAL, INTENT(OUT) :: vprt (nx,ny,nz) ! Perturbation v-velocity (m/s)
REAL, INTENT(OUT) :: wprt (nx,ny,nz) ! Perturbation w-velocity (m/s)
REAL, INTENT(OUT) :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K)
REAL, INTENT(OUT) :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal)
REAL, INTENT(OUT) :: qvprt (nx,ny,nz) ! Perturbation water vapor mixing
! ratio (kg/kg)
REAL, INTENT(OUT) :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg)
REAL, INTENT(OUT) :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg)
REAL, INTENT(OUT) :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg)
REAL, INTENT(OUT) :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg)
REAL, INTENT(OUT) :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg)
REAL, INTENT(OUT) :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2)
REAL, INTENT(OUT) :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for
! momentum. ( m**2/s )
REAL, INTENT(OUT) :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for
! momentum. ( m**2/s )
REAL, INTENT(INOUT) :: ubar (nx,ny,nz) ! Base state u-velocity (m/s)
REAL, INTENT(INOUT) :: vbar (nx,ny,nz) ! Base state v-velocity (m/s)
REAL, INTENT(INOUT) :: wbar (nx,ny,nz) ! Base state w-velocity (m/s)
REAL, INTENT(INOUT) :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL, INTENT(INOUT) :: pbar (nx,ny,nz) ! Base state pressure (Pascal)
REAL, INTENT(INOUT) :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3)
REAL, INTENT(INOUT) :: qvbar (nx,ny,nz) ! Base state water vapor mixing ratio
INTEGER, INTENT(OUT) :: soiltyp (nx,ny,nstyps) ! Soil type
REAL, INTENT(OUT) :: stypfrct(nx,ny,nstyps) ! Soil type fraction
INTEGER, INTENT(OUT) :: vegtyp (nx,ny) ! Vegetation type
REAL, INTENT(OUT) :: lai (nx,ny) ! Leaf Area Index
REAL, INTENT(OUT) :: roufns (nx,ny) ! Surface roughness
REAL, INTENT(OUT) :: veg (nx,ny) ! Vegetation fraction
REAL, INTENT(OUT) :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil temperature (K)
REAL, INTENT(OUT) :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil moisture (m**3/m**3)
REAL, INTENT(OUT) :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount
REAL, INTENT(OUT) :: snowdpth(nx,ny) ! Snow depth (m)
REAL, INTENT(OUT) :: raing(nx,ny) ! Grid supersaturation rain
REAL, INTENT(OUT) :: rainc(nx,ny) ! Cumulus convective rain
REAL, INTENT(OUT) :: prcrate(nx,ny,4) ! precipitation rate (kg/(m**2*s))
! prcrate(1,1,1) = total precip. rate
! prcrate(1,1,2) = grid scale precip. rate
! prcrate(1,1,3) = cumulus precip. rate
! prcrate(1,1,4) = microphysics precip. rate
REAL, INTENT(OUT) :: radfrc(nx,ny,nz) ! Radiation forcing (K/s)
REAL, INTENT(OUT) :: radsw (nx,ny) ! Solar radiation reaching the surface
REAL, INTENT(OUT) :: rnflx (nx,ny) ! Net radiation flux absorbed by surface
REAL, INTENT(OUT) :: radswnet(nx,ny) ! Net shortwave radiation
REAL, INTENT(OUT) :: radlwin(nx,ny) ! Incoming longwave radiation
REAL, INTENT(OUT) :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2))
REAL, INTENT(OUT) :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2))
REAL, INTENT(OUT) :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m**2*s))
REAL, INTENT(OUT) :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s))
REAL, INTENT(INOUT) :: tem1(nx,ny,nz) ! Temporary work array
INTEGER, INTENT(OUT) :: ireturn ! Return status indicator
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'indtflg.inc'
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
INCLUDE 'mp.inc' ! mpi parameters.
!
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k,is,n
INTEGER :: nxin,nyin,nzin,nzsoilin
INTEGER :: bgrdin,bbasin,bvarin,bicein,btkein,btrbin
INTEGER :: idummy,nstyps1
INTEGER, SAVE :: nstypsin
CHARACTER(LEN=20) :: varname
REAL, ALLOCATABLE :: invar2d (:,:)
REAL, ALLOCATABLE :: invar3dt(:,:,:)
REAL, ALLOCATABLE :: invar3du(:,:,:)
REAL, ALLOCATABLE :: invar3dv(:,:,:)
REAL, ALLOCATABLE :: invar3dw(:,:,:)
REAL, ALLOCATABLE :: invar4d (:,:,:,:)
INTEGER, ALLOCATABLE :: invar2di(:,:)
INTEGER, ALLOCATABLE :: invar3di(:,:,:)
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code ... ...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IF ( mp_opt /= 1 ) readsplit = 0 ! NO-MPI or is not initialized
!-----------------------------------------------------------------------
!
! Read dimensions and global attributes
!
!-----------------------------------------------------------------------
!
IF ( itime == 1 ) THEN
CALL net_getdims
(netid,nxin,nyin,nzin,nzsoilin,nstypsin,ireturn)
!
! Data validation: dimensions
!
IF( nxin /= nx .OR. nyin /= ny .OR. &
nzin /= nz .OR. nzsoil /= nzsoil) THEN
WRITE(6,'(1x,a)') &
' Dimensions in NETREAD inconsistent with data.'
WRITE(6,'(1x,a,3I15)') ' Read were: ', nxin, nyin, nzin, nzsoilin
WRITE(6,'(1x,a,3I15)') ' Expected: ', nx, ny, nz, nzsoil
WRITE(6,'(1x,a)') ' Program aborted in NETREAD.'
CALL arpsstop
('arpstop called from binread nx-ny-nz read ',1)
END IF
IF (nstypsin > nstyps) THEN
WRITE(6,'(/1x,3(a,I4),a/)') 'WARNING: nstyps in the data file is ',&
nstypsin, ' which is larger than the decalared dimension ',&
nstyps,' only ',nstyps, ' soil types will be extracted.'
ELSE if (nstypsin < nstyps) THEN
WRITE(6,'(/1x,a,I4,a,a,I4,a/)') 'WARNING: only ',nstypsin, &
' soil types are available inside the data file.', &
' Because the decalared dimension is ',nstyps, &
' the extra soil types will be packed with zeros.'
END IF
IF (grdbas == 1) THEN
CALL net_getatts
(netid,runname,nocmnt,cmnt,dx,dy, &
year,month,day,hour,minute,second,thisdmp,tstop, &
mapproj,sclfct,trulat1,trulat2,trulon,latitud, &
ctrlat,ctrlon,xgrdorg,ygrdorg,umove,vmove, &
bgrdin,bbasin,bvarin,mstin,bicein,btrbin, &
idummy,idummy,landin,totin,btkein, &
prcin,radin,flxin,snowin,ireturn)
ELSE
CALL net_getatts
(netid,runname,nocmnt,cmnt,dx,dy, &
year,month,day,hour,minute,second,thisdmp,tstop, &
mapproj,sclfct,trulat1,trulat2,trulon,latitud, &
ctrlat,ctrlon,xgrdorg,ygrdorg,umove,vmove, &
grdin,basin,varin,mstin,icein,trbin, &
sfcin,rainin,landin,totin,tkein, &
prcin,radin,flxin,snowin,ireturn)
END IF
END IF
snowcin = 0
nstyps1 = MAX(1, MIN(nstypsin,nstyps)) ! nstyps: Decalared dimension
! nstypsin: Dimension inside file
! nstyps1: Dimension to be extracted
ALLOCATE(invar2d(nx-1,ny-1), STAT = idummy)
CALL check_alloc_status
(idummy, "NETREAD:invar2d")
ALLOCATE(invar3dt(nx-1,ny-1,nz-1), STAT = idummy)
CALL check_alloc_status
(idummy, "NETREAD:invar3dt")
ALLOCATE(invar3du(nx, ny-1,nz-1), STAT = idummy)
CALL check_alloc_status
(idummy, "NETREAD:invar3dt")
ALLOCATE(invar3dv(nx-1,ny, nz-1), STAT = idummy)
CALL check_alloc_status
(idummy, "NETREAD:invar3dt")
ALLOCATE(invar3dw(nx-1,ny-1,MAX(nz,nzsoil,nstypsin+1)), STAT = idummy)
CALL check_alloc_status
(idummy, "NETREAD:invar3dt")
ALLOCATE(invar4d (nx-1,ny-1,nzsoil,nstypsin+1), STAT = idummy)
CALL check_alloc_status
(idummy, "NETREAD:invar4d")
ALLOCATE(invar2di(nx-1,ny-1), STAT = idummy)
CALL check_alloc_status
(idummy, "NETREAD:invar2di")
ALLOCATE(invar3di(nx-1,ny-1,nstypsin), STAT = idummy)
CALL check_alloc_status
(idummy, "NETREAD:invar3di")
!
!-----------------------------------------------------------------------
!
! Readin current valid time
!
!-----------------------------------------------------------------------
IF ( grdbas /= 1 ) THEN
CALL netreadTime
(netid,itime,'Time',time)
WRITE(6,'(1x,/,a,f8.1,a,f8.3,a/)') 'To read data for time:', &
time,' secs = ',(time/60.),' mins.'
ELSE
WRITE(6,'(1x,/,a,/)') 'To read grid and base state data.'
END IF
!
!-----------------------------------------------------------------------
!
! Read in x, y, z and zp arrays.
!
!----------------------------------------------------------------------
!
IF( itime <= 1 .AND. (grdin == 1 .OR. grdbas == 1) ) THEN
CALL netread1d
(netid,packed,0,'x_stag',nx,x)
CALL netread1d
(netid,packed,0,'y_stag',ny,y)
CALL netread1d
(netid,packed,0,'z_stag',nz,z)
CALL netread3d
(netid,packed,0,'ZP',nx-1,ny-1,nz,invar3dw)
DO k = 1, nz
DO j = 1, ny-1
DO i = 1, nx-1
zp(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(zp,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz)
CALL netread3d
(netid,packed,0,'ZPSOIL',nx-1,ny-1,nzsoil,invar3dw)
DO k = 1, nzsoil
DO j = 1, ny-1
DO i = 1, nx-1
zpsoil(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(zpsoil,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nzsoil,1,nzsoil)
END IF
!
!-----------------------------------------------------------------------
!
! Read in base state fields
!
!----------------------------------------------------------------------
!
IF(itime == 1 .AND. (basin == 1 .OR. grdbas == 1) ) THEN
CALL netread3d
(netid,packed,0,'UBAR',nx,ny-1,nz-1,invar3du)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx
ubar(i,j,k) = invar3du(i,j,k)
END DO
END DO
END DO
CALL edgfill
(ubar,1,nx,1,nx, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL netread3d
(netid,packed,0,'VBAR',nx-1,ny,nz-1,invar3dv)
DO k = 1, nz-1
DO j = 1, ny
DO i = 1, nx-1
vbar(i,j,k) = invar3dv(i,j,k)
END DO
END DO
END DO
CALL edgfill
(vbar,1,nx,1,nx-1, 1,ny,1,ny, 1,nz,1,nz-1)
CALL netread3d
(netid,packed,0,'WBAR',nx-1,ny-1,nz,invar3dw)
DO k = 1, nz
DO j = 1, ny-1
DO i = 1, nx-1
wbar(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(wbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz)
CALL netread3d
(netid,packed,0,'PTBAR',nx-1,ny-1,nz-1,invar3dt)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
ptbar(i,j,k) = invar3dt(i,j,k)
END DO
END DO
END DO
CALL edgfill
(ptbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL netread3d
(netid,packed,0,'PBAR',nx-1,ny-1,nz-1,invar3dt)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
pbar(i,j,k) = invar3dt(i,j,k)
END DO
END DO
END DO
CALL edgfill
(pbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
IF (mstin == 1) THEN
CALL netread3d
(netid,packed,0,'QVBAR',nx-1,ny-1,nz-1,invar3dt)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
qvbar(i,j,k) = invar3dt(i,j,k)
END DO
END DO
END DO
CALL edgfill
(qvbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
END IF
IF (landin == 1) THEN
CALL netread3di
(netid,packed,0,'SOILTYP',nx-1,ny-1,nstypsin,invar3di)
DO is = 1, nstyps1
DO j = 1, ny-1
DO i = 1, nx-1
soiltyp(i,j,is) = invar3di(i,j,is)
END DO
END DO
END DO
CALL iedgfill
(soiltyp,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nstyps,1,nstyps1)
CALL netread3d
(netid,packed,0,'STYPFRCT',nx-1,ny-1,nstypsin,invar3dw)
DO is = 1, nstyps1
DO j = 1, ny-1
DO i = 1, nx-1
stypfrct(i,j,is) = invar3dw(i,j,is)
END DO
END DO
END DO
CALL fix_stypfrct_nstyp
(nx,ny,nstyps1,nstyps,stypfrct)
CALL netread2di
(netid,packed,0,'VEGTYP',nx-1,ny-1,invar2di)
DO j = 1, ny-1
DO i = 1, nx-1
vegtyp(i,j) = invar2di(i,j)
END DO
END DO
CALL iedgfill
(vegtyp,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL netread2d
(netid,packed,0,'LAI',nx-1,ny-1,invar2d)
DO j = 1, ny-1
DO i = 1, nx-1
lai(i,j) = invar2d(i,j)
END DO
END DO
CALL edgfill
(lai,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL netread2d
(netid,packed,0,'ROUFNS',nx-1,ny-1,invar2d)
DO j = 1, ny-1
DO i = 1, nx-1
roufns(i,j) = invar2d(i,j)
END DO
END DO
CALL edgfill
(roufns,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL netread2d
(netid,packed,0,'VEG',nx-1,ny-1,invar2d)
DO j = 1, ny-1
DO i = 1, nx-1
veg(i,j) = invar2d(i,j)
END DO
END DO
CALL edgfill
(veg,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
END IF
END IF
IF ( grdbas == 1 ) GOTO 4444
IF (varin == 1) THEN
IF (totin == 0) THEN
CALL netread3d
(netid,packed,itime,'UPRT',nx,ny-1,nz-1,invar3du)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx
uprt(i,j,k) = invar3du(i,j,k)
END DO
END DO
END DO
CALL edgfill
(uprt,1,nx,1,nx, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL netread3d
(netid,packed,itime,'VPRT',nx-1,ny,nz-1,invar3dv)
DO k = 1, nz-1
DO j = 1, ny
DO i = 1, nx-1
vprt(i,j,k) = invar3dv(i,j,k)
END DO
END DO
END DO
CALL edgfill
(vprt,1,nx,1,nx-1, 1,ny,1,ny, 1,nz,1,nz-1)
CALL netread3d
(netid,packed,itime,'WPRT',nx-1,ny-1,nz,invar3dw)
DO k = 1, nz
DO j = 1, ny-1
DO i = 1, nx-1
wprt(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(wprt,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz)
CALL netread3d
(netid,packed,itime,'PTPRT',nx-1,ny-1,nz-1,invar3dt)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
ptprt(i,j,k) = invar3dt(i,j,k)
END DO
END DO
END DO
CALL edgfill
(ptprt,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL netread3d
(netid,packed,itime,'PPRT',nx-1,ny-1,nz-1,invar3dt)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
pprt(i,j,k) = invar3dt(i,j,k)
END DO
END DO
END DO
CALL edgfill
(pprt,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
ELSE
CALL netread3d
(netid,packed,itime,'U',nx,ny-1,nz-1,invar3du)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx
uprt(i,j,k) = invar3du(i,j,k) - ubar(i,j,k)
END DO
END DO
END DO
CALL edgfill
(uprt,1,nx,1,nx, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL netread3d
(netid,packed,itime,'V',nx-1,ny,nz-1,invar3dv)
DO k = 1, nz-1
DO j = 1, ny
DO i = 1, nx-1
vprt(i,j,k) = invar3dv(i,j,k) - vbar(i,j,k)
END DO
END DO
END DO
CALL edgfill
(vprt,1,nx,1,nx-1, 1,ny,1,ny, 1,nz,1,nz-1)
CALL netread3d
(netid,packed,itime,'W',nx-1,ny-1,nz,invar3dw)
DO k = 1, nz
DO j = 1, ny-1
DO i = 1, nx-1
wprt(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(wprt,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz)
CALL netread3d
(netid,packed,itime,'PT',nx-1,ny-1,nz-1,invar3dt)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
ptprt(i,j,k) = invar3dt(i,j,k) - ptbar(i,j,k)
END DO
END DO
END DO
CALL edgfill
(ptprt,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL netread3d
(netid,packed,itime,'P',nx-1,ny-1,nz-1,invar3dt)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
pprt(i,j,k) = invar3dt(i,j,k) - pbar(i,j,k)
END DO
END DO
END DO
CALL edgfill
(pprt,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
END IF
END IF ! varin
IF (mstin == 1) THEN
IF (totin == 0) THEN
CALL netread3d
(netid,packed,itime,'QVPRT',nx-1,ny-1,nz-1,invar3dt)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
qvprt(i,j,k) = invar3dt(i,j,k)
END DO
END DO
END DO
ELSE
CALL netread3d
(netid,packed,itime,'QV',nx-1,ny-1,nz-1,invar3dt)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
qvprt(i,j,k) = invar3dt(i,j,k) - qvbar(i,j,k)
END DO
END DO
END DO
END IF
CALL edgfill
(qvprt,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL netread3d
(netid,packed,itime,'QC',nx-1,ny-1,nz-1,invar3dt)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
qc(i,j,k) = invar3dt(i,j,k)
END DO
END DO
END DO
CALL edgfill
(qc,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL netread3d
(netid,packed,itime,'QR',nx-1,ny-1,nz-1,invar3dt)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
qr(i,j,k) = invar3dt(i,j,k)
END DO
END DO
END DO
CALL edgfill
(qr,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
IF( rainin == 1 ) THEN
CALL netread2d
(netid,packed,itime,'RAING',nx-1,ny-1,invar2d)
DO j = 1, ny-1
DO i = 1, nx-1
raing(i,j) = invar2d(i,j)
END DO
END DO
CALL edgfill
(raing,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL netread2d
(netid,packed,itime,'RAINC',nx-1,ny-1,invar2d)
DO j = 1, ny-1
DO i = 1, nx-1
rainc(i,j) = invar2d(i,j)
END DO
END DO
CALL edgfill
(rainc,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
END IF
IF (prcin == 1) THEN
DO n = 1,4
WRITE(varname,'(a,I1)') 'PRCRATE',n
CALL netread2d
(netid,packed,itime,varname,nx-1,ny-1,invar2d)
DO j = 1, ny-1
DO i = 1, nx-1
prcrate(i,j,n) = invar2d(i,j)
END DO
END DO
END DO
CALL edgfill
(prcrate,1,nx,1,nx-1, 1,ny,1,ny-1, 1,4,1,4)
END IF
IF(icein == 1) THEN
CALL netread3d
(netid,packed,itime,'QI',nx-1,ny-1,nz-1,invar3dt)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
qi(i,j,k) = invar3dt(i,j,k)
END DO
END DO
END DO
CALL edgfill
(qi,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL netread3d
(netid,packed,itime,'QS',nx-1,ny-1,nz-1,invar3dt)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
qs(i,j,k) = invar3dt(i,j,k)
END DO
END DO
END DO
CALL edgfill
(qs,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL netread3d
(netid,packed,itime,'QH',nx-1,ny-1,nz-1,invar3dt)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
qh(i,j,k) = invar3dt(i,j,k)
END DO
END DO
END DO
CALL edgfill
(qh,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
END IF
END IF
IF( tkein == 1 ) THEN
CALL netread3d
(netid,packed,itime,'TKE',nx-1,ny-1,nz-1,invar3dt)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
tke(i,j,k) = invar3dt(i,j,k)
END DO
END DO
END DO
CALL edgfill
(tke,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
END IF
IF( trbin == 1 ) THEN
CALL netread3d
(netid,packed,itime,'KMH',nx-1,ny-1,nz-1,invar3dt)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
kmh(i,j,k) = invar3dt(i,j,k)
END DO
END DO
END DO
CALL edgfill
(kmh,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL netread3d
(netid,packed,itime,'KMV',nx-1,ny-1,nz-1,invar3dt)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
kmv(i,j,k) = invar3dt(i,j,k)
END DO
END DO
END DO
CALL edgfill
(kmv,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
END IF
IF (sfcin == 1) THEN
!
! NOTE: Soil type dimensions
! nstyps: Required in this run
! nstypsin: soil types inside the data file
! nstyps1: = MIN(nstypsin, nstyps), soil types to be extracted
!
CALL netread4d
(netid,packed,itime,'TSOIL',nx-1,ny-1,nzsoil,nstypsin+1,invar4d)
DO is = 0,nstyps1
DO k = 1, nzsoil
DO j = 1, ny-1
DO i = 1, nx-1
tsoil(i,j,k,is) = invar4d(i,j,k,is+1)
END DO
END DO
END DO
CALL edgfill
(tsoil(:,:,:,is),1,nx,1,nx-1, 1,ny,1,ny-1, 1,nzsoil,1,nzsoil)
END DO
CALL netread4d
(netid,packed,itime,'QSOIL',nx-1,ny-1,nzsoil,nstypsin+1,invar4d)
DO is = 0,nstyps1
DO k = 1, nzsoil
DO j = 1, ny-1
DO i = 1, nx-1
qsoil(i,j,k,is) = invar4d(i,j,k,is+1)
END DO
END DO
END DO
CALL edgfill
(tsoil(:,:,:,is),1,nx,1,nx-1, 1,ny,1,ny-1, 1,nzsoil,1,nzsoil)
END DO
CALL netread3d
(netid,packed,itime,'WETCANP',nx-1,ny-1,nstypsin+1,invar3dw)
DO is = 0,nstyps1
DO j = 1, ny-1
DO i = 1, nx-1
wetcanp(i,j,is) = invar3dw(i,j,is+1)
END DO
END DO
END DO
CALL edgfill
(wetcanp,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nstyps1+1,1,nstyps1+1)
CALL fix_soil_nstyp
(nx,ny,nzsoil,nstyps1,nstyps,tsoil,qsoil,wetcanp)
IF (snowin == 1) THEN
CALL netread2d
(netid,packed,itime,'SNOWDPTH',nx-1,ny-1,invar2d)
DO j = 1, ny-1
DO i = 1, nx-1
snowdpth(i,j) = invar2d(i,j)
END DO
END DO
CALL edgfill
(snowdpth,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
END IF
END IF
IF (radin == 1) THEN
CALL netread3d
(netid,packed,itime,'RADFRC',nx-1,ny-1,nz-1,invar3dt)
DO k = 1, nz-1
DO j = 1, ny-1
DO i = 1, nx-1
radfrc(i,j,k) = invar3dt(i,j,k)
END DO
END DO
END DO
CALL edgfill
(radfrc,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL netread2d
(netid,packed,itime,'RADSW',nx-1,ny-1,invar2d)
DO j = 1, ny-1
DO i = 1, nx-1
radsw(i,j) = invar2d(i,j)
END DO
END DO
CALL edgfill
(radsw,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL netread2d
(netid,packed,itime,'RNFLX',nx-1,ny-1,invar2d)
DO j = 1, ny-1
DO i = 1, nx-1
rnflx(i,j) = invar2d(i,j)
END DO
END DO
CALL edgfill
(rnflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL netread2d
(netid,packed,itime,'RADSWNET',nx-1,ny-1,invar2d)
DO j = 1, ny-1
DO i = 1, nx-1
radswnet(i,j) = invar2d(i,j)
END DO
END DO
CALL edgfill
(radswnet,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL netread2d
(netid,packed,itime,'RADLWIN',nx-1,ny-1,invar2d)
DO j = 1, ny-1
DO i = 1, nx-1
radlwin(i,j) = invar2d(i,j)
END DO
END DO
CALL edgfill
(radlwin,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
END IF
IF (flxin == 1) THEN
CALL netread2d
(netid,packed,itime,'USFLX',nx-1,ny-1,invar2d)
DO j = 1, ny-1
DO i = 1, nx-1
usflx(i,j) = invar2d(i,j)
END DO
END DO
CALL edgfill
(usflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL netread2d
(netid,packed,itime,'VSFLX',nx-1,ny-1,invar2d)
DO j = 1, ny-1
DO i = 1, nx-1
vsflx(i,j) = invar2d(i,j)
END DO
END DO
CALL edgfill
(vsflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL netread2d
(netid,packed,itime,'PTSFLX',nx-1,ny-1,invar2d)
DO j = 1, ny-1
DO i = 1, nx-1
ptsflx(i,j) = invar2d(i,j)
END DO
END DO
CALL edgfill
(ptsflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL netread2d
(netid,packed,itime,'QVSFLX',nx-1,ny-1,invar2d)
DO j = 1, ny-1
DO i = 1, nx-1
qvsflx(i,j) = invar2d(i,j)
END DO
END DO
CALL edgfill
(qvsflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
END IF
!-----------------------------------------------------------------------
!
! Clear memory and return
!
!-----------------------------------------------------------------------
4444 CONTINUE
DEALLOCATE(invar2d, invar2di, invar4d)
DEALLOCATE(invar3dt,invar3du, invar3dv, invar3dw, invar3di)
RETURN
END SUBROUTINE netread
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE NETREADSPLIT ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE netreadsplit(netid,packed,itime,grdbas,time, & 3,215
nx,ny,nz,nzsoil,nstyps, x, y, z, zp,zpsoil, &
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, &
tsoil,qsoil,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx,radswnet,radlwin, &
usflx,vsflx,ptsflx,qvsflx, &
tem1, ireturn)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read ARPS history data from NetCDF file.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER, INTENT(IN) :: netid
INTEGER, INTENT(IN) :: packed
INTEGER, INTENT(IN) :: itime
INTEGER, INTENT(IN) :: grdbas ! Data read flag.
INTEGER, INTENT(IN) :: nx,ny,nz ! Number of grid points in 3 directions
INTEGER, INTENT(IN) :: nzsoil ! Number of grid points in the soil
INTEGER, INTENT(IN) :: nstyps ! Number of soil type
REAL, INTENT(OUT) :: time ! Time in seconds of data read
! from "filename"
REAL, INTENT(OUT) :: x (nx) ! x-coord. of the physical and compu
! -tational grid. Defined at u-point(m).
REAL, INTENT(OUT) :: y (ny) ! y-coord. of the physical and compu
! -tational grid. Defined at v-point(m).
REAL, INTENT(OUT) :: z (nz) ! z-coord. of the computational grid.
! Defined at w-point on the staggered
! grid(m).
REAL, INTENT(OUT) :: zp (nx,ny,nz) ! Physical height coordinate defined at
! w-point of the staggered grid(m).
REAL, INTENT(OUT) :: zpsoil(nx,ny,nzsoil) ! Physical height coordinate defined at
! w-point of the soil (m)
REAL, INTENT(OUT) :: uprt (nx,ny,nz) ! Perturbation u-velocity (m/s)
REAL, INTENT(OUT) :: vprt (nx,ny,nz) ! Perturbation v-velocity (m/s)
REAL, INTENT(OUT) :: wprt (nx,ny,nz) ! Perturbation w-velocity (m/s)
REAL, INTENT(OUT) :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K)
REAL, INTENT(OUT) :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal)
REAL, INTENT(OUT) :: qvprt (nx,ny,nz) ! Perturbation water vapor mixing
! ratio (kg/kg)
REAL, INTENT(OUT) :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg)
REAL, INTENT(OUT) :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg)
REAL, INTENT(OUT) :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg)
REAL, INTENT(OUT) :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg)
REAL, INTENT(OUT) :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg)
REAL, INTENT(OUT) :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2)
REAL, INTENT(OUT) :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for
! momentum. ( m**2/s )
REAL, INTENT(OUT) :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for
! momentum. ( m**2/s )
REAL, INTENT(INOUT) :: ubar (nx,ny,nz) ! Base state u-velocity (m/s)
REAL, INTENT(INOUT) :: vbar (nx,ny,nz) ! Base state v-velocity (m/s)
REAL, INTENT(INOUT) :: wbar (nx,ny,nz) ! Base state w-velocity (m/s)
REAL, INTENT(INOUT) :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL, INTENT(INOUT) :: pbar (nx,ny,nz) ! Base state pressure (Pascal)
REAL, INTENT(INOUT) :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3)
REAL, INTENT(INOUT) :: qvbar (nx,ny,nz) ! Base state water vapor mixing ratio
INTEGER, INTENT(OUT) :: soiltyp (nx,ny,nstyps) ! Soil type
REAL, INTENT(OUT) :: stypfrct(nx,ny,nstyps) ! Soil type fraction
INTEGER, INTENT(OUT) :: vegtyp (nx,ny) ! Vegetation type
REAL, INTENT(OUT) :: lai (nx,ny) ! Leaf Area Index
REAL, INTENT(OUT) :: roufns (nx,ny) ! Surface roughness
REAL, INTENT(OUT) :: veg (nx,ny) ! Vegetation fraction
REAL, INTENT(OUT) :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil temperature (K)
REAL, INTENT(OUT) :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil moisture (m**3/m**3)
REAL, INTENT(OUT) :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount
REAL, INTENT(OUT) :: snowdpth(nx,ny) ! Snow depth (m)
REAL, INTENT(OUT) :: raing(nx,ny) ! Grid supersaturation rain
REAL, INTENT(OUT) :: rainc(nx,ny) ! Cumulus convective rain
REAL, INTENT(OUT) :: prcrate(nx,ny,4) ! precipitation rate (kg/(m**2*s))
! prcrate(1,1,1) = total precip. rate
! prcrate(1,1,2) = grid scale precip. rate
! prcrate(1,1,3) = cumulus precip. rate
! prcrate(1,1,4) = microphysics precip. rate
REAL, INTENT(OUT) :: radfrc(nx,ny,nz) ! Radiation forcing (K/s)
REAL, INTENT(OUT) :: radsw (nx,ny) ! Solar radiation reaching the surface
REAL, INTENT(OUT) :: rnflx (nx,ny) ! Net radiation flux absorbed by surface
REAL, INTENT(OUT) :: radswnet(nx,ny) ! Net shortwave radiation
REAL, INTENT(OUT) :: radlwin(nx,ny) ! Incoming longwave radiation
REAL, INTENT(OUT) :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2))
REAL, INTENT(OUT) :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2))
REAL, INTENT(OUT) :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m**2*s))
REAL, INTENT(OUT) :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s))
REAL, INTENT(INOUT) :: tem1(nx,ny,nz) ! Temporary work array
INTEGER, INTENT(OUT) :: ireturn ! Return status indicator
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'indtflg.inc'
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
INCLUDE 'mp.inc' ! mpi parameters.
!
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k,is,n
INTEGER :: nxin,nyin,nzin,nzsoilin
INTEGER :: bgrdin,bbasin,bvarin,bicein,btkein,btrbin
INTEGER :: idummy,nstyps1
INTEGER :: nxlg, nylg
INTEGER, SAVE :: nstypsin
CHARACTER(LEN=20) :: varname
REAL, ALLOCATABLE :: invar1d (:) ! Used to extract data from NetCDF file
REAL, ALLOCATABLE :: invar3du(:,:,:) ! U, UBAR
REAL, ALLOCATABLE :: invar3dv(:,:,:) ! V, VBAR
REAL, ALLOCATABLE :: invar3dw(:,:,:) ! W, WBAR, ZP,
! ZPSOIL, stypfrct, wetcanp
! and other 2D/3D nostag data
REAL, ALLOCATABLE :: invar4d (:,:,:,:) ! tsoil, qsoil
INTEGER, ALLOCATABLE :: invar3di(:,:,:) ! soiltyp, vegtyp
REAL, ALLOCATABLE :: var3d (:,:,:) ! used to split those data
INTEGER, ALLOCATABLE :: var3di(:,:,:)
REAL, ALLOCATABLE :: var4d (:,:,:,:)
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code ... ...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
nxlg = (nx-3)*nproc_x + 3
nylg = (ny-3)*nproc_y + 3
!-----------------------------------------------------------------------
!
! Read dimensions and global attributes
!
!-----------------------------------------------------------------------
!
IF ( itime == 1 .AND. myproc == 0 ) THEN
CALL net_getdims
(netid,nxin,nyin,nzin,nzsoilin,nstypsin,ireturn)
!
! Data validation: dimensions
!
IF( nxin /= nxlg .OR. nyin /= nylg .OR. &
nzin /= nz .OR. nzsoil /= nzsoil) THEN
WRITE(6,'(1x,a)') &
' Dimensions in NETREAD inconsistent with data.'
WRITE(6,'(1x,a,3I15)') ' Read were: ', nxin, nyin, nzin, nzsoilin
WRITE(6,'(1x,a,3I15)') ' Expected: ', nxlg, nylg, nz, nzsoil
WRITE(6,'(1x,a)') ' Program aborted in NETREAD.'
CALL arpsstop
('arpstop called from binread nx-ny-nz read ',1)
END IF
IF (nstypsin > nstyps) THEN
WRITE(6,'(/1x,3(a,I4),a/)') 'WARNING: nstyps in the data file is ',&
nstypsin, ' which is larger than the decalared dimension ',&
nstyps,' only ',nstyps, ' soil types will be extracted.'
ELSE if (nstypsin < nstyps) THEN
WRITE(6,'(/1x,a,I4,a,a,I4,a/)') 'WARNING: only ',nstypsin, &
' soil types are available inside the data file.', &
' Because the decalared dimension is ',nstyps, &
' the extra soil types will be packed with zeros.'
END IF
IF (grdbas == 1) THEN
CALL net_getatts
(netid,runname,nocmnt,cmnt,dx,dy, &
year,month,day,hour,minute,second,thisdmp,tstop, &
mapproj,sclfct,trulat1,trulat2,trulon,latitud, &
ctrlat,ctrlon,xgrdorg,ygrdorg,umove,vmove, &
bgrdin,bbasin,bvarin,mstin,bicein,btrbin, &
idummy,idummy,landin,totin,btkein, &
prcin,radin,flxin,snowin,ireturn)
ELSE
CALL net_getatts
(netid,runname,nocmnt,cmnt,dx,dy, &
year,month,day,hour,minute,second,thisdmp,tstop, &
mapproj,sclfct,trulat1,trulat2,trulon,latitud, &
ctrlat,ctrlon,xgrdorg,ygrdorg,umove,vmove, &
grdin,basin,varin,mstin,icein,trbin, &
sfcin,rainin,landin,totin,tkein, &
prcin,radin,flxin,snowin,ireturn)
END IF
END IF
IF (itime == 1) THEN
CALL mpupdatec
(runname, 40)
CALL mpupdatei
(mstin,1)
CALL mpupdatei
(landin,1)
CALL mpupdatei
(totin,1)
CALL mpupdatei
(mapproj,1)
CALL mpupdatei
(month,1)
CALL mpupdatei
(day,1)
CALL mpupdatei
(year,1)
CALL mpupdatei
(hour,1)
CALL mpupdatei
(minute,1)
CALL mpupdatei
(second,1)
IF(grdbas == 1) THEN
CALL mpupdatei
(bgrdin,1)
CALL mpupdatei
(bbasin,1)
CALL mpupdatei
(bvarin,1)
CALL mpupdatei
(btrbin,1)
CALL mpupdatei
(btkein,1)
ELSE
CALL mpupdatei
(grdin,1)
CALL mpupdatei
(basin,1)
CALL mpupdatei
(varin,1)
CALL mpupdatei
(trbin,1)
CALL mpupdatei
(tkein,1)
CALL mpupdatei
(icein,1)
CALL mpupdatei
(sfcin,1)
CALL mpupdatei
(rainin,1)
END IF
CALL mpupdater
(umove,1)
CALL mpupdater
(vmove,1)
CALL mpupdater
(xgrdorg,1)
CALL mpupdater
(ygrdorg,1)
CALL mpupdater
(trulat1,1)
CALL mpupdater
(trulat2,1)
CALL mpupdater
(trulon,1)
CALL mpupdater
(sclfct,1)
CALL mpupdater
(tstop,1)
CALL mpupdater
(thisdmp,1)
CALL mpupdater
(latitud,1)
CALL mpupdater
(ctrlat,1)
CALL mpupdater
(ctrlon,1)
IF(totin /= 0) THEN
CALL mpupdatei
(prcin,1)
CALL mpupdatei
(radin,1)
CALL mpupdatei
(flxin,1)
CALL mpupdatei
(snowin,1)
END IF
CALL mpupdatei
(nstypsin,1)
END IF
nstyps1 = MAX(1, MIN(nstypsin,nstyps)) ! nstyps: Decalared dimension
! nstypsin: Dimension inside file
! nstyps1: Dimension to be extracted
snowcin = 0
ALLOCATE(invar1d (MAX(nxlg,nylg)), STAT = idummy)
CALL check_alloc_status
(idummy, "NETREADSPLIT:invar1d")
ALLOCATE(invar3du(nxlg,nylg-1,nz-1), STAT = idummy)
CALL check_alloc_status
(idummy, "NETREADSPLIT:invar3du")
ALLOCATE(invar3dv(nxlg-1,nylg,nz-1), STAT = idummy)
CALL check_alloc_status
(idummy, "NETREADSPLIT:invar3dv")
ALLOCATE(invar3dw(nxlg-1,nylg-1,MAX(nz,nzsoil,nstypsin+1)), STAT = idummy)
CALL check_alloc_status
(idummy, "NETREADSPLIT:invar3dw")
ALLOCATE(invar4d (nxlg-1,nylg-1,nzsoil,nstypsin+1), STAT = idummy)
CALL check_alloc_status
(idummy, "NETREADSPLIT:invar4d")
ALLOCATE(invar3di(nxlg-1,nylg-1,nstypsin), STAT = idummy)
CALL check_alloc_status
(idummy, "NETREADSPLIT:invar3di")
ALLOCATE(var3d (nxlg,nylg,MAX(nz,nzsoil,nstyps1+1)), STAT = idummy)
CALL check_alloc_status
(idummy, "NETREADSPLIT:var3d")
ALLOCATE(var3di(nxlg,nylg,nstyps1), STAT = idummy)
CALL check_alloc_status
(idummy, "NETREADSPLIT:var3di")
ALLOCATE(var4d(nxlg,nylg,nzsoil,nstyps1+1), STAT = idummy)
CALL check_alloc_status
(idummy, "NETREADSPLIT:var4d")
!
!-----------------------------------------------------------------------
!
! Readin current valid time
!
!-----------------------------------------------------------------------
IF ( grdbas /= 1 ) THEN
IF (myproc == 0 ) THEN
CALL netreadTime
(netid,itime,'Time',time)
WRITE(6,'(1x,/,a,f8.1,a,f8.3,a/)') 'To read data for time:', &
time,' secs = ',(time/60.),' mins.'
END IF
CALL mpupdater
(time,1)
ELSE
IF (myproc == 0) &
WRITE(6,'(1x,/,a,/)') 'To read grid and base state data.'
END IF
!
!-----------------------------------------------------------------------
!
! Read in x, y, z and zp arrays.
!
!----------------------------------------------------------------------
!
IF( itime == 1 .AND. (grdin == 1 .OR. grdbas == 1) ) THEN
IF ( myproc == 0 ) THEN
CALL netread1d
(netid,packed,0,'x_stag',nxlg,invar1d)
END IF
CALL mpisplit1dx
(invar1d,nx,x)
IF ( myproc == 0 ) THEN
CALL netread1d
(netid,packed,0,'y_stag',nylg,invar1d)
END IF
CALL mpisplit1dy
(invar1d,ny,y)
IF ( myproc == 0 ) THEN
CALL netread1d
(netid,packed,0,'z_stag',nz,z)
END IF
CALL mpupdater
(z,nz)
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,0,'ZP',nxlg-1,nylg-1,nz,invar3dw)
DO k = 1,nz
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,zp)
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,0,'ZPSOIL',nxlg-1,nylg-1,nzsoil,invar3dw)
DO k = 1,nzsoil
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nzsoil,1,nzsoil)
END IF
CALL mpisplit3d
(var3d,nx,ny,nzsoil,zpsoil)
END IF
!
!-----------------------------------------------------------------------
!
! Read in base state fields
!
!----------------------------------------------------------------------
!
IF(itime == 1 .AND. (basin == 1 .OR. grdbas == 1) ) THEN
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,0,'UBAR',nxlg,nylg-1,nz-1,invar3du)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg
var3d(i,j,k) = invar3du(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,ubar)
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,0,'VBAR',nxlg-1,nylg,nz-1,invar3dv)
DO k = 1,nz-1
DO j = 1,nylg
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dv(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,vbar)
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,0,'WBAR',nxlg-1,nylg-1,nz,invar3dw)
DO k = 1,nz
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,wbar)
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,0,'PTBAR',nxlg-1,nylg-1,nz-1,invar3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,ptbar)
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,0,'PBAR',nxlg-1,nylg-1,nz-1,invar3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,pbar)
IF (mstin == 1) THEN
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,0,'QVBAR',nxlg-1,nylg-1,nz-1,invar3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,qvbar)
END IF
IF (landin == 1) THEN
IF ( myproc == 0 ) THEN
CALL netread3di
(netid,packed,0,'SOILTYP',nxlg-1,nylg-1,nstypsin,invar3di)
DO is = 1,nstyps1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3di(i,j,is) = invar3di(i,j,is)
END DO
END DO
END DO
CALL iedgfill
(var3di,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nstyps1,1,nstyps1)
END IF
CALL mpisplit3di
(invar3di,nx,ny,nstyps1,soiltyp)
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,0,'STYPFRCT',nxlg-1,nylg-1,nstypsin,invar3dw)
DO is = 1,nstyps1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,is) = invar3dw(i,j,is)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nstyps1,1,nstyps1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nstyps1,stypfrct)
CALL fix_stypfrct_nstyp
(nx,ny,nstyps1,nstyps,stypfrct)
IF ( myproc == 0 ) THEN
CALL netread2di
(netid,packed,0,'VEGTYP',nxlg-1,nylg-1,invar3di)
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3di(i,j,1) = invar3di(i,j,1)
END DO
END DO
CALL iedgfill
(var3di,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,1,1,1)
END IF
CALL mpisplit2di
(var3di,nx,ny,vegtyp)
IF ( myproc == 0 ) THEN
CALL netread2d
(netid,packed,0,'LAI',nxlg-1,nylg-1,invar3dw)
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,1) = invar3dw(i,j,1)
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,1,1,1)
END IF
CALL mpisplit2d
(var3d,nx,ny,lai)
IF ( myproc == 0 ) THEN
CALL netread2d
(netid,packed,0,'ROUFNS',nxlg-1,nylg-1,invar3dw)
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,1) = invar3dw(i,j,1)
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,1,1,1)
END IF
CALL mpisplit2d
(var3d,nx,ny,roufns)
IF ( myproc == 0 ) THEN
CALL netread2d
(netid,packed,0,'VEG',nxlg-1,nylg-1,invar3dw)
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,1) = invar3dw(i,j,1)
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,1,1,1)
END IF
CALL mpisplit2d
(var3d,nx,ny,veg)
END IF
END IF
IF ( grdbas == 1 ) GOTO 4444
IF (varin == 1) THEN
IF (totin == 0) THEN
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'UPRT',nxlg,nylg-1,nz-1,invar3du)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg
var3d(i,j,k) = invar3du(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,uprt)
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'VPRT',nxlg-1,nylg,nz-1,invar3dv)
DO k = 1,nz-1
DO j = 1,nylg
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dv(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,vprt)
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'WPRT',nxlg-1,nylg-1,nz,invar3dw)
DO k = 1,nz
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,wprt)
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'PTPRT',nxlg-1,nylg-1,nz-1,invar3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,ptprt)
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'PPRT',nxlg-1,nylg-1,nz-1,invar3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,pprt)
ELSE
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'U',nxlg,nylg-1,nz-1,invar3du)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg
var3d(i,j,k) = invar3du(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,uprt)
DO k = 1,nz
DO j = 1,ny
DO i = 1,nx
uprt(i,j,k) = uprt(i,j,k) - ubar(i,j,k)
END DO
END DO
END DO
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'V',nxlg-1,nylg,nz-1,invar3dv)
DO k = 1,nz-1
DO j = 1,nylg
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dv(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,vprt)
DO k = 1,nz
DO j = 1,ny
DO i = 1,nx
vprt(i,j,k) = vprt(i,j,k) - vbar(i,j,k)
END DO
END DO
END DO
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'W',nxlg-1,nylg-1,nz,invar3dw)
DO k = 1,nz
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,wprt)
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'PT',nxlg-1,nylg-1,nz-1,invar3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,ptprt)
ptprt(:,:,:) = ptprt(:,:,:) - ptbar(:,:,:)
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'P',nxlg-1,nylg-1,nz-1,invar3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,pprt)
pprt(:,:,:) = pprt(:,:,:) - pbar(:,:,:)
END IF
END IF ! varin
IF (mstin == 1) THEN
IF (totin == 0) THEN
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'QVPRT',nxlg-1,nylg-1,nz-1,invar3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,qvprt)
ELSE
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'QV',nxlg-1,nylg-1,nz-1,invar3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,qvprt)
qvprt(:,:,:) = qvprt(:,:,:) - qvbar(:,:,:)
END IF
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'QC',nxlg-1,nylg-1,nz-1,invar3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,qc)
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'QR',nxlg-1,nylg-1,nz-1,invar3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,qr)
IF( rainin == 1 ) THEN
IF ( myproc == 0 ) THEN
CALL netread2d
(netid,packed,itime,'RAING',nxlg-1,nylg-1,invar3dw)
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,1) = invar3dw(i,j,1)
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,1,1,1)
END IF
CALL mpisplit2d
(var3d,nx,ny,raing)
IF ( myproc == 0 ) THEN
CALL netread2d
(netid,packed,itime,'RAINC',nxlg-1,nylg-1,invar3dw)
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,1) = invar3dw(i,j,1)
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,1,1,1)
END IF
CALL mpisplit2d
(var3d,nx,ny,rainc)
END IF
IF (prcin == 1) THEN
DO n = 1,4
WRITE(varname,'(a,I1)') 'PRCRATE',n
IF ( myproc == 0 ) THEN
CALL netread2d
(netid,packed,itime,varname,nxlg-1,nylg-1,invar3dw)
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,1) = invar3dw(i,j,1)
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,1,1,1)
END IF
CALL mpisplit2d
(var3d,nx,ny,prcrate(:,:,n))
END DO
END IF
IF(icein == 1) THEN
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'QI',nxlg-1,nylg-1,nz-1,invar3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,qi)
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'QS',nxlg-1,nylg-1,nz-1,invar3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,qs)
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'QH',nxlg-1,nylg-1,nz-1,invar3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,qh)
END IF
END IF
IF( tkein == 1 ) THEN
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'TKE',nxlg-1,nylg-1,nz-1,invar3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,tke)
END IF
IF( trbin == 1 ) THEN
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'KMH',nxlg-1,nylg-1,nz-1,invar3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,kmh)
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'KMV',nxlg-1,nylg-1,nz-1,invar3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,kmv)
END IF
IF (sfcin == 1) THEN
!
! NOTE: Soil type dimensions
! nstyps: Required in this run
! nstypsin: soil types inside the data file
! nstyps1: = MIN(nstypsin, nstyps), soil types to be extracted
!
IF ( myproc == 0 ) THEN
CALL netread4d
(netid,packed,itime,'TSOIL',nxlg-1,nylg-1,nzsoil,nstypsin+1,invar4d)
DO is = 1, nstyps1+1
DO k = 1,nzsoil
DO j = 1,nylg-1
DO i = 1,nxlg-1
var4d(i,j,k,is) = invar4d(i,j,k,is)
END DO
END DO
END DO
CALL edgfill
(var4d(:,:,:,is),1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nzsoil,1,nzsoil)
END DO
END IF
CALL mpisplit4d
(var4d,nx,ny,nzsoil,nstyps1+1,tsoil)
IF ( myproc == 0 ) THEN
CALL netread4d
(netid,packed,itime,'QSOIL',nxlg-1,nylg-1,nzsoil,nstypsin+1,invar4d)
DO is = 1, nstyps1+1
DO k = 1,nzsoil
DO j = 1,nylg-1
DO i = 1,nxlg-1
var4d(i,j,k,is) = invar4d(i,j,k,is)
END DO
END DO
END DO
CALL edgfill
(var4d(:,:,:,is),1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nzsoil,1,nzsoil)
END DO
END IF
CALL mpisplit4d
(var4d,nx,ny,nzsoil,nstyps1+1,qsoil)
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'WETCANP',nxlg-1,nylg-1,nstypsin+1,invar3dw)
DO is = 1, nstyps1+1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,is) = invar3dw(i,j,is)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nstyps1+1,1,nstyps1+1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nstyps1+1,wetcanp)
CALL fix_soil_nstyp
(nx,ny,nzsoil,nstyps1,nstyps,tsoil,qsoil,wetcanp)
IF (snowin == 1) THEN
IF ( myproc == 0 ) THEN
CALL netread2d
(netid,packed,itime,'SNOWDPTH',nxlg-1,nylg-1,invar3dw)
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,1) = invar3dw(i,j,1)
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,1,1,1)
END IF
CALL mpisplit2d
(var3d,nx,ny,snowdpth)
END IF
END IF
IF (radin == 1) THEN
IF ( myproc == 0 ) THEN
CALL netread3d
(netid,packed,itime,'RADFRC',nxlg-1,nylg-1,nz-1,invar3dw)
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,k) = invar3dw(i,j,k)
END DO
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,nz,1,nz-1)
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,radfrc)
IF ( myproc == 0 ) THEN
CALL netread2d
(netid,packed,itime,'RADSW',nxlg-1,nylg-1,invar3dw)
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,1) = invar3dw(i,j,1)
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,1,1,1)
END IF
CALL mpisplit2d
(var3d,nx,ny,radsw)
IF ( myproc == 0 ) THEN
CALL netread2d
(netid,packed,itime,'RNFLX',nxlg-1,nylg-1,invar3dw)
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,1) = invar3dw(i,j,1)
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,1,1,1)
END IF
CALL mpisplit2d
(var3d,nx,ny,rnflx)
IF ( myproc == 0 ) THEN
CALL netread2d
(netid,packed,itime,'RADSWNET',nxlg-1,nylg-1,invar3dw)
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,1) = invar3dw(i,j,1)
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,1,1,1)
END IF
CALL mpisplit2d
(var3d,nx,ny,radswnet)
IF ( myproc == 0 ) THEN
CALL netread2d
(netid,packed,itime,'RADLWIN',nxlg-1,nylg-1,invar3dw)
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,1) = invar3dw(i,j,1)
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,1,1,1)
END IF
CALL mpisplit2d
(var3d,nx,ny,radlwin)
END IF
IF (flxin == 1) THEN
IF ( myproc == 0 ) THEN
CALL netread2d
(netid,packed,itime,'USFLX',nxlg-1,nylg-1,invar3dw)
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,1) = invar3dw(i,j,1)
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,1,1,1)
END IF
CALL mpisplit2d
(var3d,nx,ny,usflx)
IF ( myproc == 0 ) THEN
CALL netread2d
(netid,packed,itime,'VSFLX',nxlg-1,nylg-1,invar3dw)
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,1) = invar3dw(i,j,1)
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,1,1,1)
END IF
CALL mpisplit2d
(var3d,nx,ny,vsflx)
IF ( myproc == 0 ) THEN
CALL netread2d
(netid,packed,itime,'PTSFLX',nxlg-1,nylg-1,invar3dw)
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,1) = invar3dw(i,j,1)
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,1,1,1)
END IF
CALL mpisplit2d
(var3d,nx,ny,ptsflx)
IF ( myproc == 0 ) THEN
CALL netread2d
(netid,packed,itime,'QVSFLX',nxlg-1,nylg-1,invar3dw)
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3d(i,j,1) = invar3dw(i,j,1)
END DO
END DO
CALL edgfill
(var3d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,1,1,1)
END IF
CALL mpisplit2d
(var3d,nx,ny,qvsflx)
END IF
!-----------------------------------------------------------------------
!
! Clear memory and return
!
!-----------------------------------------------------------------------
4444 CONTINUE
DEALLOCATE(invar1d)
DEALLOCATE(invar3du, invar3dv, invar3dw, invar4d)
DEALLOCATE(var3di,invar3di)
DEALLOCATE(var3d, var4d)
RETURN
END SUBROUTINE netreadsplit
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE NETDUMP ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE netdump(netid,itime,packed,nx,ny,nz,nzsoil,nstyps,grdbas, & 2,59
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
kmh,kmv,ubar,vbar,ptbar,pbar,rhobar,qvbar, &
x,y,z,zp,zpsoil,raing,rainc,prcrate, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsoil,qsoil,wetcanp,snowdpth, &
radfrc,radsw,rnflx,radswnet,radlwin, &
usflx,vsflx,ptsflx,qvsflx, &
var3du,var3dv,var3dt)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Write ARPS history file using NetCDF 3.0 API.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yunheng Wang
! 2004/08/02
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: netid
INTEGER, INTENT(IN) :: itime ! Time level, default 1.
INTEGER, INTENT(IN) :: packed ! No pack implemented still, 0
INTEGER, INTENT(IN) :: nx,ny,nz,nzsoil,nstyps
INTEGER, INTENT(IN) :: grdbas ! If this is a grid/base state array dump
REAL, INTENT(IN) :: u (nx,ny,nz) ! Total u-velocity (m/s)
REAL, INTENT(IN) :: v (nx,ny,nz) ! Total v-velocity (m/s)
REAL, INTENT(IN) :: w (nx,ny,nz) ! Total w-velocity (m/s)
REAL, INTENT(IN) :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K)
REAL, INTENT(IN) :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal)
REAL, INTENT(IN) :: qv (nx,ny,nz) ! Water vapor specific humidity (kg/kg)
REAL, INTENT(IN) :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg)
REAL, INTENT(IN) :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg)
REAL, INTENT(IN) :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg)
REAL, INTENT(IN) :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg)
REAL, INTENT(IN) :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg)
REAL, INTENT(IN) :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2)
REAL, INTENT(IN) :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for
! momentum. ( m**2/s )
REAL, INTENT(IN) :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for
! momentum. ( m**2/s )
REAL, INTENT(IN) :: ubar (nx,ny,nz) ! Base state x-velocity (m/s)
REAL, INTENT(IN) :: vbar (nx,ny,nz) ! Base state y-velocity (m/s)
REAL, INTENT(IN) :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL, INTENT(IN) :: pbar (nx,ny,nz) ! Base state pressure (Pascal)
REAL, INTENT(IN) :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3)
REAL, INTENT(IN) :: qvbar (nx,ny,nz) ! Base state water vapor specific humidity
! (kg/kg)
REAL, INTENT(IN) :: x (nx) ! The x-coord. of the physical and
! computational grid. Defined at u-point.
REAL, INTENT(IN) :: y (ny) ! The y-coord. of the physical and
! computational grid. Defined at v-point.
REAL, INTENT(IN) :: z (nz) ! The z-coord. of the computational grid.
! Defined at w-point on the staggered grid.
REAL, INTENT(IN) :: zp (nx,ny,nz) ! The physical height coordinate defined at
! w-point of the staggered grid.
REAL, INTENT(IN) :: zpsoil (nx,ny,nzsoil)! The physical height coordinate defined at
! w-point of the soil.
REAL, INTENT(IN) :: raing(nx,ny) ! Grid supersaturation rain
REAL, INTENT(IN) :: rainc(nx,ny) ! Cumulus convective rain
REAL, INTENT(IN) :: 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
INTEGER, INTENT(IN) :: soiltyp(nx,ny,nstyps) ! Soil type
REAL, INTENT(IN) :: stypfrct(nx,ny,nstyps) ! Soil type fractions
INTEGER, INTENT(IN) :: vegtyp (nx,ny) ! Vegetation type
REAL, INTENT(IN) :: lai (nx,ny) ! Leaf Area Index
REAL, INTENT(IN) :: roufns (nx,ny) ! Surface roughness
REAL, INTENT(IN) :: veg (nx,ny) ! Vegetation fraction
REAL, INTENT(IN) :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil temperature (K)
REAL, INTENT(IN) :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil moisture (m**3/m**3)
REAL, INTENT(IN) :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount
REAL, INTENT(IN) :: snowdpth(nx,ny) ! Snow depth (m)
REAL, INTENT(IN) :: radfrc(nx,ny,nz) ! Radiation forcing (K/s)
REAL, INTENT(IN) :: radsw (nx,ny) ! Solar radiation reaching the surface
REAL, INTENT(IN) :: rnflx (nx,ny) ! Net radiation flux absorbed by surface
REAL, INTENT(IN) :: radswnet(nx,ny) ! Net shortwave radiation
REAL, INTENT(IN) :: radlwin(nx,ny) ! Incominging longwave radiation
REAL, INTENT(IN) :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2))
REAL, INTENT(IN) :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2))
REAL, INTENT(IN) :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m*s**2))
REAL, INTENT(IN) :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s))
REAL, INTENT(INOUT) :: var3du(nx, ny-1,nz-1) ! Temporary work array
REAL, INTENT(INOUT) :: var3dv(nx-1,ny, nz-1) ! Temporary work array
REAL, INTENT(INOUT) :: var3dt(nx-1,ny-1,nz-1) ! Temporary work array
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid parameters
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Local working arrays
!
!-----------------------------------------------------------------------
REAL, ALLOCATABLE :: var2d (:,:)
REAL, ALLOCATABLE :: var3dw(:,:,:)
INTEGER, ALLOCATABLE :: var2di(:,:)
INTEGER, ALLOCATABLE :: var3di(:,:,:)
REAL, ALLOCATABLE :: var4d (:,:,:,:)
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
CHARACTER(LEN=10), PARAMETER :: tmunit = 'seconds '
INTEGER :: zdim
INTEGER :: i,j,k,is
INTEGER :: istatus
INTEGER :: nxlg, nylg
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code ... ...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IF (mp_opt /= 1) joindmp = 0 ! Non-mpi run
zdim = MAX(nz,nzsoil,nstyps+1,4)
ALLOCATE(var2d (nx-1,ny-1), STAT = istatus)
ALLOCATE(var2di(nx-1,ny-1), STAT = istatus)
ALLOCATE(var3dw(nx-1,ny-1,zdim), STAT = istatus)
ALLOCATE(var3di(nx-1,ny-1,nstyps), STAT = istatus)
ALLOCATE(var4d (nx-1,ny-1,nzsoil,nstyps+1), STAT = istatus)
!-----------------------------------------------------------------------
!
! Define dimension, write global attribute and define variables,
! Only needed for the first time level
!
!-----------------------------------------------------------------------
IF (myproc == 0) WRITE(6,'(/1x,a/)') &
'Defining NetCDF dimensions, global attribute and variables. '
IF( itime == 1 ) THEN
!-----------------------------------------------------------------------
!
! Define ARPS dimension and variables
!
!-----------------------------------------------------------------------
nxlg = (nx-3)*nproc_x + 3
nylg = (ny-3)*nproc_y + 3
CALL net_define_dimension
(netid,grdbas,nx,ny,nz,nzsoil,nstyps)
CALL net_define_variables
(netid,packed,grdbas,tmunit,nxlg,nylg,istatus)
! nx, ny used only in netwrt_general_att
END IF
!-----------------------------------------------------------------------
!
! Beginning of writing variables
!
!-----------------------------------------------------------------------
IF (grdbas == 1) THEN
IF(myproc ==0) WRITE(6,'(1x,/,a/)') &
'Writing history grid & base data.'
ELSE
IF(myproc ==0) WRITE(6,'(1x,/,a,f13.3/)') &
'Writing history data at time=', curtim
END IF
!
! Grid variables
!
IF (itime < 2 .AND. (grdout == 1 .OR. grdbas == 1) ) THEN
CALL netwrt1d
(netid,packed,0,'x_stag',x,nx)
CALL netwrt1d
(netid,packed,0,'y_stag',y,ny)
CALL netwrt1d
(netid,packed,0,'z_stag',z,nz)
DO k = 1,nz
DO j = 1,ny-1
DO i = 1,nx-1
var3dw(i,j,k) = zp(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,0,'ZP',var3dw,nx-1,ny-1,nz)
DO k = 1,nzsoil
DO j = 1,ny-1
DO i = 1,nx-1
var3dw(i,j,k) = zpsoil(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,0,'ZPSOIL',var3dw,nx-1,ny-1,nzsoil)
END IF
!
! Base state variables
!
IF(itime < 2 .AND. (basout == 1 .OR. grdbas == 1) ) THEN
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1, nx
var3du(i,j,k) = ubar(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,0,'UBAR',var3du,nx,ny-1,nz-1)
DO k = 1,nz-1
DO j = 1,ny
DO i = 1,nx-1
var3dv(i,j,k) = vbar(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,0,'VBAR',var3dv,nx-1,ny,nz-1)
var3dw(:,:,:) = 0.0
CALL netwrt3d
(netid,packed,0,'WBAR',var3dw,nx-1,ny-1,nz)
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dt(i,j,k) = ptbar(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,0,'PTBAR',var3dt,nx-1,ny-1,nz-1)
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dt(i,j,k) = pbar(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,0,'PBAR',var3dt,nx-1,ny-1,nz-1)
IF (mstout == 1) THEN
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dt(i,j,k) = qvbar(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,0,'QVBAR',var3dt,nx-1,ny-1,nz-1)
END IF
IF (landout == 1) THEN
DO k = 1,nstyps
DO j = 1,ny-1
DO i = 1,nx-1
var3di(i,j,k) = soiltyp(i,j,k)
END DO
END DO
END DO
CALL netwrt3di
(netid,packed,0,'SOILTYP',var3di,nx-1,ny-1,nstyps)
DO k = 1,nstyps
DO j = 1,ny-1
DO i = 1,nx-1
var3dw(i,j,k) = stypfrct(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,0,'STYPFRCT',var3dw,nx-1,ny-1,nstyps)
DO j = 1,ny-1
DO i = 1,nx-1
var2di(i,j) = vegtyp(i,j)
END DO
END DO
CALL netwrt2di
(netid,packed,0,'VEGTYP',var2di,nx-1,ny-1)
DO j = 1,ny-1
DO i = 1,nx-1
var2d(i,j) = lai(i,j)
END DO
END DO
CALL netwrt2d
(netid,packed,0,'LAI',var2d,nx-1,ny-1)
DO j = 1,ny-1
DO i = 1,nx-1
var2d(i,j) = roufns(i,j)
END DO
END DO
CALL netwrt2d
(netid,packed,0,'ROUFNS',var2d,nx-1,ny-1)
DO j = 1,ny-1
DO i = 1,nx-1
var2d(i,j) = veg(i,j)
END DO
END DO
CALL netwrt2d
(netid,packed,0,'VEG',var2d,nx-1,ny-1)
END IF
END IF
IF ( grdbas == 1 ) GOTO 3333
CALL netwrtTime
(netid,itime,'Time',curtim)
IF (varout == 1) THEN
IF (totout == 0) THEN
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx
var3du(i,j,k)=u(i,j,k)-ubar(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'UPRT',var3du,nx,ny-1,nz-1)
DO k=1,nz-1
DO j=1,ny
DO i=1,nx-1
var3dv(i,j,k)=v(i,j,k)-vbar(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'VPRT',var3dv,nx-1,ny,nz-1)
DO k = 1,nz
DO j = 1,ny-1
DO i = 1,nx-1
var3dw(i,j,k) = w(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'WPRT',var3dw,nx-1,ny-1,nz)
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dt(i,j,k) = ptprt(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'PTPRT',var3dt,nx-1,ny-1,nz-1)
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dt(i,j,k) = pprt(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'PPRT',var3dt,nx-1,ny-1,nz-1)
ELSE
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx
var3du(i,j,k) = u(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'U',var3du,nx,ny-1,nz-1)
DO k = 1,nz-1
DO j = 1,ny
DO i = 1,nx-1
var3dv(i,j,k) = v(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'V',var3dv,nx-1,ny,nz-1)
DO k = 1,nz
DO j = 1,ny-1
DO i = 1,nx-1
var3dw(i,j,k) = w(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'W',var3dw,nx-1,ny-1,nz)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
var3dt(i,j,k) = ptbar(i,j,k) + ptprt(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'PT',var3dt,nx-1,ny-1,nz-1)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
var3dt(i,j,k) = pbar(i,j,k) + pprt(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'P',var3dt,nx-1,ny-1,nz-1)
END IF ! totout
END IF ! varout
IF (mstout == 1) THEN
IF (totout == 0) THEN
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
var3dt(i,j,k)=qv(i,j,k)-qvbar(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'QVPRT',var3dt,nx-1,ny-1,nz-1)
ELSE
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dt(i,j,k) = qv(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'QV',var3dt,nx-1,ny-1,nz-1)
END IF
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dt(i,j,k) = qc(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'QC',var3dt,nx-1,ny-1,nz-1)
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dt(i,j,k) = qr(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'QR',var3dt,nx-1,ny-1,nz-1)
IF (rainout == 1) THEN
DO j = 1,ny-1
DO i = 1,nx-1
var2d(i,j) = raing(i,j)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'RAING',var2d,nx-1,ny-1)
DO j = 1,ny-1
DO i = 1,nx-1
var2d(i,j) = rainc(i,j)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'RAINC',var2d,nx-1,ny-1)
END IF
IF (prcout == 1) THEN
DO k = 1,4
DO j = 1,ny-1
DO i = 1,nx-1
var3dw(i,j,k) = prcrate(i,j,k)
END DO
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'PRCRATE1',var3dw(:,:,1),nx-1,ny-1)
CALL netwrt2d
(netid,packed,itime,'PRCRATE2',var3dw(:,:,2),nx-1,ny-1)
CALL netwrt2d
(netid,packed,itime,'PRCRATE3',var3dw(:,:,3),nx-1,ny-1)
CALL netwrt2d
(netid,packed,itime,'PRCRATE4',var3dw(:,:,4),nx-1,ny-1)
END IF
IF (iceout == 1) THEN
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dt(i,j,k) = qi(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'QI',var3dt,nx-1,ny-1,nz-1)
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dt(i,j,k) = qs(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'QS',var3dt,nx-1,ny-1,nz-1)
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dt(i,j,k) = qh(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'QH',var3dt,nx-1,ny-1,nz-1)
END IF
END IF ! mstout == 1
IF (tkeout == 1) THEN
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dt(i,j,k) = tke(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'TKE',var3dt,nx-1,ny-1,nz-1)
END IF
IF (trbout == 1) THEN
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dt(i,j,k) = kmh(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'KMH',var3dt,nx-1,ny-1,nz-1)
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dt(i,j,k) = kmv(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'KMV',var3dt,nx-1,ny-1,nz-1)
END IF ! trbout
IF (sfcout == 1) THEN
DO is = 0,nstyps
DO k = 1,nzsoil
DO j = 1,ny-1
DO i = 1,nx-1
var4d(i,j,k,is+1) = tsoil(i,j,k,is)
END DO
END DO
END DO
END DO
CALL netwrt4d
(netid,packed,itime,'TSOIL',var4d,nx-1,ny-1,nzsoil,nstyps+1)
DO is = 0,nstyps
DO k = 1,nzsoil
DO j = 1,ny-1
DO i = 1,nx-1
var4d(i,j,k,is+1) = qsoil(i,j,k,is)
END DO
END DO
END DO
END DO
CALL netwrt4d
(netid,packed,itime,'QSOIL',var4d,nx-1,ny-1,nzsoil,nstyps+1)
DO is = 0,nstyps
DO j = 1,ny-1
DO i = 1,nx-1
var3dw(i,j,is+1) = wetcanp(i,j,is)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'WETCANP',var3dw,nx-1,ny-1,nstyps+1)
IF (snowout == 1) THEN
DO j = 1,ny-1
DO i = 1,nx-1
var2d(i,j) = snowdpth(i,j)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'SNOWDPTH',var2d,nx-1,ny-1)
END IF
END IF ! sfcout
IF (radout == 1) THEN
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
var3dt(i,j,k) = radfrc(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'RADFRC',var3dt,nx-1,ny-1,nz-1)
DO j = 1,ny-1
DO i = 1,nx-1
var2d(i,j) = radsw(i,j)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'RADSW',var2d,nx-1,ny-1)
DO j = 1,ny-1
DO i = 1,nx-1
var2d(i,j) = rnflx(i,j)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'RNFLX',var2d,nx-1,ny-1)
DO j = 1,ny-1
DO i = 1,nx-1
var2d(i,j) = radswnet(i,j)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'RADSWNET',var2d,nx-1,ny-1)
DO j = 1,ny-1
DO i = 1,nx-1
var2d(i,j) = radlwin(i,j)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'RADLWIN',var2d,nx-1,ny-1)
END IF
IF (flxout == 1) THEN
DO j = 1,ny-1
DO i = 1,nx-1
var2d(i,j) = usflx(i,j)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'USFLX',var2d,nx-1,ny-1)
DO j = 1,ny-1
DO i = 1,nx-1
var2d(i,j) = vsflx(i,j)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'VSFLX',var2d,nx-1,ny-1)
DO j = 1,ny-1
DO i = 1,nx-1
var2d(i,j) = ptsflx(i,j)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'PTSFLX',var2d,nx-1,ny-1)
DO j = 1,ny-1
DO i = 1,nx-1
var2d(i,j) = qvsflx(i,j)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'QVSFLX',var2d,nx-1,ny-1)
END IF
3333 CONTINUE
DEALLOCATE(var2d, var2di)
DEALLOCATE(var3dw,var3di)
DEALLOCATE(var4d)
RETURN
END SUBROUTINE netdump
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE NETJOINDUMP ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE netjoindump(netid,itime,packed,nx,ny,nz,nzsoil,nstyps,grdbas, & 2,110
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
kmh,kmv,ubar,vbar,ptbar,pbar,rhobar,qvbar, &
x,y,z,zp,zpsoil,raing,rainc,prcrate, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsoil,qsoil,wetcanp,snowdpth, &
radfrc,radsw,rnflx,radswnet,radlwin, &
usflx,vsflx,ptsflx,qvsflx, &
tem1,tem2,tem3)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Write ARPS history file using NetCDF 3.0 API.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yunheng Wang
! 2004/08/02
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: netid
INTEGER, INTENT(IN) :: itime ! Time level, default 1.
INTEGER, INTENT(IN) :: packed ! No pack implemented still, 0
INTEGER, INTENT(IN) :: nx,ny,nz,nzsoil,nstyps
INTEGER, INTENT(IN) :: grdbas ! If this is a grid/base state array dump
REAL, INTENT(IN) :: u (nx,ny,nz) ! Total u-velocity (m/s)
REAL, INTENT(IN) :: v (nx,ny,nz) ! Total v-velocity (m/s)
REAL, INTENT(IN) :: w (nx,ny,nz) ! Total w-velocity (m/s)
REAL, INTENT(IN) :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K)
REAL, INTENT(IN) :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal)
REAL, INTENT(IN) :: qv (nx,ny,nz) ! Water vapor specific humidity (kg/kg)
REAL, INTENT(IN) :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg)
REAL, INTENT(IN) :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg)
REAL, INTENT(IN) :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg)
REAL, INTENT(IN) :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg)
REAL, INTENT(IN) :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg)
REAL, INTENT(IN) :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2)
REAL, INTENT(IN) :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for
! momentum. ( m**2/s )
REAL, INTENT(IN) :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for
! momentum. ( m**2/s )
REAL, INTENT(IN) :: ubar (nx,ny,nz) ! Base state x-velocity (m/s)
REAL, INTENT(IN) :: vbar (nx,ny,nz) ! Base state y-velocity (m/s)
REAL, INTENT(IN) :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL, INTENT(IN) :: pbar (nx,ny,nz) ! Base state pressure (Pascal)
REAL, INTENT(IN) :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3)
REAL, INTENT(IN) :: qvbar (nx,ny,nz) ! Base state water vapor specific humidity
! (kg/kg)
REAL, INTENT(IN) :: x (nx) ! The x-coord. of the physical and
! computational grid. Defined at u-point.
REAL, INTENT(IN) :: y (ny) ! The y-coord. of the physical and
! computational grid. Defined at v-point.
REAL, INTENT(IN) :: z (nz) ! The z-coord. of the computational grid.
! Defined at w-point on the staggered grid.
REAL, INTENT(IN) :: zp (nx,ny,nz) ! The physical height coordinate defined at
! w-point of the staggered grid.
REAL, INTENT(IN) :: zpsoil (nx,ny,nzsoil)! The physical height coordinate defined at
! w-point of the soil.
REAL, INTENT(IN) :: raing(nx,ny) ! Grid supersaturation rain
REAL, INTENT(IN) :: rainc(nx,ny) ! Cumulus convective rain
REAL, INTENT(IN) :: 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
INTEGER, INTENT(IN) :: soiltyp(nx,ny,nstyps) ! Soil type
REAL, INTENT(IN) :: stypfrct(nx,ny,nstyps) ! Soil type fractions
INTEGER, INTENT(IN) :: vegtyp (nx,ny) ! Vegetation type
REAL, INTENT(IN) :: lai (nx,ny) ! Leaf Area Index
REAL, INTENT(IN) :: roufns (nx,ny) ! Surface roughness
REAL, INTENT(IN) :: veg (nx,ny) ! Vegetation fraction
REAL, INTENT(IN) :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil temperature (K)
REAL, INTENT(IN) :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil moisture (m**3/m**3)
REAL, INTENT(IN) :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount
REAL, INTENT(IN) :: snowdpth(nx,ny) ! Snow depth (m)
REAL, INTENT(IN) :: radfrc(nx,ny,nz) ! Radiation forcing (K/s)
REAL, INTENT(IN) :: radsw (nx,ny) ! Solar radiation reaching the surface
REAL, INTENT(IN) :: rnflx (nx,ny) ! Net radiation flux absorbed by surface
REAL, INTENT(IN) :: radswnet(nx,ny) ! Net shortwave radiation
REAL, INTENT(IN) :: radlwin(nx,ny) ! Incominging longwave radiation
REAL, INTENT(IN) :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2))
REAL, INTENT(IN) :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2))
REAL, INTENT(IN) :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m*s**2))
REAL, INTENT(IN) :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s))
REAL, INTENT(INOUT) :: tem1 (nx,ny,nz) ! Temporary work array
REAL, INTENT(INOUT) :: tem2 (nx,ny,nz) ! Temporary work array
REAL, INTENT(INOUT) :: tem3 (nx,ny,nz) ! Temporary work array
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid parameters
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Local working arrays
!
!-----------------------------------------------------------------------
REAL, ALLOCATABLE :: out1d(:)
REAL, ALLOCATABLE :: out3d(:,:,:)
REAL, ALLOCATABLE :: out4d(:,:,:,:)
INTEGER, ALLOCATABLE :: out3di(:,:,:)
REAL, ALLOCATABLE :: var3du(:,:,:)
REAL, ALLOCATABLE :: var3dv(:,:,:)
REAL, ALLOCATABLE :: var3dw(:,:,:)
REAL, ALLOCATABLE :: var4d (:,:,:,:)
INTEGER, ALLOCATABLE :: var3di(:,:,:)
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
CHARACTER(LEN=10), PARAMETER :: tmunit = 'seconds '
INTEGER :: nxlg,nylg
INTEGER :: i,j,k,is
INTEGER :: istatus
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code ... ...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
nxlg = (nx-3)*nproc_x + 3
nylg = (ny-3)*nproc_y + 3
ALLOCATE(out1d (MAX(nxlg,nylg)), STAT = istatus)
ALLOCATE(out3d (nxlg,nylg,MAX(nz,nzsoil,nstyps+1)), STAT = istatus)
ALLOCATE(out3di(nxlg,nylg,nstyps), STAT = istatus)
ALLOCATE(out4d (nxlg,nylg,nzsoil,nstyps+1), STAT = istatus)
IF (myproc == 0) THEN
ALLOCATE(var3du(nxlg, nylg-1,nz-1), STAT = istatus)
ALLOCATE(var3dv(nxlg-1,nylg, nz-1), STAT = istatus)
ALLOCATE(var3dw(nxlg-1,nylg-1,MAX(nz,nstyps+1,nzsoil)), STAT = istatus)
ALLOCATE(var3di(nxlg-1,nylg-1,nstyps), STAT = istatus)
ALLOCATE(var4d (nxlg-1,nylg-1,nzsoil,nstyps+1), STAT = istatus)
END IF
!-----------------------------------------------------------------------
!
! Define dimension, write global attribute and define variables,
! Only needed for the first time level
!
!-----------------------------------------------------------------------
IF (myproc == 0) WRITE(6,'(/1x,a/)') &
'Defining NetCDF dimensions, global attribute and variables. '
IF( (itime == 1) .AND. (myproc == 0) ) THEN
!
!-----------------------------------------------------------------------
!
! Define ARPS dimension and variables
!
!-----------------------------------------------------------------------
CALL net_define_dimension
(netid,grdbas,nxlg,nylg,nz,nzsoil,nstyps)
CALL net_define_variables
(netid,packed,grdbas,tmunit,nxlg,nylg,istatus)
END IF
!-----------------------------------------------------------------------
!
! Beginning of writing variables
!
!-----------------------------------------------------------------------
IF (grdbas == 1) THEN
IF(myproc ==0) WRITE(6,'(1x,/,a/)') &
'Writing history grid & base data.'
ELSE
IF(myproc ==0) WRITE(6,'(1x,/,a,f13.3/)') &
'Writing history data at time=', curtim
END IF
!
! Grid variables
!
IF (itime == 1 .AND. (grdout == 1 .OR. grdbas == 1) ) THEN
CALL mpimerge1dx
(x,nx,out1d)
IF( myproc == 0 ) THEN
CALL netwrt1d
(netid,packed,0,'x_stag',out1d,nxlg)
END IF
CALL mpimerge1dy
(y,ny,out1d)
IF( myproc == 0 ) THEN
CALL netwrt1d
(netid,packed,0,'y_stag',out1d,nylg)
END IF
IF( myproc == 0 ) THEN
CALL netwrt1d
(netid,packed,0,'z_stag',z,nz)
END IF
CALL mpimerge3d
(zp,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,0,'ZP',var3dw,nxlg-1,nylg-1,nz)
END IF
CALL mpimerge3d
(zpsoil,nx,ny,nzsoil,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nzsoil
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,0,'ZPSOIL',var3dw,nxlg-1,nylg-1,nzsoil)
END IF
END IF
!
! Base state variables
!
IF(itime == 1 .AND. (basout == 1 .OR. grdbas == 1) ) THEN
CALL mpimerge3d
(ubar,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg
var3du(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,0,'UBAR',var3du,nxlg,nylg-1,nz-1)
END IF
CALL mpimerge3d
(vbar,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg
DO i = 1,nxlg-1
var3dv(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,0,'VBAR',var3dv,nxlg-1,nylg,nz-1)
END IF
IF( myproc == 0 ) THEN
DO k = 1,nz
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = 0.0
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,0,'WBAR',var3dw,nxlg-1,nylg-1,nz)
END IF
CALL mpimerge3d
(ptbar,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,0,'PTBAR',var3dw,nxlg-1,nylg-1,nz-1)
END IF
CALL mpimerge3d
(pbar,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,0,'PBAR',var3dw,nxlg-1,nylg-1,nz-1)
END IF
IF (mstout == 1) THEN
CALL mpimerge3d
(qvbar,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,0,'QVBAR',var3dw,nxlg-1,nylg-1,nz-1)
END IF
END IF
IF (landout == 1) THEN
CALL mpimerge3di
(soiltyp,nx,ny,nstyps,out3di)
IF( myproc == 0 ) THEN
DO is = 1,nstyps
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3di(i,j,is) = out3di(i,j,is)
END DO
END DO
END DO
CALL netwrt3di
(netid,packed,0,'SOILTYP',var3di,nxlg-1,nylg-1,nstyps)
END IF
CALL mpimerge3d
(stypfrct,nx,ny,nstyps,out3d)
IF( myproc == 0 ) THEN
DO is = 1,nstyps
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,is) = out3d(i,j,is)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,0,'STYPFRCT',var3dw,nxlg-1,nylg-1,nstyps)
END IF
CALL mpimerge2di
(vegtyp,nx,ny,out3di)
IF( myproc == 0 ) THEN
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3di(i,j,1) = out3di(i,j,1)
END DO
END DO
CALL netwrt2di
(netid,packed,0,'VEGTYP',var3di,nxlg-1,nylg-1)
END IF
CALL mpimerge2d
(lai,nx,ny,out3d)
IF( myproc == 0 ) THEN
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,1) = out3d(i,j,1)
END DO
END DO
CALL netwrt2d
(netid,packed,0,'LAI',var3dw,nxlg-1,nylg-1)
END IF
CALL mpimerge2d
(roufns,nx,ny,out3d)
IF( myproc == 0 ) THEN
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,1) = out3d(i,j,1)
END DO
END DO
CALL netwrt2d
(netid,packed,0,'ROUFNS',var3dw,nxlg-1,nylg-1)
END IF
CALL mpimerge2d
(veg,nx,ny,out3d)
IF( myproc == 0 ) THEN
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,1) = out3d(i,j,1)
END DO
END DO
CALL netwrt2d
(netid,packed,0,'VEG',var3dw,nxlg-1,nylg-1)
END IF
END IF
END IF
IF ( grdbas == 1 ) GOTO 3333
IF( myproc == 0 ) THEN
CALL netwrtTime
(netid,itime,'Time',curtim)
END IF
IF (varout == 1) THEN
IF (totout == 0) THEN
tem1(:,:,:) = u(:,:,:) - ubar(:,:,:)
CALL mpimerge3d
(tem1,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg
var3du(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'UPRT',var3du,nxlg,nylg-1,nz-1)
END IF
tem1(:,:,:) = v(:,:,:) - vbar(:,:,:)
CALL mpimerge3d
(tem1,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg
DO i = 1,nxlg-1
var3dv(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'VPRT',var3dv,nxlg-1,nylg,nz-1)
END IF
CALL mpimerge3d
(w,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'WPRT',var3dw,nxlg-1,nylg-1,nz)
END IF
CALL mpimerge3d
(ptprt,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'PTPRT',var3dw,nxlg-1,nylg-1,nz-1)
END IF
CALL mpimerge3d
(pprt,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'PPRT',var3dw,nxlg-1,nylg-1,nz-1)
END IF
ELSE
CALL mpimerge3d
(u,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg
var3du(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'U',var3du,nxlg,nylg-1,nz-1)
END IF
CALL mpimerge3d
(v,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg
DO i = 1,nxlg-1
var3dv(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'V',var3dv,nxlg-1,nylg,nz-1)
END IF
CALL mpimerge3d
(w,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'W',var3dw,nxlg-1,nylg-1,nz)
END IF
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
CALL mpimerge3d
(tem1,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'PT',var3dw,nxlg-1,nylg-1,nz-1)
END IF
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 mpimerge3d
(tem1,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'P',var3dw,nxlg-1,nylg-1,nz-1)
END IF
END IF ! totout
END IF ! varout
IF (mstout == 1) THEN
IF (totout == 0) THEN
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k)=qv(i,j,k)-qvbar(i,j,k)
END DO
END DO
END DO
CALL mpimerge3d
(tem1,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'QVPRT',var3dw,nxlg-1,nylg-1,nz-1)
END IF
ELSE
CALL mpimerge3d
(qv,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'QV',var3dw,nxlg-1,nylg-1,nz-1)
END IF
END IF
CALL mpimerge3d
(qc,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'QC',var3dw,nxlg-1,nylg-1,nz-1)
END IF
CALL mpimerge3d
(qr,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'QR',var3dw,nxlg-1,nylg-1,nz-1)
END IF
IF (rainout == 1) THEN
CALL mpimerge2d
(raing,nx,ny,out3d)
IF( myproc == 0 ) THEN
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,1) = out3d(i,j,1)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'RAING',var3dw,nxlg-1,nylg-1)
END IF
CALL mpimerge2d
(rainc,nx,ny,out3d)
IF( myproc == 0 ) THEN
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,1) = out3d(i,j,1)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'RAINC',var3dw,nxlg-1,nylg-1)
END IF
END IF
IF (prcout == 1) THEN
CALL mpimerge3d
(prcrate,nx,ny,4,out3d)
IF( myproc == 0 ) THEN
DO k = 1,4
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'PRCRATE1',var3dw(:,:,1),nxlg-1,nylg-1)
CALL netwrt2d
(netid,packed,itime,'PRCRATE2',var3dw(:,:,2),nxlg-1,nylg-1)
CALL netwrt2d
(netid,packed,itime,'PRCRATE3',var3dw(:,:,3),nxlg-1,nylg-1)
CALL netwrt2d
(netid,packed,itime,'PRCRATE4',var3dw(:,:,4),nxlg-1,nylg-1)
END IF
END IF
IF (iceout == 1) THEN
CALL mpimerge3d
(qi,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'QI',var3dw,nxlg-1,nylg-1,nz-1)
END IF
CALL mpimerge3d
(qs,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'QS',var3dw,nxlg-1,nylg-1,nz-1)
END IF
CALL mpimerge3d
(qh,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'QH',var3dw,nxlg-1,nylg-1,nz-1)
END IF
END IF
END IF ! mstout == 1
IF (tkeout == 1) THEN
CALL mpimerge3d
(tke,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'TKE',var3dw,nxlg-1,nylg-1,nz-1)
END IF
END IF
IF (trbout == 1) THEN
CALL mpimerge3d
(kmh,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'KMH',var3dw,nxlg-1,nylg-1,nz-1)
END IF
CALL mpimerge3d
(kmv,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'KMV',var3dw,nxlg-1,nylg-1,nz-1)
END IF
END IF ! trbout
IF (sfcout == 1) THEN
CALL mpimerge4d
(tsoil,nx,ny,nzsoil,nstyps+1,out4d)
IF( myproc == 0 ) THEN
DO is = 1, nstyps+1
DO k = 1, nzsoil
DO j = 1, nylg-1
DO i = 1, nxlg-1
var4d(i,j,k,is) = out4d(i,j,k,is)
END DO
END DO
END DO
END DO
CALL netwrt4d
(netid,packed,itime,'TSOIL',var4d,nxlg-1,nylg-1,nzsoil,nstyps+1)
END IF
CALL mpimerge4d
(qsoil,nx,ny,nzsoil,nstyps+1,out4d)
IF( myproc == 0 ) THEN
DO is = 1, nstyps+1
DO k = 1, nzsoil
DO j = 1, nylg-1
DO i = 1, nxlg-1
var4d(i,j,k,is) = out4d(i,j,k,is)
END DO
END DO
END DO
END DO
CALL netwrt4d
(netid,packed,itime,'QSOIL',var4d,nxlg-1,nylg-1,nzsoil,nstyps+1)
END IF
CALL mpimerge3d
(wetcanp,nx,ny,nstyps+1,out3d)
IF( myproc == 0 ) THEN
DO is = 1, nstyps+1
DO j = 1, nylg-1
DO i = 1, nxlg-1
var3dw(i,j,is) = out3d(i,j,is)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'WETCANP',var3dw,nxlg-1,nylg-1,nstyps+1)
END IF
IF (snowout == 1) THEN
CALL mpimerge2d
(snowdpth,nx,ny,out3d)
IF( myproc == 0 ) THEN
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,1) = out3d(i,j,1)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'SNOWDPTH',var3dw,nxlg-1,nylg-1)
END IF
END IF
END IF ! sfcout
IF (radout == 1) THEN
CALL mpimerge3d
(radfrc,nx,ny,nz,out3d)
IF( myproc == 0 ) THEN
DO k = 1,nz-1
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,k) = out3d(i,j,k)
END DO
END DO
END DO
CALL netwrt3d
(netid,packed,itime,'RADFRC',var3dw,nxlg-1,nylg-1,nz-1)
END IF
CALL mpimerge2d
(radsw,nx,ny,out3d)
IF( myproc == 0 ) THEN
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,1) = out3d(i,j,1)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'RADSW',var3dw,nxlg-1,nylg-1)
END IF
CALL mpimerge2d
(rnflx,nx,ny,out3d)
IF( myproc == 0 ) THEN
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,1) = out3d(i,j,1)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'RNFLX',var3dw,nxlg-1,nylg-1)
END IF
CALL mpimerge2d
(radswnet,nx,ny,out3d)
IF( myproc == 0 ) THEN
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,1) = out3d(i,j,1)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'RADSWNET',var3dw,nxlg-1,nylg-1)
END IF
CALL mpimerge2d
(radlwin,nx,ny,out3d)
IF( myproc == 0 ) THEN
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,1) = out3d(i,j,1)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'RADLWIN',var3dw,nxlg-1,nylg-1)
END IF
END IF
IF (flxout == 1) THEN
CALL mpimerge2d
(usflx,nx,ny,out3d)
IF( myproc == 0 ) THEN
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,1) = out3d(i,j,1)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'USFLX',var3dw,nxlg-1,nylg-1)
END IF
CALL mpimerge2d
(vsflx,nx,ny,out3d)
IF( myproc == 0 ) THEN
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,1) = out3d(i,j,1)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'VSFLX',var3dw,nxlg-1,nylg-1)
END IF
CALL mpimerge2d
(ptsflx,nx,ny,out3d)
IF( myproc == 0 ) THEN
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,1) = out3d(i,j,1)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'PTSFLX',var3dw,nxlg-1,nylg-1)
END IF
CALL mpimerge2d
(qvsflx,nx,ny,out3d)
IF( myproc == 0 ) THEN
DO j = 1,nylg-1
DO i = 1,nxlg-1
var3dw(i,j,1) = out3d(i,j,1)
END DO
END DO
CALL netwrt2d
(netid,packed,itime,'QVSFLX',var3dw,nxlg-1,nylg-1)
END IF
END IF
3333 CONTINUE
DEALLOCATE(out1d,out3d,out4d,out3di)
IF (myproc == 0) DEALLOCATE(var3du,var3dv,var3dw,var4d,var3di)
RETURN
END SUBROUTINE netjoindump
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE netopen ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE netopen(filename,fmode,nout) 28,2
!
!------------------------------------------------------------------
!
! PURPOSE:
!
! Open a NetCDF file according to fmode
!
! 'C': Create a new NetCDF file
! 'W': Write to an exist NetCDF file
! 'R': Read from an exist NetCDF file
!
!------------------------------------------------------------------
IMPLICIT NONE
CHARACTER(LEN=*), INTENT(IN) :: filename
CHARACTER(LEN=1), INTENT(IN) :: fmode
INTEGER, INTENT(OUT) :: nout
INCLUDE 'netcdf.inc'
INTEGER :: istatus
LOGICAL :: fexists
LOGICAL :: LargeFile
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code ... ...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
LargeFile = .TRUE.
SELECT CASE (fmode)
CASE ('C','W')
IF (LargeFile) THEN
istatus = NF_CREATE(TRIM(filename),IOR(NF_CLOBBER,NF_64BIT_OFFSET),&
nout) ! CDF2
ELSE
istatus = NF_CREATE(TRIM(filename),NF_CLOBBER,nout) ! CDF1
END IF
CALL net_check_error
(istatus,'netopen')
CASE ('R')
INQUIRE(FILE = TRIM(filename), EXIST = fexists)
IF (fexists) THEN
istatus = NF_OPEN(TRIM(filename),NF_NOWRITE,nout)
CALL net_check_error
(istatus,'netopen')
ELSE
WRITE(6,'(2a)') 'File not found: ', filename
STOP
END IF
CASE DEFAULT
WRITE(6,*) 'Wrong file mode: ',fmode,'.'
STOP
END SELECT
RETURN
END SUBROUTINE netopen
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE net_check_error ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE net_check_error(ierr,sub_name) 256
IMPLICIT NONE
INTEGER, INTENT(IN) :: ierr
CHARACTER(LEN=*), INTENT(IN) :: sub_name
CHARACTER(LEN=80) :: errmsg
INCLUDE 'netcdf.inc'
IF(ierr /= NF_NOERR) THEN
errmsg = NF_STRERROR(ierr)
WRITE(6,'(/2a)') 'NetCDF error: ',errmsg
WRITE(6,'(3a/)' ) 'Program stopped while calling "', sub_name,'".'
STOP
END IF
RETURN
END SUBROUTINE
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE netclose ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE netclose(nchout) 28,1
!
!------------------------------------------------------------------
!
! PURPOSE:
!
! Close the NetCDF file.
!
!------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: nchout
INCLUDE 'netcdf.inc'
INTEGER :: istatus
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
istatus = NF_CLOSE(nchout)
CALL net_check_error
(istatus,'netclose')
RETURN
END SUBROUTINE netclose
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE net_define_dimension ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE net_define_dimension(ncid,grdbas,nx,ny,nz,nzsoil,nstyps) 2,10
!
!-----------------------------------------------------------------------
!
! Define dimensions for ARPS History file
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: ncid
INTEGER, INTENT(IN) :: grdbas
INTEGER, INTENT(IN) :: nx
INTEGER, INTENT(IN) :: ny
INTEGER, INTENT(IN) :: nz
INTEGER, INTENT(IN) :: nzsoil
INTEGER, INTENT(IN) :: nstyps
INCLUDE 'netcdf.inc'
INTEGER :: istatus
INTEGER :: dimunlim_id
INTEGER :: dimwe_id, dimwes_id, dimsn_id, dimsns_id
INTEGER :: dimbt_id, dimbts_id
INTEGER :: dimsoil_id, dimn_id, dimns_id
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code ... ...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
! define dimensions
IF (grdbas /= 1) THEN
istatus = NF_DEF_DIM(ncid,'Time',NF_UNLIMITED,dimunlim_id)
CALL net_check_error
(istatus,'net_define_dimension')
END IF
istatus = NF_DEF_DIM(ncid,'x',nx-1,dimwe_id)
CALL net_check_error
(istatus,'net_define_dimension')
istatus = NF_DEF_DIM(ncid,'y',ny-1,dimsn_id)
CALL net_check_error
(istatus,'net_define_dimension')
istatus = NF_DEF_DIM(ncid,'z',nz-1,dimbt_id)
CALL net_check_error
(istatus,'net_define_dimension')
istatus = NF_DEF_DIM(ncid,'x_stag',nx,dimwes_id)
CALL net_check_error
(istatus,'net_define_dimension')
istatus = NF_DEF_DIM(ncid,'y_stag',ny,dimsns_id)
CALL net_check_error
(istatus,'net_define_dimension')
istatus = NF_DEF_DIM(ncid,'z_stag',nz,dimbts_id)
CALL net_check_error
(istatus,'net_define_dimension')
istatus = NF_DEF_DIM(ncid,'zsoil',nzsoil,dimsoil_id)
CALL net_check_error
(istatus,'net_define_dimension')
istatus = NF_DEF_DIM(ncid,'nstyp',nstyps,dimn_id)
CALL net_check_error
(istatus,'net_define_dimension')
IF (grdbas /= 1) THEN
istatus = NF_DEF_DIM(ncid,'nstyp_total',nstyps+1,dimns_id)
CALL net_check_error
(istatus,'net_define_dimension')
END IF
RETURN
END SUBROUTINE net_define_dimension
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE net_define_variables ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE net_define_variables(ncid,packed,grdbas,tmunit,nx,ny,istatus) 2,65
!
!-----------------------------------------------------------------------
!
! PURPOSE:
! Define ARPS history file attributes and variables. After this call
! The netCDF file should be in DATA mode.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yunheng Wang (08/10/2004)
!
! MODIFIED HISTORY:
!
!-----------------------------------------------------------------------
USE arps_netio_metadata
IMPLICIT NONE
INTEGER, INTENT(IN) :: ncid
INTEGER, INTENT(IN) :: packed ! may support pack latter
INTEGER, INTENT(IN) :: grdbas
INTEGER, INTENT(IN) :: nx,ny ! must be global domain size
CHARACTER(LEN=*), INTENT(IN) :: tmunit
INTEGER, INTENT(OUT) :: istatus
!-----------------------------------------------------------------------
!
! Included files
!
!-----------------------------------------------------------------------
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
INCLUDE 'netcdf.inc'
!-----------------------------------------------------------------------
!
! Local variables
!
!-----------------------------------------------------------------------
INTEGER :: lenstr
INTEGER :: i,j,k,n
INTEGER :: varid
INTEGER :: dimns_id,dimunlim_id
INTEGER :: dimx_id, dimy_id, dimz_id, dimsoil_id,dimn_id
INTEGER :: dimxs_id,dimys_id,dimzs_id
INTEGER :: oldfillmode
CHARACTER(LEN=80) :: tmpstr,tstr
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
IF (grdbas == 1) THEN
tmpstr = 'ARPS 5.1 grid & base (time independent) data'
ELSE
tmpstr = 'ARPS 5.1 history dump (time dependent)'
END IF
CALL netwrt_general_att
(ncid,packed,tmpstr,nx,ny,dx,dy,mapproj,sclfct,&
trulat1,trulat2,trulon,ctrlat,ctrlon,istatus)
!-----------------------------------------------------------------------
!
! Define specific global attributes for ARPS history files
!
!-----------------------------------------------------------------------
lenstr = LEN_TRIM(runname)
istatus = NF_PUT_ATT_TEXT(ncid,NF_GLOBAL,'RUNNAME',lenstr,runname)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'nocmnt',NF_INT,1,nocmnt)
tmpstr(:) = ' '
DO n = 1, nocmnt
WRITE(tmpstr,'(a,I2.2)') 'cmnt',n
lenstr = LEN_TRIM(cmnt(n))
istatus = NF_PUT_ATT_TEXT(ncid,NF_GLOBAL,TRIM(tmpstr),lenstr,cmnt(n))
END DO
!
! Date & time
!
tmpstr(:) = ' '
WRITE(tmpstr,'(I4.4,a,I2.2,a,I2.2,a,I2.2,a,I2.2,a,I2.2)') &
year,'-', month,'-',day,'_',hour,':',minute,':',second
lenstr = LEN_TRIM(tmpstr)
istatus = NF_PUT_ATT_TEXT(ncid,NF_GLOBAL,'INITIAL_TIME',lenstr,tmpstr)
istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'TSTOP', NF_FLOAT,1,tstop)
istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'THISDMP',NF_FLOAT,1,thisdmp)
istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'LATITUD', NF_FLOAT,1,latitud)
istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'XGRDORG', NF_FLOAT,1,xgrdorg)
istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'YGRDORG', NF_FLOAT,1,ygrdorg)
istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'UMOVE', NF_FLOAT,1,umove)
istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'VMOVE', NF_FLOAT,1,vmove)
!
! Flags
!
IF( grdbas == 1 ) THEN
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'GRDFLG', NF_INT,1,1)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'BASFLG', NF_INT,1,1)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'VARFLG', NF_INT,1,0)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'MSTFLG', NF_INT,1,mstout)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'ICEFLG', NF_INT,1,0)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'TRBFLG', NF_INT,1,0)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'SFCFLG', NF_INT,1,0)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'RAINFLG',NF_INT,1,0)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'LANDFLG',NF_INT,1,landout)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'TOTFLG', NF_INT,1,totout)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'TKEFLG', NF_INT,1,0)
ELSE
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'GRDFLG', NF_INT,1,grdout)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'BASFLG', NF_INT,1,basout)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'VARFLG', NF_INT,1,varout)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'MSTFLG', NF_INT,1,mstout)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'ICEFLG', NF_INT,1,iceout)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'TRBFLG', NF_INT,1,trbout)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'SFCFLG', NF_INT,1,sfcout)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'RAINFLG',NF_INT,1,rainout)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'LANDFLG',NF_INT,1,landout)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'TOTFLG', NF_INT,1,totout)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'TKEFLG', NF_INT,1,tkeout)
END IF
IF ( totout == 1 ) THEN
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'PRCFLG', NF_INT,1,prcout)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'RADFLG', NF_INT,1,radout)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'FLXFLG', NF_INT,1,flxout)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'SNOWFLG',NF_INT,1,snowout)
END IF
! do not fill, will set values explicitly later. Improve performance
istatus = NF_SET_FILL(ncid,NF_NOFILL,oldfillmode)
!-----------------------------------------------------------------------
!
! Define variable arrays
!
!-----------------------------------------------------------------------
!
! Get dimension IDs
!
istatus = NF_INQ_DIMID(ncid,'x_stag', dimx_id)
istatus = NF_INQ_DIMID(ncid,'y_stag', dimy_id)
istatus = NF_INQ_DIMID(ncid,'z_stag', dimz_id)
istatus = NF_INQ_DIMID(ncid,'x', dimxs_id)
istatus = NF_INQ_DIMID(ncid,'y', dimys_id)
istatus = NF_INQ_DIMID(ncid,'z', dimzs_id)
istatus = NF_INQ_DIMID(ncid,'zsoil', dimsoil_id)
istatus = NF_INQ_DIMID(ncid,'nstyp', dimn_id)
IF(grdbas /= 1) THEN
istatus = NF_INQ_DIMID(ncid, 'Time', dimunlim_id)
CALL net_check_error
(istatus,'net_define_variabls:Time')
istatus = NF_INQ_DIMID(ncid, 'nstyp_total',dimns_id)
CALL net_check_error
(istatus,'net_define_variabls:nstyp_total')
END IF
IF(grdout == 1 .OR. grdbas == 1 ) THEN
!
! Grid variables
!
istatus = NF_DEF_VAR(ncid,'x_stag',NF_FLOAT,1,(/dimx_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%x_stag)
istatus = NF_DEF_VAR(ncid,'y_stag',NF_FLOAT,1,(/dimy_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%y_stag)
istatus = NF_DEF_VAR(ncid,'z_stag',NF_FLOAT,1,(/dimz_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%z_stag)
istatus = NF_DEF_VAR(ncid,'ZP',NF_FLOAT,3,(/dimxs_id,dimys_id,dimz_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%zp)
istatus = NF_DEF_VAR(ncid,'ZPSOIL',NF_FLOAT,3,(/dimxs_id,dimys_id,dimsoil_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%zpsoil)
END IF
IF(basout == 1 .OR. grdbas == 1 ) THEN
!
! Base state variables
!
istatus = NF_DEF_VAR(ncid,'UBAR',NF_FLOAT,3,(/dimx_id,dimys_id,dimzs_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%ubar)
istatus = NF_DEF_VAR(ncid,'VBAR',NF_FLOAT,3,(/dimxs_id,dimy_id,dimzs_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%vbar)
istatus = NF_DEF_VAR(ncid,'WBAR',NF_FLOAT,3,(/dimxs_id,dimys_id,dimz_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%wbar)
istatus = NF_DEF_VAR(ncid,'PTBAR',NF_FLOAT,3,(/dimxs_id,dimys_id,dimzs_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%ptbar)
istatus = NF_DEF_VAR(ncid,'PBAR',NF_FLOAT,3,(/dimxs_id,dimys_id,dimzs_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%pbar)
IF(mstout == 1) THEN
istatus = NF_DEF_VAR(ncid,'QVBAR',NF_FLOAT,3,(/dimxs_id,dimys_id,dimzs_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%qvbar)
END IF
IF(landout == 1) THEN
istatus = NF_DEF_VAR(ncid,'SOILTYP',NF_INT,3,(/dimxs_id,dimys_id,dimn_id/),varid)
CALL net_define_var_meta
(ncid,varid,'INT',arpsmeta%soiltyp)
istatus = NF_DEF_VAR(ncid,'STYPFRCT',NF_FLOAT,3,(/dimxs_id,dimys_id,dimn_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%stypfrct)
istatus = NF_DEF_VAR(ncid,'VEGTYP',NF_INT,2,(/dimxs_id,dimys_id/),varid)
CALL net_define_var_meta
(ncid,varid,'INT',arpsmeta%vegtyp)
istatus = NF_DEF_VAR(ncid,'LAI',NF_FLOAT,2,(/dimxs_id,dimys_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%lai)
istatus = NF_DEF_VAR(ncid,'ROUFNS',NF_FLOAT,2,(/dimxs_id,dimys_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%roufns)
istatus = NF_DEF_VAR(ncid,'VEG',NF_FLOAT,2,(/dimxs_id,dimys_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%veg)
END IF
END IF
IF ( grdbas == 1 ) GOTO 444 ! For grid & base file, this is all of the data to be written
tmpstr(:) = ' '
WRITE(tmpstr,'(I4.4,a,I2.2,a,I2.2,1x,I2.2,a,I2.2,a,I2.2)') &
year,'-', month,'-',day,hour,':',minute,':',second
WRITE(tstr,'(3a)') TRIM(tmunit), ' since ',TRIM(tmpstr)
istatus = NF_DEF_VAR(ncid,'Time',NF_FLOAT,1,(/dimunlim_id/),varid)
arpsmeta%Time%units = tstr
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%Time)
IF(varout == 1) THEN
IF ( totout == 0 ) THEN
istatus = NF_DEF_VAR(ncid,'UPRT',NF_FLOAT,4,(/dimx_id,dimys_id,dimzs_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%uprt)
istatus = NF_DEF_VAR(ncid,'VPRT',NF_FLOAT,4,(/dimxs_id,dimy_id,dimzs_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%vprt)
istatus = NF_DEF_VAR(ncid,'WPRT',NF_FLOAT,4,(/dimxs_id,dimys_id,dimz_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%wprt)
istatus = NF_DEF_VAR(ncid,'PTPRT',NF_FLOAT,4,(/dimxs_id,dimys_id,dimzs_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%ptprt)
istatus = NF_DEF_VAR(ncid,'PPRT',NF_FLOAT,4,(/dimxs_id,dimys_id,dimzs_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%pprt)
ELSE
istatus = NF_DEF_VAR(ncid,'U',NF_FLOAT,4,(/dimx_id,dimys_id,dimzs_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%u)
istatus = NF_DEF_VAR(ncid,'V',NF_FLOAT,4,(/dimxs_id,dimy_id,dimzs_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%v)
istatus = NF_DEF_VAR(ncid,'W',NF_FLOAT,4,(/dimxs_id,dimys_id,dimz_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%w)
istatus = NF_DEF_VAR(ncid,'PT',NF_FLOAT,4,(/dimxs_id,dimys_id,dimzs_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%pt)
istatus = NF_DEF_VAR(ncid,'P',NF_FLOAT,4,(/dimxs_id,dimys_id,dimzs_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%p)
END IF
END IF
IF(mstout == 1) THEN
IF( totout == 0 ) THEN
istatus = NF_DEF_VAR(ncid,'QVPRT',NF_FLOAT,4,(/dimxs_id,dimys_id,dimzs_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%qvprt)
ELSE
istatus = NF_DEF_VAR(ncid,'QV',NF_FLOAT,4,(/dimxs_id,dimys_id,dimzs_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%qv)
END IF
istatus = NF_DEF_VAR(ncid,'QC',NF_FLOAT,4,(/dimxs_id,dimys_id,dimzs_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%qc)
istatus = NF_DEF_VAR(ncid,'QR',NF_FLOAT,4,(/dimxs_id,dimys_id,dimzs_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%qr)
IF(rainout == 1) THEN
istatus = NF_DEF_VAR(ncid,'RAING',NF_FLOAT,3,(/dimxs_id,dimys_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%raing)
istatus = NF_DEF_VAR(ncid,'RAINC',NF_FLOAT,3,(/dimxs_id,dimys_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%rainc)
END IF
IF ( prcout == 1 ) THEN
istatus = NF_DEF_VAR(ncid,'PRCRATE1',NF_FLOAT,3,(/dimxs_id,dimys_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%prcrate1)
istatus = NF_DEF_VAR(ncid,'PRCRATE2',NF_FLOAT,3,(/dimxs_id,dimys_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%prcrate2)
istatus = NF_DEF_VAR(ncid,'PRCRATE3',NF_FLOAT,3,(/dimxs_id,dimys_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%prcrate3)
istatus = NF_DEF_VAR(ncid,'PRCRATE4',NF_FLOAT,3,(/dimxs_id,dimys_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%prcrate4)
END IF
IF(iceout == 1) THEN
istatus = NF_DEF_VAR(ncid,'QI',NF_FLOAT,4,(/dimxs_id,dimys_id,dimzs_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%qi)
istatus = NF_DEF_VAR(ncid,'QS',NF_FLOAT,4,(/dimxs_id,dimys_id,dimzs_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%qs)
istatus = NF_DEF_VAR(ncid,'QH',NF_FLOAT,4,(/dimxs_id,dimys_id,dimzs_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%qh)
END IF
END IF ! mstout == 1
IF( tkeout == 1 ) THEN
istatus = NF_DEF_VAR(ncid,'TKE',NF_FLOAT,4,(/dimxs_id,dimys_id,dimzs_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%tke)
END IF
IF( trbout == 1 ) THEN
istatus = NF_DEF_VAR(ncid,'KMH',NF_FLOAT,4,(/dimxs_id,dimys_id,dimzs_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%kmh)
istatus = NF_DEF_VAR(ncid,'KMV',NF_FLOAT,4,(/dimxs_id,dimys_id,dimzs_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%kmv)
END IF
IF( sfcout == 1) THEN
istatus = NF_DEF_VAR(ncid,'TSOIL',NF_FLOAT,5, &
(/dimxs_id,dimys_id,dimsoil_id,dimns_id,dimunlim_id/),varid)
CALL net_check_error
(istatus,'net_define_variabls:TSOIL')
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%tsoil)
istatus = NF_DEF_VAR(ncid,'QSOIL',NF_FLOAT,5, &
(/dimxs_id,dimys_id,dimsoil_id,dimns_id,dimunlim_id/),varid)
CALL net_check_error
(istatus,'net_define_variabls:QSOIL')
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%qsoil)
istatus = NF_DEF_VAR(ncid,'WETCANP',NF_FLOAT,4, &
(/dimxs_id,dimys_id,dimns_id,dimunlim_id/),varid)
CALL net_check_error
(istatus,'net_define_variabls:WETCANP')
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%wetcanp)
IF (snowout == 1) THEN
istatus = NF_DEF_VAR(ncid,'SNOWDPTH',NF_FLOAT,3, &
(/dimxs_id,dimys_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%snowdpth)
END IF
END IF ! sfcout == 1
IF( radout == 1 ) THEN
istatus = NF_DEF_VAR(ncid,'RADFRC',NF_FLOAT,4, &
(/dimxs_id,dimys_id,dimzs_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%radfrc)
istatus = NF_DEF_VAR(ncid,'RADSW',NF_FLOAT,3, &
(/dimxs_id,dimys_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%radsw)
istatus = NF_DEF_VAR(ncid,'RNFLX',NF_FLOAT,3, &
(/dimxs_id,dimys_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%rnflx)
istatus = NF_DEF_VAR(ncid,'RADSWNET',NF_FLOAT,3, &
(/dimxs_id,dimys_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%radswnet)
istatus = NF_DEF_VAR(ncid,'RADLWIN',NF_FLOAT,3, &
(/dimxs_id,dimys_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%radlwin)
END IF
IF( flxout == 1 ) THEN
istatus = NF_DEF_VAR(ncid,'USFLX',NF_FLOAT,3, &
(/dimxs_id,dimys_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%usflx)
istatus = NF_DEF_VAR(ncid,'VSFLX',NF_FLOAT,3, &
(/dimxs_id,dimys_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%vsflx)
istatus = NF_DEF_VAR(ncid,'PTSFLX',NF_FLOAT,3, &
(/dimxs_id,dimys_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%ptsflx)
istatus = NF_DEF_VAR(ncid,'QVSFLX',NF_FLOAT,3, &
(/dimxs_id,dimys_id,dimunlim_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',arpsmeta%qvsflx)
END IF
!-----------------------------------------------------------------------
!
! End NetCDF file DEFINE mode
!
!-----------------------------------------------------------------------
444 CONTINUE
istatus = NF_ENDDEF(ncid)
CALL net_check_error
(istatus,'net_define_variabls')
RETURN
END SUBROUTINE net_define_variables
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE netwrtTime ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE netwrtTime(nout,itime,varname,var1d) 2,2
!
!------------------------------------------------------------------
!
! PURPOSE:
!
! Write 1D vector to the output file.
!
!------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: nout ! output channel, NetCDF id
INTEGER, INTENT(IN) :: itime
REAL, INTENT(IN) :: var1d
CHARACTER(LEN=*), INTENT(IN) :: varname
!------------------------------------------------------------------
!
! Misc. local variable
!
!------------------------------------------------------------------
INTEGER :: varid, istatus
INCLUDE 'netcdf.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
WRITE(6,FMT='(2a)',ADVANCE='NO') ' Writing data valid time ', varname
!
! get variable id and dimension length
!
istatus = NF_INQ_VARID(nout,varname,varid)
CALL net_check_error
(istatus,'NF_INQ_VARID in netwrtTime.')
!
! Write data
!
istatus = NF_PUT_VARA_REAL(nout,varid,(/itime/),(/1/),var1d)
CALL net_check_error
(istatus,'NF_PUT_VARA_REAL in netwrtTime')
WRITE(6,'(a)') ' === DONE ==='
RETURN
END SUBROUTINE netwrtTime
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE netwrt1d ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE netwrt1d(nout,packed,itime,varname,var1d,ndim) 6,2
!
!------------------------------------------------------------------
!
! PURPOSE:
!
! Write 1D vector to the output file.
!
!------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: nout ! output channel, NetCDF id
INTEGER, INTENT(IN) :: packed
INTEGER, INTENT(IN) :: itime
INTEGER, INTENT(IN) :: ndim
REAL, INTENT(IN) :: var1d(ndim)
CHARACTER(LEN=*), INTENT(IN) :: varname
!------------------------------------------------------------------
!
! Misc. local variable
!
!------------------------------------------------------------------
INTEGER :: varid, istatus
INTEGER :: dim_ids(2)
INTEGER :: dimlens(2)
INCLUDE 'netcdf.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
WRITE(6,FMT='(2a)',ADVANCE='NO') ' Writing 1D NetCDF variable ', varname
!
! get variable id and dimension length
!
istatus = NF_INQ_VARID(nout,varname,varid)
CALL net_check_error
(istatus,'NF_INQ_VARID in write1d.')
istatus = NF_INQ_VARDIMID(nout,varid,dim_ids)
istatus = NF_INQ_DIMLEN(nout,dim_ids(1),dimlens(1))
!
! check dimension
!
IF(dimlens(1) /= ndim) THEN
WRITE(6,'(1x,/a)') 'Mismatched dimension size.'
WRITE(6,'(1x,2(a,I4))') ' Input dimension = ',ndim, &
', Defined dimension in file = ',dimlens(1)
STOP
END IF
!
! Write data
!
IF (itime > 0) THEN
istatus = NF_PUT_VARA_REAL(nout,varid,(/1,itime/),(/ndim,1/),var1d)
ELSE
istatus = NF_PUT_VARA_REAL(nout,varid,(/1/),(/ndim/),var1d)
END IF
CALL net_check_error
(istatus,'NF_PUT_VARA_REAL in netwrt1d')
WRITE(6,'(a)') ' === DONE ==='
RETURN
END SUBROUTINE netwrt1d
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE netwrt2d ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE netwrt2d(nout,packed,itime,varname,var2d,ndimx,ndimy) 48,2
!
!------------------------------------------------------------------
!
! PURPOSE:
!
! Write 2D array to the output file.
!
!------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: nout
INTEGER, INTENT(IN) :: packed
INTEGER, INTENT(IN) :: itime ! = 0 no unlimited dimension
! > 0 record No.
INTEGER, INTENT(IN) :: ndimx,ndimy
REAL, INTENT(IN) :: var2d(ndimx,ndimy)
CHARACTER(LEN=*), INTENT(IN) :: varname
!------------------------------------------------------------------
!
! Misc. local variable
!
!------------------------------------------------------------------
INTEGER :: varid, istatus
INTEGER :: dim_ids(3)
INTEGER :: dimlens(3)
INCLUDE 'netcdf.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
WRITE(6,FMT='(2a)',ADVANCE='NO') ' Writing 2D NetCDF variable ', varname
! get variable id and dimension length
istatus = NF_INQ_VARID(nout,varname,varid)
CALL net_check_error
(istatus,'NF_INQ_VARID in write2d.')
istatus = NF_INQ_VARDIMID(nout,varid,dim_ids)
istatus = NF_INQ_DIMLEN(nout,dim_ids(1),dimlens(1))
istatus = NF_INQ_DIMLEN(nout,dim_ids(2),dimlens(2))
IF(itime > 0) &
istatus = NF_INQ_DIMLEN(nout,dim_ids(3),dimlens(3)) ! unlimit dimension
IF(dimlens(1) /= ndimx) THEN
WRITE(6,'(/a)') ' ERROR: Mismatched dimension size in X direction.'
WRITE(6,*) 'Input X dimension = ',ndimx, ' Data X dimension =',dimlens(1)
STOP
END IF
IF(dimlens(2) /= ndimy) THEN
WRITE(6,'(/a)') ' ERROR:Mismatched dimension size in Y direction.'
WRITE(6,*) 'Input Y dimension = ',ndimx, ' Data Y dimension =',dimlens(2)
STOP
END IF
! Write data
IF (itime > 0) THEN
istatus = NF_PUT_VARA_REAL(nout,varid,(/1,1,itime/), &
(/ndimx,ndimy,1/),var2d)
ELSE
istatus = NF_PUT_VARA_REAL(nout,varid,(/1,1/),(/ndimx,ndimy/),var2d)
END IF
CALL net_check_error
(istatus,'NF_PUT_VARA_REAL in netwrt2d')
WRITE(6,'(a)') ' === DONE ==='
RETURN
END SUBROUTINE netwrt2d
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE netwrt2di ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE netwrt2di(nout,packed,itime,varname,var2d,ndimx,ndimy) 4,2
!
!------------------------------------------------------------------
!
! PURPOSE:
!
! Write 2D array to the output file.
!
!------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: nout
INTEGER, INTENT(IN) :: packed
INTEGER, INTENT(IN) :: itime
INTEGER, INTENT(IN) :: ndimx,ndimy
INTEGER, INTENT(IN) :: var2d(ndimx,ndimy)
CHARACTER(LEN=*), INTENT(IN) :: varname
!------------------------------------------------------------------
!
! Misc. local variable
!
!------------------------------------------------------------------
INTEGER :: varid, istatus
INTEGER :: dim_ids(3)
INTEGER :: dimlens(3)
INCLUDE 'netcdf.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
WRITE(6,FMT='(2a)',ADVANCE='NO') &
' Writing 2D integer NetCDF variable ', varname
!
! get variable id and dimension length
!
istatus = NF_INQ_VARID(nout,varname,varid)
CALL net_check_error
(istatus,'NF_INQ_VARID in write2di.')
istatus = NF_INQ_VARDIMID(nout,varid,dim_ids)
istatus = NF_INQ_DIMLEN(nout,dim_ids(1),dimlens(1))
istatus = NF_INQ_DIMLEN(nout,dim_ids(2),dimlens(2))
IF (itime > 0) & ! unlimit dimension
istatus = NF_INQ_DIMLEN(nout,dim_ids(3),dimlens(3))
!
! Some checks to confirm it is the right variable and dimensions
!
IF(dimlens(1) /= ndimx) THEN
WRITE(6,'(/a)') 'Mismatched dimension size in X direction.'
WRITE(6,*) ' Input X dimension = ',ndimx, &
' Data X dimension = ', dimlens(1)
STOP
END IF
IF(dimlens(2) /= ndimy) THEN
WRITE(6,'(/a)') 'Mismatched dimension size in Y direction.'
WRITE(6,*) ' Input Y dimension = ',ndimy, &
' Data Y dimension = ',dimlens(2)
STOP
END IF
!
! Write data
!
IF (itime > 0) THEN
istatus = NF_PUT_VARA_INT(nout,varid,(/1,1,itime/), &
(/ndimx,ndimy,1/),var2d)
ELSE
istatus = NF_PUT_VARA_INT(nout,varid,(/1,1/),(/ndimx,ndimy/),var2d)
END IF
CALL net_check_error
(istatus,'NF_PUT_VARA_INT in netwrt2di.')
WRITE(6,'(a)') ' === DONE ==='
RETURN
END SUBROUTINE netwrt2di
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE netwrt3d ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE netwrt3d(nout,packed,itime,varname,var3d,ndimx,ndimy,ndimz) 91,2
!
!------------------------------------------------------------------
!
! PURPOSE:
!
! Write 3D array to the output file.
!
!------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: nout
INTEGER, INTENT(IN) :: packed
INTEGER, INTENT(IN) :: itime
INTEGER, INTENT(IN) :: ndimx,ndimy,ndimz
REAL, INTENT(IN) :: var3d(ndimx,ndimy,ndimz)
CHARACTER(LEN=*), INTENT(IN) :: varname
!------------------------------------------------------------------
!
! Misc. local variable
!
!------------------------------------------------------------------
INTEGER :: varid, istatus
INTEGER :: dim_ids(4)
INTEGER :: dimlens(4)
INCLUDE 'netcdf.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
WRITE(6,FMT='(1x,2a)',ADVANCE='NO') ' Writing 3D NetCDF variable ', varname
!
! get variable id
!
istatus = NF_INQ_VARID(nout,varname,varid)
CALL net_check_error
(istatus,'NF_INQ_VARID in write3d.')
!
! get dimension lengths and do some checks
!
istatus = NF_INQ_VARDIMID(nout,varid,dim_ids)
istatus = NF_INQ_DIMLEN (nout,dim_ids(1),dimlens(1))
istatus = NF_INQ_DIMLEN (nout,dim_ids(2),dimlens(2))
istatus = NF_INQ_DIMLEN (nout,dim_ids(3),dimlens(3))
IF(itime > 0) & ! unlimit dimension
istatus = NF_INQ_DIMLEN(nout,dim_ids(4),dimlens(4))
IF(dimlens(1) /= ndimx) THEN
WRITE(6,'(1x,/a)') 'Mismatched dimension size in X direction.'
WRITE(6,'(1x,2(a,I4))') ' Input dimension = ',ndimx, &
', Defined dimension in file = ',dimlens(1)
STOP
END IF
IF(dimlens(2) /= ndimy) THEN
WRITE(6,'(1x,/a)') 'Mismatched dimension size in Y direction.'
WRITE(6,'(1x,2(a,I4))') ' Input dimension = ',ndimy, &
', Defined dimension in file = ',dimlens(2)
STOP
END IF
IF(dimlens(3) /= ndimz) THEN
WRITE(6,'(1x,/a)') 'Mismatched dimension size in the 3rd dimension.'
WRITE(6,'(1x,2(a,I4))') ' Input dimension = ',ndimz, &
', Defined dimension in file = ',dimlens(3)
STOP
END IF
!
! Write data
!
IF (itime > 0 ) THEN ! Actually, 4D array defined in file
istatus = NF_PUT_VARA_REAL(nout,varid,(/1,1,1,itime/), &
(/ndimx,ndimy,ndimz,1/),var3d)
ELSE ! Just 3D array, no unlimited dim.
istatus = NF_PUT_VARA_REAL(nout,varid,(/1,1,1/), &
(/ndimx,ndimy,ndimz/),var3d)
END IF
CALL net_check_error
(istatus,'NF_PUT_VARA_REAL in netwrt3d')
WRITE(6,'(a)') ' === DONE ==='
RETURN
END SUBROUTINE netwrt3d
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE netwrt3di ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE netwrt3di(nout,packed,itime,varname,var3d,ndimx,ndimy,ndimz) 6,2
!
!------------------------------------------------------------------
!
! PURPOSE:
!
! Write 3D integer array to the output file.
!
!------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: nout
INTEGER, INTENT(IN) :: packed
INTEGER, INTENT(IN) :: itime
INTEGER, INTENT(IN) :: ndimx,ndimy,ndimz
INTEGER, INTENT(IN) :: var3d(ndimx,ndimy,ndimz)
CHARACTER(LEN=*), INTENT(IN) :: varname
!------------------------------------------------------------------
!
! Misc. local variable
!
!------------------------------------------------------------------
INTEGER :: varid, istatus
INTEGER :: dim_ids(4)
INTEGER :: dimlens(4)
INCLUDE 'netcdf.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
WRITE(6,FMT='(1x,2a)',ADVANCE='NO') &
' Writing 3D integer NetCDF variable ', varname
!
! get variable id
!
istatus = NF_INQ_VARID(nout,varname,varid)
CALL net_check_error
(istatus,'NF_INQ_VARID in netwrt3di.')
!
! get dimension lengths and do some checks
!
istatus = NF_INQ_VARDIMID(nout,varid,dim_ids)
istatus = NF_INQ_DIMLEN (nout,dim_ids(1),dimlens(1))
istatus = NF_INQ_DIMLEN (nout,dim_ids(2),dimlens(2))
istatus = NF_INQ_DIMLEN (nout,dim_ids(3),dimlens(3))
IF(itime > 0) & ! unlimit dimension
istatus = NF_INQ_DIMLEN(nout,dim_ids(4),dimlens(4))
IF(dimlens(1) /= ndimx) THEN
WRITE(6,'(1x,/a)') 'Mismatched dimension size in X direction.'
WRITE(6,'(1x,2(a,I4))') ' Input dimension = ',ndimx, &
', Defined dimension in file = ',dimlens(1)
STOP
END IF
IF(dimlens(2) /= ndimy) THEN
WRITE(6,'(1x,/a)') 'Mismatched dimension size in Y direction.'
WRITE(6,'(1x,2(a,I4))') ' Input dimension = ',ndimy, &
', Defined dimension in file = ',dimlens(2)
STOP
END IF
IF(dimlens(3) /= ndimz) THEN
WRITE(6,'(1x,/a)') 'Mismatched dimension size in the 3rd dimension.'
WRITE(6,'(1x,2(a,I4))') ' Input dimension = ',ndimz, &
', Defined dimension in file = ',dimlens(3)
STOP
END IF
!
! Write data
!
IF (itime > 0 ) THEN ! Actually, 4D array defined in file
istatus = NF_PUT_VARA_INT(nout,varid,(/1,1,1,itime/), &
(/ndimx,ndimy,ndimz,1/),var3d)
ELSE ! Just 3D array, no unlimited dim.
istatus = NF_PUT_VARA_INT(nout,varid,(/1,1,1/), &
(/ndimx,ndimy,ndimz/),var3d)
END IF
CALL net_check_error
(istatus,'NF_PUT_VARA_INT in netwrt3di')
WRITE(6,'(a)') ' === DONE ==='
RETURN
END SUBROUTINE netwrt3di
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE netwrt4d ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE netwrt4d(nout,packed,itime,varname,var4d, & 8,2
ndimx,ndimy,ndimz,ndims)
!
!------------------------------------------------------------------
!
! PURPOSE:
!
! Write 4D array to the output file.
!
!------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: nout
INTEGER, INTENT(IN) :: packed
INTEGER, INTENT(IN) :: itime
INTEGER, INTENT(IN) :: ndimx,ndimy,ndimz,ndims
REAL, INTENT(IN) :: var4d(ndimx,ndimy,ndimz,ndims)
CHARACTER(LEN=*), INTENT(IN) :: varname
!------------------------------------------------------------------
!
! Misc. local variable
!
!------------------------------------------------------------------
INTEGER :: varid, istatus
INTEGER :: dim_ids(5)
INTEGER :: dimlens(5)
INCLUDE 'netcdf.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
WRITE(6,FMT='(1x,2a)',ADVANCE='NO') ' Writing 4D NetCDF variable ', varname
!
! get variable id
!
istatus = NF_INQ_VARID(nout,varname,varid)
CALL net_check_error
(istatus,'NF_INQ_VARID in netwrt4d.')
!
! get dimension lengths and do some checks
!
istatus = NF_INQ_VARDIMID(nout,varid,dim_ids)
istatus = NF_INQ_DIMLEN (nout,dim_ids(1),dimlens(1))
istatus = NF_INQ_DIMLEN (nout,dim_ids(2),dimlens(2))
istatus = NF_INQ_DIMLEN (nout,dim_ids(3),dimlens(3))
istatus = NF_INQ_DIMLEN (nout,dim_ids(4),dimlens(4))
IF(itime > 0) istatus = NF_INQ_DIMLEN(nout,dim_ids(5),dimlens(5))
! unlimit dimension
IF(dimlens(1) /= ndimx) THEN
WRITE(6,'(1x,/a)') 'Mismatched dimension size in X direction.'
WRITE(6,'(1x,2(a,I4))') ' Input dimension = ',ndimx, &
', Defined dimension in file = ',dimlens(1)
STOP
END IF
IF(dimlens(2) /= ndimy) THEN
WRITE(6,'(1x,/a)') 'Mismatched dimension size in Y direction.'
WRITE(6,'(1x,2(a,I4))') ' Input dimension = ',ndimy, &
', Defined dimension in file = ',dimlens(2)
STOP
END IF
IF(dimlens(3) /= ndimz) THEN
WRITE(6,'(1x,/a)') 'Mismatched dimension size in the 3rd dimension.'
WRITE(6,'(1x,2(a,I4))') ' Input dimension = ',ndimz, &
', Defined dimension in file = ',dimlens(3)
STOP
END IF
IF(dimlens(4) /= ndims) THEN
WRITE(6,'(1x,/a)') 'Mismatched dimension size in the 4th dimension.'
WRITE(6,'(1x,2(a,I4))') ' Input dimension = ',ndims, &
', Defined dimension in file = ',dimlens(4)
STOP
END IF
!
! Write data
!
IF (itime > 0 ) THEN ! Actually, 5D array defined in file
istatus = NF_PUT_VARA_REAL(nout,varid,(/1,1,1,1,itime/), &
(/ndimx,ndimy,ndimz,ndims,1/),var4d)
ELSE ! Just 4D array, no unlimited dim.
istatus = NF_PUT_VARA_REAL(nout,varid,(/1,1,1,1/), &
(/ndimx,ndimy,ndimz,ndims/),var4d)
END IF
CALL net_check_error
(istatus,'NF_PUT_VARA_REAL in netwrt4d')
WRITE(6,'(a)') ' === DONE ==='
RETURN
END SUBROUTINE netwrt4d
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE net_getdims ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE net_getdims(ncid,nxout,nyout,nzout,nzsoilout, & 4,10
nstypsout,istatus)
!------------------------------------------------------------------------
!
! PURPOSE:
!
! Read dimension parameters from NetCDF output file.
!
!------------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER, INTENT(IN) :: ncid
INTEGER, INTENT(OUT) :: nxout
INTEGER, INTENT(OUT) :: nyout
INTEGER, INTENT(OUT) :: nzout
INTEGER, INTENT(OUT) :: nzsoilout
INTEGER, INTENT(OUT) :: nstypsout
INTEGER, INTENT(OUT) :: istatus
!------------------------------------------------------------------------
!
! Misc. Local variables
!
!------------------------------------------------------------------------
INTEGER :: dimid
INCLUDE 'netcdf.inc'
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Begining of executable code
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Get ARPS dimensions
!
!-----------------------------------------------------------------------
istatus = NF_INQ_DIMID(ncid,'x_stag',dimid)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_getdims')
istatus = NF_INQ_DIMLEN(ncid,dimid,nxout)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_getdims')
istatus = NF_INQ_DIMID(ncid,'y_stag',dimid)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_getdims')
istatus = NF_INQ_DIMLEN(ncid,dimid,nyout)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_getdims')
istatus = NF_INQ_DIMID(ncid,'z_stag',dimid)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_getdims')
istatus = NF_INQ_DIMLEN(ncid,dimid,nzout)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_getdims')
istatus = NF_INQ_DIMID(ncid,'zsoil',dimid)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_getdims')
istatus = NF_INQ_DIMLEN(ncid,dimid,nzsoilout)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_getdims')
istatus = NF_INQ_DIMID(ncid,'nstyp',dimid)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_getdims')
istatus = NF_INQ_DIMLEN(ncid,dimid,nstypsout)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_getdims')
RETURN
END SUBROUTINE net_getdims
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE net_getatts ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE net_getatts(ncid,runname,nocmnt,cmnt,dx,dy, & 5,35
year,month,day,hour,minute,second,thisdmp,tstop, &
mapproj,sclfct,trulat1,trulat2,trulon,latitud, &
ctrlat,ctrlon,xgrdorg,ygrdorg,umove,vmove, &
grdflg,basflg,varflg,mstflg,iceflg,trbflg, &
sfcflg,rainflg,landflg,totflg,tkeflg, &
prcflg,radflg,flxflg,snowflg,istatus)
!-----------------------------------------------------------------------
!
! PURPOSE
!
! Retieve ARPS grib information from the NetCDF file which are stored
! as Global attributes.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: ncid
CHARACTER(LEN=80), INTENT(OUT) :: runname
INTEGER, INTENT(OUT) :: nocmnt
CHARACTER(LEN=80), INTENT(OUT) :: cmnt(50)
REAL, INTENT(OUT) :: dx, dy
INTEGER, INTENT(OUT) :: year, month, day, hour,minute,second
INTEGER, INTENT(OUT) :: thisdmp, tstop
INTEGER, INTENT(OUT) :: mapproj
REAL, INTENT(OUT) :: sclfct, trulat1, trulat2, trulon, latitud
REAL, INTENT(OUT) :: ctrlat, ctrlon, xgrdorg, ygrdorg
REAL, INTENT(OUT) :: umove, vmove
INTEGER, INTENT(OUT) :: grdflg, basflg, varflg, mstflg, iceflg
INTEGER, INTENT(OUT) :: trbflg, sfcflg, rainflg, landflg, totflg
INTEGER, INTENT(OUT) :: tkeflg, prcflg, radflg, flxflg, snowflg
INTEGER, INTENT(OUT) :: istatus
INCLUDE 'netcdf.inc'
INTEGER :: n
CHARACTER(LEN=80) :: tmpstr
CHARACTER(LEN=1) :: ach
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Annotation
!
runname(:) = ' '
istatus = NF_GET_ATT_TEXT(ncid,NF_GLOBAL,'RUNNAME',runname)
CALL net_check_error
(istatus,'NF_GET_ATT_TEXT in net_getatts')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'nocmnt',nocmnt)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_getatts')
DO n = 1, nocmnt
WRITE(tmpstr,'(a,I2.2)') 'cmnt',n
istatus = NF_GET_ATT_TEXT(ncid,NF_GLOBAL,TRIM(tmpstr),cmnt(n))
CALL net_check_error
(istatus,'NF_GET_ATT_TEXT in net_getatts')
END DO
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'DX',dx)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_getatts')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'DY',dy)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_getatts')
!
! Date & time
!
istatus = NF_GET_ATT_TEXT(ncid,NF_GLOBAL,'INITIAL_TIME',tmpstr)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_getatts')
READ(tmpstr,'(I4.4,5(a,I2.2))') year,ach,month,ach,day,ach, &
hour,ach,minute,ach,second
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'TSTOP',tstop)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_getatts')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'THISDMP',thisdmp)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_getatts')
!
! Map projection
!
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'MAPPROJ',mapproj)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_getatts')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'SCLFCT',sclfct)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_getatts')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'TRUELAT1',trulat1)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_getatts')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'TRUELAT2',trulat2)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_getatts')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'TRUELON',trulon)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_getatts')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'LATITUD',latitud)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_getatts')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'CTRLAT',ctrlat)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_getatts')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'CTRLON',ctrlon)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_getatts')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'XGRDORG',xgrdorg)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_getatts')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'YGRDORG',ygrdorg)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_getatts')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'UMOVE',umove)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_getatts')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'VMOVE',vmove)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_getatts')
!
! Flags
!
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'GRDFLG',grdflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_getatts')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'BASFLG',basflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_getatts')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'VARFLG',varflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_getatts')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'MSTFLG',mstflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_getatts')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'ICEFLG',iceflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_getatts')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'TRBFLG',trbflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_getatts')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'SFCFLG',sfcflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_getatts')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'RAINFLG',rainflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_getatts')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'LANDFLG',landflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_getatts')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'TOTFLG',totflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_getatts')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'TKEFLG',tkeflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_getatts')
IF (totflg == 1) THEN
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'PRCFLG',prcflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_getatts')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'RADFLG',radflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_getatts')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'FLXFLG',flxflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_getatts')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'SNOWFLG',snowflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_getatts')
END IF
RETURN
END SUBROUTINE net_getatts
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE netread1d ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE netread1d(ncid,packed,itime,varname,nx,var1d) 6,6
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in a 1D array from the ARPS NetCDF file.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: ncid
INTEGER, INTENT(IN) :: packed
INTEGER, INTENT(IN) :: itime
CHARACTER(LEN=*), INTENT(IN) :: varname
INTEGER, INTENT(IN) :: nx
REAL, INTENT(OUT) :: var1d(nx)
!-----------------------------------------------------------------------
!
! Misc. Local variables
!
!-----------------------------------------------------------------------
INCLUDE 'netcdf.inc'
INTEGER :: istatus
INTEGER :: varid
CHARACTER(LEN=20) :: namein
INTEGER :: vartype, ndims,natts,dimlen
INTEGER :: dimids(5)
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
WRITE(6,FMT='(1x,2a)',ADVANCE='NO') &
' Reading 1D NetCDF variable ', varname
!
! Get variable ID
!
istatus = NF_INQ_VARID(ncid,varname,varid)
CALL net_check_error
(istatus,'NF_INQ_VARID in netread1d')
!
! Do some checks
!
istatus = NF_INQ_VAR(ncid,varid,namein,vartype,ndims,dimids,natts)
CALL net_check_error
(istatus,'NF_INQ_VAR in netread1d')
IF(vartype /= NF_FLOAT) THEN ! Data type
WRITE(6,'(1x,3a)') 'Variable ',varname, ' is not REAL.'
STOP 'WRONG_VAR_TYPE'
END IF
! Data rank
IF((ndims /= 2 .AND. itime > 0) .OR. (ndims /= 1 .AND. itime == 0) ) THEN
WRITE(6,'(1x,3a)') 'Variable ', varname, ' is not a 1D array.'
STOP 'WRONG_VAR_DIMENSIONS'
END IF
! X dimension length
istatus = NF_INQ_DIMLEN(ncid,dimids(1),dimlen)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in netread1d')
IF(dimlen /= nx) THEN
WRITE(6,'(1x,3a,I3,a,I3)') 'First dimension of variable ', varname, &
' is ',dimlen, ' and it should be ',nx
STOP 'WRONG_DIM_length'
END IF
IF (itime > 0) THEN ! Record No. if applied
istatus = NF_INQ_DIMLEN(ncid,dimids(2),dimlen)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in netread1d')
IF(dimlen < itime) THEN
WRITE(6,'(1x,a,I3,a,I3)') 'The total records number is ', dimlen, &
' however, the required time level is ',itime
STOP 'itime_tool_large'
END IF
END IF
IF (itime > 0) THEN
istatus = NF_GET_VARA_REAL(ncid,varid,(/1,itime/),(/nx,1/),var1d)
CALL net_check_error
(istatus,'NF_GET_VARA_REAL in netread1d')
ELSE
istatus = NF_GET_VARA_REAL(ncid,varid,(/1/),(/nx/),var1d)
CALL net_check_error
(istatus,'NF_GET_VARA_REAL in netread1d')
END IF
WRITE(6,'(a)') ' === DONE ==='
RETURN
END SUBROUTINE netread1d
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE netread2d ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE netread2d(ncid,packed,itime,varname,nx,ny,var2d) 48,7
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in a 2D array from the ARPS NetCDF file.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: ncid
INTEGER, INTENT(IN) :: packed
INTEGER, INTENT(IN) :: itime
CHARACTER(LEN=*), INTENT(IN) :: varname
INTEGER, INTENT(IN) :: nx
INTEGER, INTENT(IN) :: ny
REAL, INTENT(OUT) :: var2d(nx,ny)
!-----------------------------------------------------------------------
!
! Misc. Local variables
!
!-----------------------------------------------------------------------
INCLUDE 'netcdf.inc'
INTEGER :: istatus
INTEGER :: varid
CHARACTER(LEN=20) :: namein
INTEGER :: vartype, ndims,natts,dimlen
INTEGER :: dimids(5)
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
WRITE(6,FMT='(1x,2a)',ADVANCE='NO') &
' Reading 2D NetCDF variable ', varname
!
! Get variable ID
!
istatus = NF_INQ_VARID(ncid,varname,varid)
CALL net_check_error
(istatus,'NF_INQ_VARID in netread2d')
!
! Do some checks
!
istatus = NF_INQ_VAR(ncid,varid,namein,vartype,ndims,dimids,natts)
CALL net_check_error
(istatus,'NF_INQ_VAR in netread2d')
IF(vartype /= NF_FLOAT) THEN ! Data type
WRITE(6,'(1x,3a)') 'Variable ',varname, ' is not REAL.'
STOP 'WRONG_VAR_TYPE'
END IF
! Data rank
IF((ndims /= 3 .AND. itime > 0) .OR. (ndims /= 2 .AND. itime == 0) ) THEN
WRITE(6,'(1x,3a)') 'Variable ', varname, ' is not a 2D array.'
STOP 'WRONG_VAR_DIMENSIONS'
END IF
! X dimension length
istatus = NF_INQ_DIMLEN(ncid,dimids(1),dimlen)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in netread2d')
IF(dimlen /= nx) THEN
WRITE(6,'(1x,3a,I3,a,I3)') 'First dimension of variable ', varname, &
' is ',dimlen, ' and it should be ',nx
STOP 'WRONG_DIM_length'
END IF
! Y dimension length
istatus = NF_INQ_DIMLEN(ncid,dimids(2),dimlen)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in netread2d')
IF(dimlen /= ny) THEN
WRITE(6,'(1x,3a,I3,a,I3)') 'Second dimension of variable ',varname, &
' is ',dimlen, ' and it should be ',ny
STOP 'WRONG_DIM_length'
END IF
IF (itime > 0) THEN ! Record No. if applied
istatus = NF_INQ_DIMLEN(ncid,dimids(3),dimlen)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in netread2d')
IF(dimlen < itime) THEN
WRITE(6,'(1x,a,I3,a,I3)') 'The total records number is ', dimlen, &
' however, the required time level is ',itime
STOP 'itime_tool_large'
END IF
END IF
IF (itime > 0) THEN
istatus = NF_GET_VARA_REAL(ncid,varid,(/1,1,itime/),(/nx,ny,1/),var2d)
CALL net_check_error
(istatus,'NF_GET_VARA_REAL in netread2d')
ELSE
istatus = NF_GET_VARA_REAL(ncid,varid,(/1,1/),(/nx,ny/),var2d)
CALL net_check_error
(istatus,'NF_GET_VARA_REAL in netread2d')
END IF
WRITE(6,'(a)') ' === DONE ==='
RETURN
END SUBROUTINE netread2d
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE netread2di ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE netread2di(ncid,packed,itime,varname,nx,ny,var2d) 5,7
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in a 2D INTEGER array from the ARPS NetCDF file.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: ncid
INTEGER, INTENT(IN) :: packed
INTEGER, INTENT(IN) :: itime
CHARACTER(LEN=*), INTENT(IN) :: varname
INTEGER, INTENT(IN) :: nx
INTEGER, INTENT(IN) :: ny
INTEGER, INTENT(OUT) :: var2d(nx,ny)
!-----------------------------------------------------------------------
!
! Misc. Local variables
!
!-----------------------------------------------------------------------
INCLUDE 'netcdf.inc'
INTEGER :: istatus
INTEGER :: varid
CHARACTER(LEN=20) :: namein
INTEGER :: vartype, ndims,natts,dimlen
INTEGER :: dimids(5)
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
WRITE(6,FMT='(1x,2a)',ADVANCE='NO') &
' Reading 2D integer NetCDF variable ', varname
!
! Get variable ID
!
istatus = NF_INQ_VARID(ncid,varname,varid)
CALL net_check_error
(istatus,'NF_INQ_VARID in netread2di')
!
! Do some checks
!
istatus = NF_INQ_VAR(ncid,varid,namein,vartype,ndims,dimids,natts)
CALL net_check_error
(istatus,'NF_INQ_VAR in netread2di')
IF(vartype /= NF_INT) THEN ! Data type
WRITE(6,'(1x,3a)') 'Variable ',varname, ' is not REAL.'
STOP 'WRONG_VAR_TYPE'
END IF
! Data rank
IF((ndims /= 3 .AND. itime > 0) .OR. (ndims /= 2 .AND. itime == 0) ) THEN
WRITE(6,'(1x,3a)') 'Variable ', varname, ' is not a 2D array.'
STOP 'WRONG_VAR_DIMENSIONS'
END IF
! X dimension length
istatus = NF_INQ_DIMLEN(ncid,dimids(1),dimlen)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in netread2di')
IF(dimlen /= nx) THEN
WRITE(6,'(1x,3a,I3,a,I3)') 'First dimension of variable ', varname, &
' is ',dimlen, ' and it should be ',nx
STOP 'WRONG_DIM_length'
END IF
! Y dimension length
istatus = NF_INQ_DIMLEN(ncid,dimids(2),dimlen)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in netread2di')
IF(dimlen /= ny) THEN
WRITE(6,'(1x,3a,I3,a,I3)') 'Second dimension of variable ',varname, &
' is ',dimlen, ' and it should be ',ny
STOP 'WRONG_DIM_length'
END IF
IF (itime > 0) THEN ! Record No. if applied
istatus = NF_INQ_DIMLEN(ncid,dimids(3),dimlen)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in netread2di')
IF(dimlen < itime) THEN
WRITE(6,'(1x,a,I3,a,I3)') 'The total records number is ', dimlen, &
' however, the required time level is ',itime
STOP 'itime_tool_large'
END IF
END IF
IF (itime > 0) THEN
istatus = NF_GET_VARA_INT(ncid,varid,(/1,1,itime/),(/nx,ny,1/),var2d)
CALL net_check_error
(istatus,'NF_GET_VARA_REAL in netread2di')
ELSE
istatus = NF_GET_VARA_INT(ncid,varid,(/1,1/),(/nx,ny/),var2d)
CALL net_check_error
(istatus,'NF_GET_VARA_REAL in netread2di')
END IF
WRITE(6,'(a)') ' === DONE ==='
RETURN
END SUBROUTINE netread2di
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE netread3d ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE netread3d(ncid,packed,itime,varname,nx,ny,nz,var3d) 94,7
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in a 3D array from the ARPS NetCDF file.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: ncid
INTEGER, INTENT(IN) :: packed
INTEGER, INTENT(IN) :: itime
CHARACTER(LEN=*), INTENT(IN) :: varname
INTEGER, INTENT(IN) :: nx
INTEGER, INTENT(IN) :: ny
INTEGER, INTENT(IN) :: nz
REAL, INTENT(OUT) :: var3d(nx,ny,nz)
!-----------------------------------------------------------------------
!
! Misc. Local variables
!
!-----------------------------------------------------------------------
INCLUDE 'netcdf.inc'
INTEGER :: istatus
INTEGER :: varid
CHARACTER(LEN=20) :: namein
INTEGER :: vartype, ndims,natts,dimlen
INTEGER :: dimids(5)
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
WRITE(6,FMT='(1x,2a)',ADVANCE='NO') &
' Reading 3D NetCDF variable ', TRIM(varname)
!
! Get variable ID
!
istatus = NF_INQ_VARID(ncid,varname,varid)
CALL net_check_error
(istatus,'NF_INQ_VARID in netread3d')
!
! Do some checks
!
istatus = NF_INQ_VAR(ncid,varid,namein,vartype,ndims,dimids,natts)
CALL net_check_error
(istatus,'NF_INQ_VAR in netread3d')
IF(vartype /= NF_FLOAT) THEN ! Data type
WRITE(6,'(1x,3a)') 'Variable ',varname, ' is not REAL.'
STOP 'WRONG_VAR_TYPE'
END IF
! Data rank
IF((ndims /= 4 .AND. itime > 0) .OR. (ndims /= 3 .AND. itime == 0) ) THEN
WRITE(6,'(1x,3a)') 'Variable ', varname, ' is not a 2D array.'
STOP 'WRONG_VAR_DIMENSIONS'
END IF
! X dimension length
istatus = NF_INQ_DIMLEN(ncid,dimids(1),dimlen)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in netread3d')
IF(dimlen /= nx) THEN
WRITE(6,'(1x,3a,I3,a,I3)') 'First dimension of variable ', varname, &
' is ',dimlen, ' and it should be ',nx
STOP 'WRONG_DIM_length'
END IF
! Y dimension length
istatus = NF_INQ_DIMLEN(ncid,dimids(2),dimlen)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in netread3d')
IF(dimlen /= ny) THEN
WRITE(6,'(1x,3a,I3,a,I3)') 'Second dimension of variable ',varname, &
' is ',dimlen, ' and it should be ',ny
STOP 'WRONG_DIM_length'
END IF
! Z dimension length
istatus = NF_INQ_DIMLEN(ncid,dimids(3),dimlen)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in netread3d')
IF(dimlen /= nz) THEN
WRITE(6,'(1x,3a,I3,a,I3)') 'Third dimension of variable ',varname, &
' is ',dimlen, ' and it should be ',nz
STOP 'WRONG_DIM_length'
END IF
IF (itime > 0) THEN ! Record No. if applied
istatus = NF_INQ_DIMLEN(ncid,dimids(4),dimlen)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in netread3d')
IF(dimlen < itime) THEN
WRITE(6,'(1x,a,I3,a,I3)') 'The total records number is ', dimlen, &
' however, the required time level is ',itime
STOP 'itime_tool_large'
END IF
END IF
IF (itime > 0) THEN
istatus = NF_GET_VARA_REAL(ncid,varid,(/1,1,1,itime/), &
(/nx,ny,nz,1/),var3d)
ELSE
istatus = NF_GET_VARA_REAL(ncid,varid,(/1,1,1/), &
(/nx,ny,nz/),var3d)
END IF
CALL net_check_error
(istatus,'NF_GET_VARA_REAL in netread3d')
WRITE(6,'(a)') ' === DONE ==='
RETURN
END SUBROUTINE netread3d
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE netread3di ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE netread3di(ncid,packed,itime,varname,nx,ny,nz,var3d) 8,7
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in a 3D integer array from the ARPS NetCDF file.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: ncid
INTEGER, INTENT(IN) :: packed
INTEGER, INTENT(IN) :: itime
CHARACTER(LEN=*), INTENT(IN) :: varname
INTEGER, INTENT(IN) :: nx
INTEGER, INTENT(IN) :: ny
INTEGER, INTENT(IN) :: nz
INTEGER, INTENT(OUT) :: var3d(nx,ny,nz)
!-----------------------------------------------------------------------
!
! Misc. Local variables
!
!-----------------------------------------------------------------------
INCLUDE 'netcdf.inc'
INTEGER :: istatus
INTEGER :: varid
CHARACTER(LEN=20) :: namein
INTEGER :: vartype, ndims,natts,dimlen
INTEGER :: dimids(5)
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
WRITE(6,FMT='(1x,2a)',ADVANCE='NO') &
' Reading 3D integer NetCDF variable ', varname
!
! Get variable ID
!
istatus = NF_INQ_VARID(ncid,varname,varid)
CALL net_check_error
(istatus,'NF_INQ_VARID in netread3di')
!
! Do some checks
!
istatus = NF_INQ_VAR(ncid,varid,namein,vartype,ndims,dimids,natts)
CALL net_check_error
(istatus,'NF_INQ_VAR in netread3di')
IF(vartype /= NF_INT) THEN ! Data type
WRITE(6,'(1x,3a)') 'Variable ',varname, ' is not INTEGER.'
STOP 'WRONG_VAR_TYPE'
END IF
! Data rank
IF((ndims /= 4 .AND. itime > 0) .OR. (ndims /= 3 .AND. itime == 0) ) THEN
WRITE(6,'(1x,3a)') 'Variable ', varname, ' is not a 2D array.'
STOP 'WRONG_VAR_DIMENSIONS'
END IF
! X dimension length
istatus = NF_INQ_DIMLEN(ncid,dimids(1),dimlen)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in netread3di')
IF(dimlen /= nx) THEN
WRITE(6,'(1x,3a,I3,a,I3)') 'First dimension of variable ', varname, &
' is ',dimlen, ' and it should be ',nx
STOP 'WRONG_DIM_length'
END IF
! Y dimension length
istatus = NF_INQ_DIMLEN(ncid,dimids(2),dimlen)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in netread3di')
IF(dimlen /= ny) THEN
WRITE(6,'(1x,3a,I3,a,I3)') 'Second dimension of variable ',varname, &
' is ',dimlen, ' and it should be ',ny
STOP 'WRONG_DIM_length'
END IF
! Z dimension length
istatus = NF_INQ_DIMLEN(ncid,dimids(3),dimlen)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in netread3di')
IF(dimlen /= nz) THEN
WRITE(6,'(1x,3a,I3,a,I3)') 'Third dimension of variable ',varname, &
' is ',dimlen, ' and it should be ',nz
STOP 'WRONG_DIM_length'
END IF
IF (itime > 0) THEN ! Record No. if applied
istatus = NF_INQ_DIMLEN(ncid,dimids(4),dimlen)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in netread3di')
IF(dimlen < itime) THEN
WRITE(6,'(1x,a,I3,a,I3)') 'The total records number is ', dimlen, &
' however, the required time level is ',itime
STOP 'itime_tool_large'
END IF
END IF
IF (itime > 0) THEN
istatus = NF_GET_VARA_INT(ncid,varid,(/1,1,1,itime/), &
(/nx,ny,nz,1/),var3d)
ELSE
istatus = NF_GET_VARA_INT(ncid,varid,(/1,1,1/), &
(/nx,ny,nz/),var3d)
END IF
CALL net_check_error
(istatus,'NF_GET_VARA_REAL in netread3di')
WRITE(6,'(a)') ' === DONE ==='
RETURN
END SUBROUTINE netread3di
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE netread4d ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE netread4d(ncid,packed,itime,varname,nx,ny,nz,nn,var4d) 10,8
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in a 3D array from the ARPS NetCDF file.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: ncid
INTEGER, INTENT(IN) :: packed
INTEGER, INTENT(IN) :: itime
CHARACTER(LEN=*), INTENT(IN) :: varname
INTEGER, INTENT(IN) :: nx
INTEGER, INTENT(IN) :: ny
INTEGER, INTENT(IN) :: nz
INTEGER, INTENT(IN) :: nn
REAL, INTENT(OUT) :: var4d(nx,ny,nz,nn)
!-----------------------------------------------------------------------
!
! Misc. Local variables
!
!-----------------------------------------------------------------------
INCLUDE 'netcdf.inc'
INTEGER :: istatus
INTEGER :: varid
CHARACTER(LEN=20) :: namein
INTEGER :: vartype, ndims,natts,dimlen
INTEGER :: dimids(5)
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
WRITE(6,FMT='(1x,2a)',ADVANCE='NO') &
' Reading 4D NetCDF variable ', varname
!
! Get variable ID
!
istatus = NF_INQ_VARID(ncid,varname,varid)
CALL net_check_error
(istatus,'NF_INQ_VARID in netread4d')
!
! Do some checks
!
istatus = NF_INQ_VAR(ncid,varid,namein,vartype,ndims,dimids,natts)
CALL net_check_error
(istatus,'NF_INQ_VAR in netread4d')
IF(vartype /= NF_FLOAT) THEN ! Data type
WRITE(6,'(1x,3a)') 'Variable ',varname, ' is not REAL.'
STOP 'WRONG_VAR_TYPE'
END IF
! Data rank
IF((ndims /= 5 .AND. itime > 0) .OR. (ndims /= 4 .AND. itime == 0) ) THEN
WRITE(6,'(1x,3a)') 'Variable ', varname, ' is not a 2D array.'
STOP 'WRONG_VAR_DIMENSIONS'
END IF
! X dimension length
istatus = NF_INQ_DIMLEN(ncid,dimids(1),dimlen)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in netread4d')
IF(dimlen /= nx) THEN
WRITE(6,'(1x,3a,I3,a,I3)') 'First dimension of variable ', varname, &
' is ',dimlen, ' and it should be ',nx
STOP 'WRONG_DIM_length'
END IF
! Y dimension length
istatus = NF_INQ_DIMLEN(ncid,dimids(2),dimlen)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in netread4d')
IF(dimlen /= ny) THEN
WRITE(6,'(1x,3a,I3,a,I3)') 'Second dimension of variable ',varname, &
' is ',dimlen, ' and it should be ',ny
STOP 'WRONG_DIM_length'
END IF
! Z dimension length
istatus = NF_INQ_DIMLEN(ncid,dimids(3),dimlen)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in netread4d')
IF(dimlen /= nz) THEN
WRITE(6,'(1x,3a,I3,a,I3)') 'Third dimension of variable ',varname, &
' is ',dimlen, ' and it should be ',nz
STOP 'WRONG_DIM_length'
END IF
! nstyps dimension length
istatus = NF_INQ_DIMLEN(ncid,dimids(4),dimlen)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in netread4d')
IF(dimlen /= nn) THEN
WRITE(6,'(1x,3a,I3,a,I3)') 'Fourth dimension of variable ',varname, &
' is ',dimlen, ' and it should be ',nn
STOP 'WRONG_DIM_length'
END IF
IF (itime > 0) THEN ! Record No. if applied
istatus = NF_INQ_DIMLEN(ncid,dimids(5),dimlen)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in netread4d')
IF(dimlen < itime) THEN
WRITE(6,'(1x,a,I3,a,I3)') 'The total records number is ', dimlen, &
' however, the required time level is ',itime
STOP 'itime_tool_large'
END IF
END IF
IF (itime > 0) THEN
istatus = NF_GET_VARA_REAL(ncid,varid,(/1,1,1,1,itime/), &
(/nx,ny,nz,nn,1/),var4d)
ELSE
istatus = NF_GET_VARA_REAL(ncid,varid,(/1,1,1,1/), &
(/nx,ny,nz,nn/),var4d)
END IF
CALL net_check_error
(istatus,'NF_GET_VARA_REAL in netread4d')
WRITE(6,'(a)') ' === DONE ==='
RETURN
END SUBROUTINE netread4d
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE netreadTime ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE netreadTime(ncid,itime,varname,time) 2,2
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in current Valid time from the ARPS NetCDF file.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: ncid
INTEGER, INTENT(IN) :: itime
CHARACTER(LEN=*), INTENT(IN) :: varname
REAL, INTENT(OUT) :: time
!-----------------------------------------------------------------------
!
! Misc. Local variables
!
!-----------------------------------------------------------------------
INCLUDE 'netcdf.inc'
INTEGER :: istatus
INTEGER :: varid
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
! WRITE(6,FMT='(1x,2a)',ADVANCE='NO') &
! ' Reading data valid time ', varname
!
! Get variable ID
!
istatus = NF_INQ_VARID(ncid,varname,varid)
CALL net_check_error
(istatus,'NF_INQ_VARID in netreadTime')
IF (itime > 0) THEN
istatus = NF_GET_VARA_REAL(ncid,varid,(/itime/),(/1/),time)
ELSE
WRITE(6,'(1x,a)') 'There should not CURTIME variable in the data file.'
STOP
END IF
CALL net_check_error
(istatus,'NF_GET_VARA_REAL in netreadTime')
! WRITE(6,'(a)') ' === DONE ==='
RETURN
END SUBROUTINE netreadTime
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE net_define_trn ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE net_define_trn(ncid,nx,ny,dx,dy,mapproj,sclfct, & 2,6
trulat1,trulat2,trulon,ctrlat,ctrlon, &
istatus)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Define ARPS terrain data file attributes and variables. After this call
! The netCDF file should be in DATA mode.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yunheng Wang (08/10/2004)
!
! MODIFIED HISTORY:
!
!-----------------------------------------------------------------------
USE arps_netio_metadata
IMPLICIT NONE
INTEGER, INTENT(IN) :: ncid
INTEGER, INTENT(IN) :: nx, ny
REAL, INTENT(IN) :: dx, dy
INTEGER, INTENT(IN) :: mapproj
REAL, INTENT(IN) :: sclfct
REAL, INTENT(IN) :: trulat1, trulat2, trulon
REAL, INTENT(IN) :: ctrlat, ctrlon
INTEGER, INTENT(OUT) :: istatus
!-----------------------------------------------------------------------
!
! Included files
!
!-----------------------------------------------------------------------
INCLUDE 'netcdf.inc'
!-----------------------------------------------------------------------
!
! Local variables
!
!-----------------------------------------------------------------------
INTEGER :: varid
INTEGER :: dimx_id,dimy_id
INTEGER :: oldfillmode
CHARACTER(LEN=80) :: tmpstr
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Define dimensions
!
!-----------------------------------------------------------------------
istatus = NF_DEF_DIM(ncid,'x',nx-1,dimx_id)
CALL net_check_error
(istatus,'net_define_trn')
istatus = NF_DEF_DIM(ncid,'y',ny-1,dimy_id)
CALL net_check_error
(istatus,'net_define_trn')
!-----------------------------------------------------------------------
!
! Define global attributes
!
!-----------------------------------------------------------------------
tmpstr = 'ARPS 5.2 terrain data (ARPSTRN)'
CALL netwrt_general_att
(ncid,0,tmpstr,nx,ny,dx,dy,mapproj,sclfct, &
trulat1,trulat2,trulon,ctrlat,ctrlon,istatus)
! do not fill, will set values explicitly later. Improve performance
istatus = NF_SET_FILL(ncid,NF_NOFILL,oldfillmode)
!-----------------------------------------------------------------------
!
! Define variable arrays
!
!-----------------------------------------------------------------------
istatus = NF_DEF_VAR(ncid,'HTERAIN',NF_FLOAT,2,(/dimx_id,dimy_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',trnmeta%hterrain)
!-----------------------------------------------------------------------
!
! End NetCDF file DEFINE mode
!
!-----------------------------------------------------------------------
istatus = NF_ENDDEF(ncid)
CALL net_check_error
(istatus,'net_define_trn')
RETURN
END SUBROUTINE net_define_trn
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE net_get_trn ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE net_get_trn(ncid,nx,ny,dx,dy,mapproj,sclfct, & 3,13
trulat1,trulat2,trulon,ctrlat,ctrlon,istatus)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Extract NetCDF file dimensions and attributes from ARPS terrain
! data.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yunheng Wang (08/11/2004)
!
! MODIFIED HISTORY:
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: ncid
INTEGER, INTENT(OUT) :: nx, ny
REAL, INTENT(OUT) :: dx, dy
INTEGER, INTENT(OUT) :: mapproj
REAL, INTENT(OUT) :: sclfct
REAL, INTENT(OUT) :: trulat1, trulat2, trulon
REAL, INTENT(OUT) :: ctrlat, ctrlon
INTEGER, INTENT(OUT) :: istatus
!-----------------------------------------------------------------------
!
! Included files
!
!-----------------------------------------------------------------------
INCLUDE 'netcdf.inc'
!-----------------------------------------------------------------------
!
! Local variables
!
!-----------------------------------------------------------------------
INTEGER :: varid
INTEGER :: dimx_id,dimy_id
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Get dimensions
!
!-----------------------------------------------------------------------
istatus = NF_INQ_DIMID(ncid,'x',dimx_id)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_get_trn')
istatus = NF_INQ_DIMLEN(ncid,dimx_id,nx)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_get_trn')
istatus = NF_INQ_DIMID(ncid,'y',dimy_id)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_get_trn')
istatus = NF_INQ_DIMLEN(ncid,dimy_id,ny)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_get_trn')
nx = nx + 1
ny = ny + 1
!-----------------------------------------------------------------------
!
! Get global attributes
!
!-----------------------------------------------------------------------
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'DX',dx)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_get_trn')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'DY',dy)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_get_trn')
!
! Map projection
!
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'MAPPROJ',mapproj)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_getatts')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'SCLFCT',sclfct)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_getatts')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'TRUELAT1',trulat1)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_getatts')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'TRUELAT2',trulat2)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_getatts')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'TRUELON',trulon)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_getatts')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'CTRLAT',ctrlat)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_getatts')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'CTRLON',ctrlon)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_getatts')
RETURN
END SUBROUTINE net_get_trn
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE net_define_sfc ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE net_define_sfc(ncid,nx,ny,nstyps,dx,dy,mapproj,sclfct, & 2,13
trulat1,trulat2,trulon,ctrlat,ctrlon, &
stypflg,vtypflg,laiflg,rfnsflg,vegflg,ndviflg, &
istatus)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Define ARPS surface data file attributes and variables. After this call
! The netCDF file should be in DATA mode.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yunheng Wang (08/12/2004)
!
! MODIFIED HISTORY:
!
!-----------------------------------------------------------------------
use arps_netio_metadata
IMPLICIT NONE
INTEGER, INTENT(IN) :: ncid
INTEGER, INTENT(IN) :: nx, ny, nstyps
REAL, INTENT(IN) :: dx, dy
INTEGER, INTENT(IN) :: mapproj
REAL, INTENT(IN) :: sclfct
REAL, INTENT(IN) :: trulat1, trulat2, trulon
REAL, INTENT(IN) :: ctrlat, ctrlon
INTEGER, INTENT(IN) :: stypflg, vtypflg, laiflg
INTEGER, INTENT(IN) :: rfnsflg, vegflg, ndviflg
INTEGER, INTENT(OUT) :: istatus
!-----------------------------------------------------------------------
!
! Included files
!
!-----------------------------------------------------------------------
INCLUDE 'netcdf.inc'
!-----------------------------------------------------------------------
!
! Local variables
!
!-----------------------------------------------------------------------
INTEGER :: varid
INTEGER :: dimx_id, dimy_id, dimn_id
INTEGER :: oldfillmode
CHARACTER(LEN=80) :: tmpstr
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----------------------------------------------------------------------
!
! Define dimensions
!
!-----------------------------------------------------------------------
istatus = NF_DEF_DIM(ncid,'x',nx-1,dimx_id)
CALL net_check_error
(istatus,'net_define_sfc')
istatus = NF_DEF_DIM(ncid,'y',ny-1,dimy_id)
CALL net_check_error
(istatus,'net_define_sfc')
istatus = NF_DEF_DIM(ncid,'nstyp',nstyps,dimn_id)
CALL net_check_error
(istatus,'net_define_sfc')
!-----------------------------------------------------------------------
!
! Define global attributes
!
!-----------------------------------------------------------------------
tmpstr = 'ARPS 5.2 surface characteristics data (ARPSSFC)'
CALL netwrt_general_att
(ncid,0,tmpstr,nx,ny,dx,dy,mapproj,sclfct, &
trulat1,trulat2,trulon,ctrlat,ctrlon,istatus)
!
! Flags
!
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'STYPFLG',NF_INT,1,stypflg)
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'VTYPFLG',NF_INT,1,vtypflg)
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'LAIFLG', NF_INT,1,laiflg)
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'RFNSFLG',NF_INT,1,rfnsflg)
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'VEGFLG', NF_INT,1,vegflg)
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'NDVIFLG',NF_INT,1,ndviflg)
! do not fill, will set values explicitly later. Improve performance
istatus = NF_SET_FILL(ncid,NF_NOFILL,oldfillmode)
!-----------------------------------------------------------------------
!
! Define variable arrays
!
!-----------------------------------------------------------------------
IF (stypflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'SOILTYP',NF_INT,3, &
(/dimx_id,dimy_id,dimn_id/),varid)
CALL net_define_var_meta
(ncid,varid,'INT',sfcmeta%soiltyp)
istatus = NF_DEF_VAR(ncid,'STYPFRCT',NF_FLOAT,3, &
(/dimx_id,dimy_id,dimn_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',sfcmeta%stypfrct)
END IF
IF (vtypflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'VEGTYP',NF_INT,2,(/dimx_id,dimy_id/),varid)
CALL net_define_var_meta
(ncid,varid,'INT',sfcmeta%vegtyp)
END IF
IF (laiflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'LAI',NF_FLOAT,2,(/dimx_id,dimy_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',sfcmeta%lai)
END IF
IF (rfnsflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'ROUFNS',NF_FLOAT,2,(/dimx_id,dimy_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',sfcmeta%roufns)
END IF
IF (vegflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'VEG',NF_FLOAT,2,(/dimx_id,dimy_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',sfcmeta%veg)
END IF
IF (ndviflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'NDVI',NF_FLOAT,2,(/dimx_id,dimy_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',sfcmeta%ndvi)
END IF
!-----------------------------------------------------------------------
!
! End NetCDF file DEFINE mode
!
!-----------------------------------------------------------------------
istatus = NF_ENDDEF(ncid)
CALL net_check_error
(istatus,'net_define_sfc')
RETURN
END SUBROUTINE net_define_sfc
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE net_get_sfc ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE net_get_sfc(ncid,nx,ny,nstyps,dx,dy, & 3,21
mapproj,sclfct,trulat1,trulat2,trulon,ctrlat,ctrlon, &
stypflg,vtypflg,laiflg,rfnsflg,vegflg,ndviflg,istatus)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Extract NetCDF file dimensions and attributes from ARPS surface
! data.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yunheng Wang (08/12/2004)
!
! MODIFIED HISTORY:
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: ncid
INTEGER, INTENT(OUT) :: nx, ny, nstyps
REAL, INTENT(OUT) :: dx, dy
INTEGER, INTENT(OUT) :: mapproj
REAL, INTENT(OUT) :: sclfct
REAL, INTENT(OUT) :: trulat1, trulat2, trulon
REAL, INTENT(OUT) :: ctrlat, ctrlon
INTEGER, INTENT(OUT) :: stypflg, vtypflg, laiflg
INTEGER, INTENT(OUT) :: rfnsflg, vegflg, ndviflg
INTEGER, INTENT(OUT) :: istatus
!-----------------------------------------------------------------------
!
! Included files
!
!-----------------------------------------------------------------------
INCLUDE 'netcdf.inc'
!-----------------------------------------------------------------------
!
! Local variables
!
!-----------------------------------------------------------------------
INTEGER :: varid
INTEGER :: dimx_id,dimy_id,dimn_id
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Get dimensions
!
!-----------------------------------------------------------------------
istatus = NF_INQ_DIMID(ncid,'x',dimx_id)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_get_sfc')
istatus = NF_INQ_DIMLEN(ncid,dimx_id,nx)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_get_sfc')
istatus = NF_INQ_DIMID(ncid,'y',dimy_id)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_get_sfc')
istatus = NF_INQ_DIMLEN(ncid,dimy_id,ny)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_get_sfc')
istatus = NF_INQ_DIMID(ncid,'nstyp',dimn_id)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_get_sfc')
istatus = NF_INQ_DIMLEN(ncid,dimn_id,nstyps)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_get_sfc')
nx = nx + 1
ny = ny + 1
!-----------------------------------------------------------------------
!
! Get global attributes
!
!-----------------------------------------------------------------------
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'DX',dx)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_get_sfc')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'DY',dy)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_get_sfc')
!
! Map projection
!
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'MAPPROJ',mapproj)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_get_sfc')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'SCLFCT',sclfct)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_get_sfc')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'TRUELAT1',trulat1)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_get_sfc')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'TRUELAT2',trulat2)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_get_sfc')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'TRUELON',trulon)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_get_sfc')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'CTRLAT',ctrlat)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_get_sfc')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'CTRLON',ctrlon)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_get_sfc')
!
! Flags
!
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'STYPFLG',stypflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_get_sfc')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'VTYPFLG',vtypflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_get_sfc')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'LAIFLG',laiflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_get_sfc')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'RFNSFLG',rfnsflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_get_sfc')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'VEGFLG',vegflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_get_sfc')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'NDVIFLG',ndviflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_get_sfc')
RETURN
END SUBROUTINE net_get_sfc
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE net_define_soil ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE net_define_soil(ncid,nx,ny,nzsoil,nstyps,dx,dy,mapproj, & 2,14
sclfct,trulat1,trulat2,trulon,ctrlat,ctrlon, &
zpsoilflg,tsoilflg,qsoilflg,wcanpflg, &
snowdflg,stypflg,istatus)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Define ARPS soil data file attributes and variables. After this call
! The netCDF file should be in DATA mode.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yunheng Wang (08/13/2004)
!
! MODIFIED HISTORY:
!
!-----------------------------------------------------------------------
USE arps_netio_metadata
IMPLICIT NONE
INTEGER, INTENT(IN) :: ncid
INTEGER, INTENT(IN) :: nx, ny, nzsoil, nstyps
REAL, INTENT(IN) :: dx, dy
INTEGER, INTENT(IN) :: mapproj
REAL, INTENT(IN) :: sclfct
REAL, INTENT(IN) :: trulat1, trulat2, trulon
REAL, INTENT(IN) :: ctrlat, ctrlon
INTEGER, INTENT(IN) :: zpsoilflg, tsoilflg, qsoilflg
INTEGER, INTENT(IN) :: wcanpflg, snowdflg, stypflg
INTEGER, INTENT(OUT) :: istatus
!-----------------------------------------------------------------------
!
! Included files
!
!-----------------------------------------------------------------------
INCLUDE 'netcdf.inc'
!-----------------------------------------------------------------------
!
! Local variables
!
!-----------------------------------------------------------------------
INTEGER :: varid
INTEGER :: dimx_id, dimy_id, dimz_id, dimn_id
INTEGER :: dims_id
INTEGER :: oldfillmode
CHARACTER(LEN=80) :: tmpstr
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Define dimensions
!
!-----------------------------------------------------------------------
istatus = NF_DEF_DIM(ncid,'x',nx-1,dimx_id)
CALL net_check_error
(istatus,'net_define_soil')
istatus = NF_DEF_DIM(ncid,'y',ny-1,dimy_id)
CALL net_check_error
(istatus,'net_define_soil')
istatus = NF_DEF_DIM(ncid,'zsoil',nzsoil,dimz_id)
CALL net_check_error
(istatus,'net_define_soil')
istatus = NF_DEF_DIM(ncid,'nstyp',nstyps,dimn_id)
CALL net_check_error
(istatus,'net_define_soil')
istatus = NF_DEF_DIM(ncid,'nstyp_total',nstyps+1,dims_id)
CALL net_check_error
(istatus,'net_define_soil')
!-----------------------------------------------------------------------
!
! Define global attributes
!
!-----------------------------------------------------------------------
tmpstr = 'ARPS 5.2 Soil data'
CALL netwrt_general_att
(ncid,0,tmpstr,nx,ny,dx,dy,mapproj,sclfct, &
trulat1,trulat2,trulon,ctrlat,ctrlon,istatus)
!
! Flags
!
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'ZPSOILFLG',NF_INT,1,zpsoilflg)
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'TSOILFLG', NF_INT,1,tsoilflg)
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'QSOILFLG', NF_INT,1,qsoilflg)
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'WCANPFLG', NF_INT,1,wcanpflg)
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'SNOWDFLG', NF_INT,1,snowdflg)
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'STYPFLG', NF_INT,1,stypflg)
! do not fill, will set values explicitly later. Improve performance
istatus = NF_SET_FILL(ncid,NF_NOFILL,oldfillmode)
!-----------------------------------------------------------------------
!
! Define variable arrays
!
!-----------------------------------------------------------------------
IF (zpsoilflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'ZPSOIL',NF_FLOAT,3, &
(/dimx_id,dimy_id,dimz_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',soilmeta%zpsoil)
END IF
IF (tsoilflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'TSOIL',NF_FLOAT,4, &
(/dimx_id,dimy_id,dimz_id,dims_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',soilmeta%tsoil)
END IF
IF (qsoilflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'QSOIL',NF_FLOAT,4, &
(/dimx_id,dimy_id,dimz_id,dims_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',soilmeta%qsoil)
END IF
IF (wcanpflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'WETCANP',NF_FLOAT,3, &
(/dimx_id,dimy_id,dims_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',soilmeta%wetcanp)
END IF
IF (snowdflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'SNOWDPTH',NF_FLOAT,2,(/dimx_id,dimy_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',soilmeta%snowdpth)
END IF
IF (stypflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'SOILTYP',NF_INT,3, &
(/dimx_id,dimy_id,dimn_id/),varid)
CALL net_define_var_meta
(ncid,varid,'INT',soilmeta%soiltyp)
END IF
!-----------------------------------------------------------------------
!
! End NetCDF file DEFINE mode
!
!-----------------------------------------------------------------------
istatus = NF_ENDDEF(ncid)
CALL net_check_error
(istatus,'net_define_soil')
RETURN
END SUBROUTINE net_define_soil
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE net_get_soil ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE net_get_soil(ncid,nx,ny,nzsoil,nstyps,dx,dy, & 3,25
mapproj,sclfct,trulat1,trulat2,trulon,ctrlat,ctrlon, &
zpsoilflg,tsoilflg,qsoilflg,wcanpflg,snowdflg,stypflg, &
istatus)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Extract NetCDF file dimensions and attributes from ARPS soil
! data.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yunheng Wang (08/13/2004)
!
! MODIFIED HISTORY:
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: ncid
INTEGER, INTENT(OUT) :: nx, ny, nzsoil, nstyps
REAL, INTENT(OUT) :: dx, dy
INTEGER, INTENT(OUT) :: mapproj
REAL, INTENT(OUT) :: sclfct
REAL, INTENT(OUT) :: trulat1, trulat2, trulon
REAL, INTENT(OUT) :: ctrlat, ctrlon
INTEGER, INTENT(OUT) :: zpsoilflg, tsoilflg, qsoilflg
INTEGER, INTENT(OUT) :: wcanpflg, snowdflg, stypflg
INTEGER, INTENT(OUT) :: istatus
!-----------------------------------------------------------------------
!
! Included files
!
!-----------------------------------------------------------------------
INCLUDE 'netcdf.inc'
!-----------------------------------------------------------------------
!
! Local variables
!
!-----------------------------------------------------------------------
INTEGER :: varid
INTEGER :: dimx_id,dimy_id,dimz_id,dimn_id,dims_id
INTEGER :: ntotal
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Get dimensions
!
!-----------------------------------------------------------------------
istatus = NF_INQ_DIMID(ncid,'x',dimx_id)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_get_soil')
istatus = NF_INQ_DIMLEN(ncid,dimx_id,nx)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_get_soil')
istatus = NF_INQ_DIMID(ncid,'y',dimy_id)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_get_soil')
istatus = NF_INQ_DIMLEN(ncid,dimy_id,ny)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_get_soil')
istatus = NF_INQ_DIMID(ncid,'zsoil',dimz_id)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_get_soil')
istatus = NF_INQ_DIMLEN(ncid,dimz_id,nzsoil)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_get_soil')
istatus = NF_INQ_DIMID(ncid,'nstyp',dimn_id)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_get_soil')
istatus = NF_INQ_DIMLEN(ncid,dimn_id,nstyps)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_get_soil')
istatus = NF_INQ_DIMID(ncid,'nstyp_total',dims_id)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_get_soil')
istatus = NF_INQ_DIMLEN(ncid,dims_id,ntotal)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_get_soil')
nx = nx + 1
ny = ny + 1
!-----------------------------------------------------------------------
!
! Get global attributes
!
!-----------------------------------------------------------------------
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'DX',dx)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_get_soil')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'DY',dy)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_get_soil')
!
! Map projection
!
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'MAPPROJ',mapproj)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_get_soil')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'SCLFCT',sclfct)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_get_soil')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'TRUELAT1',trulat1)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_get_soil')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'TRUELAT2',trulat2)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_get_soil')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'TRUELON',trulon)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_get_soil')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'CTRLAT',ctrlat)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_get_soil')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'CTRLON',ctrlon)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL in net_get_soil')
!
! Flags
!
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'ZPSOILFLG',zpsoilflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_get_soil')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'TSOILFLG',tsoilflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_get_soil')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'QSOILFLG',qsoilflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_get_soil')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'WCANPFLG',wcanpflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_get_soil')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'SNOWDFLG',snowdflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_get_soil')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'STYPFLG',stypflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT in net_get_soil')
RETURN
END SUBROUTINE net_get_soil
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE net_define_exbc ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE net_define_exbc(ncid,nx,ny,nz,itime,dx,dy,dz,dzmin,strhopt, & 2,25
zrefsfc,dlayer1,dlayer2,zflat,strhtune,mapproj,sclfct, &
trulat1,trulat2,trulon,ctrlat,ctrlon, &
ubcflg,vbcflg,wbcflg,ptbcflg,prbcflg,qvbcflg, &
qcbcflg,qrbcflg,qibcflg,qsbcflg,qhbcflg,ctime,istatus)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Define ARPS boundary data file attributes and variables. After this call
! The netCDF file should be in DATA mode.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yunheng Wang (08/18/2004)
!
! MODIFIED HISTORY:
!
!-----------------------------------------------------------------------
USE arps_netio_metadata
IMPLICIT NONE
INTEGER, INTENT(IN) :: ncid
INTEGER, INTENT(IN) :: nx, ny, nz, itime
REAL, INTENT(IN) :: dx, dy, dz
REAL, INTENT(IN) :: dzmin, zrefsfc, dlayer1, dlayer2, zflat
REAL, INTENT(IN) :: strhtune
INTEGER, INTENT(IN) :: strhopt
INTEGER, INTENT(IN) :: mapproj
REAL, INTENT(IN) :: sclfct
REAL, INTENT(IN) :: trulat1, trulat2, trulon
REAL, INTENT(IN) :: ctrlat, ctrlon
INTEGER, INTENT(IN) :: ubcflg, vbcflg, wbcflg, ptbcflg, prbcflg, qvbcflg
INTEGER, INTENT(IN) :: qcbcflg, qrbcflg, qibcflg, qsbcflg, qhbcflg
CHARACTER(LEN=*), INTENT(IN) :: ctime
INTEGER, INTENT(OUT) :: istatus
!-----------------------------------------------------------------------
!
! Included files
!
!-----------------------------------------------------------------------
INCLUDE 'netcdf.inc'
!-----------------------------------------------------------------------
!
! Local variables
!
!-----------------------------------------------------------------------
INTEGER :: varid
INTEGER :: dimx_id, dimy_id, dimz_id, dimt_id, dims_id
INTEGER :: dimxs_id, dimys_id, dimzs_id
INTEGER :: oldfillmode
CHARACTER(LEN=80) :: tmpstr
INTEGER, PARAMETER :: ctime_len = 15
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IF (itime == 1) THEN
!-----------------------------------------------------------------------
!
! Define dimensions
!
!-----------------------------------------------------------------------
istatus = NF_DEF_DIM(ncid,'Time',NF_UNLIMITED,dimt_id)
CALL net_check_error
(istatus,'net_define_exbc')
istatus = NF_DEF_DIM(ncid,'x_stag',nx,dimx_id)
CALL net_check_error
(istatus,'net_define_exbc')
istatus = NF_DEF_DIM(ncid,'y_stag',ny,dimy_id)
CALL net_check_error
(istatus,'net_define_exbc')
istatus = NF_DEF_DIM(ncid,'z_stag',nz,dimz_id)
CALL net_check_error
(istatus,'net_define_exbc')
istatus = NF_DEF_DIM(ncid,'x',nx-1,dimxs_id)
CALL net_check_error
(istatus,'net_define_exbc')
istatus = NF_DEF_DIM(ncid,'y',ny-1,dimys_id)
CALL net_check_error
(istatus,'net_define_exbc')
istatus = NF_DEF_DIM(ncid,'z',nz-1,dimzs_id)
CALL net_check_error
(istatus,'net_define_exbc')
istatus = NF_DEF_DIM(ncid,'CtimeStrLen',ctime_len,dims_id)
CALL net_check_error
(istatus,'net_define_exbc')
!-----------------------------------------------------------------------
!
! Define global attributes
!
!-----------------------------------------------------------------------
tmpstr = 'ARPS 5.2 EXBC data'
CALL netwrt_general_att
(ncid,0,tmpstr,nx,ny,dx,dy,mapproj,sclfct, &
trulat1,trulat2,trulon,ctrlat,ctrlon,istatus)
istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'DZ',NF_FLOAT,1,dz)
istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'DZMIN', NF_FLOAT,1,dzmin)
istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'ZREFSFC',NF_FLOAT,1,zrefsfc)
istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'DLAYER1',NF_FLOAT,1,dlayer1)
istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'DLAYER2',NF_FLOAT,1,dlayer2)
istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'ZFLAT', NF_FLOAT,1,zflat)
istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'STRHTUNE',NF_FLOAT,1,strhtune)
istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'STRHOPT',NF_INT,1,strhopt)
!
! Flags
!
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'UBCFLG', NF_INT,1,ubcflg)
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'VBCFLG', NF_INT,1,vbcflg)
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'WBCFLG', NF_INT,1,wbcflg)
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'PTBCFLG',NF_INT,1,ptbcflg)
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'PRBCFLG',NF_INT,1,prbcflg)
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'QVBCFLG',NF_INT,1,qvbcflg)
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'QCBCFLG',NF_INT,1,qcbcflg)
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'QRBCFLG',NF_INT,1,qrbcflg)
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'QIBCFLG',NF_INT,1,qibcflg)
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'QSBCFLG',NF_INT,1,qsbcflg)
istatus = NF_PUT_ATT_INT(ncid,NF_GLOBAL,'QHBCFLG',NF_INT,1,qhbcflg)
! do not fill, will set values explicitly later. Improve performance
istatus = NF_SET_FILL(ncid,NF_NOFILL,oldfillmode)
!-----------------------------------------------------------------------
!
! Define variable arrays
!
!-----------------------------------------------------------------------
istatus = NF_DEF_VAR(ncid,'CTIME',NF_CHAR,2,(/dims_id,dimt_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',bdymeta%ctime)
IF (ubcflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'U',NF_FLOAT,4, &
(/dimx_id,dimys_id,dimzs_id,dimt_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',bdymeta%u)
END IF
IF (vbcflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'V',NF_FLOAT,4, &
(/dimxs_id,dimy_id,dimzs_id,dimt_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',bdymeta%v)
END IF
IF (wbcflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'W',NF_FLOAT,4, &
(/dimxs_id,dimys_id,dimz_id,dimt_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',bdymeta%w)
END IF
IF (ptbcflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'PT',NF_FLOAT,4, &
(/dimxs_id,dimys_id,dimzs_id,dimt_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',bdymeta%pt)
END IF
IF (prbcflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'P',NF_FLOAT,4, &
(/dimxs_id,dimys_id,dimzs_id,dimt_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',bdymeta%p)
END IF
IF (qvbcflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'QV',NF_FLOAT,4, &
(/dimxs_id,dimys_id,dimzs_id,dimt_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',bdymeta%qv)
END IF
IF (qcbcflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'QC',NF_FLOAT,4, &
(/dimxs_id,dimys_id,dimzs_id,dimt_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',bdymeta%qc)
END IF
IF (qrbcflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'QR',NF_FLOAT,4, &
(/dimxs_id,dimys_id,dimzs_id,dimt_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',bdymeta%qr)
END IF
IF (qibcflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'QI',NF_FLOAT,4, &
(/dimxs_id,dimys_id,dimzs_id,dimt_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',bdymeta%qi)
END IF
IF (qsbcflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'QS',NF_FLOAT,4, &
(/dimxs_id,dimys_id,dimzs_id,dimt_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',bdymeta%qs)
END IF
IF (qhbcflg /= 0) THEN
istatus = NF_DEF_VAR(ncid,'QH',NF_FLOAT,4, &
(/dimxs_id,dimys_id,dimzs_id,dimt_id/),varid)
CALL net_define_var_meta
(ncid,varid,'REAL',bdymeta%qh)
END IF
!-----------------------------------------------------------------------
!
! End NetCDF file DEFINE mode
!
!-----------------------------------------------------------------------
istatus = NF_ENDDEF(ncid)
CALL net_check_error
(istatus,'net_define_exbc')
END IF
istatus = NF_INQ_VARID(ncid,'CTIME',varid)
CALL net_check_error
(istatus,'net_define_exbc')
istatus = NF_PUT_VARA_TEXT(ncid,varid,(/1,itime/),(/ctime_len,1/),ctime)
CALL net_check_error
(istatus,'net_define_exbc')
RETURN
END SUBROUTINE net_define_exbc
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE net_get_exbc ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE net_get_exbc(ncid,nx,ny,nz,itime,dx,dy,dz, & 2,38
dzmin,strhopt,zrefsfc,dlayer1,dlayer2,zflat,strhtune, &
mapproj,sclfct,trulat1,trulat2,trulon,ctrlat,ctrlon, &
ubcflg,vbcflg,wbcflg,ptbcflg,prbcflg,qvbcflg, &
qcbcflg,qrbcflg,qibcflg,qsbcflg,qhbcflg, &
ctime,istatus)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Extract NetCDF file dimensions and attributes from ARPS boundary
! data.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yunheng Wang (08/20/2004)
!
! MODIFIED HISTORY:
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: ncid, itime
INTEGER, INTENT(OUT) :: nx, ny, nz
REAL, INTENT(OUT) :: dx, dy, dz
REAL, INTENT(OUT) :: dzmin, strhtune
INTEGER, INTENT(OUT) :: strhopt
REAL, INTENT(OUT) :: zrefsfc, dlayer1, dlayer2, zflat
INTEGER, INTENT(OUT) :: mapproj
REAL, INTENT(OUT) :: sclfct
REAL, INTENT(OUT) :: trulat1, trulat2, trulon
REAL, INTENT(OUT) :: ctrlat, ctrlon
INTEGER, INTENT(OUT) :: ubcflg, vbcflg, wbcflg
INTEGER, INTENT(OUT) :: ptbcflg, prbcflg
INTEGER, INTENT(OUT) :: qvbcflg, qcbcflg, qrbcflg
INTEGER, INTENT(OUT) :: qibcflg, qsbcflg, qhbcflg
CHARACTER(LEN=15), INTENT(OUT) :: ctime
INTEGER, INTENT(OUT) :: istatus
!-----------------------------------------------------------------------
!
! Included files
!
!-----------------------------------------------------------------------
INCLUDE 'netcdf.inc'
!-----------------------------------------------------------------------
!
! Local variables
!
!-----------------------------------------------------------------------
INTEGER :: varid
INTEGER :: dimx_id,dimy_id,dimz_id,dimt_id,dims_id
INTEGER :: lenstr
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Get dimensions
!
!-----------------------------------------------------------------------
istatus = NF_INQ_DIMID(ncid,'x_stag',dimx_id)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_get_exbc')
istatus = NF_INQ_DIMLEN(ncid,dimx_id,nx)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_get_exbc')
istatus = NF_INQ_DIMID(ncid,'y_stag',dimy_id)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_get_exbc')
istatus = NF_INQ_DIMLEN(ncid,dimy_id,ny)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_get_exbc')
istatus = NF_INQ_DIMID(ncid,'z_stag',dimz_id)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_get_exbc')
istatus = NF_INQ_DIMLEN(ncid,dimz_id,nz)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_get_exbc')
! istatus = NF_INQ_DIMID(ncid,'Time',dimt_id)
! CALL net_check_error(istatus,'NF_INQ_DIMID in net_get_exbc')
! istatus = NF_INQ_DIMLEN(ncid,dimt_id,nt)
! CALL net_check_error(istatus,'NF_INQ_DIMLEN in net_get_exbc')
istatus = NF_INQ_DIMID(ncid,'CtimeStrLen',dims_id)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_get_exbc')
istatus = NF_INQ_DIMLEN(ncid,dims_id,lenstr)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_get_exbc')
!-----------------------------------------------------------------------
!
! Get global attributes
!
!-----------------------------------------------------------------------
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'DX',dx)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL:dx in net_get_exbc')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'DY',dy)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL:dy in net_get_exbc')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'DZ',dz)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL:dz in net_get_exbc')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'DZMIN',dzmin)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL:dzmin in net_get_exbc')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'STRHOPT',strhopt)
CALL net_check_error
(istatus,'NF_GET_ATT_INT:strhopt in net_get_exbc')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'STRHTUNE',strhtune)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL:strhtune in net_get_exbc')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'ZREFSFC',zrefsfc)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL:zresfc in net_get_exbc')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'DLAYER1',dlayer1)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL:dlayer1 in net_get_exbc')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'DLAYER2',dlayer2)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL:dlayer2 in net_get_exbc')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'ZFLAT',zflat)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL:zflat in net_get_exbc')
!
! Map projection
!
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'MAPPROJ',mapproj)
CALL net_check_error
(istatus,'NF_GET_ATT_INT:mapproj in net_get_exbc')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'SCLFCT',sclfct)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL:sclfct in net_get_exbc')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'TRUELAT1',trulat1)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL:trulat1 in net_get_exbc')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'TRUELAT2',trulat2)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL:trulat2 in net_get_exbc')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'TRUELON',trulon)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL:trulon in net_get_exbc')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'CTRLAT',ctrlat)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL:ctrlat in net_get_exbc')
istatus = NF_GET_ATT_REAL(ncid,NF_GLOBAL,'CTRLON',ctrlon)
CALL net_check_error
(istatus,'NF_GET_ATT_REAL:ctrlon in net_get_exbc')
!
! Flags
!
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'UBCFLG',ubcflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT:ubcflg in net_get_exbc')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'VBCFLG',vbcflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT:vbcflg in net_get_exbc')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'WBCFLG',wbcflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT:wbcflg in net_get_exbc')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'PTBCFLG',ptbcflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT:ptbcflg in net_get_exbc')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'PRBCFLG',prbcflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT:prbcflg in net_get_exbc')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'QVBCFLG',qvbcflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT:qvbcflg in net_get_exbc')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'QCBCFLG',qcbcflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT:qcbcflg in net_get_exbc')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'QRBCFLG',qrbcflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT:qrbcflg in net_get_exbc')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'QIBCFLG',qibcflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT:qibcflg in net_get_exbc')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'QSBCFLG',qsbcflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT:qsbcflg in net_get_exbc')
istatus = NF_GET_ATT_INT(ncid,NF_GLOBAL,'QHBCFLG',qhbcflg)
CALL net_check_error
(istatus,'NF_GET_ATT_INT:qhbcflg in net_get_exbc')
istatus = NF_INQ_VARID(ncid,'CTIME',varid)
CALL net_check_error
(istatus,'NF_INQ_VARID:ctime in net_get_exbc')
istatus = NF_GET_VARA_TEXT(ncid,varid,(/1,itime/),(/lenstr,1/),ctime)
CALL net_check_error
(istatus,'NF_GET_VARA_TEXT:ctime in net_get_exbc')
RETURN
END SUBROUTINE net_get_exbc
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE net_define_onevar ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE net_define_onevar(ncid,nx,ny,nz,varname,varlongname,varunits, & 1,4
istatus)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Define one variable in NetCDF file.
! The netCDF file should be in DATA mode after this call.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yunheng Wang (06/13/2005)
!
! MODIFIED HISTORY:
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: ncid
INTEGER, INTENT(IN) :: nx, ny, nz
CHARACTER(*), INTENT(IN) :: varname, varlongname, varunits
INTEGER, INTENT(OUT) :: istatus
!-----------------------------------------------------------------------
!
! Included files
!
!-----------------------------------------------------------------------
INCLUDE 'netcdf.inc'
!-----------------------------------------------------------------------
!
! Local variables
!
!-----------------------------------------------------------------------
INTEGER :: varid
INTEGER :: dimx_id, dimy_id, dimz_id
INTEGER :: lenstr
INTEGER :: oldfillmode
CHARACTER(LEN=80) :: tmpstr
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Define dimensions
!
!-----------------------------------------------------------------------
istatus = NF_DEF_DIM(ncid,'x',nx,dimx_id)
CALL net_check_error
(istatus,'net_define_onevar')
istatus = NF_DEF_DIM(ncid,'y',ny,dimy_id)
CALL net_check_error
(istatus,'net_define_onevar')
istatus = NF_DEF_DIM(ncid,'z',nz,dimz_id)
CALL net_check_error
(istatus,'net_define_onevar')
!-----------------------------------------------------------------------
!
! Define global attributes
!
!-----------------------------------------------------------------------
! do not fill, will set values explicitly later. Improve performance
istatus = NF_SET_FILL(ncid,NF_NOFILL,oldfillmode)
!-----------------------------------------------------------------------
!
! Define variable arrays
!
!-----------------------------------------------------------------------
istatus = NF_DEF_VAR(ncid,varname,NF_FLOAT,3, &
(/dimx_id,dimy_id,dimz_id/),varid)
lenstr = LEN_TRIM(varname)
istatus = NF_PUT_ATT_TEXT(ncid,varid,'standard_name',lenstr,varname)
lenstr = LEN_TRIM(varlongname)
istatus = NF_PUT_ATT_TEXT(ncid,varid,'long_name',lenstr,varlongname)
lenstr = LEN_TRIM(varunits)
istatus = NF_PUT_ATT_TEXT(ncid,varid,'units',lenstr,varunits)
!-----------------------------------------------------------------------
!
! End NetCDF file DEFINE mode
!
!-----------------------------------------------------------------------
istatus = NF_ENDDEF(ncid)
CALL net_check_error
(istatus,'net_define_onevar')
RETURN
END SUBROUTINE net_define_onevar
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE net_get_onevar ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE net_get_onevar(ncid,nx,ny,nz,varname,varlongname,varunits, & 1,9
istatus)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Extract NetCDF file dimensions and variable attributes
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yunheng Wang (06/13/2005)
!
! MODIFIED HISTORY:
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: ncid
CHARACTER(*), INTENT(IN) :: varname
INTEGER, INTENT(OUT) :: nx, ny, nz
CHARACTER(*), INTENT(OUT) :: varlongname, varunits
INTEGER, INTENT(OUT) :: istatus
!-----------------------------------------------------------------------
!
! Included files
!
!-----------------------------------------------------------------------
INCLUDE 'netcdf.inc'
!-----------------------------------------------------------------------
!
! Local variables
!
!-----------------------------------------------------------------------
INTEGER :: varid
INTEGER :: dimx_id,dimy_id,dimz_id
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Get dimensions
!
!-----------------------------------------------------------------------
istatus = NF_INQ_DIMID(ncid,'x',dimx_id)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_get_onevar')
istatus = NF_INQ_DIMLEN(ncid,dimx_id,nx)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_get_onevar')
istatus = NF_INQ_DIMID(ncid,'y',dimy_id)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_get_onevar')
istatus = NF_INQ_DIMLEN(ncid,dimy_id,ny)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_get_onevar')
istatus = NF_INQ_DIMID(ncid,'z',dimz_id)
CALL net_check_error
(istatus,'NF_INQ_DIMID in net_get_onevar')
istatus = NF_INQ_DIMLEN(ncid,dimz_id,nz)
CALL net_check_error
(istatus,'NF_INQ_DIMLEN in net_get_onevar')
!-----------------------------------------------------------------------
!
! Get variable attributes
!
!-----------------------------------------------------------------------
istatus = NF_INQ_VARID(ncid,varname,varid)
CALL net_check_error
(istatus,'NF_INQ_VARID in net_get_onevar')
istatus = NF_GET_ATT_TEXT(ncid,varid,'long_name',varlongname)
CALL net_check_error
(istatus,'NF_GET_ATT_TEXT in net_get_onevar')
istatus = NF_GET_ATT_TEXT(ncid,varid,'units',varunits)
CALL net_check_error
(istatus,'NF_GET_ATT_TEXT in net_get_onevar')
RETURN
END SUBROUTINE net_get_onevar