!########################################################################
!########################################################################
!######### #########
!######### SUBROUTINE wrtlsohdf #########
!######### #########
!######### Developed by #########
!######### Center for Analysis and Prediction of Storms #########
!######### University of Oklahoma #########
!######### #########
!########################################################################
!########################################################################
SUBROUTINE wrtlsohdf(maxsta,n_obs_b,yrob,monthob,dayob,hrob,minob, & 1,23
stn2d,obstype2d,lat,lon, &
elev,elevunits, &
wmowx, &
t,tunits, &
td,tdunits, &
dd, ddunits, &
ff, ffunits, &
ddg, ddgunits, &
ffg, ffgunits, &
pmsl, pmslunits, &
cover, &
ceil, ceilunits, &
lowcld, lowcldunits, &
vis, visunits, &
filename)
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Writes lso data into an HDF file for use by NCL.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Eric Kemp, January 2002.
!
!-----------------------------------------------------------------------
!
! Use modules.
!
!-----------------------------------------------------------------------
USE hdf_constants
!-----------------------------------------------------------------------
!
! Force explicit declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
!-----------------------------------------------------------------------
!
! Declare arguments.
!
!-----------------------------------------------------------------------
INTEGER, INTENT(IN) :: maxsta ! Size of array
INTEGER, INTENT(IN) :: n_obs_b ! Number of observations
INTEGER, INTENT(IN) :: yrob(maxsta) ! Year (UTC)
INTEGER, INTENT(IN) :: monthob(maxsta) ! Month (UTC)
INTEGER, INTENT(IN) :: dayob(maxsta) ! Day (UTC)
INTEGER, INTENT(IN) :: hrob(maxsta) ! Hour (UTC)
INTEGER, INTENT(IN) :: minob(maxsta) ! Minute (UTC)
CHARACTER(LEN=1), INTENT(IN) :: stn2d(5,maxsta) ! Station ID
CHARACTER(LEN=*), INTENT(IN) :: obstype2d(maxsta) ! Type of station.
REAL, INTENT(IN) :: lat(maxsta) ! Latitude
REAL, INTENT(IN) :: lon(maxsta) ! Longitude
REAL, INTENT(IN) :: elev(maxsta) ! Elevation.
CHARACTER(LEN=*), INTENT(IN) :: elevunits ! Elevation units.
INTEGER, INTENT(IN) :: wmowx(maxsta) ! WMO numerical weather
! code.
REAL, INTENT(IN) :: t(maxsta) ! Temperature.
CHARACTER(LEN=*), INTENT(IN) :: tunits ! Temperature units.
REAL, INTENT(IN) :: td(maxsta) ! Dew point.
CHARACTER(LEN=*), INTENT(IN) :: tdunits ! Dew point units.
REAL, INTENT(IN) :: dd(maxsta) ! Wind direction
CHARACTER(LEN=*), INTENT(IN) :: ddunits ! Wind direction units.
REAL, INTENT(IN) :: ff(maxsta) ! Wind speed.
CHARACTER(LEN=*), INTENT(IN) :: ffunits ! Wind speed units.
REAL, INTENT(IN) :: ddg(maxsta) ! Wind gust direction.
CHARACTER(LEN=*), INTENT(IN) :: ddgunits ! Wind gust direction
! units.
REAL, INTENT(IN) :: ffg(maxsta) ! Wind gust speed.
CHARACTER(LEN=*), INTENT(IN) :: ffgunits ! Wind gust speed units.
REAL, INTENT(IN) :: pmsl(maxsta) ! MSL pressure.
CHARACTER(LEN=*), INTENT(IN) :: pmslunits ! MSL pressure units.
REAL, INTENT(IN) :: cover(maxsta) ! Cloud cover.
REAL, INTENT(IN) :: ceil(maxsta) ! Ceiling height.
CHARACTER(LEN=*), INTENT(IN) :: ceilunits ! Ceiling height units.
REAL, INTENT(IN) :: lowcld(maxsta) ! Lowest cloud height.
CHARACTER(LEN=*), INTENT(IN) :: lowcldunits ! Lowest cloud height
! units.
REAL, INTENT(IN) :: vis(maxsta) ! Visibility.
CHARACTER(LEN=*), INTENT(IN) :: visunits ! Visibility (miles).
CHARACTER(LEN=*), INTENT(IN) :: filename ! Filename of output
! HDF file.
!-----------------------------------------------------------------------
!
! HDF parameters and variables
!
!-----------------------------------------------------------------------
INTEGER, PARAMETER :: maxrank = 2
INTEGER :: dims(maxrank),start(maxrank),edges(maxrank),stride(maxrank)
INTEGER :: sd_id, sds_id, dim_id
REAL, PARAMETER :: missing = -9999.
INTEGER :: status
CHARACTER(LEN=132) :: string
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Open HDF file.
!
!-----------------------------------------------------------------------
WRITE(6,*)'-----------------------------------------------------------'
PRINT *, 'wrtlsohdf: Creating HDF file ', TRIM(filename)
sd_id = sfstart(filename, DFACC_CREATE)
IF (sd_id == FAIL) CALL hdf_fail (1, sd_id, sd_id, 'sfstart')
!-----------------------------------------------------------------------
!
! Write n_obs_b as scalar attribute.
!
!-----------------------------------------------------------------------
status = sfsnatt(sd_id, 'nobs', DFNT_INT32, 1, n_obs_b)
IF (status == FAIL) CALL hdf_fail (1, status, sd_id, 'sfsnatt')
!-----------------------------------------------------------------------
!
! Write yrob array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing yrob array.'
CALL write_sds
(sds_id,sd_id, DFNT_INT32, 'yrob', yrob, 1, n_obs_b, &
missing)
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'Year'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Write monthob array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing monthob array.'
CALL write_sds
(sds_id,sd_id, DFNT_INT32, 'monthob', monthob, 1, &
n_obs_b, missing)
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'Month'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Write dayob array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing dayob array.'
CALL write_sds
(sds_id,sd_id, DFNT_INT32, 'dayob', dayob, 1, &
n_obs_b, missing)
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'Day'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Write hrob array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing hrob array.'
CALL write_sds
(sds_id,sd_id, DFNT_INT32, 'hrob', hrob, 1, &
n_obs_b, missing)
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'Hour'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Write minob array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing minob array.'
CALL write_sds
(sds_id,sd_id, DFNT_INT32, 'minob', minob, 1, &
n_obs_b, missing)
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'Minute'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Write stn2d array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing stn2d array.'
dims(2) = n_obs_b
dims(1) = 5
CALL write_sds_char
(sds_id,sd_id, 'stn', stn2d, 2, dims)
dim_id = sfdimid(sds_id,1)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'maxnumchar_stn')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'StationID'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Write obstype2d array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing obstype2d array.'
dims(2) = n_obs_b
dims(1) = 8
CALL write_sds_char
(sds_id,sd_id, 'obstype', obstype2d, 2, dims)
dim_id = sfdimid(sds_id,1)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'maxnumchar_obstype')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'ObTypeID'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Write lat array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing lat array.'
CALL write_sds
(sds_id,sd_id, DFNT_FLOAT32, 'lat', lat, 1, n_obs_b, &
missing)
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'Latitude'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'Deg N'
status = sfscatt(sds_id,'units',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Write lon array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing lon array.'
CALL write_sds
(sds_id,sd_id, DFNT_FLOAT32, 'lon', lon, 1, n_obs_b, &
missing)
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'Longitude'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'Deg E'
status = sfscatt(sds_id,'units',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Write elev array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing elev array.'
CALL write_sds
(sds_id,sd_id, DFNT_FLOAT32, 'elev', elev, 1, n_obs_b, &
missing)
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'Elevation'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = TRIM(elevunits)
status = sfscatt(sds_id,'units',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Write wmowx array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing wmowx array.'
CALL write_sds
(sds_id,sd_id, DFNT_INT32, 'wmowx', wmowx, 1, n_obs_b, &
missing)
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'WMO Weather Code'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Write t array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing t array.'
CALL write_sds
(sds_id,sd_id, DFNT_FLOAT32, 't', t, 1, n_obs_b, &
missing)
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'Temperature'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = TRIM(tunits)
status = sfscatt(sds_id,'units',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Write td array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing td array.'
CALL write_sds
(sds_id,sd_id, DFNT_FLOAT32, 'td', td, 1, n_obs_b, &
missing)
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'Dew Point'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = TRIM(tdunits)
status = sfscatt(sds_id,'units',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Write u array.
!
!-----------------------------------------------------------------------
!
! WRITE(6,*)'wrtlsohdf: Writing u array.'
! CALL write_sds (sds_id,sd_id, DFNT_FLOAT32, 'u', u, 1, n_obs_b, &
! missing)
!
! dim_id = sfdimid(sds_id,0)
! status = sfsdmname(dim_id,'nobs')
! IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
!
! string = 'U Wind'
! status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
! TRIM(string))
! IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
!
! string = TRIM(uunits)
! status = sfscatt(sds_id,'units',DFNT_CHAR8,LEN_TRIM(string), &
! TRIM(string))
! IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
!
! status = sfendacc(sds_id)
!
!-----------------------------------------------------------------------
!
! Write v array.
!
!-----------------------------------------------------------------------
!
! WRITE(6,*)'wrtlsohdf: Writing v array.'
! CALL write_sds (sds_id,sd_id, DFNT_FLOAT32, 'v', v, 1, n_obs_b, &
! missing)
!
! dim_id = sfdimid(sds_id,0)
! status = sfsdmname(dim_id,'nobs')
! IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
!
! string = 'V Wind'
! status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
! TRIM(string))
! IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
!
! string = TRIM(vunits)
! status = sfscatt(sds_id,'units',DFNT_CHAR8,LEN_TRIM(string), &
! TRIM(string))
! IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
!
! status = sfendacc(sds_id)
!
!-----------------------------------------------------------------------
!
! Write dd array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing dd array.'
CALL write_sds
(sds_id,sd_id, DFNT_FLOAT32, 'dd', dd, 1, n_obs_b, &
missing)
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'Wind Direction'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = TRIM(ddunits)
status = sfscatt(sds_id,'units',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Write ff array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing ff array.'
CALL write_sds
(sds_id,sd_id, DFNT_FLOAT32, 'ff', ff, 1, n_obs_b, &
missing)
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'Wind Speed'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = TRIM(ffunits)
status = sfscatt(sds_id,'units',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Write ug array.
!
!-----------------------------------------------------------------------
!
! WRITE(6,*)'wrtlsohdf: Writing ug array.'
! CALL write_sds (sds_id,sd_id, DFNT_FLOAT32, 'ug', ug, 1, n_obs_b, &
! missing)
!
! dim_id = sfdimid(sds_id,0)
! status = sfsdmname(dim_id,'nobs')
! IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
!
! string = 'U Wind Gust'
! status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
! TRIM(string))
! IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
!
! string = TRIM(uunits)
! status = sfscatt(sds_id,'units',DFNT_CHAR8,LEN_TRIM(string), &
! TRIM(string))
! IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
!
! status = sfendacc(sds_id)
!
!-----------------------------------------------------------------------
!
! Write vg array.
!
!-----------------------------------------------------------------------
!
! WRITE(6,*)'wrtlsohdf: Writing vg array.'
! CALL write_sds (sds_id,sd_id, DFNT_FLOAT32, 'vg', vg, 1, n_obs_b, &
! missing)
!
! dim_id = sfdimid(sds_id,0)
! status = sfsdmname(dim_id,'nobs')
! IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
!
! string = 'V Wind Gust'
! status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
! TRIM(string))
! IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
!
! string = TRIM(vgunits)
! status = sfscatt(sds_id,'units',DFNT_CHAR8,LEN_TRIM(string), &
! TRIM(string))
! IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
!
! status = sfendacc(sds_id)
!
!-----------------------------------------------------------------------
!
! Write ddg array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing ddg array.'
CALL write_sds
(sds_id,sd_id, DFNT_FLOAT32, 'ddg', ddg, 1, n_obs_b, &
missing)
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'Wind Gust Direction'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = TRIM(ddgunits)
status = sfscatt(sds_id,'units',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Write ffg array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing ffg array.'
CALL write_sds
(sds_id,sd_id, DFNT_FLOAT32, 'ffg', ffg, 1, n_obs_b, &
missing)
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'Wind Gust Speed'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = TRIM(ffgunits)
status = sfscatt(sds_id,'units',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Write pmsl array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing pmsl array.'
CALL write_sds
(sds_id,sd_id, DFNT_FLOAT32, 'pmsl', pmsl, 1, n_obs_b, &
missing)
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'MSL Pressure'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = TRIM(pmslunits)
status = sfscatt(sds_id,'units',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Write cover array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing cover array.'
CALL write_sds
(sds_id,sd_id, DFNT_FLOAT32,'cover',cover,1,n_obs_b, &
missing)
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'Cloud Cover'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'tenths'
status = sfscatt(sds_id,'units',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Write ceil array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing ceil array.'
CALL write_sds
(sds_id,sd_id, DFNT_FLOAT32, 'ceil', ceil, 1, n_obs_b, &
missing)
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'Ceiling'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = TRIM(ceilunits)
status = sfscatt(sds_id,'units',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Write lowcld array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing lowcld array.'
CALL write_sds
(sds_id,sd_id, DFNT_FLOAT32,'lowcld',lowcld,1,n_obs_b, &
missing)
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'Lowest Cloud Height'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = TRIM(lowcldunits)
status = sfscatt(sds_id,'units',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Write vis array.
!
!-----------------------------------------------------------------------
WRITE(6,*)'wrtlsohdf: Writing vis array.'
CALL write_sds
(sds_id,sd_id, DFNT_FLOAT32,'vis',vis,1,n_obs_b, &
missing)
dim_id = sfdimid(sds_id,0)
status = sfsdmname(dim_id,'nobs')
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = 'Visibility'
status = sfscatt(sds_id,'long_name',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
string = TRIM(visunits)
status = sfscatt(sds_id,'units',DFNT_CHAR8,LEN_TRIM(string), &
TRIM(string))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'sfscatt')
status = sfendacc(sds_id)
!-----------------------------------------------------------------------
!
! Close file and exit.
!
!-----------------------------------------------------------------------
status = sfend(sd_id)
IF (status == FAIL) CALL hdf_fail (1, status, sd_id, 'sfend')
PRINT *, 'wrtlsohdf: Done'
WRITE(6,*)'-----------------------------------------------------------'
RETURN
END SUBROUTINE wrtlsohdf
!########################################################################
!########################################################################
!###### ######
!###### SUBROUTINE HDF_FAIL ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!########################################################################
!########################################################################
SUBROUTINE hdf_fail (disposition, status, id, string)
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Gracefully exits program if there is an HDF library call error.
!
! AUTHOR: Richard Carpenter, January 2000
!
! MODIFICATION HISTORY:
!
! Eric Kemp, March 2000
! Added Documentation.
!
! Eric Kemp, January 2002
! Updated documentation.
!
!-----------------------------------------------------------------------
!
! Force explicit declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
!-----------------------------------------------------------------------
!
! Declare arguments.
!
!-----------------------------------------------------------------------
INTEGER, INTENT(IN) :: disposition, status, id
CHARACTER(LEN=*), INTENT(IN) :: string
CHARACTER(LEN=5) :: disposition_string(0:1) = (/ 'ERROR', 'FATAL' /)
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
PRINT *, 'hdf_fail: ', TRIM(disposition_string(disposition)), &
': HDF error. status=', status, ', id=', id
PRINT *, 'hdf_fail: Message: ', TRIM(string)
IF (disposition > 0) STOP
END SUBROUTINE hdf_fail
!########################################################################
!########################################################################
!###### ######
!###### SUBROUTINE WRITE_SDS ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!########################################################################
!########################################################################
SUBROUTINE write_sds (sds_id, sd_id, type, name, var, rank, dims, missing) 43,2
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Writes numerical SDS data to a HDF file.
!
! AUTHOR: Richard Carpenter, January 2000
!
! MODIFICATION HISTORY:
!
! Eric Kemp, March 2000
! Added Documentation.
!
! Eric Kemp, 31 March 2000
! Corrected checks for file access errors.
!
! Eric Kemp, January 2002
! Updated documentation.
!
!-----------------------------------------------------------------------
!
! Use modules.
!
!-----------------------------------------------------------------------
USE hdf_constants
!-----------------------------------------------------------------------
!
! Force explicit declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
!-----------------------------------------------------------------------
!
! Declare arguments.
!
!-----------------------------------------------------------------------
INTEGER, INTENT(OUT) :: sds_id
INTEGER, INTENT(IN) :: sd_id, type, rank
INTEGER, INTENT(IN), DIMENSION(rank) :: dims
REAL, INTENT(IN) :: var, missing
CHARACTER(LEN=*) :: name
!-----------------------------------------------------------------------
!
! Local variables
!
!-----------------------------------------------------------------------
INTEGER, PARAMETER :: maxrank=8
INTEGER :: status
INTEGER, DIMENSION(maxrank) :: start, edges, stride
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
WRITE(6,*) 'write_sds: ', TRIM(name), dims(1:rank)
!-----------------------------------------------------------------------
!
! Create SDS
!
!-----------------------------------------------------------------------
start(:) = 0
edges(1:rank) = dims(1:rank)
stride(:) = 1
sds_id = sfcreate(sd_id, TRIM(name), type, rank, dims)
IF (sds_id == FAIL) CALL hdf_fail (1, sds_id, sd_id, 'wrt1sds: sfcreate')
!-----------------------------------------------------------------------
!
! Set compression
!
!-----------------------------------------------------------------------
status = sfscompress(sds_id, comp_type, comp_prm(1))
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'wrt1sds: sfcompr')
!-----------------------------------------------------------------------
!
! Write the data to the SDS.
!
!-----------------------------------------------------------------------
status = sfwdata(sds_id, start, stride, edges, var)
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'wrt1sds: sfwdata')
!-----------------------------------------------------------------------
!
! Set the missing value and exit.
!
!-----------------------------------------------------------------------
status = sfsnatt(sds_id, '_FillValue', DFNT_FLOAT32, 1, missing)
IF (status == FAIL) CALL hdf_fail (0, status, sds_id, 'sfsnatt')
END SUBROUTINE write_sds
!########################################################################
!########################################################################
!###### ######
!###### SUBROUTINE WRITE_SDS_CHAR ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!########################################################################
!########################################################################
SUBROUTINE write_sds_char (sds_id, sd_id, name, var, rank, dims) 17,2
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Writes character SDS data to a HDF file.
!
! AUTHOR: Richard Carpenter, January 2000
!
! MODIFICATION HISTORY:
!
! Eric Kemp, March 2000
! Added Documentation.
!
! Eric Kemp, 31 March 2000
! Corrected checks for file access errors.
!
! Eric Kemp, January 2002.
! Updated documentation.
!
!-----------------------------------------------------------------------
!
! Use modules
!
!-----------------------------------------------------------------------
USE hdf_constants
!-----------------------------------------------------------------------
!
! Force explicit declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
!-----------------------------------------------------------------------
!
! Declare arguments. Note that the first dimension is the length of
! the strings, and the rank is increased by 1.
!
!-----------------------------------------------------------------------
INTEGER, INTENT(OUT) :: sds_id
INTEGER, INTENT(IN) :: sd_id, rank
INTEGER, INTENT(IN), DIMENSION(rank) :: dims
CHARACTER(LEN=*) :: var, name
!-----------------------------------------------------------------------
!
! Local variables
!
!-----------------------------------------------------------------------
INTEGER, PARAMETER :: maxrank=8
INTEGER, DIMENSION(maxrank) :: start, edges, stride
INTEGER :: status
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
WRITE(6,*) 'write_sds_char: ', TRIM(name), dims(1:rank)
!-----------------------------------------------------------------------
!
! Create SDS
!
!-----------------------------------------------------------------------
start(:) = 0
edges(1:rank) = dims(1:rank)
stride(:) = 1
sds_id = sfcreate(sd_id, TRIM(name), DFNT_CHAR8, rank, dims)
IF (sds_id == FAIL) CALL hdf_fail (1, sds_id, sd_id, 'wrt1c: sfcreate')
!-----------------------------------------------------------------------
!
! Set compression.
!
!-----------------------------------------------------------------------
!status = sfscompress(sds_id, comp_type, comp_prm(1))
! IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'wrt1c: sfcompr')
!-----------------------------------------------------------------------
!
! Write the data to the SDS.
!
!-----------------------------------------------------------------------
status = sfwcdata(sds_id, start, stride, edges, var)
IF (status == FAIL) CALL hdf_fail (1, status, sds_id, 'wrt1c: sfwcdata')
END SUBROUTINE write_sds_char