!################################################################## !################################################################## !###### ###### !###### SUBROUTINE HDFREAD ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## SUBROUTINE hdfread(nx,ny,nz,nstyps, grdbas, filename, time, & 2,114 x,y,z,zp, & uprt, vprt, wprt, ptprt, pprt, & qvprt, qc, qr, qi, qs, qh, tke, kmh,kmv, & ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, & raing,rainc,prcrate, & radfrc,radsw,rnflx, & usflx,vsflx,ptsflx,qvsflx, & ireturn, tem1) !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Read in history data in the NCSA HDF4 format. ! !----------------------------------------------------------------------- ! ! AUTHOR: Gene Bassett ! 2000/04/15 ! ! 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 ! ! 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) ! ! 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 ! ! tsfc Temperature at ground (K) (in top 1 cm layer) ! tsoil Deep soil temperature (K) (in deep 1 m layer) ! wetsfc Surface soil moisture in the top 1 cm layer ! wetdp Deep soil moisture in the deep 1 m layer ! wetcanp Canopy water amount ! ! raing Grid supersaturation rain ! rainc Cumulus convective rain ! prcrate Precipitation rates ! ! radfrc Radiation forcing (K/s) ! radsw Solar radiation reaching the surface ! rnflx Net radiation flux absorbed by surface ! ! usflx Surface flux of u-momentum (kg/(m*s**2)) ! vsflx Surface flux of v-momentum (kg/(m*s**2)) ! ptsflx Surface heat flux (K*kg/(m**2 * s )) ! qvsflx Surface moisture flux of (kg/(m**2 * s)) ! ! ireturn Return status indicator ! ! WORK ARRAY ! ! tem1 ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- IMPLICIT NONE INTEGER :: nx,ny,nz 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 :: 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 :: tsfc (nx,ny,0:nstyps) ! Temperature at surface (K) REAL :: tsoil (nx,ny,0:nstyps) ! Deep soil temperature (K) REAL :: wetsfc (nx,ny,0:nstyps) ! Surface soil moisture REAL :: wetdp (nx,ny,0:nstyps) ! Deep soil moisture REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount REAL :: snowdpth(nx,ny) ! Snow depth (m) REAL :: raing(nx,ny) ! Grid supersaturation rain REAL :: rainc(nx,ny) ! Cumulus convective rain REAL :: prcrate(nx,ny,4) ! precipitation rates (kg/(m**2*s)) ! prcrate(1,1,1) = total precip. rate ! prcrate(1,1,2) = grid scale precip. rate ! prcrate(1,1,3) = 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 :: 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 INTEGER :: ireturn REAL :: time !----------------------------------------------------------------------- ! ! Parameters describing routine that wrote the gridded data ! !----------------------------------------------------------------------- CHARACTER (LEN=40) :: fmtver,fmtverin PARAMETER (fmtver='004.10 HDF4 Coded Data') CHARACTER (LEN=10) :: tmunit !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- INTEGER :: lchanl PARAMETER (lchanl=6) ! Channel number for formatted printing. INTEGER :: isizes(3), isize2 INTEGER :: i,j,k,iret,ndim,itime,is INTEGER :: nxin,nyin,nzin INTEGER :: bgrdin,bbasin,bvarin,bicein,btrbin,btkein INTEGER :: l INTEGER :: istat, sd_id, sds_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' ! mpi parameters !----------------------------------------------------------------------- ! ! Functions ! !----------------------------------------------------------------------- !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IF(myproc == 0) & WRITE(*,*) 'HDFREAD: Reading HDF file: ', trim(filename) 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 !----------------------------------------------------------------------- ! ! 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 /= fmtver ) THEN IF(myproc == 0) & WRITE(6,'(/1x,a/1x,2a/1x,2a)') & 'Data format incompatible with the data reader.', & 'Format of data is ',fmtverin,' Format of reader is ',fmtver CALL arpsstop('arpsstop called from HDFREAD due to fmtver',1) END IF 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 IF(myproc == 0) & WRITE(6,'(1x,a)') ' Dimensions in HDFREAD inconsistent with data.' IF(myproc == 0) & WRITE(6,'(1x,a,3I15)') ' Read were: ', nxin, nyin, nzin IF(myproc == 0) & WRITE(6,'(1x,a,3I15)') ' Expected: ', nx, ny, nz IF(myproc == 0) & WRITE(6,'(1x,a)') ' Program aborted in HDFREAD.' CALL arpsstop('arpsstop called from HDFREAD due to nxin...',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 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 CALL hdfrd3d(sd_id,"tsfc",nx,ny,nstypin+1,tsfc,istat,itmp,hmax,hmin) IF (istat /= 0) GO TO 110 CALL hdfrd3d(sd_id,"tsoil",nx,ny,nstypin+1,tsoil,istat,itmp,hmax,hmin) IF (istat /= 0) GO TO 110 CALL hdfrd3d(sd_id,"wetsfc",nx,ny,nstypin+1,wetsfc,istat,itmp,hmax,hmin) IF (istat /= 0) GO TO 110 CALL hdfrd3d(sd_id,"wetdp",nx,ny,nstypin+1,wetdp,istat,itmp,hmax,hmin) IF (istat /= 0) GO TO 110 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,nstyp1,nstyp,tsfc,tsoil,wetsfc,wetdp,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 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(*,*) "HDFDUMP: Successfully read ", trim(filename) ELSE IF(myproc == 0) & WRITE(*,*) "HDFDUMP: ERROR (status=", istat, ") closing ", trim(filename) END IF END IF DEALLOCATE (itmp,stat=istat) DEALLOCATE (hmax,stat=istat) DEALLOCATE (hmin,stat=istat) RETURN END SUBROUTINE hdfread !################################################################## !################################################################## !###### ###### !###### SUBROUTINE HDFDUMP ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## SUBROUTINE hdfdump(nx,ny,nz,nstyps, filename , grdbas, & 1,162 u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke,kmh,kmv, & ubar,vbar,ptbar,pbar,rhobar,qvbar, & x,y,z,zp,hterain, j1,j2,j3, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, & raing,rainc,prcrate, & radfrc,radsw,rnflx, & usflx,vsflx,ptsflx,qvsflx, & tem1) !----------------------------------------------------------------------- ! ! 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: ! !----------------------------------------------------------------------- ! ! 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 ! ! 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) ! hterain Terrain height (m) ! ! j1 Coordinate transformation Jacobian -d(zp)/dx ! j2 Coordinate transformation Jacobian -d(zp)/dy ! j3 Coordinate transformation Jacobian d(zp)/dz ! ! soiltyp Soil type ! vegtyp Vegetation type ! lai Leaf Area Index ! roufns Surface roughness ! veg Vegetation fraction ! ! tsfc Temperature at ground (K) (in top 1 cm layer) ! tsoil Deep soil temperature (K) (in deep 1 m layer) ! wetsfc Surface soil moisture in the top 1 cm layer ! wetdp Deep soil moisture in the deep 1 m layer ! wetcanp Canopy water amount ! ! raing Grid supersaturation rain ! rainc Cumulus convective rain ! prcrate Precipitation rates ! ! radfrc Radiation forcing (K/s) ! radsw Solar radiation reaching the surface ! rnflx Net radiation flux absorbed by surface ! ! usflx Surface flux of u-momentum (kg/(m*s**2)) ! vsflx Surface flux of v-momentum (kg/(m*s**2)) ! ptsflx Surface heat flux (K*kg/(m**2 * s )) ! qvsflx Surface moisture flux of (kg/(m**2 * s)) ! ! OUTPUT: ! ! None. ! ! WORK ARRAY: ! ! tem1 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 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 :: hterain(nx,ny) ! Terrain height. REAL :: j1 (nx,ny,nz) ! Coordinate transformation Jacobian defined as ! - d( zp )/d( x ) REAL :: j2 (nx,ny,nz) ! Coordinate transformation Jacobian defined as ! - d( zp )/d( y ) REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian defined as ! d( zp )/d( z ) INTEGER :: nstyps ! Number of soil 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 :: tsfc (nx,ny,0:nstyps) ! Temperature at surface (K) REAL :: tsoil (nx,ny,0:nstyps) ! Deep soil temperature (K) REAL :: wetsfc (nx,ny,0:nstyps) ! Surface soil moisture REAL :: wetdp (nx,ny,0:nstyps) ! Deep soil moisture REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount REAL :: snowdpth(nx,ny) ! Snow depth (m) REAL :: raing(nx,ny) ! Grid supersaturation rain REAL :: rainc(nx,ny) ! Cumulus convective rain REAL :: prcrate(nx,ny,4) ! precipitation rates (kg/(m**2*s)) ! prcrate(1,1,1) = total precip. rate ! prcrate(1,1,2) = grid scale precip. rate ! prcrate(1,1,3) = 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 :: 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 REAL :: dx_out,dy_out !----------------------------------------------------------------------- ! ! Parameters describing this routine ! !----------------------------------------------------------------------- CHARACTER (LEN=40) :: fmtver PARAMETER (fmtver='004.10 HDF4 Coded Data') CHARACTER (LEN=10) :: tmunit PARAMETER (tmunit='seconds ') !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- INTEGER :: i,j,k,l,is INTEGER :: nstypout INTEGER :: istat, sd_id !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! Grid parameters INCLUDE 'mp.inc' ! mpi parameters !----------------------------------------------------------------------- ! ! 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 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 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( 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', 1, 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,nstyp) 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) 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, ! tsfc, tsoil, wetsfc, wetdp, and wetcanp. ! !----------------------------------------------------------------------- IF( sfcout == 1) THEN DO is=0,nstypout CALL edgfill(tsfc(1,1,is), 1,nx,1,nx-1, 1,ny,1,ny-1, & 1,1,1,1) CALL edgfill(tsoil(1,1,is), 1,nx,1,nx-1, 1,ny,1,ny-1, & 1,1,1,1) CALL edgfill(wetsfc(1,1,is), 1,nx,1,nx-1, 1,ny,1,ny-1, & 1,1,1,1) CALL edgfill(wetdp(1,1,is), 1,nx,1,nx-1, 1,ny,1,ny-1, & 1,1,1,1) CALL edgfill(wetcanp(1,1,is),1,nx,1,nx-1, 1,ny,1,ny-1, & 1,1,1,1) END DO CALL hdfwrt3d(tsfc,nx,ny,nstypout+1,sd_id,0,hdfcompr, & 'tsfc','Surface ground temperature','K', & itmp,hmax,hmin) CALL hdfwrt3d(tsoil,nx,ny,nstypout+1,sd_id,0,hdfcompr, & 'tsoil','Deep soil temperature','K', & itmp,hmax,hmin) CALL hdfwrt3d(wetsfc,nx,ny,nstypout+1,sd_id,0,hdfcompr, & 'wetsfc','Surface soil moisture','fraction', & itmp,hmax,hmin) CALL hdfwrt3d(wetdp,nx,ny,nstypout+1,sd_id,0,hdfcompr, & 'wetdp','Deep soil moisture','fraction', & itmp,hmax,hmin) 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) 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) END IF RETURN END SUBROUTINE hdfdump !################################################################## !################################################################## !###### ###### !###### 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, & 81,1 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: ! !----------------------------------------------------------------------- ! ! 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 :: 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 :: scale INTEGER :: itmp1 !----------------------------------------------------------------------- ! ! 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 = sfscatt(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 = sfscatt(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 = sfscatt(sds_id, 'hdf_comp_code', dfnt_int32, 1, 3) END IF istat = sfscatt(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 CALL a3dmax0lcl(var(1,1,k),1,nx,1,nx,1,ny,1,ny,1,1,1,1, & hmax(k),hmin(k)) IF (ABS(hmax(k)-hmin(k)) < 1.0E-10) hmax(k) = 1.1 * hmin(k) + 1. scale = 65534.0 / (hmax(k) - hmin(k)) DO j=1,ny DO i=1,nx itmp1 = nint(scale * (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 istat = sfwdata(sds_id, start, stride, dims, var) ELSE istat = sfwdata(sds_id, start, stride, dims, itmp) END IF IF (istat /= 0) THEN IF(myproc == 0) & WRITE (6,*) "HDFWRT3D: ERROR writing variable ",trim(name) END IF istat = sfendacc(sds_id) IF (istat /= 0) THEN IF(myproc == 0) & WRITE (6,*) "HDFWRT3D: ERROR writing variable ",trim(name) END IF RETURN END SUBROUTINE hdfwrt3d !################################################################## !################################################################## !###### ###### !###### 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, & 4 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 = sfscatt(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 = sfscatt(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 = sfscatt(sds_id, 'hdf_comp_code', dfnt_int32, 1, 3) END IF istat = sfscatt(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, & 23,1 name,comment,units,itmp) !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Write out a 2-D real 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 ! ! 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,scale INTEGER :: i,j,k INTEGER :: itmp1 !----------------------------------------------------------------------- ! ! 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 = sfscatt(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 = sfscatt(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 = sfscatt(sds_id, 'hdf_comp_code', dfnt_int32, 1, 3) END IF istat = sfscatt(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 CALL a3dmax0lcl(var,1,nx,1,nx,1,ny,1,ny,1,1,1,1,amax,amin) IF (ABS(amax-amin) < 1.0E-10) amax = 1.1 * amin + 1. scale = 65534.0 / (amax - amin) DO j=1,ny DO i=1,nx itmp1 = nint(scale * (var(i,j) - amin)) - 32767 itmp(i,j) = itmp1 END DO END DO istat = sfsnatt(sds_id, 'packed16', dfnt_int32, 1, 1) istat = sfsnatt(sds_id, 'max', dfnt_float32, 1, amax) istat = sfsnatt(sds_id, 'min', dfnt_float32, 1, amin) END IF !----------------------------------------------------------------------- ! ! Write the data in var out to the file ! !----------------------------------------------------------------------- IF (hdfcompr <= 3) THEN istat = sfwdata(sds_id, start, stride, dims, var) ELSE istat = sfwdata(sds_id, start, stride, dims, itmp) END IF IF (istat /= 0) THEN IF(myproc == 0) & WRITE (6,*) "HDFWRT2D: ERROR writing variable ",trim(name) END IF istat = sfendacc(sds_id) IF (istat /= 0) THEN IF(myproc == 0) & 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, & 3 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 = sfscatt(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 = sfscatt(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 = sfscatt(sds_id, 'hdf_comp_code', dfnt_int32, 1, 3) END IF istat = sfscatt(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) 6 !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Write out a 1-D real array to an HDF4 file. ! !----------------------------------------------------------------------- ! ! AUTHOR: Gene Bassett ! 2000/03/15 ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! ! 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 !----------------------------------------------------------------------- ! ! 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) = 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 ! !----------------------------------------------------------------------- istat = sfwdata(sds_id, start, stride, dims, var) IF (istat /= 0) THEN IF(myproc == 0) & WRITE (6,*) "HDFWRT1D: ERROR writing variable ",trim(name) END IF istat = sfendacc(sds_id) IF (istat /= 0) THEN IF(myproc == 0) & WRITE (6,*) "HDFWRT1D: ERROR writing variable ",trim(name) END IF RETURN END SUBROUTINE hdfwrt1d !################################################################## !################################################################## !###### ###### !###### SUBROUTINE HDFWRTR ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## SUBROUTINE hdfwrtr(sd_id,name,val,istat) 96 !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Write out a real 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 REAL :: 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 include file !----------------------------------------------------------------------- ! ! Functions ! !----------------------------------------------------------------------- INTEGER :: sfsnatt !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ istat = sfsnatt(sd_id, trim(name), dfnt_float32, 1, val) IF (istat == -1) THEN IF (myproc == 0) & 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) 117 !----------------------------------------------------------------------- ! ! 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) 20 !----------------------------------------------------------------------- ! ! 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 !----------------------------------------------------------------------- ! ! 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, strlen, 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) 73 !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Read in a 3-D real 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 ! ! 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 :: 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 :: scale INTEGER :: i,j,k !----------------------------------------------------------------------- ! ! 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 IF (myproc == 0) & 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 IF (myproc == 0) & 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 istat = sfrdata(sds_id, start, stride, dims, var) ELSE istat = sfrdata(sds_id, start, stride, dims, itmp) END IF IF (istat == -1) THEN IF (myproc == 0) & 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 scale = (hmax(k) - hmin(k)) / 65534.0 DO j=1,ny DO i=1,nx var(i,j,k) = scale * (itmp(i,j,k) + 32767) + hmin(k) END DO END DO END DO END IF istat = sfendacc(sds_id) IF (istat /= 0) THEN IF (myproc == 0) & WRITE (6,*) "HDFRD3D: ERROR reading variable ",trim(name) istat = 2 END IF RETURN END SUBROUTINE hdfrd3d !################################################################## !################################################################## !###### ###### !###### SUBROUTINE HDFRD3DI ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## SUBROUTINE hdfrd3di(sd_id,name,nx,ny,nz,var,istat) 3 !----------------------------------------------------------------------- ! ! 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) 26 !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Read in a 2-D real 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) ! ! 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 :: amax,amin, scale INTEGER :: istat1,istat2,istat3 INTEGER :: i,j INTEGER :: packed16 !----------------------------------------------------------------------- ! ! 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 IF (myproc == 0) & 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 IF (myproc == 0) & 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 istat = sfrdata(sds_id, start, stride, dims, var) ELSE istat = sfrdata(sds_id, start, stride, dims, itmp) END IF IF (istat == -1) THEN IF (myproc == 0) & 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 scale = (amax - amin) / 65534.0 DO j=1,ny DO i=1,nx var(i,j) = scale * (itmp(i,j) + 32767) + amin END DO END DO END IF istat = sfendacc(sds_id) IF (istat /= 0) THEN IF (myproc == 0) & 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) 2 !----------------------------------------------------------------------- ! ! 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) 5 !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Read in a 2-D real 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 ! ! 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 !----------------------------------------------------------------------- ! ! 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,*) "HDFRD1D: 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,*) "HDFRD1D: ERROR reading variable ",trim(name) istat = 2 END IF RETURN END SUBROUTINE hdfrd1d !################################################################## !################################################################## !###### ###### !###### SUBROUTINE HDFRDR ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## SUBROUTINE hdfrdr(sd_id,name,val,istat) 121 !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Read in a real 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 ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- IMPLICIT NONE REAL :: 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,*) "HDFRDR: 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,*) "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) 142 !----------------------------------------------------------------------- ! ! 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) 21 !----------------------------------------------------------------------- ! ! 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=128) :: attr_name INTEGER :: i !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- INCLUDE 'hdf.f90' ! HDF4 library include file INCLUDE 'mp.inc' !----------------------------------------------------------------------- ! ! Functions ! !----------------------------------------------------------------------- INTEGER :: sffattr, sfgainfo, sfrnatt !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! 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 = sfrnatt(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) 25 !----------------------------------------------------------------------- ! ! 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) 23 !----------------------------------------------------------------------- ! ! 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,nstyps,ireturn) 2,6 !----------------------------------------------------------------------- ! ! 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 !----------------------------------------------------------------------- ! ! 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 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 CALL hdfclose(sd_id,istat) RETURN END SUBROUTINE get_dims_from_hdf