!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFREAD ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfread(nx,ny,nz,nzsoil,nstyps, grdbas, filename, time, & 2,127
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, &
ireturn, tem1)
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in history data in the NCSA HDF4 format.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/04/15
!
! MODIFICATION HISTORY:
!
! 05/15/2002 (J. Brotzge)
! Added to allow for multiple soil schemes
!
!-----------------------------------------------------------------------
!
! INPUT :
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
! nzsoil Number of grid points in the soil
!
! grdbas Data read flag.
! =1, only grid and base state arrays will be read
! =0, all arrays will be read based on data
! parameter setting.
! filename Character variable nhming the input HDF file
!
! OUTPUT:
!
! time Time in seconds of data read from "filename"
!
! x x coordinate of grid points in physical/comp. space (m)
! y y coordinate of grid points in physical/comp. space (m)
! z z coordinate of grid points in computational space (m)
! zp z coordinate of grid points in physical space (m)
! zpsoil z coordinate of grid points in the soil (m)
!
! uprt x component of perturbation velocity (m/s)
! vprt y component of perturbation velocity (m/s)
! wprt Vertical component of perturbation velocity in Cartesian
! coordinates (m/s).
! ptprt Perturbation potential temperature (K)
! pprt Perturbation pressure (Pascal)
!
! qvprt Perturbation water vapor mixing ratio (kg/kg)
! qc Cloud water mixing ratio (kg/kg)
! qr Rainwater mixing ratio (kg/kg)
! qi Cloud ice mixing ratio (kg/kg)
! qs Snow mixing ratio (kg/kg)
! qh Hail mixing ratio (kg/kg)
! tke Turbulent Kinetic Energy ((m/s)**2)
! kmh Horizontal turb. mixing coef. for momentum ( m**2/s )
! kmv Vertical turb. mixing coef. for momentum ( m**2/s )
!
! ubar Base state x velocity component (m/s)
! vbar Base state y velocity component (m/s)
! wbar Base state z velocity component (m/s)
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
! rhobar Base state air density (kg/m**3)
! qvbar Base state water vapor mixing ratio (kg/kg)
!
! soiltyp Soil type
! vegtyp Vegetation type
! lai Leaf Area Index
! roufns Surface roughness
! veg Vegetation fraction
!
! tsoil Soil temperature (K)
! qsoil Soil moisture (m**3/m**3)
! wetcanp Canopy water amount
!
! raing Grid supersaturation rain
! rainc Cumulus convective rain
! prcrate Precipitation rates
!
! radfrc Radiation forcing (K/s)
! radsw Solar radiation reaching the surface
! rnflx Net radiation flux absorbed by surface
! radswnet Net shortwave radiation
! radlwin Incoming longwave radiation
!
! usflx Surface flux of u-momentum (kg/(m*s**2))
! vsflx Surface flux of v-momentum (kg/(m*s**2))
! ptsflx Surface heat flux (K*kg/(m**2 * s ))
! qvsflx Surface moisture flux of (kg/(m**2 * s))
!
! ireturn Return status indicator
!
! WORK ARRAY
!
! tem1
! tem2 work array.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: nx,ny,nz
INTEGER :: nzsoil
INTEGER :: grdbas
CHARACTER (LEN=*) :: filename
REAL :: time
REAL :: x (nx) ! x coord.
REAL :: y (ny) ! y coord.
REAL :: z (nz) ! z coord.
REAL :: zp (nx,ny,nz) ! physical x coord.
REAL :: zpsoil(nx,ny,nzsoil) ! physical x coord. for soil (m)
REAL :: uprt (nx,ny,nz) ! Perturbation u-velocity (m/s)
REAL :: vprt (nx,ny,nz) ! Perturbation v-velocity (m/s)
REAL :: wprt (nx,ny,nz) ! Perturbation w-velocity (m/s)
REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K)
REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal)
REAL :: qvprt (nx,ny,nz) ! Perturbation water vapor mixing ratio (kg/kg)
REAL :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg)
REAL :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg)
REAL :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg)
REAL :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg)
REAL :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg)
REAL :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2)
REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for
! momentum. ( m**2/s )
REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for
! momentum. ( m**2/s )
REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s)
REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s)
REAL :: wbar (nx,ny,nz) ! Base state w-velocity (m/s)
REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal).
REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3)
REAL :: qvbar (nx,ny,nz) ! Base state water vapor mixing ratio
INTEGER :: nstyps ! Number of soil type
INTEGER :: soiltyp (nx,ny,nstyps) ! Soil type
REAL :: stypfrct(nx,ny,nstyps) ! Fraction of soil types
INTEGER :: vegtyp(nx,ny) ! Vegetation type
REAL :: lai (nx,ny) ! Leaf Area Index
REAL :: roufns (nx,ny) ! Surface roughness
REAL :: veg (nx,ny) ! Vegetation fraction
REAL :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil temperature (K)
REAL :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil moisture (m**3/m**3)
REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount
REAL :: snowdpth(nx,ny) ! Snow depth (m)
REAL :: raing(nx,ny) ! Grid supersaturation rain
REAL :: rainc(nx,ny) ! Cumulus convective rain
REAL :: prcrate(nx,ny,4) ! precipitation rates (kg/(m**2*s))
! prcrate(1,1,1) = total precip. rate
! prcrate(1,1,2) = grid scale precip. rate
! prcrate(1,1,3) = cumulative precip. rate
! prcrate(1,1,4) = microphysics precip. rate
REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s)
REAL :: radsw (nx,ny) ! Solar radiation reaching the surface
REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface
REAL :: radswnet(nx,ny) ! Net shortwave radiation
REAL :: radlwin(nx,ny) ! Incoming longwave radiation
REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2))
REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2))
REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m*s**2))
REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s))
REAL :: tem1 (nx,ny,nz) ! Temporary work array
INTEGER (KIND=selected_int_kind(4)), ALLOCATABLE :: itmp(:,:,:)
INTEGER (KIND=selected_int_kind(4)), ALLOCATABLE :: itmpsoil(:,:,:,:)
! Temporary array
REAL, ALLOCATABLE :: hmax(:), hmin(:) ! Temporary array
REAL, ALLOCATABLE :: hmaxsoil(:), hminsoil(:) ! Temporary array
!
! 06/28/2002 Zuwen He
!
! Create a tem2 which will be used when dump data in previous version.
! It may be better to pass the array from the argument list
! in the future.
!
REAL, ALLOCATABLE :: tem2(:,:,:) ! Temporary array
INTEGER :: ireturn
!-----------------------------------------------------------------------
!
! Parameters describing routine that wrote the gridded data
!
!-----------------------------------------------------------------------
!
! 06/28/2002 Zuwen He
!
! fmtver??: to label each data a version.
! intver??: an integer to allow faster comparison than fmtver??,
! which are strings.
!
! Verion 5.00: significant change in soil variables since version 4.10.
!
!-----------------------------------------------------------------------
CHARACTER (LEN=40) :: fmtver410,fmtver500
INTEGER :: intver,intver410,intver500
PARAMETER (fmtver410='004.10 HDF4 Coded Data',intver410=410)
PARAMETER (fmtver500='005.00 HDF4 Coded Data',intver500=500)
CHARACTER (LEN=40) :: fmtverin
CHARACTER (LEN=10) :: tmunit
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------
INTEGER :: lchanl
PARAMETER (lchanl=6) ! Channel number for formatted printing.
INTEGER :: i,j,k,is
INTEGER :: nxin,nyin,nzin,nzsoilin
INTEGER :: bgrdin,bbasin,bvarin,bicein,btrbin,btkein
INTEGER :: istat, sd_id
INTEGER :: nstyp1,nstypin
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid parameters
INCLUDE 'indtflg.inc'
INCLUDE 'alloc.inc' ! allocation parameters & declarations
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IF(myproc == 0) &
WRITE(*,*) 'HDFREAD: Reading HDF file: ', trim(filename)
ALLOCATE (itmp(nx,ny,nz),stat=istat)
CALL check_alloc_status
(istat, "HDFREAD:itmp")
ALLOCATE (hmax(nz),stat=istat)
CALL check_alloc_status
(istat, "HDFREAD:hmax")
ALLOCATE (hmin(nz),stat=istat)
CALL check_alloc_status
(istat, "HDFREAD:hmin")
ALLOCATE (itmpsoil(nx,ny,nzsoil,0:nstyps),stat=istat)
CALL check_alloc_status
(istat, "HDFREAD:itmpsoil")
ALLOCATE (hmaxsoil(nzsoil),stat=istat)
CALL check_alloc_status
(istat, "HDFREAD:hmaxsoil")
ALLOCATE (hminsoil(nzsoil),stat=istat)
CALL check_alloc_status
(istat, "HDFREAD:hminsoil")
!-----------------------------------------------------------------------
!
! Read header info
!
!-----------------------------------------------------------------------
CALL hdfopen
(filename,1,sd_id)
IF (sd_id < 0) THEN
IF(myproc == 0) &
WRITE (6,*) "HDFREAD: ERROR opening ", &
trim(filename)," for reading."
GO TO 110
END IF
CALL hdfrdc
(sd_id,40,"fmtver",fmtverin,istat)
IF (fmtverin == fmtver410) THEN
intver=intver410
ELSE IF (fmtverin == fmtver500) THEN
intver=intver500
ELSE
IF (myproc == 0) WRITE(6,'(/1x,a,a,a/)') &
'Incoming data format, fmtverin=',fmtverin, &
', not found. The Job stopped.'
CALL arpsstop
('arpstop called from HDFREAD. ',1)
END IF
IF (myproc == 0) WRITE(6,'(/1x,a,a/)') &
'Incoming data format, fmtverin=',fmtverin
CALL hdfrdc
(sd_id,40,"runname",runname,istat)
CALL hdfrdi
(sd_id,"nocmnt",nocmnt,istat)
IF( nocmnt > 0 ) THEN
CALL hdfrdc
(sd_id,80*nocmnt,"cmnt",cmnt,istat)
END IF
IF(myproc == 0) &
WRITE(6,'(//'' THE NAME OF THIS RUN IS: '',A//)') trim(runname)
IF(myproc == 0) &
WRITE (6,*) "Comments:"
IF( nocmnt > 0 ) THEN
DO i=1,nocmnt
IF(myproc == 0) &
WRITE(6,'(1x,a)') cmnt(i)
END DO
END IF
IF(myproc == 0) &
WRITE (6,*) " "
CALL hdfrdc
(sd_id,10,"tmunit",tmunit,istat)
CALL hdfrdr
(sd_id,"time",time,istat)
!-----------------------------------------------------------------------
!
! Get dimensions of data in binary file and check against
! the dimensions passed to HDFREAD
!
!-----------------------------------------------------------------------
CALL hdfrdi
(sd_id,"nx",nxin,istat)
CALL hdfrdi
(sd_id,"ny",nyin,istat)
CALL hdfrdi
(sd_id,"nz",nzin,istat)
IF ( nxin /= nx .OR. nyin /= ny .OR. nzin /= nz ) THEN
WRITE(6,'(1x,a)') ' Dimensions in HDFREAD inconsistent with data.'
WRITE(6,'(1x,a,3I15)') ' Read were: ', nxin, nyin, nzin
WRITE(6,'(1x,a,3I15)') ' Expected: ', nx, ny, nz
WRITE(6,'(1x,a)') ' Program aborted in HDFREAD.'
CALL arpsstop
('arpsstop called from HDFREAD due to nxin...',1)
END IF
IF (intver <= intver410) THEN
nzsoilin = 2 ! for versions earlier than 410, it is actually
! a 2 level soil model.
ELSE IF (intver >= intver500) THEN
CALL hdfrdi
(sd_id,"nzsoil",nzsoilin,istat)
END IF
IF (nzsoilin /= nzsoil) THEN
IF (intver <= intver410) THEN
IF(myproc == 0) WRITE(6,'(1x,a,a/,2(1x,a/))') &
' The incoming data version is ', fmtverin, &
' In the input file, nzsoil must be set to 2. ', &
' Program aborted in HDFREAD.'
ELSE IF (intver >= intver500) THEN
WRITE(6,'(1x,a)') &
' Dimensions in BINREAD inconsistent with data.'
WRITE(6,'(1x,a,I15)') ' Read were: ', nzsoilin
WRITE(6,'(1x,a,I15)') ' Expected: ', nzsoil
WRITE(6,'(1x,a)') ' Program aborted in HDFREAD.'
WRITE(6,*)' myproc = ',myproc
END IF
CALL arpsstop
('arpsstop called from HDFREAD due to nzsoilin...',1)
END IF
!-----------------------------------------------------------------------
!
! Read in flags for different data groups
!
!-----------------------------------------------------------------------
IF ( grdbas == 1 ) THEN ! Read grid and base state arrays
IF(myproc == 0) &
WRITE(lchanl,'(1x,a,f8.1,a,f8.3,a/)') &
'To read grid and base state data at time ', time, &
' secs = ',(time/60.),' mins.'
CALL hdfrdi
(sd_id,"grdflg",bgrdin,istat)
CALL hdfrdi
(sd_id,"basflg",bbasin,istat)
CALL hdfrdi
(sd_id,"varflg",bvarin,istat)
CALL hdfrdi
(sd_id,"mstflg",mstin,istat)
CALL hdfrdi
(sd_id,"iceflg",bicein,istat)
CALL hdfrdi
(sd_id,"trbflg",btrbin,istat)
CALL hdfrdi
(sd_id,"landflg",landin,istat)
CALL hdfrdi
(sd_id,"totflg",totin,istat)
CALL hdfrdi
(sd_id,"tkeflg",btkein,istat)
ELSE ! Normal data reading
IF(myproc == 0) &
WRITE(lchanl,'(1x,a,f8.1,a,f8.3,a/)')'To read data for time:', &
time,' secs = ',(time/60.),' mins.'
CALL hdfrdi
(sd_id,"grdflg",grdin,istat)
CALL hdfrdi
(sd_id,"basflg",basin,istat)
CALL hdfrdi
(sd_id,"varflg",varin,istat)
CALL hdfrdi
(sd_id,"mstflg",mstin,istat)
CALL hdfrdi
(sd_id,"iceflg",icein,istat)
CALL hdfrdi
(sd_id,"trbflg",trbin,istat)
CALL hdfrdi
(sd_id,"sfcflg",sfcin,istat)
CALL hdfrdi
(sd_id,"rainflg",rainin,istat)
!Don't read landin (land data only written to base file,
!landin flag set there).
!CALL hdfrdi(sd_id,"landflg",landin,istat)
CALL hdfrdi
(sd_id,"totflg",totin,istat)
CALL hdfrdi
(sd_id,"tkeflg",tkein,istat)
END IF
CALL hdfrdi
(sd_id,"nstyp",nstyp1,istat)
IF ( nstyp1 < 1 ) THEN
nstyp1 = 1
END IF
IF (nstyp1 > nstyp) THEN
IF(myproc == 0) &
WRITE (6,*) "HDFREAD: WARNING, nstyp in file (",nstyp1, &
") greater than that specified in input file (",nstyp, &
"), using only",nstyp
nstypin = nstyp
ELSE
nstypin = nstyp1
ENDIF
CALL hdfrdi
(sd_id,"prcflg",prcin,istat)
CALL hdfrdi
(sd_id,"radflg",radin,istat)
CALL hdfrdi
(sd_id,"flxflg",flxin,istat)
CALL hdfrdi
(sd_id,"snowflg",snowin,istat)
CALL hdfrdi
(sd_id,"month",month,istat)
CALL hdfrdi
(sd_id,"day",day,istat)
CALL hdfrdi
(sd_id,"year",year,istat)
CALL hdfrdi
(sd_id,"hour",hour,istat)
CALL hdfrdi
(sd_id,"minute",minute,istat)
CALL hdfrdi
(sd_id,"second",second,istat)
CALL hdfrdr
(sd_id,"umove",umove,istat)
CALL hdfrdr
(sd_id,"vmove",vmove,istat)
CALL hdfrdr
(sd_id,"xgrdorg",xgrdorg,istat)
CALL hdfrdr
(sd_id,"ygrdorg",ygrdorg,istat)
CALL hdfrdi
(sd_id,"mapproj",mapproj,istat)
CALL hdfrdr
(sd_id,"trulat1",trulat1,istat)
CALL hdfrdr
(sd_id,"trulat2",trulat2,istat)
CALL hdfrdr
(sd_id,"trulon",trulon,istat)
CALL hdfrdr
(sd_id,"sclfct",sclfct,istat)
CALL hdfrdr
(sd_id,"tstop",tstop,istat)
CALL hdfrdr
(sd_id,"thisdmp",thisdmp,istat)
CALL hdfrdr
(sd_id,"latitud",latitud,istat)
CALL hdfrdr
(sd_id,"ctrlat",ctrlat,istat)
CALL hdfrdr
(sd_id,"ctrlon",ctrlon,istat)
!-----------------------------------------------------------------------
!
! Read in x,y and z at grid cell centers (scalar points).
!
!-----------------------------------------------------------------------
IF( grdin == 1 .OR. grdbas == 1 ) THEN
CALL hdfrd1d
(sd_id,"x",nx,x,istat)
IF (istat /= 0) GO TO 110
CALL hdfrd1d
(sd_id,"y",ny,y,istat)
IF (istat /= 0) GO TO 110
CALL hdfrd1d
(sd_id,"z",nz,z,istat)
IF (istat /= 0) GO TO 110
CALL hdfrd3d
(sd_id,"zp",nx,ny,nz,zp,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
IF (intver <= intver410) THEN
!
! nzsoil must equal to 2, 06/28/2002, Zuwen
! assume zpsoil(,,2) is one meter below the surface.
!
DO j=1,ny
DO i=1,nx
zpsoil(i,j,1)=zp(i,j,2)
zpsoil(i,j,2)=zpsoil(i,j,1)-1.
END DO
END DO
IF (myproc == 0) THEN
WRITE(6,*) ' Assign zpsoil. '
WRITE(6,*) ' Assume zpsoil(,,1) is zp(,,2). '
WRITE(6,*) ' Assume zpsoil(,,2) is zp(,,2)-1. '
END IF
ELSE IF (intver >= intver500) THEN
CALL hdfrd3d
(sd_id,"zpsoil",nx,ny,nzsoil,zpsoil,istat, &
itmpsoil,hmaxsoil,hminsoil)
END IF
IF (istat /= 0) GO TO 110
END IF ! grdin
!-----------------------------------------------------------------------
!
! Read in base state fields
!
!-----------------------------------------------------------------------
IF( basin == 1 .OR. grdbas == 1 ) THEN
CALL hdfrd3d
(sd_id,"ubar",nx,ny,nz,ubar,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
CALL hdfrd3d
(sd_id,"vbar",nx,ny,nz,vbar,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
CALL hdfrd3d
(sd_id,"wbar",nx,ny,nz,wbar,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
CALL hdfrd3d
(sd_id,"ptbar",nx,ny,nz,ptbar,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
CALL hdfrd3d
(sd_id,"pbar",nx,ny,nz,pbar,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
IF( mstin == 1) THEN
CALL hdfrd3d
(sd_id,"qvbar",nx,ny,nz,qvbar,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
IF (landin == 1) THEN
CALL hdfrd3di
(sd_id,"soiltyp",nx,ny,nstypin,soiltyp(1,1,1),istat)
IF (istat /= 0) GO TO 110
CALL hdfrd3d
(sd_id,"stypfrct",nx,ny,nstypin, &
stypfrct(1,1,1),istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
CALL fix_stypfrct_nstyp
(nx,ny,nstyp1,nstyp,stypfrct)
CALL hdfrd2di
(sd_id,"vegtyp",nx,ny,vegtyp,istat)
IF (istat /= 0) GO TO 110
CALL hdfrd2d
(sd_id,"lai",nx,ny,lai,istat,itmp)
IF (istat /= 0) GO TO 110
CALL hdfrd2d
(sd_id,"roufns",nx,ny,roufns,istat,itmp)
IF (istat /= 0) GO TO 110
CALL hdfrd2d
(sd_id,"veg",nx,ny,veg,istat,itmp)
IF (istat /= 0) GO TO 110
END IF
END IF
IF( grdbas == 1 ) GO TO 930
IF( varin == 1 ) THEN
IF ( totin == 0 ) THEN
!-----------------------------------------------------------------------
!
! Read in perturbations from history dump
!
!-----------------------------------------------------------------------
CALL hdfrd3d
(sd_id,"uprt",nx,ny,nz,uprt,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
CALL hdfrd3d
(sd_id,"vprt",nx,ny,nz,vprt,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
CALL hdfrd3d
(sd_id,"wprt",nx,ny,nz,wprt,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
!-----------------------------------------------------------------------
!
! Read in scalars
!
!-----------------------------------------------------------------------
CALL hdfrd3d
(sd_id,"ptprt",nx,ny,nz,ptprt,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
CALL hdfrd3d
(sd_id,"pprt",nx,ny,nz,pprt,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
ELSE
!-----------------------------------------------------------------------
!
! Read in total values of variables from history dump
!
!-----------------------------------------------------------------------
CALL hdfrd3d
(sd_id,"u",nx,ny,nz,uprt,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx
uprt(i,j,k) = uprt(i,j,k) - ubar(i,j,k)
END DO
END DO
END DO
CALL hdfrd3d
(sd_id,"v",nx,ny,nz,vprt,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
DO k=1,nz-1
DO j=1,ny
DO i=1,nx-1
vprt(i,j,k) = vprt(i,j,k) - vbar(i,j,k)
END DO
END DO
END DO
CALL hdfrd3d
(sd_id,"w",nx,ny,nz,wprt,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
CALL hdfrd3d
(sd_id,"pt",nx,ny,nz,ptprt,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
ptprt(i,j,k) = ptprt(i,j,k) - ptbar(i,j,k)
END DO
END DO
END DO
CALL hdfrd3d
(sd_id,"p",nx,ny,nz,pprt,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
pprt(i,j,k) = pprt(i,j,k) - pbar(i,j,k)
END DO
END DO
END DO
END IF
END IF
!-----------------------------------------------------------------------
!
! Read in moisture variables
!
!-----------------------------------------------------------------------
IF( mstin == 1 ) THEN
IF ( totin == 0 ) THEN
CALL hdfrd3d
(sd_id,"qvprt",nx,ny,nz,qvprt,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
ELSE
CALL hdfrd3d
(sd_id,"qv",nx,ny,nz,qvprt,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
qvprt(i,j,k) = qvprt(i,j,k) - qvbar(i,j,k)
END DO
END DO
END DO
END IF
CALL hdfrd3d
(sd_id,"qc",nx,ny,nz,qc,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
CALL hdfrd3d
(sd_id,"qr",nx,ny,nz,qr,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
IF( rainin == 1 ) THEN
CALL hdfrd2d
(sd_id,"raing",nx,ny,raing,istat,itmp)
IF (istat /= 0) GO TO 110
CALL hdfrd2d
(sd_id,"rainc",nx,ny,rainc,istat,itmp)
IF (istat /= 0) GO TO 110
END IF
IF( prcin == 1 ) THEN
CALL hdfrd2d
(sd_id,"prcrate1",nx,ny,prcrate(1,1,1),istat,itmp)
IF (istat /= 0) GO TO 110
CALL hdfrd2d
(sd_id,"prcrate2",nx,ny,prcrate(1,1,2),istat,itmp)
IF (istat /= 0) GO TO 110
CALL hdfrd2d
(sd_id,"prcrate3",nx,ny,prcrate(1,1,3),istat,itmp)
IF (istat /= 0) GO TO 110
CALL hdfrd2d
(sd_id,"prcrate4",nx,ny,prcrate(1,1,4),istat,itmp)
IF (istat /= 0) GO TO 110
END IF
IF( icein == 1 ) THEN
CALL hdfrd3d
(sd_id,"qi",nx,ny,nz,qi,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
CALL hdfrd3d
(sd_id,"qs",nx,ny,nz,qs,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
CALL hdfrd3d
(sd_id,"qh",nx,ny,nz,qh,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
END IF
IF( tkein == 1 ) THEN
CALL hdfrd3d
(sd_id,"tke",nx,ny,nz,tke,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
IF( trbin == 1 ) THEN
CALL hdfrd3d
(sd_id,"kmh",nx,ny,nz,kmh,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
CALL hdfrd3d
(sd_id,"kmv",nx,ny,nz,kmv,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
IF( sfcin == 1 ) THEN
IF (intver <= intver410) THEN
ALLOCATE (tem2(nx,ny,0:nstyps),stat=istat)
tem2=0.
CALL hdfrd3d
(sd_id,"tsfc",nx,ny,nstypin+1,tem2,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
DO is=0,nstypin
DO j=1,ny
DO i=1,nx
tsoil(i,j,1,is)=tem2(i,j,is)
END DO
END DO
END DO
tem2=0.
CALL hdfrd3d
(sd_id,"tsoil",nx,ny,nstypin+1,tem2,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
DO is=0,nstypin
DO j=1,ny
DO i=1,nx
tsoil(i,j,2,is)=tem2(i,j,is)
END DO
END DO
END DO
tem2=0.
CALL hdfrd3d
(sd_id,"wetsfc",nx,ny,nstypin+1,tem2,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
DO is=0,nstypin
DO j=1,ny
DO i=1,nx
qsoil(i,j,1,is)=tem2(i,j,is)
END DO
END DO
END DO
tem2=0.
CALL hdfrd3d
(sd_id,"wetdp",nx,ny,nstypin+1,tem2,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
DO is=0,nstypin
DO j=1,ny
DO i=1,nx
qsoil(i,j,2,is)=tem2(i,j,is)
END DO
END DO
END DO
DEALLOCATE (tem2,stat=istat)
ELSE IF (intver >= intver500) THEN
CALL hdfrd4d
(sd_id,"tsoil",nx,ny,nzsoil,nstypin+1,tsoil,istat, &
itmpsoil,hmaxsoil,hminsoil)
IF (istat /= 0) GO TO 110
CALL hdfrd4d
(sd_id,"qsoil",nx,ny,nzsoil,nstypin+1,qsoil,istat, &
itmpsoil,hmaxsoil,hminsoil)
IF (istat /= 0) GO TO 110
END IF
CALL hdfrd3d
(sd_id,"wetcanp",nx,ny,nstypin+1,wetcanp,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
CALL fix_soil_nstyp
(nx,ny,nzsoil,nstyp1,nstyp,tsoil,qsoil,wetcanp)
IF (snowin == 1) THEN
CALL hdfrd2d
(sd_id,"snowdpth",nx,ny,snowdpth,istat,itmp)
IF (istat /= 0) GO TO 110
END IF
END IF
IF( radin == 1 ) THEN
CALL hdfrd3d
(sd_id,"radfrc",nx,ny,nz,radfrc,istat, &
itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
CALL hdfrd2d
(sd_id,"radsw",nx,ny,radsw,istat,itmp)
IF (istat /= 0) GO TO 110
CALL hdfrd2d
(sd_id,"rnflx",nx,ny,rnflx,istat,itmp)
IF (istat /= 0) GO TO 110
IF (intver <= intver410) THEN
radswnet=0.
radlwin=0.
ELSE IF (intver >= intver500) THEN
CALL hdfrd2d
(sd_id,"radswnet",nx,ny,radswnet,istat,itmp)
IF (istat /= 0) GO TO 110
CALL hdfrd2d
(sd_id,"radlwin",nx,ny,radlwin,istat,itmp)
IF (istat /= 0) GO TO 110
END IF
END IF
IF( flxin == 1 ) THEN
CALL hdfrd2d
(sd_id,"usflx",nx,ny,usflx,istat,itmp)
IF (istat /= 0) GO TO 110
CALL hdfrd2d
(sd_id,"vsflx",nx,ny,vsflx,istat,itmp)
IF (istat /= 0) GO TO 110
CALL hdfrd2d
(sd_id,"ptsflx",nx,ny,ptsflx,istat,itmp)
IF (istat /= 0) GO TO 110
CALL hdfrd2d
(sd_id,"qvsflx",nx,ny,qvsflx,istat,itmp)
IF (istat /= 0) GO TO 110
END IF
!-----------------------------------------------------------------------
!
! Friendly exit message
!
!-----------------------------------------------------------------------
930 CONTINUE
IF(myproc == 0) &
WRITE(6,'(/a,F8.1,a/)') &
' Data at time=', time/60,' (min) were successfully read.'
ireturn = 0
GO TO 130
!-----------------------------------------------------------------------
!
! Error during read
!
!-----------------------------------------------------------------------
110 CONTINUE
IF(myproc == 0) &
WRITE(6,'(/a/)') ' Error reading data in HDFREAD'
ireturn=1
GO TO 130
!-----------------------------------------------------------------------
!
! End-of-file during read
!
!-----------------------------------------------------------------------
! 120 CONTINUE
! IF(myproc == 0) &
! WRITE(6,'(/a/)') ' End of file reached in HDFREAD'
! ireturn=2
130 CONTINUE
!tmp istat = sfendacc(sd_id) ! is this necessary?
CALL hdfclose
(sd_id,istat)
IF (ireturn == 0) THEN
IF (istat == 0) THEN
IF(myproc == 0) &
WRITE(*,*) "HDFREAD: Successfully read ", trim(filename)
ELSE
IF(myproc == 0) &
WRITE(*,*) "HDFREAD: ERROR (status=", istat, ") closing ", trim(filename)
END IF
END IF
DEALLOCATE (itmp,stat=istat)
DEALLOCATE (hmax,stat=istat)
DEALLOCATE (hmin,stat=istat)
DEALLOCATE (itmpsoil,stat=istat)
DEALLOCATE (hmaxsoil,stat=istat)
DEALLOCATE (hminsoil,stat=istat)
RETURN
END SUBROUTINE hdfread
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFREADSPLIT ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfreadsplit(nx,ny,nz,nzsoil,nstyps, grdbas, filename, time, & 2,227
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, &
ireturn, tem1)
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in history data in the NCSA HDF4 format, split and scatter to
! each processors using message passing.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yunheng Wang
! 2002/08/26
! Based on subroutine hdfread.
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT :
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
! nzsoil Number of grid points in the soil
!
! grdbas Data read flag.
! =1, only grid and base state arrays will be read
! =0, all arrays will be read based on data
! parameter setting.
! filename Character variable nhming the input HDF file
!
! OUTPUT:
!
! time Time in seconds of data read from "filename"
!
! x x coordinate of grid points in physical/comp. space (m)
! y y coordinate of grid points in physical/comp. space (m)
! z z coordinate of grid points in computational space (m)
! zp z coordinate of grid points in physical space (m)
! zpsoil z coordinate of grid points in the soil (m)
!
! uprt x component of perturbation velocity (m/s)
! vprt y component of perturbation velocity (m/s)
! wprt Vertical component of perturbation velocity in Cartesian
! coordinates (m/s).
! ptprt Perturbation potential temperature (K)
! pprt Perturbation pressure (Pascal)
!
! qvprt Perturbation water vapor mixing ratio (kg/kg)
! qc Cloud water mixing ratio (kg/kg)
! qr Rainwater mixing ratio (kg/kg)
! qi Cloud ice mixing ratio (kg/kg)
! qs Snow mixing ratio (kg/kg)
! qh Hail mixing ratio (kg/kg)
! tke Turbulent Kinetic Energy ((m/s)**2)
! kmh Horizontal turb. mixing coef. for momentum ( m**2/s )
! kmv Vertical turb. mixing coef. for momentum ( m**2/s )
!
! ubar Base state x velocity component (m/s)
! vbar Base state y velocity component (m/s)
! wbar Base state z velocity component (m/s)
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
! rhobar Base state air density (kg/m**3)
! qvbar Base state water vapor mixing ratio (kg/kg)
!
! soiltyp Soil type
! vegtyp Vegetation type
! lai Leaf Area Index
! roufns Surface roughness
! veg Vegetation fraction
!
! tsoil Soil temperature (K)
! qsoil Soil moisture (m**3/m**3)
! wetcanp Canopy water amount
!
! raing Grid supersaturation rain
! rainc Cumulus convective rain
! prcrate Precipitation rates
!
! radfrc Radiation forcing (K/s)
! radsw Solar radiation reaching the surface
! rnflx Net radiation flux absorbed by surface
! radswnet Net shortwave radiation
! radlwin Incoming longwave radiation
!
! usflx Surface flux of u-momentum (kg/(m*s**2))
! vsflx Surface flux of v-momentum (kg/(m*s**2))
! ptsflx Surface heat flux (K*kg/(m**2 * s ))
! qvsflx Surface moisture flux of (kg/(m**2 * s))
!
! ireturn Return status indicator
!
! WORK ARRAY
!
! tem1
! tem2 work array.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: nx,ny,nz
INTEGER :: nzsoil
INTEGER :: grdbas
CHARACTER (LEN=*) :: filename
REAL :: x (nx) ! x coord.
REAL :: y (ny) ! y coord.
REAL :: z (nz) ! z coord.
REAL :: zp (nx,ny,nz) ! physical x coord.
REAL :: zpsoil(nx,ny,nzsoil) ! physical x coord. for soil (m)
REAL :: uprt (nx,ny,nz) ! Perturbation u-velocity (m/s)
REAL :: vprt (nx,ny,nz) ! Perturbation v-velocity (m/s)
REAL :: wprt (nx,ny,nz) ! Perturbation w-velocity (m/s)
REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K)
REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal)
REAL :: qvprt (nx,ny,nz) ! Perturbation water vapor mixing ratio (kg/kg)
REAL :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg)
REAL :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg)
REAL :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg)
REAL :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg)
REAL :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg)
REAL :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2)
REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for
! momentum. ( m**2/s )
REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for
! momentum. ( m**2/s )
REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s)
REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s)
REAL :: wbar (nx,ny,nz) ! Base state w-velocity (m/s)
REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal).
REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3)
REAL :: qvbar (nx,ny,nz) ! Base state water vapor mixing ratio
INTEGER :: nstyps ! Number of soil type
INTEGER :: soiltyp (nx,ny,nstyps) ! Soil type
REAL :: stypfrct(nx,ny,nstyps) ! Fraction of soil types
INTEGER :: vegtyp(nx,ny) ! Vegetation type
REAL :: lai (nx,ny) ! Leaf Area Index
REAL :: roufns (nx,ny) ! Surface roughness
REAL :: veg (nx,ny) ! Vegetation fraction
REAL :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil temperature (K)
REAL :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil moisture (m**3/m**3)
REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount
REAL :: snowdpth(nx,ny) ! Snow depth (m)
REAL :: raing(nx,ny) ! Grid supersaturation rain
REAL :: rainc(nx,ny) ! Cumulus convective rain
REAL :: prcrate(nx,ny,4) ! precipitation rates (kg/(m**2*s))
! prcrate(1,1,1) = total precip. rate
! prcrate(1,1,2) = grid scale precip. rate
! prcrate(1,1,3) = cumulative precip. rate
! prcrate(1,1,4) = microphysics precip. rate
REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s)
REAL :: radsw (nx,ny) ! Solar radiation reaching the surface
REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface
REAL :: radswnet(nx,ny) ! Net shortwave radiation
REAL :: radlwin(nx,ny) ! Incoming longwave radiation
REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2))
REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2))
REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m*s**2))
REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s))
REAL :: tem1 (nx,ny,nz) ! Temporary work array
INTEGER (KIND=selected_int_kind(4)), ALLOCATABLE :: itmp(:,:,:)
! Temporary array
REAL, ALLOCATABLE :: hmax(:), hmin(:) ! Temporary array
REAL, ALLOCATABLE :: hmaxsoil(:), hminsoil(:) ! Temporary array
INTEGER (KIND=selected_int_kind(4)), ALLOCATABLE :: itmpsoil(:,:,:,:)
!
!
! tem2 will be used when read data in previous version.
! It may be better to pass the array from the argument list
! in the future.
!
REAL, allocatable :: tem2(:,:,:) ! Temporary array
INTEGER :: ireturn
REAL :: time
!-----------------------------------------------------------------------
!
! Parameters describing routine that wrote the gridded data
!
!-----------------------------------------------------------------------
!
! fmtver??: to label each data a version.
! intver??: an integer to allow faster comparison than fmtver??,
! which are strings.
!
! Verion 5.00: significant change in soil variables since version 4.10.
!
!-----------------------------------------------------------------------
CHARACTER (LEN=40) :: fmtver410,fmtver500
INTEGER :: intver,intver410,intver500
PARAMETER (fmtver410='004.10 HDF4 Coded Data',intver410=410)
PARAMETER (fmtver500='005.00 HDF4 Coded Data',intver500=500)
CHARACTER (LEN=40) :: fmtverin
CHARACTER (LEN=10) :: tmunit
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------
INTEGER :: lchanl
PARAMETER (lchanl=6) ! Channel number for formatted printing.
INTEGER :: i,j,k,is
INTEGER :: nxin,nyin,nzin,nzsoilin
INTEGER :: bgrdin,bbasin,bvarin,bicein,btrbin,btkein
INTEGER :: istat, sd_id
INTEGER :: nstyp1,nstypin
INTEGER :: nxlg, nylg, nzlg, nzsoillg
REAL, ALLOCATABLE :: var1d(:), var3d(:,:,:), var4d(:,:,:,:)
INTEGER, ALLOCATABLE :: var3di(:,:,:)
! temporary variable only needed for processor 0
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid parameters
INCLUDE 'indtflg.inc'
INCLUDE 'alloc.inc' ! allocation parameters & declarations
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
nxlg = nproc_x*(nx-3)+3
nylg = nproc_y*(ny-3)+3
nzlg = nz
nzsoillg = nzsoil
ALLOCATE (itmp(nxlg,nylg,nzlg),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "HDFREADSPLIT: ERROR allocating itmp, returning"
RETURN
END IF
ALLOCATE (hmax(nzlg),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "HDFREADSPLIT: ERROR allocating hmax, returning"
RETURN
END IF
ALLOCATE (hmin(nzlg),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "HDFREADSPLIT: ERROR allocating hmin, returning"
RETURN
END IF
ALLOCATE (itmpsoil(nxlg,nylg,nzsoillg,0:nstyps),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "HDFREADSPLIT: ERROR allocating itmp, returning"
RETURN
END IF
ALLOCATE (hmaxsoil(nzsoillg),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "HDFREADSPLIT: ERROR allocating hmax, returning"
RETURN
END IF
ALLOCATE (hminsoil(nzsoillg),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "HDFREADSPLIT: ERROR allocating hmin, returning"
RETURN
END IF
IF(myproc == 0) THEN
WRITE(*,*) 'HDFREADSPLIT: Reading HDF file: ', trim(filename)
!-----------------------------------------------------------------------
!
! Read header info
!
!-----------------------------------------------------------------------
CALL hdfopen
(filename,1,sd_id)
IF (sd_id < 0) THEN
WRITE (6,*) "HDFREADSPLIT: ERROR opening ", &
trim(filename)," for reading."
GO TO 110
END IF
CALL hdfrdc
(sd_id,40,"fmtver",fmtverin,istat)
IF (fmtverin == fmtver410) THEN
intver=intver410
ELSE IF (fmtverin == fmtver500) THEN
intver=intver500
ELSE
WRITE(6,'(/1x,a,a,a/)') &
'Incoming data format, fmtverin=',fmtverin, &
', not found. The Job stopped.'
CALL arpsstop
('arpstop called from HDFREADSPLIT. ',1)
END IF
WRITE(6,'(/1x,a,a/)') &
'Incoming data format, fmtverin=',fmtverin
CALL hdfrdc
(sd_id,40,"runname",runname,istat)
CALL hdfrdi
(sd_id,"nocmnt",nocmnt,istat)
IF( nocmnt > 0 ) THEN
CALL hdfrdc
(sd_id,80*nocmnt,"cmnt",cmnt,istat)
END IF
WRITE(6,'(//'' THE NAME OF THIS RUN IS: '',A//)') trim(runname)
WRITE (6,*) "Comments:"
IF( nocmnt > 0 ) THEN
DO i=1,nocmnt
WRITE(6,'(1x,a)') cmnt(i)
END DO
END IF
WRITE (6,*) " "
CALL hdfrdc
(sd_id,10,"tmunit",tmunit,istat)
CALL hdfrdr
(sd_id,"time",time,istat)
END IF ! myproc == 0
CALL mpupdatei
(intver,1)
CALL mpupdatec
(runname, 40)
CALL mpupdatec
(tmunit, 10)
CALL mpupdater
(time, 1)
!-----------------------------------------------------------------------
!
! Get dimensions of data in binary file and check against
! the dimensions passed to HDFREADSPLIT
!
!-----------------------------------------------------------------------
IF (myproc == 0) THEN
CALL hdfrdi
(sd_id,"nx",nxin,istat)
CALL hdfrdi
(sd_id,"ny",nyin,istat)
CALL hdfrdi
(sd_id,"nz",nzin,istat)
IF ( nxin /= nxlg .OR. nyin /= nylg .OR. nzin /= nzlg ) THEN
WRITE(6,'(1x,a)') ' Dimensions in HDFREADSPLIT inconsistent with data.'
WRITE(6,'(1x,a,3I15)') ' Read were: ', nxin, nyin, nzin
WRITE(6,'(1x,a,3I15)') ' Expected: ', nxlg, nylg, nzlg
WRITE(6,'(1x,a)') ' Program aborted in HDFREADSPLIT.'
CALL arpsstop
('arpsstop called from HDFREADSPLIT due to nxin...',1)
END IF
IF (intver <= intver410) THEN
nzsoilin = 2 ! for versions earlier than 410, it is actually
! a 2 level soil model.
ELSE IF (intver >= intver500) THEN
CALL hdfrdi
(sd_id,"nzsoil",nzsoilin,istat)
END IF
IF (nzsoilin /= nzsoillg) THEN
IF (intver <= intver410) THEN
WRITE(6,'(1x,a,a/,2(1x,a/))') &
' The incoming data version is ', fmtverin, &
' In the input file, nzsoil must be set to 2. ', &
' Program aborted in HDFREADSPLIT.'
ELSE IF (intver >= intver500) THEN
WRITE(6,'(1x,a)') &
' Dimensions in BINREAD inconsistent with data.'
WRITE(6,'(1x,a,I15)') ' Read were: ', nzsoilin
WRITE(6,'(1x,a,I15)') ' Expected: ', nzsoillg
WRITE(6,'(1x,a)') ' Program aborted in HDFREADSPLIT.'
END IF
CALL arpsstop
('arpsstop called from HDFREADSPLIT due to nzsoilin...',1)
END IF
END IF ! myproc == 0
!-----------------------------------------------------------------------
!
! Read in flags for different data groups
!
!-----------------------------------------------------------------------
IF ( grdbas == 1 ) THEN ! Read grid and base state arrays
IF(myproc == 0) THEN
WRITE(lchanl,'(1x,a,f8.1,a,f8.3,a/)') &
'To read grid and base state data at time ', time, &
' secs = ',(time/60.),' mins.'
CALL hdfrdi
(sd_id,"grdflg",bgrdin,istat)
CALL hdfrdi
(sd_id,"basflg",bbasin,istat)
CALL hdfrdi
(sd_id,"varflg",bvarin,istat)
CALL hdfrdi
(sd_id,"mstflg",mstin,istat)
CALL hdfrdi
(sd_id,"iceflg",bicein,istat)
CALL hdfrdi
(sd_id,"trbflg",btrbin,istat)
CALL hdfrdi
(sd_id,"landflg",landin,istat)
CALL hdfrdi
(sd_id,"totflg",totin,istat)
CALL hdfrdi
(sd_id,"tkeflg",btkein,istat)
END IF
CALL mpupdatei
(bgrdin, 1)
CALL mpupdatei
(bbasin, 1)
CALL mpupdatei
(bvarin, 1)
CALL mpupdatei
(mstin, 1)
CALL mpupdatei
(bicein, 1)
CALL mpupdatei
(btrbin, 1)
CALL mpupdatei
(landin, 1)
CALL mpupdatei
(totin, 1)
CALL mpupdatei
(btkein, 1)
ELSE ! Normal data reading
IF(myproc == 0) THEN
WRITE(lchanl,'(1x,a,f8.1,a,f8.3,a/)')'To read data for time:', &
time,' secs = ',(time/60.),' mins.'
CALL hdfrdi
(sd_id,"grdflg",grdin,istat)
CALL hdfrdi
(sd_id,"basflg",basin,istat)
CALL hdfrdi
(sd_id,"varflg",varin,istat)
CALL hdfrdi
(sd_id,"mstflg",mstin,istat)
CALL hdfrdi
(sd_id,"iceflg",icein,istat)
CALL hdfrdi
(sd_id,"trbflg",trbin,istat)
CALL hdfrdi
(sd_id,"sfcflg",sfcin,istat)
CALL hdfrdi
(sd_id,"rainflg",rainin,istat)
!Don't read landin (land data only written to base file,
!landin flag set there).
!CALL hdfrdi(sd_id,"landflg",landin,istat)
CALL hdfrdi
(sd_id,"totflg",totin,istat)
CALL hdfrdi
(sd_id,"tkeflg",tkein,istat)
END IF
CALL mpupdatei
(grdin, 1)
CALL mpupdatei
(basin, 1)
CALL mpupdatei
(varin, 1)
CALL mpupdatei
(mstin, 1)
CALL mpupdatei
(icein, 1)
CALL mpupdatei
(trbin, 1)
CALL mpupdatei
(sfcin, 1)
CALL mpupdatei
(rainin, 1)
CALL mpupdatei
(totin, 1)
CALL mpupdatei
(tkein, 1)
END IF
IF(myproc == 0) THEN
CALL hdfrdi
(sd_id,"nstyp",nstyp1,istat)
IF ( nstyp1 < 1 ) nstyp1 = 1
IF (nstyp1 > nstyp) THEN
WRITE (6,*) "HDFREADSPLIT: WARNING, nstyp in file (",nstyp1, &
") greater than that specified in input file (",nstyp, &
"), using only",nstyp
nstypin = nstyp
ELSE
nstypin = nstyp1
ENDIF
CALL hdfrdi
(sd_id,"prcflg",prcin,istat)
CALL hdfrdi
(sd_id,"radflg",radin,istat)
CALL hdfrdi
(sd_id,"flxflg",flxin,istat)
CALL hdfrdi
(sd_id,"snowflg",snowin,istat)
CALL hdfrdi
(sd_id,"month",month,istat)
CALL hdfrdi
(sd_id,"day",day,istat)
CALL hdfrdi
(sd_id,"year",year,istat)
CALL hdfrdi
(sd_id,"hour",hour,istat)
CALL hdfrdi
(sd_id,"minute",minute,istat)
CALL hdfrdi
(sd_id,"second",second,istat)
CALL hdfrdr
(sd_id,"umove",umove,istat)
CALL hdfrdr
(sd_id,"vmove",vmove,istat)
CALL hdfrdr
(sd_id,"xgrdorg",xgrdorg,istat)
CALL hdfrdr
(sd_id,"ygrdorg",ygrdorg,istat)
CALL hdfrdi
(sd_id,"mapproj",mapproj,istat)
CALL hdfrdr
(sd_id,"trulat1",trulat1,istat)
CALL hdfrdr
(sd_id,"trulat2",trulat2,istat)
CALL hdfrdr
(sd_id,"trulon",trulon,istat)
CALL hdfrdr
(sd_id,"sclfct",sclfct,istat)
CALL hdfrdr
(sd_id,"tstop",tstop,istat)
CALL hdfrdr
(sd_id,"thisdmp",thisdmp,istat)
CALL hdfrdr
(sd_id,"latitud",latitud,istat)
CALL hdfrdr
(sd_id,"ctrlat",ctrlat,istat)
CALL hdfrdr
(sd_id,"ctrlon",ctrlon,istat)
END IF
CALL mpupdatei
(nstypin, 1)
CALL mpupdatei
(nstyp1, 1)
CALL mpupdatei
(prcin,1)
CALL mpupdatei
(radin,1)
CALL mpupdatei
(flxin,1)
CALL mpupdatei
(snowin,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)
CALL mpupdater
(umove,1)
CALL mpupdater
(vmove,1)
CALL mpupdater
(xgrdorg,1)
CALL mpupdater
(ygrdorg,1)
CALL mpupdatei
(mapproj,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)
ALLOCATE (var1d(MAX(nxlg,nylg,nzlg)),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "HDFREADSPLIT: ERROR allocating var1d, returning"
RETURN
END IF
ALLOCATE (var3d(nxlg,nylg,MAX(nzlg,nzsoillg,nstyps+1,4)),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "HDFREADSPLIT: ERROR allocating var3d, returning"
RETURN
END IF
ALLOCATE (var3di(nxlg,nylg,nstypin),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "HDFREADSPLIT: ERROR allocating var3di, returning"
RETURN
END IF
ALLOCATE (var4d(nxlg,nylg,nzsoillg,0:nstyps),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "HDFREADSPLIT: ERROR allocating var4d, returning"
RETURN
END IF
!-----------------------------------------------------------------------
!
! Read in x,y and z at grid cell centers (scalar points).
!
!-----------------------------------------------------------------------
IF( grdin == 1 .OR. grdbas == 1 ) THEN
IF(myproc == 0) THEN
CALL hdfrd1d
(sd_id,"x",nxlg,var1d,istat)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit1dx
(var1d,nx,x)
IF(myproc == 0) THEN
CALL hdfrd1d
(sd_id,"y",nylg,var1d,istat)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit1dy
(var1d,ny,y)
IF(myproc == 0) THEN
CALL hdfrd1d
(sd_id,"z",nzlg,z,istat)
IF (istat /= 0) GO TO 110
END IF
CALL mpupdater
(z, nz)
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"zp",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,zp)
IF (intver <= intver410) THEN
!
! nzsoil must equal to 2, 06/28/2002, Zuwen
! assume zpsoil(,,2) is one meter below the surface.
!
DO j=1,ny
DO i=1,nx
zpsoil(i,j,1)=zp(i,j,2)
zpsoil(i,j,2)=zpsoil(i,j,1)-1.
END DO
END DO
IF (myproc == 0) THEN
WRITE(6,*) ' Assign zpsoil. '
WRITE(6,*) ' Assume zpsoil(,,1) is zp(,,2). '
WRITE(6,*) ' Assume zpsoil(,,2) is zp(,,2)-1. '
END IF
ELSE IF (intver >= intver500) THEN
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"zpsoil",nxlg,nylg,nzsoillg,var3d,istat, &
itmpsoil,hmaxsoil,hminsoil)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nzsoil,zpsoil)
END IF
END IF ! grdin
!-----------------------------------------------------------------------
!
! Read in base state fields
!
!-----------------------------------------------------------------------
IF( basin == 1 .OR. grdbas == 1 ) THEN
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"ubar",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,ubar)
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"vbar",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,vbar)
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"wbar",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,wbar)
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"ptbar",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,ptbar)
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"pbar",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,pbar)
IF( mstin == 1) THEN
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"qvbar",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,qvbar)
END IF
IF (landin == 1) THEN
IF(myproc == 0) THEN
CALL hdfrd3di
(sd_id,"soiltyp",nxlg,nylg,nstypin,var3di,istat)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3di
(var3di,nx,ny,nstypin,soiltyp)
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"stypfrct",nxlg,nylg,nstypin, &
var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nstypin,stypfrct)
CALL fix_stypfrct_nstyp
(nx,ny,nstyp1,nstyp,stypfrct)
IF(myproc == 0) THEN
CALL hdfrd2di
(sd_id,"vegtyp",nxlg,nylg,var3di,istat)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3di
(var3di,nx,ny,1,vegtyp)
IF(myproc == 0) THEN
CALL hdfrd2d
(sd_id,"lai",nxlg,nylg,var3d,istat,itmp)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,1,lai)
IF(myproc == 0) THEN
CALL hdfrd2d
(sd_id,"roufns",nxlg,nylg,var3d,istat,itmp)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,1,roufns)
IF(myproc == 0) THEN
CALL hdfrd2d
(sd_id,"veg",nxlg,nylg,var3d,istat,itmp)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,1,veg)
END IF
END IF
IF( grdbas == 1 ) GO TO 930
IF( varin == 1 ) THEN
IF ( totin == 0 ) THEN
!-----------------------------------------------------------------------
!
! Read in perturbations from history dump
!
!-----------------------------------------------------------------------
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"uprt",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,uprt)
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"vprt",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,vprt)
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"wprt",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,wprt)
!-----------------------------------------------------------------------
!
! Read in scalars
!
!-----------------------------------------------------------------------
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"ptprt",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,ptprt)
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"pprt",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,pprt)
ELSE
!-----------------------------------------------------------------------
!
! Read in total values of variables from history dump
!
!-----------------------------------------------------------------------
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"u",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,uprt)
DO k=1,nz-1
DO j=1,ny-1
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 hdfrd3d
(sd_id,"v",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,vprt)
DO k=1,nz-1
DO j=1,ny
DO i=1,nx-1
vprt(i,j,k) = vprt(i,j,k) - vbar(i,j,k)
END DO
END DO
END DO
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"w",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,wprt)
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"pt",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,ptprt)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
ptprt(i,j,k) = ptprt(i,j,k) - ptbar(i,j,k)
END DO
END DO
END DO
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"p",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,pprt)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
pprt(i,j,k) = pprt(i,j,k) - pbar(i,j,k)
END DO
END DO
END DO
END IF
END IF
!-----------------------------------------------------------------------
!
! Read in moisture variables
!
!-----------------------------------------------------------------------
IF( mstin == 1 ) THEN
IF ( totin == 0 ) THEN
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"qvprt",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,qvprt)
ELSE
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"qv",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,qvprt)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
qvprt(i,j,k) = qvprt(i,j,k) - qvbar(i,j,k)
END DO
END DO
END DO
END IF
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"qc",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,qc)
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"qr",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,qr)
IF( rainin == 1 ) THEN
IF(myproc == 0) THEN
CALL hdfrd2d
(sd_id,"raing",nxlg,nylg,var3d,istat,itmp)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,1,raing)
IF(myproc == 0) THEN
CALL hdfrd2d
(sd_id,"rainc",nxlg,nylg,var3d,istat,itmp)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,1,rainc)
END IF
IF( prcin == 1 ) THEN
IF(myproc == 0) THEN
CALL hdfrd2d
(sd_id,"prcrate1",nxlg,nylg,var3d(1,1,1),istat,itmp)
IF (istat /= 0) GO TO 110
CALL hdfrd2d
(sd_id,"prcrate2",nxlg,nylg,var3d(1,1,2),istat,itmp)
IF (istat /= 0) GO TO 110
CALL hdfrd2d
(sd_id,"prcrate3",nxlg,nylg,var3d(1,1,3),istat,itmp)
IF (istat /= 0) GO TO 110
CALL hdfrd2d
(sd_id,"prcrate4",nxlg,nylg,var3d(1,1,4),istat,itmp)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,4,prcrate)
END IF
IF( icein == 1 ) THEN
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"qi",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,qi)
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"qs",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,qs)
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"qh",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,qh)
END IF
END IF
IF( tkein == 1 ) THEN
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"tke",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,tke)
END IF
IF( trbin == 1 ) THEN
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"kmh",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,kmh)
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"kmv",nxlg,nylg,nzlg,var3d,istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,kmv)
END IF
IF( sfcin == 1 ) THEN
IF (intver <= intver410) THEN
ALLOCATE (tem2(nx,ny,0:nstyps),stat=istat)
tem2=0.
IF (myproc == 0) THEN
CALL hdfrd3d
(sd_id,"tsfc",nxlg,nylg,nstypin+1,var3d,istat, &
itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d, nx, ny, nstypin+1, tem2)
DO is=0,nstypin
DO j=1,ny
DO i=1,nx
tsoil(i,j,1,is)=tem2(i,j,is)
END DO
END DO
END DO
tem2=0.
IF (myproc == 0) THEN
CALL hdfrd3d
(sd_id,"tsoil",nxlg,nylg,nstypin+1,var3d,istat, &
itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d, nx, ny, nstypin+1, tem2)
DO is=0,nstypin
DO j=1,ny
DO i=1,nx
tsoil(i,j,2,is)=tem2(i,j,is)
END DO
END DO
END DO
tem2=0.
IF (myproc == 0) THEN
CALL hdfrd3d
(sd_id,"wetsfc",nxlg,nylg,nstypin+1,var3d, &
istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d, nx, ny, nstypin+1, tem2)
DO is=0,nstypin
DO j=1,ny
DO i=1,nx
qsoil(i,j,1,is)=tem2(i,j,is)
END DO
END DO
END DO
tem2=0.
IF (myproc == 0) THEN
CALL hdfrd3d
(sd_id,"wetdp",nxlg,nylg,nstypin+1,var3d, &
istat,itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d, nx, ny, nstypin+1, tem2)
DO is=0,nstypin
DO j=1,ny
DO i=1,nx
qsoil(i,j,2,is)=tem2(i,j,is)
END DO
END DO
END DO
DEALLOCATE (tem2,stat=istat)
ELSE IF (intver >= intver500) THEN
IF(myproc == 0) THEN
CALL hdfrd4d
(sd_id,"tsoil",nxlg,nylg,nzsoillg,nstypin+1,var4d,istat, &
itmpsoil,hmaxsoil,hminsoil)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit4d
(var4d,nx,ny,nzsoil,nstypin+1,tsoil)
IF(myproc == 0) THEN
CALL hdfrd4d
(sd_id,"qsoil",nxlg,nylg,nzsoillg,nstypin+1,var4d,istat, &
itmpsoil,hmaxsoil,hminsoil)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit4d
(var4d,nx,ny,nzsoil,nstypin+1,qsoil)
END IF
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"wetcanp",nxlg,nylg,nstypin+1,var3d,istat, &
itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nstypin+1,wetcanp)
CALL fix_soil_nstyp
(nx,ny,nzsoil,nstyp1,nstyp,tsoil,qsoil,wetcanp)
IF (snowin == 1) THEN
IF(myproc == 0) THEN
CALL hdfrd2d
(sd_id,"snowdpth",nxlg,nylg,var3d,istat,itmp)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,1,snowdpth)
END IF
END IF
IF( radin == 1 ) THEN
IF(myproc == 0) THEN
CALL hdfrd3d
(sd_id,"radfrc",nxlg,nylg,nzlg,var3d,istat, &
itmp,hmax,hmin)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,nz,radfrc)
IF(myproc == 0) THEN
CALL hdfrd2d
(sd_id,"radsw",nxlg,nylg,var3d,istat,itmp)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,1,radsw)
IF(myproc == 0) THEN
CALL hdfrd2d
(sd_id,"rnflx",nxlg,nylg,var3d,istat,itmp)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,1,rnflx)
IF (intver <= intver410) THEN
radswnet=0.
radlwin=0.
ELSE IF (intver >= intver500) THEN
IF(myproc == 0) THEN
CALL hdfrd2d
(sd_id,"radswnet",nxlg,nylg,var3d,istat,itmp)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,1,radswnet)
IF(myproc == 0) THEN
CALL hdfrd2d
(sd_id,"radlwin",nxlg,nylg,var3d,istat,itmp)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,1,radlwin)
END IF
END IF
IF( flxin == 1 ) THEN
IF(myproc == 0) THEN
CALL hdfrd2d
(sd_id,"usflx",nxlg,nylg,var3d,istat,itmp)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,1,usflx)
IF(myproc == 0) THEN
CALL hdfrd2d
(sd_id,"vsflx",nxlg,nylg,var3d,istat,itmp)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,1,vsflx)
IF(myproc == 0) THEN
CALL hdfrd2d
(sd_id,"ptsflx",nxlg,nylg,var3d,istat,itmp)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,1,ptsflx)
IF(myproc == 0) THEN
CALL hdfrd2d
(sd_id,"qvsflx",nxlg,nylg,var3d,istat,itmp)
IF (istat /= 0) GO TO 110
END IF
CALL mpisplit3d
(var3d,nx,ny,1,qvsflx)
END IF
!-----------------------------------------------------------------------
!
! Friendly exit message
!
!-----------------------------------------------------------------------
930 CONTINUE
IF(myproc == 0) &
WRITE(6,'(/a,F8.1,a/)') &
' Data at time=', time/60,' (min) were successfully read.'
ireturn = 0
GO TO 130
!-----------------------------------------------------------------------
!
! Error during read
!
!-----------------------------------------------------------------------
110 CONTINUE
IF(myproc == 0) &
WRITE(6,'(/a/)') ' Error reading data in HDFREADSPLIT'
ireturn=1
GO TO 130
!-----------------------------------------------------------------------
!
! End-of-file during read
!
!-----------------------------------------------------------------------
! 120 CONTINUE
! IF(myproc == 0) &
! WRITE(6,'(/a/)') ' End of file reached in HDFREADSPLIT'
! ireturn=2
130 CONTINUE
IF(myproc == 0) THEN
CALL hdfclose
(sd_id,istat)
IF (ireturn == 0) THEN
IF (istat == 0) THEN
WRITE(*,*) "HDFREADSPLIT: Successfully read ", trim(filename)
ELSE
WRITE(*,*) "HDFREADSPLIT: ERROR (status=", istat, ") closing ", trim(filename)
END IF
END IF
END IF
DEALLOCATE (itmp,stat=istat)
DEALLOCATE (hmax,stat=istat)
DEALLOCATE (hmin,stat=istat)
DEALLOCATE (itmpsoil,stat=istat)
DEALLOCATE (hmaxsoil,stat=istat)
DEALLOCATE (hminsoil,stat=istat)
DEALLOCATE (var1d, var3d, var3di, var4d)
RETURN
END SUBROUTINE hdfreadsplit
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFDUMP ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfdump(nx,ny,nz,nzsoil,nstyps, filename , grdbas, & 1,169
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, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsoil,qsoil,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx,radswnet,radlwin, &
usflx,vsflx,ptsflx,qvsflx, &
tem1)
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Produces a history data file "filename" in the NCSA HDF4 format by
! calling HDF library subroutines.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/03/15
!
! MODIFICATION HISTORY:
!
! 05/15/2002 (J. Brotzge)
! Added to allow for multiple soil schemes
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
! nzsoil Number of grid points in the vertical
!
! filename File name of history dump data.
! grdbas Flag indicating if this is a call for the data dump
! of grid and base state arrays only. If so, grdbas=1.
!
! u x component of velocity at a given time level (m/s)
! v y component of velocity at a given time level (m/s)
! w Vertical component of Cartesian velocity at a given
! time level (m/s)
! ptprt Perturbation potential temperature at a given time
! level (K)
! pprt Perturbation pressure at a given time level (Pascal)
! qv Water vapor specific humidity at a given time level (kg/kg)
! qc Cloud water mixing ratio at a given time level (kg/kg)
! qr Rainwater mixing ratio at a given time level (kg/kg)
! qi Cloud ice mixing ratio at a given time level (kg/kg)
! qs Snow mixing ratio at a given time level (kg/kg)
! qh Hail mixing ratio at a given time level (kg/kg)
! tke Turbulent Kinetic Energy ((m/s)**2)
!
! kmh Horizontal turb. mixing coef. for momentum ( m**2/s )
! kmv Vertical turb. mixing coef. for momentum ( m**2/s )
!
! ubar Base state zonal velocity component (m/s)
! vbar Base state meridional velocity component (m/s)
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
! rhobar Base state density (kg/m**3)
! qvbar Base state water vapor specific humidity (kg/kg)
!
! x x coordinate of grid points in physical/comp. space (m)
! y y coordinate of grid points in physical/comp. space (m)
! z z coordinate of grid points in computational space (m)
! zp Vertical coordinate of grid points in physical space (m)
! zpsoil Vertical coordinate of grid points in the soil (m)
!
! soiltyp Soil type
! vegtyp Vegetation type
! lai Leaf Area Index
! roufns Surface roughness
! veg Vegetation fraction
!
! tsoil Soil temperature (K)
! qsoil Soil moisture (m**3/m**3)
! wetcanp Canopy water amount
!
! raing Grid supersaturation rain
! rainc Cumulus convective rain
! prcrate Precipitation rates
!
! radfrc Radiation forcing (K/s)
! radsw Solar radiation reaching the surface
! rnflx Net radiation flux absorbed by surface
! radswnet Net shortwave radiation
! radlwin Incoming longwave radiation
!
! usflx Surface flux of u-momentum (kg/(m*s**2))
! vsflx Surface flux of v-momentum (kg/(m*s**2))
! ptsflx Surface heat flux (K*kg/(m**2 * s ))
! qvsflx Surface moisture flux of (kg/(m**2 * s))
!
! OUTPUT:
!
! None.
!
! WORK ARRAY:
!
! tem1 work array.
! tem2 work array.
!
!-----------------------------------------------------------------------
!
! The following parameters are passed into this subroutine through
! a common block in globcst.inc, and they determine which
! variables are output.
!
! grdout =0 or 1. If grdout=0, grid variables are not dumped.
! basout =0 or 1. If basout=0, base state variables are not dumped.
! varout =0 or 1. If varout=0, perturbation variables are not dumped.
! mstout =0 or 1. If mstout=0, water variables are not dumped.
! rainout=0 or 1. If rainout=0, rain variables are not dumped.
! prcout =0 or 1. If prcout=0, precipitation rates are not dumped.
! iceout =0 or 1. If iceout=0, qi, qs and qh are not dumped.
! tkeout =0 or 1. If tkeout=0, tke is not dumped.
! trbout =0 or 1. If trbout=0, the eddy viscosity km is not dumped.
! radout =0 or 1. If radout=0, the radiation arrays are not dumped.
! flxout =0 or 1. If flxout=0, the surface fluxes are not dumped.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
INTEGER :: nzsoil ! Number of grid points in the soil
CHARACTER (LEN=*) :: filename
INTEGER :: grdbas ! If this is a grid/base state dump
REAL :: u (nx,ny,nz) ! Total u-velocity (m/s)
REAL :: v (nx,ny,nz) ! Total v-velocity (m/s)
REAL :: w (nx,ny,nz) ! Total w-velocity (m/s)
REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K)
REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal)
REAL :: qv (nx,ny,nz) ! Water vapor specific humidity (kg/kg)
REAL :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg)
REAL :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg)
REAL :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg)
REAL :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg)
REAL :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg)
REAL :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2)
REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for
! momentum. ( m**2/s )
REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for
! momentum. ( m**2/s )
REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s)
REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s)
REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal)
REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3)
REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific humidity
! (kg/kg)
REAL :: x (nx) ! The x-coord. of the physical and
! computational grid. Defined at u-point.
REAL :: y (ny) ! The y-coord. of the physical and
! computational grid. Defined at v-point.
REAL :: z (nz) ! The z-coord. of the computational grid.
! Defined at w-point on the staggered grid.
REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at
! w-point of the staggered grid.
REAL :: zpsoil(nx,ny,nzsoil) ! The physical height coordinate defined at
! w-point of the soil.
INTEGER :: nstyps ! Number of soil type
INTEGER :: soiltyp (nx,ny,nstyps) ! Soil type
REAL :: stypfrct(nx,ny,nstyps) ! Fraction of soil types
INTEGER :: vegtyp (nx,ny) ! Vegetation type
REAL :: lai (nx,ny) ! Leaf Area Index
REAL :: roufns (nx,ny) ! Surface roughness
REAL :: veg (nx,ny) ! Vegetation fraction
REAL :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil temperature (K)
REAL :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil moisture (m**3/m**3)
REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount
REAL :: snowdpth(nx,ny) ! Snow depth (m)
REAL :: raing(nx,ny) ! Grid supersaturation rain
REAL :: rainc(nx,ny) ! Cumulus convective rain
REAL :: prcrate(nx,ny,4) ! precipitation rates (kg/(m**2*s))
! prcrate(1,1,1) = total precip. rate
! prcrate(1,1,2) = grid scale precip. rate
! prcrate(1,1,3) = cumulative precip. rate
! prcrate(1,1,4) = microphysics precip. rate
REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s)
REAL :: radsw (nx,ny) ! Solar radiation reaching the surface
REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface
REAL :: radswnet(nx,ny) ! Net shortwave radiation
REAL :: radlwin(nx,ny) ! Incoming longwave radiation
REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2))
REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2))
REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m*s**2))
REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s))
REAL :: tem1 (nx,ny,nz) ! Temporary work array
INTEGER(2), allocatable :: itmp(:,:,:) ! Temporary array
REAL, allocatable :: hmax(:), hmin(:) ! Temporary array
INTEGER(2), allocatable :: itmpsoil(:,:,:,:) ! Temporary array
REAL, allocatable :: hmaxsoil(:), hminsoil(:)! Temporary array
!
! 06/28/2002 Zuwen He
!
! Create a tem2 which will be used when dump data in previous version.
! It may be better to pass the array from the argument list
! in the future.
!
REAL, allocatable :: tem2(:,:,:) ! Temporary array
REAL :: dx_out,dy_out
!-----------------------------------------------------------------------
!
! Parameters describing this routine
!
!-----------------------------------------------------------------------
! 06/28/2002 Zuwen He
!
! fmtver??: to label each data a version.
! intver??: an integer to allow faster comparison than fmtver??,
! which are strings.
!
! Verion 5.00: significant change in soil variables since version 4.10.
!
CHARACTER (LEN=40) :: fmtver,fmtver410,fmtver500
INTEGER :: intver,intver410,intver500
PARAMETER (fmtver410='004.10 HDF4 Coded Data',intver410=410)
PARAMETER (fmtver500='005.00 HDF4 Coded Data',intver500=500)
CHARACTER (LEN=10) :: tmunit
PARAMETER (tmunit='seconds ')
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
INTEGER :: i,j,k,is
INTEGER :: nstypout
INTEGER :: istat, sd_id
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid parameters
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IF (hdfcompr > 3) THEN
ALLOCATE (itmp(nx,ny,nz),stat=istat)
IF (istat /= 0) THEN
IF(myproc == 0) &
WRITE (6,*) "HDFDUMP: ERROR allocating itmp, returning"
RETURN
END IF
ALLOCATE (hmax(nz),stat=istat)
IF (istat /= 0) THEN
IF(myproc == 0) &
WRITE (6,*) "HDFDUMP: ERROR allocating hmax, returning"
RETURN
END IF
ALLOCATE (hmin(nz),stat=istat)
IF (istat /= 0) THEN
IF(myproc == 0) &
WRITE (6,*) "HDFDUMP: ERROR allocating hmin, returning"
RETURN
END IF
ALLOCATE (itmpsoil(nx,ny,nzsoil,0:nstyps),stat=istat)
IF (istat /= 0) THEN
IF(myproc == 0) &
WRITE (6,*) "HDFDUMP: ERROR allocating itmp, returning"
RETURN
END IF
ALLOCATE (hmaxsoil(nzsoil),stat=istat)
IF (istat /= 0) THEN
IF(myproc == 0) &
WRITE (6,*) "HDFDUMP: ERROR allocating hmax, returning"
RETURN
END IF
ALLOCATE (hminsoil(nzsoil),stat=istat)
IF (istat /= 0) THEN
IF(myproc == 0) &
WRITE (6,*) "HDFDUMP: ERROR allocating hmin, returning"
RETURN
END IF
END IF
IF (myproc == 0) &
WRITE(6,'(1x,a,f13.3,a,a/)') &
'Writing HDF4 data at time=', curtim,' into file ',filename
!-----------------------------------------------------------------------
!
! Create the HDF4 file.
!
!-----------------------------------------------------------------------
CALL hdfopen
(filename,2,sd_id)
IF (sd_id < 0) THEN
IF(myproc == 0) &
WRITE (6,*) "HDFDUMP: ERROR creating HDF4 file: ", &
trim(filename)
GO TO 600
END IF
intver = intver500 ! for the time being, in the future, we will
! allow to dump data in the different version
! intver will be assigned from input file
IF (intver == intver410) THEN
fmtver=fmtver410
ELSE IF (intver == intver500) THEN
fmtver=fmtver500
ELSE
IF (myproc == 0) WRITE(6,'(/1x,a,i10,a/)') &
' Data format, intver=',intver, &
', not found. The Job stopped.'
CALL arpsstop
('arpstop called from HDFDUMP. ',1)
END IF
CALL hdfwrtc
(sd_id, 40, 'fmtver', fmtver, istat)
CALL hdfwrtc
(sd_id, 40, 'runname', runname, istat)
CALL hdfwrti
(sd_id, 'nocmnt', nocmnt, istat)
IF( nocmnt > 0 ) THEN
CALL hdfwrtc
(sd_id, 80*nocmnt, 'cmnt', cmnt, istat)
END IF
CALL hdfwrtc
(sd_id, 7, 'tmunit', 'seconds', istat)
CALL hdfwrtr
(sd_id, 'time', curtim, istat)
CALL hdfwrti
(sd_id, 'nx', nx, istat)
CALL hdfwrti
(sd_id, 'ny', ny, istat)
CALL hdfwrti
(sd_id, 'nz', nz, istat)
IF (intver >= intver500) THEN
CALL hdfwrti
(sd_id, 'nzsoil', nzsoil, istat)
END IF
IF( grdbas == 1 ) THEN
CALL hdfwrti
(sd_id, 'grdflg', 1, istat)
CALL hdfwrti
(sd_id, 'basflg', 1, istat)
CALL hdfwrti
(sd_id, 'varflg', 0, istat)
CALL hdfwrti
(sd_id, 'mstflg', 1, istat)
CALL hdfwrti
(sd_id, 'iceflg', 0, istat)
CALL hdfwrti
(sd_id, 'trbflg', 0, istat)
CALL hdfwrti
(sd_id, 'sfcflg', 0, istat)
CALL hdfwrti
(sd_id, 'rainflg', 0, istat)
CALL hdfwrti
(sd_id, 'landflg', landout, istat)
CALL hdfwrti
(sd_id, 'totflg', 1, istat)
CALL hdfwrti
(sd_id, 'tkeflg', 0, istat)
ELSE
CALL hdfwrti
(sd_id, 'grdflg', grdout, istat)
CALL hdfwrti
(sd_id, 'basflg', basout, istat)
CALL hdfwrti
(sd_id, 'varflg', varout, istat)
CALL hdfwrti
(sd_id, 'mstflg', mstout, istat)
CALL hdfwrti
(sd_id, 'iceflg', iceout, istat)
CALL hdfwrti
(sd_id, 'trbflg', trbout, istat)
CALL hdfwrti
(sd_id, 'sfcflg', sfcout, istat)
CALL hdfwrti
(sd_id, 'rainflg', rainout, istat)
CALL hdfwrti
(sd_id, 'landflg', landout*basout, istat)
CALL hdfwrti
(sd_id, 'totflg', totout, istat)
CALL hdfwrti
(sd_id, 'tkeflg', tkeout, istat)
END IF
nstypout = max(1,nstyps)
CALL hdfwrti
(sd_id, 'nstyp', nstypout, istat)
CALL hdfwrti
(sd_id, 'prcflg', prcout, istat)
CALL hdfwrti
(sd_id, 'radflg', radout, istat)
CALL hdfwrti
(sd_id, 'flxflg', flxout, istat)
CALL hdfwrti
(sd_id, 'snowflg', snowout, istat)
CALL hdfwrti
(sd_id, 'day', day, istat)
CALL hdfwrti
(sd_id, 'year', year, istat)
CALL hdfwrti
(sd_id, 'month', month, istat)
CALL hdfwrti
(sd_id, 'hour', hour, istat)
CALL hdfwrti
(sd_id, 'minute', minute, istat)
CALL hdfwrti
(sd_id, 'second', second, istat)
CALL hdfwrtr
(sd_id, 'umove', umove, istat)
CALL hdfwrtr
(sd_id, 'vmove', vmove, istat)
CALL hdfwrtr
(sd_id, 'xgrdorg', xgrdorg, istat)
CALL hdfwrtr
(sd_id, 'ygrdorg', ygrdorg, istat)
CALL hdfwrti
(sd_id, 'mapproj', mapproj, istat)
CALL hdfwrtr
(sd_id, 'trulat1', trulat1, istat)
CALL hdfwrtr
(sd_id, 'trulat2', trulat2, istat)
CALL hdfwrtr
(sd_id, 'trulon', trulon, istat)
CALL hdfwrtr
(sd_id, 'sclfct', sclfct, istat)
CALL hdfwrtr
(sd_id, 'tstop', tstop, istat)
CALL hdfwrtr
(sd_id, 'thisdmp', thisdmp, istat)
CALL hdfwrtr
(sd_id, 'latitud', latitud, istat)
CALL hdfwrtr
(sd_id, 'ctrlat', ctrlat, istat)
CALL hdfwrtr
(sd_id, 'ctrlon', ctrlon, istat)
dx_out = x(2) - x(1)
dy_out = y(2) - y(1)
CALL hdfwrtr
(sd_id, 'dx', dx_out, istat)
CALL hdfwrtr
(sd_id, 'dy', dy_out, istat)
!-----------------------------------------------------------------------
!
! If grdout=1 or grdbas=1, write out grid variables
!
!-----------------------------------------------------------------------
IF(grdout == 1 .OR. grdbas == 1 ) THEN
CALL hdfwrt1d
(x,nx,sd_id,'x','x coordinate','m')
CALL hdfwrt1d
(y,ny,sd_id,'y','y coordinate','m')
CALL hdfwrt1d
(z,nz,sd_id,'z','z coordinate','m')
CALL hdfwrt3d
(zp,nx,ny,nz,sd_id,0,hdfcompr, &
'zp','Physical height coordinate','m', &
itmp,hmax,hmin)
IF (intver >= intver500) THEN
CALL hdfwrt3d
(zpsoil,nx,ny,nzsoil,sd_id,0,hdfcompr, &
'zpsoil','Physical height coordinate (soil)','m', &
itmpsoil,hmaxsoil,hminsoil)
END IF
END IF
!-----------------------------------------------------------------------
!
! If basout=1, write out base state variables.
!
!-----------------------------------------------------------------------
IF(basout == 1 .OR. grdbas == 1 ) THEN
CALL edgfill
(ubar,1,nx,1,nx, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL hdfwrt3d
(ubar,nx,ny,nz,sd_id,1,hdfcompr, &
'ubar','Base state u-velocity','m/s', &
itmp,hmax,hmin)
CALL edgfill
(vbar,1,nx,1,nx-1, 1,ny,1,ny, 1,nz,1,nz-1)
CALL hdfwrt3d
(vbar,nx,ny,nz,sd_id,2,hdfcompr, &
'vbar','Base state v-velocity','m/s', &
itmp,hmax,hmin)
DO k=1,nz
DO j=1,ny
DO i=1,nx
tem1(i,j,k) = 0.0
END DO
END DO
END DO
CALL hdfwrt3d
(tem1,nx,ny,nz,sd_id,3,hdfcompr, &
'wbar','Base state w-velocity','m/s', &
itmp,hmax,hmin)
CALL edgfill
(ptbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL hdfwrt3d
(ptbar,nx,ny,nz,sd_id,0,hdfcompr, &
'ptbar','Base state potential temperature','K', &
itmp,hmax,hmin)
CALL edgfill
(pbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL hdfwrt3d
(pbar,nx,ny,nz,sd_id,0,hdfcompr, &
'pbar','Base state pressure','Pascal', &
itmp,hmax,hmin)
IF(mstout == 1) THEN
CALL edgfill
(qvbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL hdfwrt3d
(qvbar,nx,ny,nz,sd_id,0,hdfcompr, &
'qvbar','Base state water vapor specific humidity','kg/kg', &
itmp,hmax,hmin)
END IF
IF(landout == 1) THEN
CALL iedgfill
(soiltyp(1,1,1),1,nx,1,nx-1, 1,ny,1,ny-1, &
1,nstypout,1,nstypout)
CALL hdfwrt3di
(soiltyp,nx,ny,nstypout,sd_id,0,0, &
'soiltyp','Soil type','index')
CALL edgfill
(stypfrct(1,1,1),1,nx,1,nx-1, 1,ny,1,ny-1, &
1,nstypout,1,nstypout)
CALL hdfwrt3d
(stypfrct(1,1,1),nx,ny,nstypout,sd_id,0,hdfcompr, &
'stypfrct','Soil type fractional coverage','fraction', &
itmp,hmax,hmin)
CALL iedgfill
(vegtyp ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL hdfwrt2di
(vegtyp,nx,ny,sd_id,0,0, &
'vegtyp','Vegetation type','index')
CALL edgfill
(lai ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL hdfwrt2d
(lai,nx,ny,sd_id,0,hdfcompr, &
'lai','Leaf Area Index','index',itmp)
CALL edgfill
(roufns ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL hdfwrt2d
(roufns,nx,ny,sd_id,0,hdfcompr, &
'roufns','Surface roughness','0-1',itmp)
CALL edgfill
(veg ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL hdfwrt2d
(veg,nx,ny,sd_id,0,hdfcompr, &
'veg','Vegetation fraction','fraction',itmp)
END IF
END IF
IF ( grdbas == 1 ) GO TO 600
!-----------------------------------------------------------------------
!
! If varout = 1, Write out uprt, vprt, wprt, ptprt, pprt.
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! Write out u,v and w.
!
!-----------------------------------------------------------------------
IF(varout == 1) THEN
IF ( totout == 0 ) THEN
!-----------------------------------------------------------------------
!
! Write out perturbations to history dump
!
!-----------------------------------------------------------------------
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx
tem1(i,j,k)=u(i,j,k)-ubar(i,j,k)
END DO
END DO
END DO
CALL edgfill
(tem1,1,nx,1,nx, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL hdfwrt3d
(tem1,nx,ny,nz,sd_id,1,hdfcompr, &
'uprt','Perturbation u-velocity','m/s', &
itmp,hmax,hmin)
DO k=1,nz-1
DO j=1,ny
DO i=1,nx-1
tem1(i,j,k)=v(i,j,k)-vbar(i,j,k)
END DO
END DO
END DO
CALL edgfill
(tem1,1,nx,1,nx-1, 1,ny,1,ny, 1,nz,1,nz-1)
CALL hdfwrt3d
(tem1,nx,ny,nz,sd_id,2,hdfcompr, &
'vprt','Perturbation v-velocity','m/s', &
itmp,hmax,hmin)
CALL edgfill
(w,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz)
CALL hdfwrt3d
(w,nx,ny,nz,sd_id,3,hdfcompr, &
'wprt','Perturbation w-velocity','m/s', &
itmp,hmax,hmin)
!-----------------------------------------------------------------------
!
! Write out scalars
!
!-----------------------------------------------------------------------
CALL edgfill
(ptprt,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL hdfwrt3d
(ptprt,nx,ny,nz,sd_id,0,hdfcompr, &
'ptprt','Perturbation potential temperature','K', &
itmp,hmax,hmin)
CALL edgfill
(pprt,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL hdfwrt3d
(pprt,nx,ny,nz,sd_id,0,hdfcompr, &
'pprt','Perturbation pressure','Pascal', &
itmp,hmax,hmin)
ELSE
!-----------------------------------------------------------------------
!
! Write out total values to history dump
!
!-----------------------------------------------------------------------
CALL edgfill
(u,1,nx,1,nx, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL hdfwrt3d
(u,nx,ny,nz,sd_id,1,hdfcompr, &
'u','u-velocity','m/s', &
itmp,hmax,hmin)
CALL edgfill
(v,1,nx,1,nx-1, 1,ny,1,ny, 1,nz,1,nz-1)
CALL hdfwrt3d
(v,nx,ny,nz,sd_id,2,hdfcompr, &
'v','v-velocity','m/s', &
itmp,hmax,hmin)
CALL edgfill
(w,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz)
CALL hdfwrt3d
(w,nx,ny,nz,sd_id,3,hdfcompr, &
'w','w-velocity','m/s', &
itmp,hmax,hmin)
!-----------------------------------------------------------------------
!
! Write out scalars
!
!-----------------------------------------------------------------------
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 edgfill
(tem1,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL hdfwrt3d
(tem1,nx,ny,nz,sd_id,0,hdfcompr, &
'pt','Potential temperature','K', &
itmp,hmax,hmin)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k) = pbar(i,j,k) + pprt(i,j,k)
END DO
END DO
END DO
CALL edgfill
(tem1,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL hdfwrt3d
(tem1,nx,ny,nz,sd_id,0,hdfcompr, &
'p','Pressure','Pascal', &
itmp,hmax,hmin)
END IF
END IF ! varout
!-----------------------------------------------------------------------
!
! If mstout = 1, write out moisture scalars.
!
!-----------------------------------------------------------------------
IF(mstout == 1) THEN
IF( totout == 0 ) THEN
!-----------------------------------------------------------------------
!
! Write out perturbation to history dump
!
!-----------------------------------------------------------------------
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 edgfill
(tem1,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL hdfwrt3d
(tem1,nx,ny,nz,sd_id,0,hdfcompr, &
'qvprt','Pert. water vapor specific humidity','kg/kg', &
itmp,hmax,hmin)
ELSE
!-----------------------------------------------------------------------
!
! Write out total values to history dump
!
!-----------------------------------------------------------------------
CALL edgfill
(qv,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL hdfwrt3d
(qv,nx,ny,nz,sd_id,0,hdfcompr, &
'qv','Water vapor specific humidity','kg/kg', &
itmp,hmax,hmin)
END IF
CALL edgfill
(qc,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL hdfwrt3d
(qc,nx,ny,nz,sd_id,0,hdfcompr, &
'qc','Cloud water mixing ratio','kg/kg', &
itmp,hmax,hmin)
CALL edgfill
(qr,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL hdfwrt3d
(qr,nx,ny,nz,sd_id,0,hdfcompr, &
'qr','Rain water mixing ratio','kg/kg', &
itmp,hmax,hmin)
IF(rainout == 1) THEN
CALL edgfill
(raing, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL hdfwrt2d
(raing,nx,ny,sd_id,0,hdfcompr, &
'raing','Grid supersaturation rain','mm',itmp)
CALL edgfill
(rainc,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL hdfwrt2d
(rainc,nx,ny,sd_id,0,hdfcompr, &
'rainc','Cumulus convective rain','mm',itmp)
END IF !rainout
IF ( prcout == 1 ) THEN
CALL edgfill
(prcrate,1,nx,1,nx-1, 1,ny,1,ny-1, 1,4,1,4)
CALL hdfwrt2d
(prcrate(1,1,1),nx,ny,sd_id,0,hdfcompr, &
'prcrate1','Total precip. rate','kg/(m**2*s)',itmp)
CALL hdfwrt2d
(prcrate(1,1,2),nx,ny,sd_id,0,hdfcompr, &
'prcrate2','Grid scale precip. rate','kg/(m**2*s)',itmp)
CALL hdfwrt2d
(prcrate(1,1,3),nx,ny,sd_id,0,hdfcompr, &
'prcrate3','Cumulative precip. rate','kg/(m**2*s)',itmp)
CALL hdfwrt2d
(prcrate(1,1,4),nx,ny,sd_id,0,hdfcompr, &
'prcrate4','Microphysics precip. rate','kg/(m**2*s)',itmp)
END IF
IF(iceout == 1) THEN
CALL edgfill
(qi,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL hdfwrt3d
(qi,nx,ny,nz,sd_id,0,hdfcompr, &
'qi','Cloud ice mixing ratio','kg/kg', &
itmp,hmax,hmin)
CALL edgfill
(qs,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL hdfwrt3d
(qs,nx,ny,nz,sd_id,0,hdfcompr, &
'qs','Snow mixing ratio','kg/kg', &
itmp,hmax,hmin)
CALL edgfill
(qh,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL hdfwrt3d
(qh,nx,ny,nz,sd_id,0,hdfcompr, &
'qh','Hail mixing ratio','kg/kg', &
itmp,hmax,hmin)
END IF !iceout
END IF !mstout
!-----------------------------------------------------------------------
!
! If tkeout = 1, write out tke.
!
!-----------------------------------------------------------------------
IF( tkeout == 1 ) THEN
CALL edgfill
(tke,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL hdfwrt3d
(tke,nx,ny,nz,sd_id,0,hdfcompr, &
'tke','Turbulent Kinetic Energy','(m/s)**2', &
itmp,hmax,hmin)
END IF
!-----------------------------------------------------------------------
!
! If trbout = 1, write out the turbulence parameter, km.
!
!-----------------------------------------------------------------------
IF( trbout == 1 ) THEN
CALL edgfill
(kmh,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL hdfwrt3d
(kmh,nx,ny,nz,sd_id,0,hdfcompr, &
'kmh','Hori. turb. mixing coef. for momentum','m**2/s', &
itmp,hmax,hmin)
CALL edgfill
(kmv,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL hdfwrt3d
(kmv,nx,ny,nz,sd_id,0,hdfcompr, &
'kmv','Vert. turb. mixing coef. for momentum','m**2/s', &
itmp,hmax,hmin)
END IF ! trbout
!-----------------------------------------------------------------------
!
! If sfcout = 1, write out the surface variables,
! tsoil, qsoil, and wetcanp.
!
!-----------------------------------------------------------------------
IF( sfcout == 1) THEN
DO is=0,nstypout
CALL edgfill
(tsoil(1,1,1,is), 1,nx,1,nx-1, 1,ny,1,ny-1, &
1,nzsoil,1,nzsoil)
CALL edgfill
(qsoil(1,1,1,is), 1,nx,1,nx-1, 1,ny,1,ny-1, &
1,nzsoil,1,nzsoil)
CALL edgfill
(wetcanp(1,1,is),1,nx,1,nx-1, 1,ny,1,ny-1, &
1,1,1,1)
END DO
IF (intver == intver410) THEN
!
! 06/28/2002 Zuwen He
!
! In version 410, tsoil is the average of tsoil from 2 to nzsoil in later
! version, and wetdp is similar.
!
ALLOCATE (tem2(nx,ny,0:nstyps),stat=istat)
tem2=0.
DO is=0,nstypout
DO j=1,ny
DO i=1,nx
tem2(i,j,is)=tsoil(i,j,1,is)
END DO
END DO
END DO
CALL hdfwrt3d
(tem2,nx,ny,nstypout+1,sd_id,0,hdfcompr, &
'tsfc','Surface ground temperature','K', &
itmp,hmax,hmin)
tem2=0.
DO is=0,nstypout
DO k=2,nzsoil
DO j=1,ny
DO i=1,nx
tem2(i,j,is)=tem2(i,j,is)+tsoil(i,j,k,is)
END DO
END DO
END DO
DO j=1,ny
DO i=1,nx
tem1(i,j,is)=tem1(i,j,is)/float(nzsoil-1)
END DO
END DO
END DO
CALL hdfwrt3d
(tem1,nx,ny,nstypout+1,sd_id,0,hdfcompr, &
'tsoil','Deep soil temperature','K', &
itmp,hmax,hmin)
tem2=0.
DO is=0,nstypout
DO j=1,ny
DO i=1,nx
tem2(i,j,is)=qsoil(i,j,1,is)
END DO
END DO
END DO
CALL hdfwrt3d
(tem2,nx,ny,nstypout+1,sd_id,0,hdfcompr, &
'wetsfc','Surface soil moisture','fraction', &
itmp,hmax,hmin)
tem2=0.
DO is=0,nstypout
DO k=2,nzsoil
DO j=1,ny
DO i=1,nx
tem2(i,j,is)=tem2(i,j,is)+qsoil(i,j,k,is)
END DO
END DO
END DO
DO j=1,ny
DO i=1,nx
tem1(i,j,is)=tem1(i,j,is)/float(nzsoil-1)
END DO
END DO
END DO
CALL hdfwrt3d
(tem1,nx,ny,nstypout+1,sd_id,0,hdfcompr, &
'wetdp','Deep soil moisture','fraction', &
itmp,hmax,hmin)
DEALLOCATE (tem2,stat=istat)
ELSE IF (intver == intver500) THEN
CALL hdfwrt4d
(tsoil,nx,ny,nzsoil,nstypout+1,sd_id,0,hdfcompr, &
'tsoil','Soil temperature','K', &
itmpsoil,hmaxsoil,hminsoil)
CALL hdfwrt4d
(qsoil,nx,ny,nzsoil,nstypout+1,sd_id,0,hdfcompr, &
'qsoil','Soil moisture','fraction', &
itmpsoil,hmaxsoil,hminsoil)
END IF
CALL hdfwrt3d
(wetcanp,nx,ny,nstypout+1,sd_id,0,hdfcompr, &
'wetcanp','Canopy water amount','fraction', &
itmp,hmax,hmin)
IF (snowout == 1) THEN
CALL edgfill
(snowdpth,1,nx,1,nx-1, 1,ny,1,ny-1,1,1,1,1)
CALL hdfwrt2d
(snowdpth,nx,ny,sd_id,0,hdfcompr, &
'snowdpth','Snow depth','m',itmp)
END IF
END IF
!-----------------------------------------------------------------------
!
! If radout = 1, write out the radiation arrays
!
!-----------------------------------------------------------------------
IF( radout == 1 ) THEN
CALL edgfill
(radfrc,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL hdfwrt3d
(radfrc,nx,ny,nz,sd_id,0,hdfcompr, &
'radfrc','Radiation forcing','K/s', &
itmp,hmax,hmin)
CALL edgfill
(radsw,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL hdfwrt2d
(radsw,nx,ny,sd_id,0,hdfcompr, &
'radsw','Solar radiation reaching the surface','W/m**2',itmp)
CALL edgfill
(rnflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL hdfwrt2d
(rnflx,nx,ny,sd_id,0,hdfcompr, &
'rnflx','Net radiation flux absorbed by surface','W/m**2', &
itmp)
IF (intver >= intver500) THEN
CALL edgfill
(radswnet,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL hdfwrt2d
(radswnet,nx,ny,sd_id,0,hdfcompr, &
'radswnet','Net solar radiation','W/m**2',itmp)
CALL edgfill
(radlwin,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL hdfwrt2d
(radlwin,nx,ny,sd_id,0,hdfcompr, &
'radlwin','Incoming longwave radiation','W/m**2', &
itmp)
END IF
END IF ! radout
!-----------------------------------------------------------------------
!
! If flxout = 1, write out the surface fluxes
!
!-----------------------------------------------------------------------
IF( flxout == 1 ) THEN
CALL edgfill
(usflx,1,nx,1,nx, 1,ny,1,ny-1, 1,1,1,1)
CALL hdfwrt2d
(usflx,nx,ny,sd_id,0,hdfcompr, &
'usflx','Surface flux of u-momentum','kg/(m*s**2)',itmp)
CALL edgfill
(vsflx,1,nx,1,nx-1, 1,ny,1,ny, 1,1,1,1)
CALL hdfwrt2d
(vsflx,nx,ny,sd_id,0,hdfcompr, &
'vsflx','Surface flux of v-momentum','kg/(m*s**2)',itmp)
CALL edgfill
(ptsflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL hdfwrt2d
(ptsflx,nx,ny,sd_id,0,hdfcompr, &
'ptsflx','Surface heat flux','K*kg/(m*s**2)',itmp)
CALL edgfill
(qvsflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL hdfwrt2d
(qvsflx,nx,ny,sd_id,0,hdfcompr, &
'qvsflx','Surface moisture flux','kg/(m**2*s)',itmp)
END IF ! flxout
600 CONTINUE
CALL hdfclose
(sd_id,istat)
IF (istat /= 0) THEN
IF(myproc == 0) &
WRITE (6,*) "HDFDUMP: ERROR on closing file ",trim(filename), &
" (status",istat,")"
END IF
IF (hdfcompr > 3) THEN
DEALLOCATE (itmp,stat=istat)
DEALLOCATE (hmax,stat=istat)
DEALLOCATE (hmin,stat=istat)
DEALLOCATE (itmpsoil,stat=istat)
DEALLOCATE (hmaxsoil,stat=istat)
DEALLOCATE (hminsoil,stat=istat)
END IF
RETURN
END SUBROUTINE hdfdump
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFJOINDUMP ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfjoindump(nx,ny,nz,nzsoil,nstyps, filename , grdbas, & 1,227
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, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsoil,qsoil,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx,radswnet,radlwin, &
usflx,vsflx,ptsflx,qvsflx, &
tem1)
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Produces a joined history data file "filename" in the NCSA HDF4 format
! for MP mode by calling HDF library subroutines.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yunheng Wang
! 2002/08/15
! Based on subroutine hdfdump
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
! nzsoil Number of grid points in the vertical
!
! filename File name of history dump data.
! grdbas Flag indicating if this is a call for the data dump
! of grid and base state arrays only. If so, grdbas=1.
!
! u x component of velocity at a given time level (m/s)
! v y component of velocity at a given time level (m/s)
! w Vertical component of Cartesian velocity at a given
! time level (m/s)
! ptprt Perturbation potential temperature at a given time
! level (K)
! pprt Perturbation pressure at a given time level (Pascal)
! qv Water vapor specific humidity at a given time level (kg/kg)
! qc Cloud water mixing ratio at a given time level (kg/kg)
! qr Rainwater mixing ratio at a given time level (kg/kg)
! qi Cloud ice mixing ratio at a given time level (kg/kg)
! qs Snow mixing ratio at a given time level (kg/kg)
! qh Hail mixing ratio at a given time level (kg/kg)
! tke Turbulent Kinetic Energy ((m/s)**2)
!
! kmh Horizontal turb. mixing coef. for momentum ( m**2/s )
! kmv Vertical turb. mixing coef. for momentum ( m**2/s )
!
! ubar Base state zonal velocity component (m/s)
! vbar Base state meridional velocity component (m/s)
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
! rhobar Base state density (kg/m**3)
! qvbar Base state water vapor specific humidity (kg/kg)
!
! x x coordinate of grid points in physical/comp. space (m)
! y y coordinate of grid points in physical/comp. space (m)
! z z coordinate of grid points in computational space (m)
! zp Vertical coordinate of grid points in physical space (m)
! zpsoil Vertical coordinate of grid points in the soil (m)
!
! soiltyp Soil type
! vegtyp Vegetation type
! lai Leaf Area Index
! roufns Surface roughness
! veg Vegetation fraction
!
! tsoil Soil temperature (K)
! qsoil Soil moisture (m**3/m**3)
! wetcanp Canopy water amount
!
! raing Grid supersaturation rain
! rainc Cumulus convective rain
! prcrate Precipitation rates
!
! radfrc Radiation forcing (K/s)
! radsw Solar radiation reaching the surface
! rnflx Net radiation flux absorbed by surface
! radswnet Net shortwave radiation
! radlwin Incoming longwave radiation
!
! usflx Surface flux of u-momentum (kg/(m*s**2))
! vsflx Surface flux of v-momentum (kg/(m*s**2))
! ptsflx Surface heat flux (K*kg/(m**2 * s ))
! qvsflx Surface moisture flux of (kg/(m**2 * s))
!
! OUTPUT:
!
! None.
!
! WORK ARRAY:
!
! tem1 work array.
! tem2 work array.
!
! out1d work array.
! out3d work array.
! out3di work array.
! outtsoil work array.
! outqsoil work array.
!
!-----------------------------------------------------------------------
!
! The following parameters are passed into this subroutine through
! a common block in globcst.inc, and they determine which
! variables are output.
!
! grdout =0 or 1. If grdout=0, grid variables are not dumped.
! basout =0 or 1. If basout=0, base state variables are not dumped.
! varout =0 or 1. If varout=0, perturbation variables are not dumped.
! mstout =0 or 1. If mstout=0, water variables are not dumped.
! rainout=0 or 1. If rainout=0, rain variables are not dumped.
! prcout =0 or 1. If prcout=0, precipitation rates are not dumped.
! iceout =0 or 1. If iceout=0, qi, qs and qh are not dumped.
! tkeout =0 or 1. If tkeout=0, tke is not dumped.
! trbout =0 or 1. If trbout=0, the eddy viscosity km is not dumped.
! radout =0 or 1. If radout=0, the radiation arrays are not dumped.
! flxout =0 or 1. If flxout=0, the surface fluxes are not dumped.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
INTEGER :: nzsoil ! Number of grid points in the soil
CHARACTER (LEN=*) :: filename
INTEGER :: grdbas ! If this is a grid/base state dump
REAL :: u (nx,ny,nz) ! Total u-velocity (m/s)
REAL :: v (nx,ny,nz) ! Total v-velocity (m/s)
REAL :: w (nx,ny,nz) ! Total w-velocity (m/s)
REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K)
REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal)
REAL :: qv (nx,ny,nz) ! Water vapor specific humidity (kg/kg)
REAL :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg)
REAL :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg)
REAL :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg)
REAL :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg)
REAL :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg)
REAL :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2)
REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for
! momentum. ( m**2/s )
REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for
! momentum. ( m**2/s )
REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s)
REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s)
REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal)
REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3)
REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific humidity
! (kg/kg)
REAL :: x (nx) ! The x-coord. of the physical and
! computational grid. Defined at u-point.
REAL :: y (ny) ! The y-coord. of the physical and
! computational grid. Defined at v-point.
REAL :: z (nz) ! The z-coord. of the computational grid.
! Defined at w-point on the staggered grid.
REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at
! w-point of the staggered grid.
REAL :: zpsoil(nx,ny,nzsoil) ! The physical height coordinate defined at
! w-point of the soil.
INTEGER :: nstyps ! Number of soil type
INTEGER :: soiltyp (nx,ny,nstyps) ! Soil type
REAL :: stypfrct(nx,ny,nstyps) ! Fraction of soil types
INTEGER :: vegtyp (nx,ny) ! Vegetation type
REAL :: lai (nx,ny) ! Leaf Area Index
REAL :: roufns (nx,ny) ! Surface roughness
REAL :: veg (nx,ny) ! Vegetation fraction
REAL :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil temperature (K)
REAL :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil moisture (m**3/m**3)
REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount
REAL :: snowdpth(nx,ny) ! Snow depth (m)
REAL :: raing(nx,ny) ! Grid supersaturation rain
REAL :: rainc(nx,ny) ! Cumulus convective rain
REAL :: prcrate(nx,ny,4) ! precipitation rates (kg/(m**2*s))
! prcrate(1,1,1) = total precip. rate
! prcrate(1,1,2) = grid scale precip. rate
! prcrate(1,1,3) = cumulative precip. rate
! prcrate(1,1,4) = microphysics precip. rate
REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s)
REAL :: radsw (nx,ny) ! Solar radiation reaching the surface
REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface
REAL :: radswnet(nx,ny) ! Net shortwave radiation
REAL :: radlwin(nx,ny) ! Incoming longwave radiation
REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2))
REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2))
REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m*s**2))
REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s))
REAL :: tem1 (nx,ny,nz) ! Temporary work array
INTEGER(2), ALLOCATABLE :: itmp(:,:,:) ! Temporary array
REAL, ALLOCATABLE :: hmax(:), hmin(:) ! Temporary array
INTEGER(2), ALLOCATABLE :: itmpsoil(:,:,:,:) ! Temporary array
REAL, ALLOCATABLE :: hmaxsoil(:), hminsoil(:)! Temporary array
REAL :: dx_out,dy_out
REAL, ALLOCATABLE :: out1d(:)
REAL, ALLOCATABLE :: out3d(:,:,:)
REAL, ALLOCATABLE :: outtsoil(:,:,:,:)
REAL, ALLOCATABLE :: outqsoil(:,:,:,:)
INTEGER, ALLOCATABLE :: out3di(:,:,:)
!-----------------------------------------------------------------------
!
! Parameters describing this routine
!
!-----------------------------------------------------------------------
!
! fmtver??: to label each data a version.
! intver??: an integer to allow faster comparison than fmtver??,
! which are strings.
!
! Verion 5.00: significant change in soil variables since version 4.10.
!
CHARACTER (LEN=40) :: fmtver,fmtver410,fmtver500
INTEGER :: intver,intver410,intver500
PARAMETER (fmtver410='004.10 HDF4 Coded Data',intver410=410)
PARAMETER (fmtver500='005.00 HDF4 Coded Data',intver500=500)
CHARACTER(LEN=10), PARAMETER :: tmunit = 'seconds '
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
INTEGER :: i,j,k,is
INTEGER :: nstypout
INTEGER :: istat, sd_id
INTEGER :: nxlg, nylg
INTEGER :: n3d
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid parameters
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
nxlg = nproc_x*(nx-3)+3
nylg = nproc_y*(ny-3)+3
nstypout = max(1,nstyps)
n3d = MAX(nz, nzsoil, nstypout+1, 4) ! 3rd dimenson for out3d
intver = intver500 ! for the time being, in the future, we will
! allow to dump data in the different version
! intver will be assigned from input file
IF (intver == intver410) THEN
fmtver=fmtver410
ELSE IF (intver == intver500) THEN
fmtver=fmtver500
ELSE
WRITE(6,'(/1x,a,i10,a/)') &
' Data format, intver=',intver, &
', not found. The Job stopped.'
CALL arpsstop
('arpstop called from HDFDUMP. ',1)
END IF
IF (hdfcompr > 3) THEN
ALLOCATE (itmp(nxlg,nylg,nz),stat=istat)
CALL check_alloc_status
(istat,'HDFJOINDUMP:itmp')
ALLOCATE (hmax(nz),stat=istat)
CALL check_alloc_status
(istat,'HDFJOINDUMP:hmax')
ALLOCATE (hmin(nz),stat=istat)
CALL check_alloc_status
(istat,'HDFJOINDUMP:hmin')
ALLOCATE (itmpsoil(nxlg,nylg,nzsoil,0:nstyps),stat=istat)
CALL check_alloc_status
(istat,'HDFJOINDUMP:itmpsoil')
ALLOCATE (hmaxsoil(nzsoil),stat=istat)
CALL check_alloc_status
(istat,'HDFJOINDUMP:hmaxsoil')
ALLOCATE (hminsoil(nzsoil),stat=istat)
CALL check_alloc_status
(istat,'HDFJOINDUMP:hminsoil')
END IF
IF(myproc == 0) THEN
WRITE(6,'(1x,a,f13.3,a,a/)') &
'Writing HDF4 data at time=', curtim,' into file ',filename
!-----------------------------------------------------------------------
!
! Create the HDF4 file.
!
!-----------------------------------------------------------------------
CALL hdfopen
(filename,2,sd_id)
IF (sd_id < 0) THEN
WRITE (6,*) "HDFJOINDUMP: ERROR creating HDF4 file: ", &
trim(filename)
GO TO 600
END IF
CALL hdfwrtc
(sd_id, 40, 'fmtver', fmtver, istat)
CALL hdfwrtc
(sd_id, 40, 'runname', runname, istat)
CALL hdfwrti
(sd_id, 'nocmnt', nocmnt, istat)
IF( nocmnt > 0 ) THEN
CALL hdfwrtc
(sd_id, 80*nocmnt, 'cmnt', cmnt, istat)
END IF
CALL hdfwrtc
(sd_id, 7, 'tmunit', 'seconds', istat)
CALL hdfwrtr
(sd_id, 'time', curtim, istat)
CALL hdfwrti
(sd_id, 'nx', nxlg, istat)
CALL hdfwrti
(sd_id, 'ny', nylg, istat)
CALL hdfwrti
(sd_id, 'nz', nz, istat)
IF (intver >= intver500) THEN
CALL hdfwrti
(sd_id, 'nzsoil', nzsoil, istat)
END IF
IF( grdbas == 1 ) THEN
CALL hdfwrti
(sd_id, 'grdflg', 1, istat)
CALL hdfwrti
(sd_id, 'basflg', 1, istat)
CALL hdfwrti
(sd_id, 'varflg', 0, istat)
CALL hdfwrti
(sd_id, 'mstflg', 1, istat)
CALL hdfwrti
(sd_id, 'iceflg', 0, istat)
CALL hdfwrti
(sd_id, 'trbflg', 0, istat)
CALL hdfwrti
(sd_id, 'sfcflg', 0, istat)
CALL hdfwrti
(sd_id, 'rainflg', 0, istat)
CALL hdfwrti
(sd_id, 'landflg', landout, istat)
CALL hdfwrti
(sd_id, 'totflg', 1, istat)
CALL hdfwrti
(sd_id, 'tkeflg', 0, istat)
ELSE
CALL hdfwrti
(sd_id, 'grdflg', grdout, istat)
CALL hdfwrti
(sd_id, 'basflg', basout, istat)
CALL hdfwrti
(sd_id, 'varflg', varout, istat)
CALL hdfwrti
(sd_id, 'mstflg', mstout, istat)
CALL hdfwrti
(sd_id, 'iceflg', iceout, istat)
CALL hdfwrti
(sd_id, 'trbflg', trbout, istat)
CALL hdfwrti
(sd_id, 'sfcflg', sfcout, istat)
CALL hdfwrti
(sd_id, 'rainflg', rainout, istat)
CALL hdfwrti
(sd_id, 'landflg', landout*basout, istat)
CALL hdfwrti
(sd_id, 'totflg', totout, istat)
CALL hdfwrti
(sd_id, 'tkeflg', tkeout, istat)
END IF
CALL hdfwrti
(sd_id, 'nstyp', nstypout, istat)
CALL hdfwrti
(sd_id, 'prcflg', prcout, istat)
CALL hdfwrti
(sd_id, 'radflg', radout, istat)
CALL hdfwrti
(sd_id, 'flxflg', flxout, istat)
CALL hdfwrti
(sd_id, 'snowflg', snowout, istat)
CALL hdfwrti
(sd_id, 'day', day, istat)
CALL hdfwrti
(sd_id, 'year', year, istat)
CALL hdfwrti
(sd_id, 'month', month, istat)
CALL hdfwrti
(sd_id, 'hour', hour, istat)
CALL hdfwrti
(sd_id, 'minute', minute, istat)
CALL hdfwrti
(sd_id, 'second', second, istat)
CALL hdfwrtr
(sd_id, 'umove', umove, istat)
CALL hdfwrtr
(sd_id, 'vmove', vmove, istat)
CALL hdfwrtr
(sd_id, 'xgrdorg', xgrdorg, istat)
CALL hdfwrtr
(sd_id, 'ygrdorg', ygrdorg, istat)
CALL hdfwrti
(sd_id, 'mapproj', mapproj, istat)
CALL hdfwrtr
(sd_id, 'trulat1', trulat1, istat)
CALL hdfwrtr
(sd_id, 'trulat2', trulat2, istat)
CALL hdfwrtr
(sd_id, 'trulon', trulon, istat)
CALL hdfwrtr
(sd_id, 'sclfct', sclfct, istat)
CALL hdfwrtr
(sd_id, 'tstop', tstop, istat)
CALL hdfwrtr
(sd_id, 'thisdmp', thisdmp, istat)
CALL hdfwrtr
(sd_id, 'latitud', latitud, istat)
CALL hdfwrtr
(sd_id, 'ctrlat', ctrlat, istat)
CALL hdfwrtr
(sd_id, 'ctrlon', ctrlon, istat)
dx_out = x(2) - x(1)
dy_out = y(2) - y(1)
CALL hdfwrtr
(sd_id, 'dx', dx_out, istat)
CALL hdfwrtr
(sd_id, 'dy', dy_out, istat)
END IF ! myproc == 0
ALLOCATE (out1d( MAX(nxlg,nylg) ),stat=istat)
CALL check_alloc_status
(istat,'HDFJOINDUMP:out1d')
ALLOCATE (out3d( nxlg,nylg, n3d ),stat=istat)
CALL check_alloc_status
(istat,'HDFJOINDUMP:out3d')
ALLOCATE (out3di( nxlg,nylg, nstypout ),stat=istat)
CALL check_alloc_status
(istat,'HDFJOINDUMP:out3di')
ALLOCATE (outtsoil( nxlg,nylg, nzsoil, 0:nstypout ),stat=istat)
CALL check_alloc_status
(istat,'HDFJOINDUMP:outtsoil')
ALLOCATE (outqsoil( nxlg,nylg, nzsoil, 0:nstypout ),stat=istat)
CALL check_alloc_status
(istat,'HDFJOINDUMP:outqsoil')
!-----------------------------------------------------------------------
!
! If grdout=1 or grdbas=1, write out grid variables
!
!-----------------------------------------------------------------------
IF(grdout == 1 .OR. grdbas == 1 ) THEN
CALL mpimerge1dx
(x,nx,out1d)
IF (myproc == 0) &
CALL hdfwrt1d
(out1d,nxlg,sd_id,'x','x coordinate','m')
CALL mpimerge1dy
(y,ny,out1d)
IF (myproc == 0) &
CALL hdfwrt1d
(out1d,nylg,sd_id,'y','y coordinate','m')
IF (myproc == 0) &
CALL hdfwrt1d
(z,nz,sd_id,'z','z coordinate','m')
CALL mpimerge3d
(zp,nx,ny,nz,out3d)
IF (myproc == 0) &
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,0,hdfcompr, &
'zp','Physical height coordinate','m',itmp,hmax,hmin)
IF (intver >= intver500) THEN
CALL mpimerge3d
(zpsoil,nx,ny,nzsoil,out3d)
IF (myproc == 0) &
CALL hdfwrt3d
(out3d,nxlg,nylg,nzsoil,sd_id,0,hdfcompr, &
'zpsoil','Physical height coordinate (soil)','m', &
itmpsoil,hmaxsoil,hminsoil)
END IF
END IF
!-----------------------------------------------------------------------
!
! If basout=1, write out base state variables.
!
!-----------------------------------------------------------------------
IF(basout == 1 .OR. grdbas == 1 ) THEN
CALL edgfill
(ubar,1,nx,1,nx, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL mpimerge3d
(ubar,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,1,hdfcompr,'ubar', &
'Base state u-velocity','m/s',itmp,hmax,hmin)
END IF
CALL edgfill
(vbar,1,nx,1,nx-1, 1,ny,1,ny, 1,nz,1,nz-1)
CALL mpimerge3d
(vbar,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,2,hdfcompr,'vbar', &
'Base state v-velocity','m/s',itmp,hmax,hmin)
END IF
IF (myproc == 0) THEN
out3d = 0.0
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,3,hdfcompr,'wbar', &
'Base state w-velocity','m/s',itmp,hmax,hmin)
END IF
CALL edgfill
(ptbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL mpimerge3d
(ptbar,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,0,hdfcompr,'ptbar', &
'Base state potential temperature','K',itmp,hmax,hmin)
END IF
CALL edgfill
(pbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL mpimerge3d
(pbar,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,0,hdfcompr,'pbar', &
'Base state pressure','Pascal',itmp,hmax,hmin)
END IF
IF(mstout == 1) THEN
CALL edgfill
(qvbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL mpimerge3d
(qvbar,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,0,hdfcompr,'qvbar', &
'Base state water vapor specific humidity','kg/kg', &
itmp,hmax,hmin)
END IF
END IF
IF(landout == 1) THEN
CALL iedgfill
(soiltyp(1,1,1),1,nx,1,nx-1, 1,ny,1,ny-1, &
1,nstypout,1,nstypout)
CALL mpimerge3di
(soiltyp,nx,ny,nstypout,out3di)
IF (myproc == 0) THEN
CALL hdfwrt3di
(out3di,nxlg,nylg,nstypout,sd_id,0,0, &
'soiltyp','Soil type','index')
END IF
CALL edgfill
(stypfrct(1,1,1),1,nx,1,nx-1, 1,ny,1,ny-1, &
1,nstypout,1,nstypout)
CALL mpimerge3d
(stypfrct,nx,ny,nstypout,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nstypout,sd_id,0,hdfcompr, &
'stypfrct','Soil type fractional coverage','fraction', &
itmp,hmax,hmin)
END IF
CALL iedgfill
(vegtyp ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL mpimerge2di
(vegtyp,nx,ny,out3di)
IF (myproc == 0) THEN
CALL hdfwrt2di
(out3di,nxlg,nylg,sd_id,0,0,'vegtyp', &
'Vegetation type','index')
END IF
CALL edgfill
(lai ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL mpimerge2d
(lai,nx,ny,out3d)
IF (myproc == 0) THEN
CALL hdfwrt2d
(out3d,nxlg,nylg,sd_id,0,hdfcompr,'lai', &
'Leaf Area Index','index',itmp)
END IF
CALL edgfill
(roufns ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL mpimerge2d
(roufns,nx,ny,out3d)
IF (myproc == 0) THEN
CALL hdfwrt2d
(out3d,nxlg,nylg,sd_id,0,hdfcompr,'roufns', &
'Surface roughness','0-1',itmp)
END IF
CALL edgfill
(veg ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL mpimerge2d
(veg,nx,ny,out3d)
IF (myproc == 0) THEN
CALL hdfwrt2d
(out3d,nxlg,nylg,sd_id,0,hdfcompr,'veg', &
'Vegetation fraction','fraction',itmp)
END IF
END IF
END IF
IF ( grdbas == 1 ) GO TO 600
!-----------------------------------------------------------------------
!
! If varout = 1, Write out uprt, vprt, wprt, ptprt, pprt.
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! Write out u,v and w.
!
!-----------------------------------------------------------------------
IF(varout == 1) THEN
IF ( totout == 0 ) THEN
!-----------------------------------------------------------------------
!
! Write out perturbations to history dump
!
!-----------------------------------------------------------------------
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx
tem1(i,j,k)=u(i,j,k)-ubar(i,j,k)
END DO
END DO
END DO
CALL edgfill
(tem1,1,nx,1,nx, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL mpimerge3d
(tem1,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,1,hdfcompr,'uprt', &
'Perturbation u-velocity','m/s',itmp,hmax,hmin)
END IF
DO k=1,nz-1
DO j=1,ny
DO i=1,nx-1
tem1(i,j,k)=v(i,j,k)-vbar(i,j,k)
END DO
END DO
END DO
CALL edgfill
(tem1,1,nx,1,nx-1, 1,ny,1,ny, 1,nz,1,nz-1)
CALL mpimerge3d
(tem1,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,2,hdfcompr,'vprt', &
'Perturbation v-velocity','m/s',itmp,hmax,hmin)
END IF
CALL edgfill
(w,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz)
CALL mpimerge3d
(w,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,3,hdfcompr,'wprt', &
'Perturbation w-velocity','m/s',itmp,hmax,hmin)
END IF
!-----------------------------------------------------------------------
!
! Write out scalars
!
!-----------------------------------------------------------------------
CALL edgfill
(ptprt,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL mpimerge3d
(ptprt,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,0,hdfcompr,'ptprt', &
'Perturbation potential temperature','K',itmp,hmax,hmin)
END IF
CALL edgfill
(pprt,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL mpimerge3d
(pprt,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,0,hdfcompr,'pprt', &
'Perturbation pressure','Pascal',itmp,hmax,hmin)
END IF
ELSE
!-----------------------------------------------------------------------
!
! Write out total values to history dump
!
!-----------------------------------------------------------------------
CALL edgfill
(u,1,nx,1,nx, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL mpimerge3d
(u,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,1,hdfcompr,'u', &
'u-velocity','m/s',itmp,hmax,hmin)
END IF
CALL edgfill
(v,1,nx,1,nx-1, 1,ny,1,ny, 1,nz,1,nz-1)
CALL mpimerge3d
(v,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,2,hdfcompr,'v', &
'v-velocity','m/s',itmp,hmax,hmin)
END IF
CALL edgfill
(w,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz)
CALL mpimerge3d
(w,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,3,hdfcompr,'w', &
'w-velocity','m/s',itmp,hmax,hmin)
END IF
!-----------------------------------------------------------------------
!
! Write out scalars
!
!-----------------------------------------------------------------------
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 edgfill
(tem1,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL mpimerge3d
(tem1,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,0,hdfcompr,'pt', &
'Potential temperature','K',itmp,hmax,hmin)
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 edgfill
(tem1,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL mpimerge3d
(tem1,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,0,hdfcompr,'p', &
'Pressure','Pascal',itmp,hmax,hmin)
END IF
END IF
END IF ! varout
!-----------------------------------------------------------------------
!
! If mstout = 1, write out moisture scalars.
!
!-----------------------------------------------------------------------
IF(mstout == 1) THEN
IF( totout == 0 ) THEN
!-----------------------------------------------------------------------
!
! Write out perturbation to history dump
!
!-----------------------------------------------------------------------
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 edgfill
(tem1,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL mpimerge3d
(tem1,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,0,hdfcompr,'qvprt', &
'Pert. water vapor specific humidity','kg/kg',itmp,hmax,hmin)
END IF
ELSE
!-----------------------------------------------------------------------
!
! Write out total values to history dump
!
!-----------------------------------------------------------------------
CALL edgfill
(qv,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL mpimerge3d
(qv,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,0,hdfcompr,'qv', &
'Water vapor specific humidity','kg/kg', &
itmp,hmax,hmin)
END IF
END IF
CALL edgfill
(qc,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL mpimerge3d
(qc,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,0,hdfcompr,'qc', &
'Cloud water mixing ratio','kg/kg',itmp,hmax,hmin)
END IF
CALL edgfill
(qr,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL mpimerge3d
(qr,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,0,hdfcompr,'qr', &
'Rain water mixing ratio','kg/kg',itmp,hmax,hmin)
END IF
IF(rainout == 1) THEN
CALL edgfill
(raing, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL mpimerge2d
(raing,nx,ny,out3d)
IF (myproc == 0) THEN
CALL hdfwrt2d
(out3d(:,:,1),nxlg,nylg,sd_id,0,hdfcompr,'raing', &
'Grid supersaturation rain','mm',itmp)
END IF
CALL edgfill
(rainc,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL mpimerge2d
(rainc,nx,ny,out3d)
IF (myproc == 0) THEN
CALL hdfwrt2d
(out3d(:,:,1),nxlg,nylg,sd_id,0,hdfcompr,'rainc', &
'Cumulus convective rain','mm',itmp)
END IF
END IF !rainout
IF ( prcout == 1 ) THEN
CALL edgfill
(prcrate,1,nx,1,nx-1, 1,ny,1,ny-1, 1,4,1,4)
CALL mpimerge3d
(prcrate,nx,ny,4,out3d)
IF (myproc == 0) THEN
CALL hdfwrt2d
(out3d(1,1,1),nxlg,nylg,sd_id,0,hdfcompr, &
'prcrate1','Total precip. rate','kg/(m**2*s)',itmp)
CALL hdfwrt2d
(out3d(1,1,2),nxlg,nylg,sd_id,0,hdfcompr, &
'prcrate2','Grid scale precip. rate','kg/(m**2*s)',itmp)
CALL hdfwrt2d
(out3d(1,1,3),nxlg,nylg,sd_id,0,hdfcompr, &
'prcrate3','Cumulative precip. rate','kg/(m**2*s)',itmp)
CALL hdfwrt2d
(out3d(1,1,4),nxlg,nylg,sd_id,0,hdfcompr, &
'prcrate4','Microphysics precip. rate','kg/(m**2*s)',itmp)
END IF
END IF
IF(iceout == 1) THEN
CALL edgfill
(qi,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL mpimerge3d
(qi,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,0,hdfcompr,'qi', &
'Cloud ice mixing ratio','kg/kg',itmp,hmax,hmin)
END IF
CALL edgfill
(qs,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL mpimerge3d
(qs,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,0,hdfcompr,'qs', &
'Snow mixing ratio','kg/kg',itmp,hmax,hmin)
END IF
CALL edgfill
(qh,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL mpimerge3d
(qh,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,0,hdfcompr,'qh', &
'Hail mixing ratio','kg/kg',itmp,hmax,hmin)
END IF
END IF !iceout
END IF !mstout
!-----------------------------------------------------------------------
!
! If tkeout = 1, write out tke.
!
!-----------------------------------------------------------------------
IF( tkeout == 1 ) THEN
CALL edgfill
(tke,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL mpimerge3d
(tke,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,0,hdfcompr,'tke', &
'Turbulent Kinetic Energy','(m/s)**2',itmp,hmax,hmin)
END IF
END IF
!-----------------------------------------------------------------------
!
! If trbout = 1, write out the turbulence parameter, km.
!
!-----------------------------------------------------------------------
IF( trbout == 1 ) THEN
CALL edgfill
(kmh,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL mpimerge3d
(kmh,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,0,hdfcompr,'kmh', &
'Hori. turb. mixing coef. for momentum','m**2/s', &
itmp,hmax,hmin)
END IF
CALL edgfill
(kmv,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL mpimerge3d
(kmv,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,0,hdfcompr,'kmv', &
'Vert. turb. mixing coef. for momentum','m**2/s', &
itmp,hmax,hmin)
END IF
END IF ! trbout
!-----------------------------------------------------------------------
!
! If sfcout = 1, write out the surface variables,
! tsoil, qsoil, and wetcanp.
!
!-----------------------------------------------------------------------
IF( sfcout == 1) THEN
DO is=0,nstypout
CALL edgfill
(tsoil(1,1,1,is), 1,nx,1,nx-1, 1,ny,1,ny-1, &
1,nzsoil,1,nzsoil)
CALL edgfill
(qsoil(1,1,1,is), 1,nx,1,nx-1, 1,ny,1,ny-1, &
1,nzsoil,1,nzsoil)
CALL edgfill
(wetcanp(1,1,is),1,nx,1,nx-1, 1,ny,1,ny-1, &
1,1,1,1)
END DO
CALL mpimerge4d
(tsoil,nx,ny,nzsoil,nstypout+1,outtsoil)
CALL mpimerge4d
(qsoil,nx,ny,nzsoil,nstypout+1,outqsoil)
CALL mpimerge3d
(wetcanp,nx,ny,nstypout+1,out3d)
IF (myproc == 0) THEN
CALL hdfwrt4d
(outtsoil,nxlg,nylg,nzsoil,nstypout+1,sd_id,0, &
hdfcompr,'tsoil','Soil temperature','K', &
itmpsoil,hmaxsoil,hminsoil)
CALL hdfwrt4d
(outqsoil,nxlg,nylg,nzsoil,nstypout+1,sd_id,0, &
hdfcompr,'qsoil','Soil moisture','fraction', &
itmpsoil,hmaxsoil,hminsoil)
CALL hdfwrt3d
(out3d,nxlg,nylg,nstypout+1,sd_id,0,hdfcompr, &
'wetcanp','Canopy water amount','fraction', &
itmp,hmax,hmin)
END IF
IF (snowout == 1) THEN
CALL edgfill
(snowdpth,1,nx,1,nx-1, 1,ny,1,ny-1,1,1,1,1)
CALL mpimerge2d
(snowdpth,nx,ny,out3d)
IF (myproc == 0) THEN
CALL hdfwrt2d
(out3d,nxlg,nylg,sd_id,0,hdfcompr,'snowdpth', &
'Snow depth','m',itmp)
END IF
END IF
END IF
!-----------------------------------------------------------------------
!
! If radout = 1, write out the radiation arrays
!
!-----------------------------------------------------------------------
IF( radout == 1 ) THEN
CALL edgfill
(radfrc,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1)
CALL mpimerge3d
(radfrc,nx,ny,nz,out3d)
IF (myproc == 0) THEN
CALL hdfwrt3d
(out3d,nxlg,nylg,nz,sd_id,0,hdfcompr,'radfrc', &
'Radiation forcing','K/s',itmp,hmax,hmin)
END IF
CALL edgfill
(radsw,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL mpimerge2d
(radsw,nx,ny,out3d)
IF (myproc == 0) THEN
CALL hdfwrt2d
(out3d,nxlg,nylg,sd_id,0,hdfcompr,'radsw', &
'Solar radiation reaching the surface','W/m**2',itmp)
END IF
CALL edgfill
(rnflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL mpimerge2d
(rnflx,nx,ny,out3d)
IF (myproc == 0) THEN
CALL hdfwrt2d
(out3d,nxlg,nylg,sd_id,0,hdfcompr,'rnflx', &
'Net radiation flux absorbed by surface','W/m**2',itmp)
END IF
IF (intver >= intver500) THEN
CALL edgfill
(radswnet,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL mpimerge2d
(radswnet,nx,ny,out3d)
IF (myproc == 0) THEN
CALL hdfwrt2d
(out3d,nxlg,nylg,sd_id,0,hdfcompr,'radswnet', &
'Net solar radiation','W/m**2',itmp)
END IF
CALL edgfill
(radlwin,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL mpimerge2d
(radlwin,nx,ny,out3d)
IF (myproc == 0) THEN
CALL hdfwrt2d
(out3d,nxlg,nylg,sd_id,0,hdfcompr,'radlwin', &
'Incoming longwave radiation','W/m**2',itmp)
END IF
END IF
END IF ! radout
!-----------------------------------------------------------------------
!
! If flxout = 1, write out the surface fluxes
!
!-----------------------------------------------------------------------
IF( flxout == 1 ) THEN
CALL edgfill
(usflx,1,nx,1,nx, 1,ny,1,ny-1, 1,1,1,1)
CALL mpimerge2d
(usflx,nx,ny,out3d)
IF (myproc == 0) THEN
CALL hdfwrt2d
(out3d,nxlg,nylg,sd_id,0,hdfcompr,'usflx', &
'Surface flux of u-momentum','kg/(m*s**2)',itmp)
END IF
CALL edgfill
(vsflx,1,nx,1,nx-1, 1,ny,1,ny, 1,1,1,1)
CALL mpimerge2d
(vsflx,nx,ny,out3d)
IF (myproc == 0) THEN
CALL hdfwrt2d
(out3d,nxlg,nylg,sd_id,0,hdfcompr,'vsflx', &
'Surface flux of v-momentum','kg/(m*s**2)',itmp)
END IF
CALL edgfill
(ptsflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL mpimerge2d
(ptsflx,nx,ny,out3d)
IF (myproc == 0) THEN
CALL hdfwrt2d
(out3d,nxlg,nylg,sd_id,0,hdfcompr,'ptsflx', &
'Surface heat flux','K*kg/(m*s**2)',itmp)
END IF
CALL edgfill
(qvsflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
CALL mpimerge2d
(qvsflx,nx,ny,out3d)
IF (myproc == 0) THEN
CALL hdfwrt2d
(out3d,nxlg,nylg,sd_id,0,hdfcompr,'qvsflx', &
'Surface moisture flux','kg/(m**2*s)',itmp)
END IF
END IF ! flxout
600 CONTINUE
IF (myproc == 0) THEN
CALL hdfclose
(sd_id,istat)
IF (istat /= 0) THEN
WRITE (6,*) "HDFDUMP: ERROR on closing file ",trim(filename), &
" (status",istat,")"
END IF
END IF
IF (hdfcompr > 3) THEN
DEALLOCATE (itmp,stat=istat)
DEALLOCATE (hmax,stat=istat)
DEALLOCATE (hmin,stat=istat)
DEALLOCATE (itmpsoil,stat=istat)
DEALLOCATE (hmaxsoil,stat=istat)
DEALLOCATE (hminsoil,stat=istat)
END IF
DEALLOCATE (out1d)
DEALLOCATE (out3d, out3di)
DEALLOCATE (outtsoil, outqsoil)
RETURN
END SUBROUTINE hdfjoindump
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFWRT3D ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE hdfwrt3d(var,nx,ny,nz,sd_id,stag_dim,hdfcompr, & 127,2
name,comment,units,itmp,hmax,hmin)
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Write out a 3-D real array to an HDF4 file.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/03/15
!
! MODIFICATION HISTORY:
!
! 02/26/2004 Yunheng Wang
! Added a working array tem to make sure that the data is written as
! 32-bit floating even the default KIND of REAL is not 4. It is
! allocated in the heap only when needed. Please note that hmax
! and hmin were redeclared as KIND = 4 floating number in this subroutine.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! var Array to be written to the file
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! sd_id HDF id of the output file
!
! stag_dim Dimension of grid staggering (0-none, 1-x, 2-y, 3-z)
!
! hdfcompr Compression flag (0-none)
!
! name Variable name
! comment Destriptive string
! units String destribing units of var
!
! itmp Scratch array for mapping reals to integers (used for
! some values of hdfcompr)
! hmax Used to store maximum values as a function of z
! hmin Used to store minimum values as a function of z
!
! OUTPUT:
!
! None.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: nx,ny,nz
REAL :: var(nx,ny,nz)
INTEGER :: sd_id, stag_dim, hdfcompr
CHARACTER (LEN=*) :: name, comment, units
INTEGER (KIND=selected_int_kind(4)) :: itmp(nx,ny,nz)
REAL(4) :: hmax(nz), hmin(nz)
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
INTEGER :: istat
INTEGER :: dims(3),start(3),stride(3)
INTEGER :: comp_prm(1)
INTEGER :: sds_id
INTEGER :: i,j,k
REAL :: amax,amin,scalef
INTEGER :: itmp1
REAL(4), ALLOCATABLE :: tem(:,:,:)
INTEGER :: istatus
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfcreate, sfscompress, sfscatt, sfsnatt, &
sfwdata, sfendacc
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Initialize dimension parameters
!
!-----------------------------------------------------------------------
dims(1) = nx
dims(2) = ny
dims(3) = nz
start(1) = 0
start(2) = 0
start(3) = 0
stride(1) = 1
stride(2) = 1
stride(3) = 1
!-----------------------------------------------------------------------
!
! Create an entry for the variable, set compression and add attributes.
!
!-----------------------------------------------------------------------
IF(myproc == 0) &
WRITE (*,*) "HDFWRT3D: Writing variable ",trim(name)
IF (hdfcompr <= 3) THEN
sds_id = sfcreate(sd_id, trim(name), dfnt_float32, 3, dims)
ELSE
sds_id = sfcreate(sd_id, trim(name), dfnt_int16, 3, dims)
END IF
comp_prm(1) = 0
IF (hdfcompr == 1 .OR. hdfcompr == 5) THEN ! quick gzip
comp_prm(1) = 1
istat = sfscompress(sds_id, 4, comp_prm)
istat = sfsnatt(sds_id, 'hdf_comp_code', dfnt_int32, 1, 4)
ELSE IF (hdfcompr == 2 .OR. hdfcompr == 6) THEN ! high gzip
comp_prm(1) = 6
istat = sfscompress(sds_id, 4, comp_prm)
istat = sfsnatt(sds_id, 'hdf_comp_code', dfnt_int32, 1, 4)
ELSE IF (hdfcompr == 3 .OR. hdfcompr == 7) THEN ! huffman
comp_prm(1) = 4 ! this may be a problem on a Cray
istat = sfscompress(sds_id, 3, comp_prm)
istat = sfsnatt(sds_id, 'hdf_comp_code', dfnt_int32, 1, 3)
END IF
istat = sfsnatt(sds_id, 'hdf_comp_prm', dfnt_int32, 1, comp_prm)
IF (len_trim(comment) > 0) THEN
istat = sfscatt(sds_id, 'comment', dfnt_char8, &
len_trim(comment), comment)
ELSE
istat = sfscatt(sds_id, 'comment', dfnt_char8, 1, ' ')
END IF
IF (len_trim(units) > 0) THEN
istat = sfscatt(sds_id, 'units', dfnt_char8, &
len_trim(units), units)
ELSE
istat = sfscatt(sds_id, 'units', dfnt_char8, 1, ' ')
END IF
istat = sfsnatt(sds_id, 'stag_dim', dfnt_int32, 1, stag_dim)
!-----------------------------------------------------------------------
!
! If called for, map reals to 16 bit integers
!
!-----------------------------------------------------------------------
IF (hdfcompr > 3) THEN
DO k=1,nz
IF ( mp_opt > 0 .AND. joindmp <= 0 ) THEN
CALL a3dmax0
(var(1,1,k),1,nx,1,nx,1,ny,1,ny,1,1,1,1, &
amax,amin)
ELSE
CALL a3dmax0lcl
(var(1,1,k),1,nx,1,nx,1,ny,1,ny,1,1,1,1, &
amax,amin)
ENDIF
hmax(k) = amax
hmin(k) = amin
IF (ABS(hmax(k)) < 1.0E-25) hmax(k)= 0.0 !Added by Xue and Dawson
IF (ABS(hmin(k)) < 1.0E-25) hmin(k)= 0.0 !Added by "" and ""
IF (ABS(hmax(k)-hmin(k)) > 1.0E-10) THEN
scalef = 65534.0 / (hmax(k) - hmin(k))
ELSE
scalef = 65534.0
END IF
DO j=1,ny
DO i=1,nx
itmp1 = nint(scalef * (var(i,j,k) - hmin(k))) - 32767
itmp(i,j,k) = itmp1
END DO
END DO
END DO
istat = sfsnatt(sds_id, 'packed16', dfnt_int32, 1, 1)
istat = sfsnatt(sds_id, 'max', dfnt_float32, nz, hmax)
istat = sfsnatt(sds_id, 'min', dfnt_float32, nz, hmin)
END IF
!-----------------------------------------------------------------------
!
! Write the data in var out to the file
!
!-----------------------------------------------------------------------
IF (hdfcompr <= 3) THEN
IF( KIND(var) == 4) THEN
istat = sfwdata(sds_id, start, stride, dims, var)
ELSE
ALLOCATE(tem(nx,ny,nz), STAT = istatus)
tem(:,:,:) = var(:,:,:)
istat = sfwdata(sds_id, start, stride, dims, tem)
DEALLOCATE(tem)
END IF
ELSE
istat = sfwdata(sds_id, start, stride, dims, itmp)
END IF
IF (istat /= 0) THEN
WRITE (6,*) "HDFWRT3D: ERROR writing variable ",trim(name)
END IF
istat = sfendacc(sds_id)
IF (istat /= 0) THEN
WRITE (6,*) "HDFWRT3D: ERROR writing variable ",trim(name)
END IF
RETURN
END SUBROUTINE hdfwrt3d
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFWRT4D ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE hdfwrt4d(var,nx,ny,nz,nl,sd_id,stag_dim,hdfcompr,& 10,2
name,comment,units,itmp,hmax,hmin)
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Write out a 4-D real array to an HDF4 file.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Eric Kemp, 23 May 2002, Based on HDFWRT3D
!
! MODIFICATION HISTORY:
!
! 07/02/2002 Zuwen He
! Clean up and make it a general 4d hdfwrt.
!
! 02/26/2004 Yunheng Wang
! Added a working array tem to make sure that the data is written as
! 32-bit floating even the default KIND of REAL is not 4. It is
! allocated in the heap only when needed. Please note that hmax
! and hmin are also used as KIND = 4 floating number in this subroutine.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! var Array to be written to the file
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
! nl Number of grid points in the 4th dimension
!
! sd_id HDF id of the output file
!
! stag_dim Dimension of grid staggering (0-none, 1-x, 2-y, 3-z)
!
! hdfcompr Compression flag (0-none)
!
! name Variable name
! comment Destriptive string
! units String destribing units of var
!
! itmp Scratch array for mapping reals to integers (used for
! some values of hdfcompr)
! hmax Used to store maximum values as a function of z
! hmin Used to store minimum values as a function of z
!
! OUTPUT:
!
! None.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: nx,ny,nz,nl
REAL :: var(nx,ny,nz,nl)
INTEGER :: sd_id, stag_dim, hdfcompr
CHARACTER (LEN=*) :: name, comment, units
INTEGER (KIND=selected_int_kind(4)) :: itmp(nx,ny,nz,nl)
REAL(4) :: hmax(nz), hmin(nz)
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
INTEGER :: istat
INTEGER :: dims(4),start(4),stride(4)
INTEGER :: comp_prm(1)
INTEGER :: sds_id
INTEGER :: i,j,k,l
REAL :: scalef
INTEGER :: itmp1
REAL :: amax, amin
REAL(4) :: amax4, amin4
REAL(4), ALLOCATABLE :: tem(:,:,:,:)
INTEGER :: istatus
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfcreate, sfscompress, sfscatt, sfsnatt, &
sfwdata, sfendacc
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Initialize dimension parameters
!
!-----------------------------------------------------------------------
dims(1) = nx
dims(2) = ny
dims(3) = nz
dims(4) = nl
start(1) = 0
start(2) = 0
start(3) = 0
start(4) = 0
stride(1) = 1
stride(2) = 1
stride(3) = 1
stride(4) = 1
!-----------------------------------------------------------------------
!
! Create an entry for the variable, set compression and add attributes.
!
!-----------------------------------------------------------------------
IF (myproc == 0) WRITE (*,*) "HDFWRT4D: Writing variable ",trim(name)
IF (hdfcompr <= 3) THEN
sds_id = sfcreate(sd_id, trim(name), dfnt_float32, 4, dims)
ELSE
sds_id = sfcreate(sd_id, trim(name), dfnt_int16, 4, dims)
END IF
comp_prm(1) = 0
IF (hdfcompr == 1 .OR. hdfcompr == 5) THEN ! quick gzip
comp_prm(1) = 1
istat = sfscompress(sds_id, 4, comp_prm)
istat = sfsnatt(sds_id, 'hdf_comp_code', dfnt_int32, 1, 4)
ELSE IF (hdfcompr == 2 .OR. hdfcompr == 6) THEN ! high gzip
comp_prm(1) = 6
istat = sfscompress(sds_id, 4, comp_prm)
istat = sfsnatt(sds_id, 'hdf_comp_code', dfnt_int32, 1, 4)
ELSE IF (hdfcompr == 3 .OR. hdfcompr == 7) THEN ! huffman
comp_prm(1) = 4 ! this may be a problem on a Cray
istat = sfscompress(sds_id, 3, comp_prm)
istat = sfsnatt(sds_id, 'hdf_comp_code', dfnt_int32, 1, 3)
END IF
istat = sfsnatt(sds_id, 'hdf_comp_prm', dfnt_int32, 1, comp_prm)
IF (len_trim(comment) > 0) THEN
istat = sfscatt(sds_id, 'comment', dfnt_char8, &
len_trim(comment), comment)
ELSE
istat = sfscatt(sds_id, 'comment', dfnt_char8, 1, ' ')
END IF
IF (len_trim(units) > 0) THEN
istat = sfscatt(sds_id, 'units', dfnt_char8, &
len_trim(units), units)
ELSE
istat = sfscatt(sds_id, 'units', dfnt_char8, 1, ' ')
END IF
istat = sfsnatt(sds_id, 'stag_dim', dfnt_int32, 1, stag_dim)
!-----------------------------------------------------------------------
!
! If called for, map reals to 16 bit integers
!
!-----------------------------------------------------------------------
IF (hdfcompr > 3) THEN
! find hmax(nz) and hmin(nz)
DO l=1,nl
DO k=1,nz
IF ( mp_opt > 0 .AND. joindmp <= 0 ) THEN
CALL a3dmax0
(var(1,1,k,l),1,nx,1,nx,1,ny,1,ny,1,1,1,1, &
amax,amin)
ELSE
CALL a3dmax0lcl
(var(1,1,k,l),1,nx,1,nx,1,ny,1,ny,1,1,1,1, &
amax,amin)
ENDIF
IF ( l == 1 ) THEN ! initialize
hmax(k) = amax
hmin(k) = amin
END IF
amax4 = amax
amin4 = amin
hmax(k) = MAX(hmax(k), amax4)
hmin(k) = MIN(hmin(k), amin4)
END DO
END DO
DO l=1,nl
DO k=1,nz
if( abs(hmax(k)) < 1.0e-25 ) hmax(k) = 0.0 !Added by Xue and Dawson
if( abs(hmin(k)) < 1.0e-25 ) hmin(k) = 0.0 !"" "" "" ""
IF (ABS(hmax(k)-hmin(k)) > 1.0E-10) THEN
scalef = 65534.0/ (hmax(k) - hmin(k))
ELSE
scalef = 65534.0
END IF
! Do map using hmax(nz), hmin(nz)
DO j=1,ny
DO i=1,nx
itmp1 = nint(scalef * (var(i,j,k,l) - hmin(k))) - 32767
itmp(i,j,k,l) = itmp1
END DO
END DO
END DO
END DO
! Write attributes, hmax(nz) and hmin(nz)
istat = sfsnatt(sds_id, 'packed16', dfnt_int32, 1, 1)
istat = sfsnatt(sds_id, 'max', dfnt_float32, nz, hmax)
istat = sfsnatt(sds_id, 'min', dfnt_float32, nz, hmin)
END IF
!-----------------------------------------------------------------------
!
! Write the data in var out to the file
!
!-----------------------------------------------------------------------
IF (hdfcompr <= 3) THEN
IF (KIND(var) == 4) THEN
istat = sfwdata(sds_id, start, stride, dims, var)
ELSE
ALLOCATE(tem(nx,ny,nz,nl), STAT = istatus)
tem(:,:,:,:) = var(:,:,:,:)
istat = sfwdata(sds_id, start, stride, dims, tem)
DEALLOCATE(tem)
END IF
ELSE
istat = sfwdata(sds_id, start, stride, dims, itmp)
END IF
IF (istat /= 0) THEN
WRITE (6,*) "HDFWRT4D: ERROR writing variable ",trim(name)
END IF
istat = sfendacc(sds_id)
IF (istat /= 0) THEN
WRITE (6,*) "HDFWRT4D: ERROR writing variable ",trim(name)
END IF
RETURN
END SUBROUTINE hdfwrt4d
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFWRT3DI ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE hdfwrt3di(var,nx,ny,nz,sd_id,stag_dim,hdfcompr, & 7
name,comment,units)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Write out a 3-D integer array to an HDF4 file.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/03/15
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! var Array to be written to the file
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! sd_id HDF id of the output file
!
! stag_dim Dimension of grid staggering (0-none, 1-x, 2-y, 3-z)
!
! hdfcompr Compression flag (0-none)
!
! name Variable name
! comment Destriptive string
! units String destribing units of var
!
! OUTPUT:
!
! None.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: nx,ny,nz
INTEGER :: var(nx,ny,nz)
INTEGER :: sd_id, stag_dim, hdfcompr
CHARACTER (LEN=*) :: name, comment, units
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
INTEGER :: istat
INTEGER :: dims(3),start(3),stride(3)
INTEGER :: sds_id
INTEGER :: comp_prm(1)
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfcreate, sfscompress, sfscatt, sfsnatt, &
sfwdata, sfendacc
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Initialize dimension parameters
!
!-----------------------------------------------------------------------
dims(1) = nx
dims(2) = ny
dims(3) = nz
start(1) = 0
start(2) = 0
start(3) = 0
stride(1) = 1
stride(2) = 1
stride(3) = 1
!-----------------------------------------------------------------------
!
! Create an entry for the variable, set compression and add attributes.
!
!-----------------------------------------------------------------------
IF (myproc == 0) &
WRITE (*,*) "HDFWRT3DI: Writing variable ",trim(name)
sds_id = sfcreate(sd_id, name, dfnt_int32, 3, dims)
comp_prm(1) = 0
IF (hdfcompr == 1 .OR. hdfcompr == 5) THEN ! quick gzip
comp_prm(1) = 1
istat = sfscompress(sds_id, 4, comp_prm)
istat = sfsnatt(sds_id, 'hdf_comp_code', dfnt_int32, 1, 4)
ELSE IF (hdfcompr == 2 .OR. hdfcompr == 6) THEN ! high gzip
comp_prm(1) = 6
istat = sfscompress(sds_id, 4, comp_prm)
istat = sfsnatt(sds_id, 'hdf_comp_code', dfnt_int32, 1, 4)
ELSE IF (hdfcompr == 3 .OR. hdfcompr == 7) THEN ! huffman
comp_prm(1) = 4 ! this may be a problem on a Cray
istat = sfscompress(sds_id, 3, comp_prm)
istat = sfsnatt(sds_id, 'hdf_comp_code', dfnt_int32, 1, 3)
END IF
istat = sfsnatt(sds_id, 'hdf_comp_prm', dfnt_int32, 1, comp_prm)
IF (len_trim(comment) > 0) THEN
istat = sfscatt(sds_id, 'comment', dfnt_char8, &
len_trim(comment), comment)
ELSE
istat = sfscatt(sds_id, 'comment', dfnt_char8, 1, ' ')
END IF
IF (len_trim(units) > 0) THEN
istat = sfscatt(sds_id, 'units', dfnt_char8, &
len_trim(units), units)
ELSE
istat = sfscatt(sds_id, 'units', dfnt_char8, 1, ' ')
END IF
istat = sfsnatt(sds_id, 'stag_dim', dfnt_int32, 1, stag_dim)
!-----------------------------------------------------------------------
!
! Write the data in var out to the file
!
!-----------------------------------------------------------------------
istat = sfwdata(sds_id, start, stride, dims, var)
IF (istat /= 0) THEN
IF(myproc == 0) &
WRITE (6,*) "HDFWRT3DI: ERROR writing variable ",trim(name)
END IF
istat = sfendacc(sds_id)
IF (istat /= 0) THEN
IF(myproc == 0) &
WRITE (6,*) "HDFWRT3DI: ERROR writing variable ",trim(name)
END IF
RETURN
END SUBROUTINE hdfwrt3di
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFWRT2D ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE hdfwrt2d(var,nx,ny,sd_id,stag_dim,hdfcompr, & 61,2
name,comment,units,itmp)
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Write out a 2-D real array to an HDF4 file.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/03/15
!
! MODIFICATION HISTORY:
!
! 02/26/2004 Yunheng Wang
! Added a working array tem to make sure that the data is written as
! 32-bit floating even the default KIND of REAL is not 4. It is
! allocated in the heap only when needed. Please note that amax
! and amin were declared as KIND = 4 floating number.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! var Array to be written to the file
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
!
! sd_id HDF id of the output file
!
! stag_dim Dimension of grid staggering (0-none, 1-x, 2-y, 3-z)
!
! hdfcompr Compression flag (0-none)
!
! name Variable name
! comment Destriptive string
! units String destribing units of var
!
! itmp Scratch array for mapping reals to integers (used for
! some values of hdfcompr)
!
! OUTPUT:
!
! None.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: nx,ny
REAL :: var(nx,ny)
INTEGER :: sd_id, stag_dim, hdfcompr
CHARACTER (LEN=*) :: name, comment, units
INTEGER (KIND=selected_int_kind(4)) :: itmp(nx,ny)
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
INTEGER :: istat
INTEGER :: dims(2),start(2),stride(2)
INTEGER :: sds_id
INTEGER :: comp_prm(1)
REAL :: amax,amin,scalef
REAL(4) :: amax4,amin4
INTEGER :: i,j
INTEGER :: itmp1
REAL(4), ALLOCATABLE :: tem(:,:)
INTEGER :: istatus
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfcreate, sfscompress, sfscatt, sfsnatt, &
sfwdata, sfendacc
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IF (myproc == 0) &
WRITE (*,*) "HDFWRT2D: Writing variable ",trim(name)
!-----------------------------------------------------------------------
!
! Initialize dimension parameters
!
!-----------------------------------------------------------------------
dims(1) = nx
dims(2) = ny
start(1) = 0
start(2) = 0
stride(1) = 1
stride(2) = 1
!-----------------------------------------------------------------------
!
! Create an entry for the variable, set compression and add attributes.
!
!-----------------------------------------------------------------------
IF (hdfcompr <= 3) THEN
sds_id = sfcreate(sd_id, trim(name), dfnt_float32, 2, dims)
ELSE
sds_id = sfcreate(sd_id, trim(name), dfnt_int16, 2, dims)
END IF
comp_prm(1) = 0
IF (hdfcompr == 1 .OR. hdfcompr == 5) THEN ! quick gzip
comp_prm(1) = 1
istat = sfscompress(sds_id, 4, comp_prm)
istat = sfsnatt(sds_id, 'hdf_comp_code', dfnt_int32, 1, 4)
ELSE IF (hdfcompr == 2 .OR. hdfcompr == 6) THEN ! high gzip
comp_prm(1) = 6
istat = sfscompress(sds_id, 4, comp_prm)
istat = sfsnatt(sds_id, 'hdf_comp_code', dfnt_int32, 1, 4)
ELSE IF (hdfcompr == 3 .OR. hdfcompr == 7) THEN ! huffman
comp_prm(1) = 4 ! this may be a problem on a Cray
istat = sfscompress(sds_id, 3, comp_prm)
istat = sfsnatt(sds_id, 'hdf_comp_code', dfnt_int32, 1, 3)
END IF
istat = sfsnatt(sds_id, 'hdf_comp_prm', dfnt_int32, 1, comp_prm)
IF (len_trim(comment) > 0) THEN
istat = sfscatt(sds_id, 'comment', dfnt_char8, &
len_trim(comment), comment)
ELSE
istat = sfscatt(sds_id, 'comment', dfnt_char8, 1, ' ')
END IF
IF (len_trim(units) > 0) THEN
istat = sfscatt(sds_id, 'units', dfnt_char8, &
len_trim(units), units)
ELSE
istat = sfscatt(sds_id, 'units', dfnt_char8, 1, ' ')
END IF
istat = sfsnatt(sds_id, 'stag_dim', dfnt_int32, 1, stag_dim)
!-----------------------------------------------------------------------
!
! If called for, map reals to 16 bit integers
!
!-----------------------------------------------------------------------
IF (hdfcompr > 3) THEN
IF ( mp_opt > 0 .AND. joindmp <= 0 ) THEN
CALL a3dmax0
(var,1,nx,1,nx,1,ny,1,ny,1,1,1,1,amax,amin)
ELSE
CALL a3dmax0lcl
(var,1,nx,1,nx,1,ny,1,ny,1,1,1,1,amax,amin)
ENDIF
if( abs(amax) < 1.0e-25 ) amax = 0.0
if( abs(amin) < 1.0e-25 ) amin = 0.0
IF (ABS(amax-amin) > 1.0E-10) THEN
scalef = 65534.0 / (amax - amin)
ELSE
scalef = 65534.0
END IF
DO j=1,ny
DO i=1,nx
itmp1 = nint(scalef * (var(i,j) - amin)) - 32767
itmp(i,j) = itmp1
END DO
END DO
amax4 = amax
amin4 = amin
istat = sfsnatt(sds_id, 'packed16', dfnt_int32, 1, 1)
istat = sfsnatt(sds_id, 'max', dfnt_float32, 1, amax4)
istat = sfsnatt(sds_id, 'min', dfnt_float32, 1, amin4)
END IF
!-----------------------------------------------------------------------
!
! Write the data in var out to the file
!
!-----------------------------------------------------------------------
IF (hdfcompr <= 3) THEN
IF (KIND(var) == 4) THEN
istat = sfwdata(sds_id, start, stride, dims, var)
ELSE
ALLOCATE(tem(nx,ny), STAT = istatus)
tem(:,:) = var(:,:)
istat = sfwdata(sds_id, start, stride, dims, tem)
DEALLOCATE(tem)
END IF
ELSE
istat = sfwdata(sds_id, start, stride, dims, itmp)
END IF
IF (istat /= 0) THEN
WRITE (6,*) "HDFWRT2D: ERROR writing variable ",trim(name)
END IF
istat = sfendacc(sds_id)
IF (istat /= 0) THEN
WRITE (6,*) "HDFWRT2D: ERROR writing variable ",trim(name)
END IF
RETURN
END SUBROUTINE hdfwrt2d
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFWRT2DI ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfwrt2di(var,nx,ny,sd_id,stag_dim,hdfcompr, & 5
name,comment,units)
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Write out a 2-D integer array to an HDF4 file.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/03/15
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! var Array to be written to the file
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
!
! sd_id HDF id of the output file
!
! stag_dim Dimension of grid staggering (0-none, 1-x, 2-y, 3-z)
!
! hdfcompr Compression flag (0-none)
!
! name Variable name
! comment Destriptive string
! units String destribing units of var
!
! OUTPUT:
!
! None.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny
INTEGER :: var(nx,ny)
INTEGER :: sd_id, stag_dim, hdfcompr
CHARACTER (LEN=*) :: name, comment, units
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
INTEGER :: istat
INTEGER :: dims(2),start(2),stride(2)
INTEGER :: sds_id
INTEGER :: comp_prm(1)
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfcreate, sfscompress, sfscatt, sfsnatt, &
sfwdata, sfendacc
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Initialize dimension parameters
!
!-----------------------------------------------------------------------
dims(1) = nx
dims(2) = ny
start(1) = 0
start(2) = 0
stride(1) = 1
stride(2) = 1
!-----------------------------------------------------------------------
!
! Create an entry for the variable, set compression and add attributes.
!
!-----------------------------------------------------------------------
IF (myproc == 0) &
WRITE (*,*) "HDFWRT2DI: Writing variable ",trim(name)
sds_id = sfcreate(sd_id, trim(name), dfnt_int32, 2, dims)
comp_prm(1) = 0
IF (hdfcompr == 1 .OR. hdfcompr == 5) THEN ! quick gzip
comp_prm(1) = 1
istat = sfscompress(sds_id, 4, comp_prm)
istat = sfsnatt(sds_id, 'hdf_comp_code', dfnt_int32, 1, 4)
ELSE IF (hdfcompr == 2 .OR. hdfcompr == 6) THEN ! high gzip
comp_prm(1) = 6
istat = sfscompress(sds_id, 4, comp_prm)
istat = sfsnatt(sds_id, 'hdf_comp_code', dfnt_int32, 1, 4)
ELSE IF (hdfcompr == 3 .OR. hdfcompr == 7) THEN ! huffman
comp_prm(1) = 4 ! this may be a problem on a Cray
istat = sfscompress(sds_id, 3, comp_prm)
istat = sfsnatt(sds_id, 'hdf_comp_code', dfnt_int32, 1, 3)
END IF
istat = sfsnatt(sds_id, 'hdf_comp_prm', dfnt_int32, 1, comp_prm)
IF (len_trim(comment) > 0) THEN
istat = sfscatt(sds_id, 'comment', dfnt_char8, &
len_trim(comment), comment)
ELSE
istat = sfscatt(sds_id, 'comment', dfnt_char8, 1, ' ')
END IF
IF (len_trim(units) > 0) THEN
istat = sfscatt(sds_id, 'units', dfnt_char8, &
len_trim(units), units)
ELSE
istat = sfscatt(sds_id, 'units', dfnt_char8, 1, ' ')
END IF
istat = sfsnatt(sds_id, 'stag_dim', dfnt_int32, 1, stag_dim)
!-----------------------------------------------------------------------
!
! Write the data in var out to the file
!
!-----------------------------------------------------------------------
istat = sfwdata(sds_id, start, stride, dims, var)
IF (istat /= 0) THEN
IF(myproc == 0) &
WRITE (6,*) "HDFWRT2DI: ERROR writing variable ",trim(name)
END IF
istat = sfendacc(sds_id)
IF (istat /= 0) THEN
IF(myproc == 0) &
WRITE (6,*) "HDFWRT2DI: ERROR writing variable ",trim(name)
END IF
RETURN
END SUBROUTINE hdfwrt2di
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFWRT1D ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfwrt1d(var,num,sd_id,name,comment,units) 20
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Write out a 1-D real array to an HDF4 file.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/03/15
!
! MODIFICATION HISTORY:
!
! 02/26/2004 Yunheng Wang
! Added a working array tem to make sure that the data is written as
! 32-bit floating even the default KIND of REAL is not 4. It is
! allocated in the heap only when needed.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! var Array to be written to the file
!
! num Number of grid points
!
! sd_id HDF id of the output file
!
! name Variable name
! comment Destriptive string
! units String destribing units of var
!
! OUTPUT:
!
! None.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: num
REAL :: var(num)
INTEGER :: sd_id
CHARACTER (LEN=*) :: name, comment, units
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
INTEGER :: istat
INTEGER :: dims(1),start(1),stride(1)
INTEGER :: sds_id
REAL(4), ALLOCATABLE :: tem(:)
INTEGER :: istatus
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfcreate, sfscatt, sfwdata, sfendacc
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Initialize dimension parameters
!
!-----------------------------------------------------------------------
dims(1) = num
start(1) = 0
stride(1) = 1
!-----------------------------------------------------------------------
!
! Create an entry for the variable, set compression and add attributes.
!
!-----------------------------------------------------------------------
IF (myproc == 0) &
WRITE (*,*) "HDFWRT1D: Writing variable ",trim(name)
sds_id = sfcreate(sd_id, trim(name), dfnt_float32, 1, dims)
IF (len_trim(comment) > 0) THEN
istat = sfscatt(sds_id, 'comment', dfnt_char8, &
len_trim(comment), comment)
ELSE
istat = sfscatt(sds_id, 'comment', dfnt_char8, 1, ' ')
END IF
IF (len_trim(units) > 0) THEN
istat = sfscatt(sds_id, 'units', dfnt_char8, &
len_trim(units), units)
ELSE
istat = sfscatt(sds_id, 'units', dfnt_char8, 1, ' ')
END IF
!-----------------------------------------------------------------------
!
! Write the data in var out to the file
!
!-----------------------------------------------------------------------
IF( KIND(var) == 4) THEN
istat = sfwdata(sds_id, start, stride, dims, var)
ELSE
ALLOCATE(tem(num), STAT = istatus)
tem(:) = var(:)
istat = sfwdata(sds_id, start, stride, dims, tem)
DEALLOCATE(tem)
END IF
IF (istat /= 0) THEN
WRITE (6,*) "HDFWRT1D: ERROR writing variable ",trim(name)
END IF
istat = sfendacc(sds_id)
IF (istat /= 0) THEN
WRITE (6,*) "HDFWRT1D: ERROR writing variable ",trim(name)
END IF
RETURN
END SUBROUTINE hdfwrt1d
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFWRT1DI ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfwrt1di(var,num,sd_id,name,comment,units)
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Write out a 1-D integer array to an HDF4 file.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster, based on hdfwrt1d
! 10/30/2002
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! var Integer array to be written to the file
!
! num Number of grid points
!
! sd_id HDF id of the output file
!
! name Variable name
! comment Destriptive string
! units String destribing units of var
!
! OUTPUT:
!
! None.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: num
INTEGER :: var(num)
INTEGER :: sd_id
CHARACTER (LEN=*) :: name, comment, units
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
INTEGER :: istat
INTEGER :: dims(1),start(1),stride(1)
INTEGER :: sds_id
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfcreate, sfscatt, sfwdata, sfendacc
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Initialize dimension parameters
!
!-----------------------------------------------------------------------
dims(1) = num
start(1) = 0
stride(1) = 1
!-----------------------------------------------------------------------
!
! Create an entry for the variable and add attributes.
! No compression is done for 1D
!!
!-----------------------------------------------------------------------
IF (myproc == 0) &
WRITE (*,*) "HDFWRT1DI: Writing variable ",trim(name)
sds_id = sfcreate(sd_id, trim(name), dfnt_int32, 1, dims)
IF (len_trim(comment) > 0) THEN
istat = sfscatt(sds_id, 'comment', dfnt_char8, &
len_trim(comment), comment)
ELSE
istat = sfscatt(sds_id, 'comment', dfnt_char8, 1, ' ')
END IF
IF (len_trim(units) > 0) THEN
istat = sfscatt(sds_id, 'units', dfnt_char8, &
len_trim(units), units)
ELSE
istat = sfscatt(sds_id, 'units', dfnt_char8, 1, ' ')
END IF
!-----------------------------------------------------------------------
!
! Write the data in var out to the file
!
!-----------------------------------------------------------------------
istat = sfwdata(sds_id, start, stride, dims, var)
IF (istat /= 0) THEN
IF(myproc == 0) &
WRITE (6,*) "HDFWRT1DI: ERROR writing variable ",trim(name)
END IF
istat = sfendacc(sds_id)
IF (istat /= 0) THEN
WRITE (6,*) "HDFWRT1DI: ERROR writing variable ",trim(name)
END IF
RETURN
END SUBROUTINE hdfwrt1di
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFWRTR ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfwrtr(sd_id,name,val,istat) 166
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Write out a real attribute
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/04/05
!
! MODIFICATION HISTORY:
!
! 02/26/2004 Yunheng Wang
! Added a temporary variable tem to make sure that the data is written
! as 32-bit floating even the default KIND of REAL is not 4.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! name Variable name
!
! sd_id HDF id of the file or variable containing the
! named attribute
!
! OUTPUT:
!
! val The value of the attribute
! istat Status of the read (0-okay, 1-write error)
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
REAL :: val
INTEGER :: sd_id
CHARACTER (LEN=*) :: name
INTEGER :: istat
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
REAL(4) :: tem
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
INCLUDE 'mp.inc' ! mpi include file
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfsnatt
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
tem = val
istat = sfsnatt(sd_id, trim(name), dfnt_float32, 1, tem)
IF (istat == -1) THEN
WRITE (6,*) "HDFWRTR: ERROR writing variable ",trim(name),"."
istat = 1
ELSE
! IF(myproc == 0) &
! WRITE (*,*) "HDFWRTR: Wrote variable ",trim(name)," value:",val
END IF
RETURN
END SUBROUTINE hdfwrtr
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFWRTI ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfwrti(sd_id,name,val,istat) 202
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Write out an integer attribute
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/04/05
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! name Variable name
!
! sd_id HDF id of the file or variable containing the
! named attribute
!
! OUTPUT:
!
! val The value of the attribute
! istat Status of the read (0-okay, 1-write error)
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: val
INTEGER :: sd_id
CHARACTER (LEN=*) :: name
INTEGER :: istat
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
INCLUDE 'mp.inc' ! mpi parameters
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfsnatt
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
istat = sfsnatt(sd_id, trim(name), dfnt_int32, 1, val)
IF (istat == -1) THEN
IF (myproc == 0) &
WRITE (6,*) "HDFWRTI: ERROR writing variable ",trim(name),"."
istat = 1
ELSE
!IF (myproc == 0) &
!WRITE (*,*) "HDFWRTI: Wrote variable ",trim(name)," value:",val
END IF
RETURN
END SUBROUTINE hdfwrti
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFWRTC ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfwrtc(sd_id,strlen,name,string,istat) 31
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Write out a string attribute
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/04/11
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! name Variable name
!
! strlen Length of string to be written out (set to len(string)
! if strlen passed in as 0)
!
! sd_id HDF id of the file or variable containing the
! named attribute
!
! OUTPUT:
!
! string The string to be written out
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: sd_id
CHARACTER (LEN=*) :: name
CHARACTER (LEN=*) :: string
INTEGER :: strlen, istat
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
INTEGER :: tmplen ! This replaces the use of strlen which is passed
! in as an expression sometimes and a "expression
! is changed by subprogram" warning will arise in
! such a case. -- WYH.
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
INCLUDE 'mp.inc' ! mpi parameters
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfscatt
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IF (strlen == 0) THEN
tmplen = LEN(string)
ELSE
tmplen = strlen
END IF
! IF (strlen ==0) strlen = LEN(string)
istat = sfscatt(sd_id, trim(name), dfnt_char8, tmplen, string)
IF (istat == -1) THEN
IF (myproc == 0) &
WRITE (6,*) "HDFWRTC: ERROR writing variable ",trim(name),"."
istat = 1
ELSE
!IF (myproc == 0) &
!WRITE (*,*) "HDFWRTC: Wrote variable ",trim(name)," value:", trim(string)
END IF
RETURN
END SUBROUTINE hdfwrtc
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFRD3D ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfrd3d(sd_id,name,nx,ny,nz,var,istat,itmp,hmax,hmin) 155
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in a 3-D real array from an HDF4 file.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/03/15
!
! MODIFICATION HISTORY:
!
! 02/26/2004 Yunheng Wang
! Added a working array tem to make sure that the data is read in
! corectly even the default KIND of REAL is not 4. It is
! allocated in the heap only when needed. Please note that hmax
! and hmin were redeclared as KIND = 4 floating number.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! name Variable name
!
! sd_id HDF id of the output file
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! itmp Scratch array for mapping reals to integers (used for
! some values of hdfcompr)
! hmax Used to store maximum values as a function of z
! hmin Used to store minimum values as a function of z
!
! OUTPUT:
!
! var Array to be read in
!
! istat Status of read (0-okay, 1-error when reading)
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: nx,ny,nz
REAL :: var(nx,ny,nz)
INTEGER :: sd_id
CHARACTER (LEN=*) :: name
INTEGER :: istat
INTEGER (KIND=selected_int_kind(4)) :: itmp(nx,ny,nz)
REAL(4) :: hmax(nz),hmin(nz)
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
INTEGER :: dims(3),start(3),stride(3)
INTEGER :: sds_index,sds_id,attr_index
INTEGER :: packed16
INTEGER :: istat1,istat2,istat3
REAL :: scalef
INTEGER :: i,j,k
REAL(4), ALLOCATABLE :: tem(:,:,:)
INTEGER :: istatus
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfn2index, sfselect, sfrdata, sffattr, sfrnatt, sfendacc
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Initialize dimension parameters
!
!-----------------------------------------------------------------------
dims(1) = nx
dims(2) = ny
dims(3) = nz
start(1) = 0
start(2) = 0
start(3) = 0
stride(1) = 1
stride(2) = 1
stride(3) = 1
!-----------------------------------------------------------------------
!
! Get the SDS ID for the variable.
!
!-----------------------------------------------------------------------
sds_index = sfn2index(sd_id, trim(name))
IF (sds_index == -1) THEN
WRITE (6,*) "HDFRD3D: WARNING, variable ", &
trim(name)," not found in file."
istat = 1
RETURN
END IF
sds_id = sfselect(sd_id, sds_index)
attr_index = sffattr(sds_id, "packed16")
IF (attr_index >= 0) THEN
istat1 = sfrnatt(sds_id, attr_index, packed16)
attr_index = sffattr(sds_id, "max")
istat2 = sfrnatt(sds_id, attr_index, hmax)
attr_index = sffattr(sds_id, "min")
istat3 = sfrnatt(sds_id, attr_index, hmin)
IF (istat1 == -1 .OR. istat2 == -1 .OR. istat3 == -1) THEN
WRITE (6,*) "HDFRD3D: ERROR reading max/min for ",trim(name)
istat = 2
RETURN
END IF
ELSE
packed16 = 0
END IF
!-----------------------------------------------------------------------
!
! Read data into var.
!
!-----------------------------------------------------------------------
! IF (myproc == 0) WRITE (*,*) "HDFRD3D: Reading variable ",trim(name)
IF (packed16 == 0) THEN
IF (KIND(var) == 4) THEN
istat = sfrdata(sds_id, start, stride, dims, var)
ELSE
ALLOCATE(tem(nx,ny,nz), STAT = istatus)
istat = sfrdata(sds_id, start, stride, dims, tem)
var(:,:,:) = tem(:,:,:)
DEALLOCATE(tem)
END IF
ELSE
istat = sfrdata(sds_id, start, stride, dims, itmp)
END IF
IF (istat == -1) THEN
WRITE (6,*) "HDFRD3D: ERROR reading variable ",trim(name),"."
istat = 2
RETURN
END IF
!-----------------------------------------------------------------------
!
! If called for, map 16 bit integers to reals
!
!-----------------------------------------------------------------------
IF (packed16 /= 0) THEN
DO k=1,nz
scalef = (hmax(k)-hmin(k)) / 65534.0
DO j=1,ny
DO i=1,nx
var(i,j,k) = scalef * (itmp(i,j,k) + 32767) + hmin(k)
END DO
END DO
END DO
END IF
istat = sfendacc(sds_id)
IF (istat /= 0) THEN
WRITE (6,*) "HDFRD3D: ERROR reading variable ",trim(name)
istat = 2
END IF
RETURN
END SUBROUTINE hdfrd3d
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFRD4D ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfrd4d(sd_id,name,nx,ny,nz,nl,var,istat, & 10
itmp,hmax,hmin)
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in a 3-D real array from an HDF4 file.
!
!-----------------------------------------------------------------------
!
! AUTHOR: J. Brotzge (modified from hdfrd3d)
! 05/23/2002
!
! MODIFICATION HISTORY:
!
! 07/02/2002 Zuwen He
! Clean up and make it a general 4d HDF writer
!
! 02/26/2004 Yunheng Wang
! Added a working array tem to make sure that the data is read in
! corectly even the default KIND of REAL is not 4. It is
! allocated in the heap only when needed. Please note that hmax
! and hmin were redeclared as KIND = 4 floating number.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! name Variable name
!
! sd_id HDF id of the output file
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
! nl Number of grid points in the 4th dimension
!
! itmp Scratch array for mapping reals to integers (used for
! some values of hdfcompr)
! hmax Used to store maximum values as a function of z
! hmin Used to store minimum values as a function of z
!
! OUTPUT:
!
! var Array to be read in
!
! istat Status of read (0-okay, 1-error when reading)
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: nx,ny,nz,nl
REAL :: var(nx,ny,nz,nl)
INTEGER :: sd_id
CHARACTER (LEN=*) :: name
INTEGER :: istat
INTEGER (KIND=selected_int_kind(4)) :: itmp(nx,ny,nz,nl)
REAL(4) :: hmax(nz),hmin(nz)
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
INTEGER :: dims(4),start(4),stride(4)
INTEGER :: sds_index,sds_id,attr_index
INTEGER :: packed16
INTEGER :: istat1,istat2,istat3
REAL :: scalef
INTEGER :: i,j,k,l
REAL(4), ALLOCATABLE :: tem(:,:,:,:)
INTEGER :: istatus
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfn2index, sfselect, sfrdata, sffattr, sfrnatt, sfendacc
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Initialize dimension parameters
!
!-----------------------------------------------------------------------
dims(1) = nx
dims(2) = ny
dims(3) = nz
dims(4) = nl
start(1) = 0
start(2) = 0
start(3) = 0
start(4) = 0
stride(1) = 1
stride(2) = 1
stride(3) = 1
stride(4) = 1
!-----------------------------------------------------------------------
!
! Get the SDS ID for the variable.
!
!-----------------------------------------------------------------------
sds_index = sfn2index(sd_id, trim(name))
IF (sds_index == -1) THEN
WRITE (6,*) "HDFRD4D: WARNING, variable ", &
trim(name)," not found in file."
istat = 1
RETURN
END IF
sds_id = sfselect(sd_id, sds_index)
attr_index = sffattr(sds_id, "packed16")
IF (attr_index >= 0) THEN
istat1 = sfrnatt(sds_id, attr_index, packed16)
attr_index = sffattr(sds_id, "max")
istat2 = sfrnatt(sds_id, attr_index, hmax)
attr_index = sffattr(sds_id, "min")
istat3 = sfrnatt(sds_id, attr_index, hmin)
IF (istat1 == -1 .OR. istat2 == -1 .OR. istat3 == -1) THEN
WRITE (6,*) "HDFRD4D: ERROR reading max/min for ",trim(name)
istat = 2
RETURN
END IF
ELSE
packed16 = 0
END IF
!-----------------------------------------------------------------------
!
! Read data into var.
!
!-----------------------------------------------------------------------
! IF (myproc == 0) WRITE (*,*) "HDFRD4D: Reading variable ",trim(name)
IF (packed16 == 0) THEN
IF( KIND(var) == 4 ) THEN
istat = sfrdata(sds_id, start, stride, dims, var)
ELSE
ALLOCATE(tem(nx,ny,nz,nl), STAT = istatus)
istat = sfrdata(sds_id, start, stride, dims, tem)
var(:,:,:,:) = tem(:,:,:,:)
DEALLOCATE(tem)
END IF
ELSE
istat = sfrdata(sds_id, start, stride, dims, itmp)
END IF
IF (istat == -1) THEN
WRITE (6,*) "HDFRD4D: ERROR reading variable ",trim(name),"."
istat = 2
RETURN
END IF
!-----------------------------------------------------------------------
!
! If called for, map 16 bit integers to reals
!
!-----------------------------------------------------------------------
IF (packed16 /= 0) THEN
DO l=1,nl
DO k=1,nz
scalef = (hmax(k)-hmin(k)) / 65534.0
DO j=1,ny
DO i=1,nx
var(i,j,k,l) = scalef * (itmp(i,j,k,l) + 32767) + hmin(k)
END DO
END DO
END DO
END DO
END IF
istat = sfendacc(sds_id)
IF (istat /= 0) THEN
WRITE (6,*) "HDFRD4D: ERROR reading variable ",trim(name)
istat = 2
END IF
RETURN
END SUBROUTINE hdfrd4d
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFRD3DI ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfrd3di(sd_id,name,nx,ny,nz,var,istat) 8
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in a 3-D integer array from an HDF4 file.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/03/15
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! name Variable name
!
! sd_id HDF id of the output file
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! OUTPUT:
!
! var Array to be read in
!
! istat Status of read (0-okay, 1-error when reading)
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: nx,ny,nz
INTEGER :: var(nx,ny,nz)
INTEGER :: sd_id
CHARACTER (LEN=*) :: name
INTEGER :: istat
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
INTEGER :: dims(3),start(3),stride(3)
INTEGER :: sds_index,sds_id
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfn2index, sfselect, sfrdata, sfendacc
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Initialize dimension parameters
!
!-----------------------------------------------------------------------
dims(1) = nx
dims(2) = ny
dims(3) = nz
start(1) = 0
start(2) = 0
start(3) = 0
stride(1) = 1
stride(2) = 1
stride(3) = 1
!-----------------------------------------------------------------------
!
! Get the SDS ID for the variable.
!
!-----------------------------------------------------------------------
sds_index = sfn2index(sd_id, trim(name))
IF (sds_index == -1) THEN
IF (myproc == 0) &
WRITE (6,*) "HDFRD3DI: WARNING, variable ", &
trim(name)," not found in file."
istat = 1
RETURN
END IF
sds_id = sfselect(sd_id, sds_index)
!-----------------------------------------------------------------------
!
! Read data into var.
!
!-----------------------------------------------------------------------
! IF (myproc == 0) WRITE (*,*) "HDFRD3DI: Reading variable ",trim(name)
istat = sfrdata(sds_id, start, stride, dims, var)
IF (istat == -1) THEN
IF (myproc == 0) &
WRITE (6,*) "HDFRD3DI: ERROR reading variable ",trim(name),"."
istat = 2
END IF
istat = sfendacc(sds_id)
IF (istat /= 0) THEN
IF (myproc == 0) &
WRITE (6,*) "HDFRD3DI: ERROR reading variable ",trim(name)
istat = 2
END IF
RETURN
END SUBROUTINE hdfrd3di
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFRD2D ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfrd2d(sd_id,name,nx,ny,var,istat,itmp) 58
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in a 2-D real array from an HDF4 file.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/03/15
!
! MODIFICATION HISTORY:
!
! 02/26/2004 Yunheng Wang
! Added a working array tem to make sure that the data is read in
! corectly even the default KIND of REAL is not 4. It is
! allocated in the heap only when needed. Please note that amax
! and amin were declared as KIND = 4 floating number.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! name Variable name
!
! sd_id HDF id of the output file
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
!
! itmp Scratch array for mapping reals to integers (used for
! some values of hdfcompr)
!
! OUTPUT:
!
! var Array to be read in
!
! istat Status of read (0-okay, 1-error when reading)
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: nx,ny
REAL :: var(nx,ny)
INTEGER :: sd_id
CHARACTER (LEN=*) :: name
INTEGER :: istat
INTEGER (KIND=selected_int_kind(4)) :: itmp(nx,ny)
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
INTEGER :: dims(2),start(2),stride(2)
INTEGER :: sds_index,sds_id,attr_index
REAL(4) :: amax,amin
REAL :: scalef
INTEGER :: istat1,istat2,istat3
INTEGER :: i,j
INTEGER :: packed16
REAL(4), ALLOCATABLE :: tem(:,:)
INTEGER :: istatus
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfn2index, sfselect, sfrdata, sffattr, sfrnatt, sfendacc
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Initialize dimension parameters
!
!-----------------------------------------------------------------------
dims(1) = nx
dims(2) = ny
start(1) = 0
start(2) = 0
stride(1) = 1
stride(2) = 1
!-----------------------------------------------------------------------
!
! Get the SDS ID for the variable.
!
!-----------------------------------------------------------------------
sds_index = sfn2index(sd_id, trim(name))
IF (sds_index == -1) THEN
WRITE (6,*) "HDFRD2D: WARNING, variable ", &
trim(name)," not found in file."
istat = 1
RETURN
END IF
sds_id = sfselect(sd_id, sds_index)
attr_index = sffattr(sds_id, "packed16")
IF (attr_index >= 0) THEN
istat1 = sfrnatt(sds_id, attr_index, packed16)
attr_index = sffattr(sds_id, "max")
istat2 = sfrnatt(sds_id, attr_index, amax)
attr_index = sffattr(sds_id, "min")
istat3 = sfrnatt(sds_id, attr_index, amin)
IF (istat1 == -1 .OR. istat2 == -1 .OR. istat3 == -1) THEN
WRITE (6,*) "HDFRD2D: ERROR reading max/min for ",trim(name)
istat = sfendacc(sds_id)
istat = 2
RETURN
END IF
ELSE
packed16 = 0
END IF
!-----------------------------------------------------------------------
!
! Read data into var.
!
!-----------------------------------------------------------------------
! IF (myproc == 0) WRITE (*,*) "HDFRD2D: Reading variable ",trim(name)
IF (packed16 == 0) THEN
IF( KIND(var) == 4) THEN
istat = sfrdata(sds_id, start, stride, dims, var)
ELSE
ALLOCATE(tem(nx,ny), STAT = istatus)
istat = sfrdata(sds_id, start, stride, dims, tem)
var(:,:) = tem(:,:)
DEALLOCATE(tem)
END IF
ELSE
istat = sfrdata(sds_id, start, stride, dims, itmp)
END IF
IF (istat == -1) THEN
WRITE (6,*) "HDFRD2D: ERROR reading variable ",trim(name),"."
istat = sfendacc(sds_id)
istat = 2
RETURN
END IF
!-----------------------------------------------------------------------
!
! If called for, map 16 bit integers to reals
!
!-----------------------------------------------------------------------
IF (packed16 /= 0) THEN
scalef = (amax - amin) / 65534.0
DO j=1,ny
DO i=1,nx
var(i,j) = scalef * (itmp(i,j) + 32767) + amin
END DO
END DO
END IF
istat = sfendacc(sds_id)
IF (istat /= 0) THEN
WRITE (6,*) "HDFRD2D: ERROR reading variable ",trim(name)
istat = 2
END IF
RETURN
END SUBROUTINE hdfrd2d
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFRD2DI ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfrd2di(sd_id,name,nx,ny,var,istat) 5
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in a 2-D integer array from an HDF4 file.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/03/15
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! name Variable name
!
! sd_id HDF id of the output file
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
!
! OUTPUT:
!
! var Array to be read in
!
! istat Status of read (0-okay, 1-error when reading)
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: nx,ny
INTEGER :: var(nx,ny)
INTEGER :: sd_id
CHARACTER (LEN=*) :: name
INTEGER :: istat
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
INTEGER :: dims(2),start(2),stride(2)
INTEGER :: sds_index,sds_id
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfn2index, sfselect, sfrdata, sfendacc
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Initialize dimension parameters
!
!-----------------------------------------------------------------------
dims(1) = nx
dims(2) = ny
start(1) = 0
start(2) = 0
stride(1) = 1
stride(2) = 1
!-----------------------------------------------------------------------
!
! Get the SDS ID for the variable.
!
!-----------------------------------------------------------------------
sds_index = sfn2index(sd_id, trim(name))
IF (sds_index == -1) THEN
IF (myproc == 0) &
WRITE (6,*) "HDFRD2DI: WARNING, variable ", &
trim(name)," not found in file."
istat = 1
RETURN
END IF
sds_id = sfselect(sd_id, sds_index)
!-----------------------------------------------------------------------
!
! Read data into var.
!
!-----------------------------------------------------------------------
! IF (myproc == 0) WRITE (*,*) "HDFRD2DI: Reading variable ",trim(name)
istat = sfrdata(sds_id, start, stride, dims, var)
IF (istat == -1) THEN
IF (myproc == 0) &
WRITE (6,*) "HDFRD2DI: ERROR reading variable ",trim(name),"."
istat = sfendacc(sds_id)
istat = 2
RETURN
END IF
istat = sfendacc(sds_id)
IF (istat /= 0) THEN
IF (myproc == 0) &
WRITE (6,*) "HDFRD2DI: ERROR reading variable ",trim(name)
istat = 2
END IF
RETURN
END SUBROUTINE hdfrd2di
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFRD1D ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfrd1d(sd_id,name,num,var,istat) 6
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in a 2-D real array from an HDF4 file.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/03/15
!
! MODIFICATION HISTORY:
!
! 02/26/2004 Yunheng Wang
! Added a working array tem to make sure that the data is read in
! correctly even the default KIND of REAL is not 4.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! name Variable name
!
! sd_id HDF id of the output file
!
! num Number of grid points
!
! OUTPUT:
!
! var Array to be read in
!
! istat Status of read (0-okay, 1-error when reading)
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: num
REAL :: var(num)
INTEGER :: sd_id
CHARACTER (LEN=*) :: name
INTEGER :: istat
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
INTEGER :: dims(1),start(1),stride(1)
INTEGER :: sds_index,sds_id
REAL(4), ALLOCATABLE :: tem(:)
INTEGER :: istatus
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfn2index, sfselect, sfrdata, sfendacc
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Initialize dimension parameters
!
!-----------------------------------------------------------------------
dims(1) = num
start(1) = 0
stride(1) = 1
!-----------------------------------------------------------------------
!
! Get the SDS ID for the variable.
!
!-----------------------------------------------------------------------
sds_index = sfn2index(sd_id, trim(name))
IF (sds_index == -1) THEN
IF (myproc == 0) &
WRITE (6,*) "HDFRD1D: WARNING, variable ", &
trim(name)," not found in file."
istat = 1
RETURN
END IF
sds_id = sfselect(sd_id, sds_index)
!-----------------------------------------------------------------------
!
! Read data into var.
!
!-----------------------------------------------------------------------
! IF (myproc == 0) WRITE (*,*) "HDFRD1D: Reading variable ",trim(name)
IF ( KIND(var) == 4 ) THEN
istat = sfrdata(sds_id, start, stride, dims, var)
ELSE
ALLOCATE(tem(num), STAT = istatus)
istat = sfrdata(sds_id, start, stride, dims, tem)
var(:) = tem(:)
DEALLOCATE(tem)
END IF
IF (istat == -1) THEN
WRITE (6,*) "HDFRD1D: ERROR reading variable ",trim(name),"."
istat = sfendacc(sds_id)
istat = 2
RETURN
END IF
istat = sfendacc(sds_id)
IF (istat /= 0) THEN
WRITE (6,*) "HDFRD1D: ERROR reading variable ",trim(name)
istat = 2
END IF
RETURN
END SUBROUTINE hdfrd1d
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFRD1DI ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfrd1di(sd_id,name,num,var,istat) 4
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in a 1-D integer array from an HDF4 file.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster, after hdfrd1d
! 10/29/2002
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! name Variable name
!
! sd_id HDF id of the output file
!
! num Number of grid points
!
! OUTPUT:
!
! var Integer array to be read in
!
! istat Status of read (0-okay, 1-error when reading)
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: num
INTEGER :: var(num)
INTEGER :: sd_id
CHARACTER (LEN=*) :: name
INTEGER :: istat
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
INTEGER :: dims(1),start(1),stride(1)
INTEGER :: sds_index,sds_id
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfn2index, sfselect, sfrdata, sfendacc
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Initialize dimension parameters
!
!-----------------------------------------------------------------------
dims(1) = num
start(1) = 0
stride(1) = 1
!-----------------------------------------------------------------------
!
! Get the SDS ID for the variable.
!
!-----------------------------------------------------------------------
sds_index = sfn2index(sd_id, trim(name))
IF (sds_index == -1) THEN
IF (myproc == 0) &
WRITE (6,*) "HDFRD1D: WARNING, variable ", &
trim(name)," not found in file."
istat = 1
RETURN
END IF
sds_id = sfselect(sd_id, sds_index)
!-----------------------------------------------------------------------
!
! Read data into var.
!
!-----------------------------------------------------------------------
! IF (myproc == 0) WRITE (*,*) "HDFRD1D: Reading variable ",trim(name)
istat = sfrdata(sds_id, start, stride, dims, var)
IF (istat == -1) THEN
IF (myproc == 0) &
WRITE (6,*) "HDFRD1DI: ERROR reading variable ",trim(name),"."
istat = sfendacc(sds_id)
istat = 2
RETURN
END IF
istat = sfendacc(sds_id)
IF (istat /= 0) THEN
IF (myproc == 0) &
WRITE (6,*) "HDFRD1DI: ERROR reading variable ",trim(name)
istat = 2
END IF
RETURN
END SUBROUTINE hdfrd1di
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFRDR ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfrdr(sd_id,name,val,istat) 251
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in a real attribute
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/03/15
!
! MODIFICATION HISTORY:
!
! 02/26/2004 Yunheng Wang
! Added a temporary variable tem to make sure that the data is read in
! correctly even the default KIND of REAL is not 4. It is because data
! was written as dfnt_float32 before.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! name Variable name
!
! sd_id HDF id of the file or variable containing the
! named attribute
!
! OUTPUT:
!
! val The value of the attribute
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
REAL :: val
INTEGER :: sd_id
CHARACTER (LEN=*) :: name
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
INTEGER :: attr_index, istat
REAL(4) :: tem
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sffattr, sfrnatt
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
attr_index = sffattr(sd_id, trim(name))
IF (attr_index < 0) THEN
WRITE (6,*) "HDFRDR: WARNING, variable ", &
trim(name)," not found in file."
istat = 1
RETURN
END IF
istat = sfrnatt(sd_id, attr_index, tem)
val = tem
IF (istat == -1) THEN
WRITE (6,*) "HDFRDR: ERROR reading variable ",trim(name),"."
istat = 2
ELSE
! IF (myproc == 0) &
! WRITE (*,*) "HDFRDR: Read variable ",trim(name)," value:",val
END IF
RETURN
END SUBROUTINE hdfrdr
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFRDI ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfrdi(sd_id,name,val,istat) 262
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in an integer attribute
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/03/15
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! name Variable name
!
! sd_id HDF id of the file or variable containing the
! named attribute
!
! OUTPUT:
!
! val The value of the attribute
! istat Status indicator (0-okay, 1-variable not found, 2-read error)
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: val
INTEGER :: sd_id
CHARACTER (LEN=*) :: name
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
INTEGER :: attr_index, istat
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sffattr, sfrnatt
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
attr_index = sffattr(sd_id, trim(name))
IF (attr_index < 0) THEN
IF (myproc == 0) &
WRITE (6,*) "HDFRDI: WARNING, variable ", &
trim(name)," not found in file."
istat = 1
RETURN
END IF
istat = sfrnatt(sd_id, attr_index, val)
IF (istat == -1) THEN
IF (myproc == 0) &
WRITE (6,*) "HDFRDI: ERROR reading variable ",trim(name),"."
istat = 2
val = -1
ELSE
! IF (myproc == 0) &
! WRITE (*,*) "HDFRDI: Read variable ",trim(name)," value:",val
END IF
RETURN
END SUBROUTINE hdfrdi
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFRDC ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfrdc(sd_id,max_len,name,string,istat) 42
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in a string attribute
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/03/15
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! name Variable name
!
! max_len Maximum allowable length of string to be read in
!
! sd_id HDF id of the file or variable containing the
! named attribute
!
! OUTPUT:
!
! string The value of the attribute
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: sd_id
CHARACTER (LEN=*) :: name
CHARACTER (LEN=*) :: string
INTEGER :: max_len
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
INTEGER :: attr_index, istat
INTEGER :: data_type, n_values
CHARACTER (LEN=256) :: attr_name
INTEGER :: i
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
INCLUDE 'mp.inc'
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sffattr, sfgainfo, sfrnatt, &
sfrcatt
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
attr_index = sffattr(sd_id, trim(name))
IF (attr_index < 0) THEN
IF (myproc == 0) &
WRITE (6,*) "HDFRDC: WARNING, variable ",trim(name), &
" not located."
istat = 1
RETURN
END IF
istat = sfgainfo(sd_id, attr_index, attr_name, data_type, &
n_values)
IF (istat /= 0) THEN
IF (myproc == 0) &
WRITE (6,*) "HDFRDC: ERROR in looking up attributes for ", &
trim(name)
istat = 2
RETURN
END IF
IF (n_values <= max_len) THEN
istat = sfrcatt(sd_id, attr_index, string)
ELSE
IF (myproc == 0) &
WRITE (6,*) "HDFRDC: ERROR: string length for variable ", &
trim(name),", ",max_len, &
", is less than string in file:",n_values,","
IF (myproc == 0) &
WRITE (6,*) " value not read in."
END IF
DO i=n_values+1,len(string)
string(i:i) = " "
END DO
IF (istat == -1) THEN
IF (myproc == 0) &
WRITE (6,*) "HDFRDC: ERROR reading variable ",trim(name),"."
istat = 1
ELSE
! IF (myproc == 0) &
! WRITE (*,*) "HDFRDC: Read variable ",trim(name)," value:", trim(string)
END IF
RETURN
END SUBROUTINE hdfrdc
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFOPEN ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfopen(filename,rdwrtflg,sd_id) 47
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Open a HDF file.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/04/11
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! filename File name
!
! rdwrtflg Read/write flag (1-read, 2-write)
!
! OUTPUT:
!
! sd_id HDF id of the file or variable containing the
! named attribute
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: sd_id
CHARACTER (LEN=*) :: filename
INTEGER :: rdwrtflg
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
INCLUDE 'mp.inc' ! mpi parameters
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfstart
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IF (rdwrtflg == 1) THEN
sd_id = sfstart(trim(filename), dfacc_read)
ELSE IF (rdwrtflg == 2) THEN
sd_id = sfstart(trim(filename), dfacc_create)
ELSE
sd_id = -1
IF (myproc == 0) &
WRITE (6,*) "HDFOPEN: ERROR, unsupported rdwrtflg value of", &
rdwrtflg
END IF
IF (sd_id <= 0) THEN
IF (myproc == 0) &
WRITE (6,*) "HDFOPEN: ERROR opening ",trim(filename)
ENDIF
RETURN
END SUBROUTINE hdfopen
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFCLOSE ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfclose(sd_id,istat) 47
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Close a HDF file.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/04/11
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! sd_id HDF id of file to close
!
! OUTPUT:
!
! istat Status returned by close
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: sd_id
INTEGER :: istat
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfend
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
istat = sfend(sd_id)
RETURN
END SUBROUTINE hdfclose
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFINFO ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfinfo(sd_id,ndata,nattr,istat) 2
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Get the number of data sets and attributes contained in a HDF data file.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/10/18
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! sd_id HDF id of the data file
!
! OUTPUT:
!
! ndata Number of data sets in the file
! nattr Number of attributes in the file
! istat Status returned by sffinfo
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: sd_id
INTEGER :: ndata,nattr,istat
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sffinfo
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
istat = sffinfo(sd_id,ndata,nattr)
RETURN
END SUBROUTINE hdfinfo
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFDINFO ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfdinfo(sds_id,name,rank,dims,dtype,nattr,istat) 2
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Get the information about a data set
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/10/18
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! sds_id HDF id of the data set
!
! OUTPUT:
!
! name Name of the data set
! rank Number of dimensions in the data set
! dims Number of points for each dimension
! dtype Data type
! nattr Number of attributes in the data set
! istat Status returned by sfginfo
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: sds_id
CHARACTER (LEN=*) :: name
INTEGER :: rank,dims(6),dtype,nattr,istat
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfginfo
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
istat = sfginfo(sds_id,name,rank,dims,dtype,nattr)
RETURN
END SUBROUTINE hdfdinfo
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HDFAINFO ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE hdfainfo(sd_id,aindex,name,dtype,nvalues,istat) 4
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Get the information about an attribute.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2000/10/25
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! sd_id HDF id of the data set (for HDF file or SDS data set in a file)
! aindex Index number for the attribute
!
! OUTPUT:
!
! name Name of the data set
! dtype Data type
! nvalues Number of values (number of characters if a string)
! istat Status returned by sfgainfo
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: sd_id,aindex
CHARACTER (LEN=*) :: name
INTEGER :: dtype,nvalues,istat
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'hdf.f90' ! HDF4 library include file
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfgainfo
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
istat = sfgainfo(sd_id,aindex,name,dtype,nvalues)
RETURN
END SUBROUTINE hdfainfo
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE GET_DIMS_FROM_HDF ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE get_dims_from_hdf(filename,nx,ny,nz,nzsoil,nstyps,ireturn) 2,9
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Get the grid dimensions from an ARPS hdf file. (Similar to
! get_dims_from_data.)
!
!-----------------------------------------------------------------------
!
! AUTHOR: Gene Bassett
! 2001/04/23
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! filename File name
!
! OUTPUT:
!
! nx,ny,nz Grid dimensions
! nstyps Number of soil types
! ireturn Return status indicator
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
CHARACTER (LEN=*) :: filename
! INTEGER :: nx,ny,nz,nstyps,ireturn
INTEGER :: nx,ny,nz,nzsoil,nstyps,ireturn
! 06/28/2002 Zuwen He
!
! fmtver??: to label each data a version.
! intver??: an integer to allow faster comparison than fmtver??,
! which are strings.
!
! Verion 5.00: significant change in soil variables since version 4.10.
!
CHARACTER (LEN=40) :: fmtver410,fmtver500
INTEGER :: intver,intver410,intver500
PARAMETER (fmtver410='004.10 HDF4 Coded Data',intver410=410)
PARAMETER (fmtver500='005.00 HDF4 Coded Data',intver500=500)
CHARACTER (LEN=40) :: fmtverin
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
INTEGER :: sd_id,istat
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ireturn = 0
CALL hdfopen
(filename,1,sd_id)
IF (sd_id <= 0) THEN
ireturn = 1
RETURN
ENDIF
CALL hdfrdc
(sd_id,40,"fmtver",fmtverin,istat)
IF (fmtverin == fmtver410) THEN
intver=intver410
ELSE IF (fmtverin == fmtver500) THEN
intver=intver500
ELSE
WRITE(6,'(/1x,a,a,a/)') &
'Incoming data format, fmtverin=',fmtverin, &
', not found. The Job stopped.'
CALL arpsstop
('arpstop called from HDFREAD. ',1)
END IF
WRITE(6,'(/1x,a,a/)')'Incoming data format, fmtverin=',fmtverin
CALL hdfrdi
(sd_id,"nx",nx,istat)
IF (istat > 0) ireturn = 1
CALL hdfrdi
(sd_id,"ny",ny,istat)
IF (istat > 0) ireturn = 1
CALL hdfrdi
(sd_id,"nz",nz,istat)
IF (istat > 0) ireturn = 1
CALL hdfrdi
(sd_id,"nstyp",nstyps,istat)
IF (istat > 0) ireturn = 1
IF (intver == intver500) THEN
CALL hdfrdi
(sd_id,"nzsoil",nzsoil,istat)
IF (istat > 0) ireturn = 1
ELSE
nzsoil = 2
END IF
CALL hdfclose
(sd_id,istat)
RETURN
END SUBROUTINE get_dims_from_hdf
SUBROUTINE get_var_attr_from_hdf(sd_id,varname,attrname,attrvalue,vallen,istatus) 2,1
!-----------------------------------------------------------------------
!
! Given a variable name, find its string attributes from HDF file
!
! long name
! units
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER, INTENT(IN) :: sd_id
CHARACTER(*), INTENT(IN) :: varname
CHARACTER(*), INTENT(IN) :: attrname
CHARACTER(*), INTENT(OUT) :: attrvalue
INTEGER, INTENT(IN) :: vallen
INTEGER, INTENT(OUT) :: istatus
INCLUDE 'hdf.f90'
INTEGER :: sds_index, sds_id
INTEGER :: sfn2index, sfselect
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Executable code below ...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
sds_index = sfn2index(sd_id, trim(varname))
IF (sds_index == -1) THEN
WRITE (6,*) "get_var_attr: WARNING, variable ", trim(varname)," not found in file."
istatus = 1
RETURN
END IF
sds_id = sfselect(sd_id, sds_index)
CALL hdfrdc
(sds_id,vallen,attrname,attrvalue, istatus)
RETURN
END SUBROUTINE get_var_attr_from_hdf