The CDF toolkit program SkeletonCDF is provided to make the task of creating a CDF easier for a programmer. SkeletonCDF reads a specially formatted text file called a skeleton table and generates a skeleton CDF. Everything about a CDF can be specified in a skeleton table except data values for variables that vary from record to record (record-variant). The toolkit program SkeletonTable is also provided. It reads an existing CDF and produces a skeleton table. The skeleton table for the CDF created using only the CDF library in Section 1.9.1 would be as follows.
! Skeleton table for the "example" CDF.
! Generated: Wed 5 Jan 1994 10:53:58
#header
CDF NAME: example1
DATA ENCODING: NETWORK
MAJORITY: ROW
FORMAT: SINGLE
! Variables G.Attributes V.Attributes Records Dims Sizes
! --------- ------------ ------------ ------- ---- -----
4/0 1 2 1/z 2 2 2
#GLOBALattributes
! Attribute Entry Data
! Name Number Type Value
! --------- ------ ---- -----
"TITLE" 1: CDF_CHAR { "An example CDF (1). " -
" " } .
#VARIABLEattributes
"VALIDMIN"
"VALIDMAX"
#variables
! Variable Data Number Record Dimension
! Name Type Elements Variance Variances
! -------- ---- -------- -------- ---------
"Time" CDF_INT4 1 T F F
! Attribute Data
! Name Type Value
! -------- ---- -----
"VALIDMIN" CDF_INT4 { 0 }
"VALIDMAX" CDF_INT4 { 2359 } .
! Variable Data Number Record Dimension
! Name Type Elements Variance Variances
! -------- ---- -------- -------- ---------
"Longitude" CDF_REAL4 1 F T F
! Attribute Data
! Name Type Value
! -------- ---- -----
"VALIDMIN" CDF_REAL4 { -180.0 }
"VALIDMAX" CDF_REAL4 { 180.0 } .
! NRV values follow...
[ 1, 1 ] = -165.0
[ 2, 1 ] = -150.0
! Variable Data Number Record Dimension
! Name Type Elements Variance Variances
! -------- ---- -------- -------- ---------
"Latitude" CDF_REAL4 1 F F T
! Attribute Data
! Name Type Value
! -------- ---- -----
"VALIDMIN" CDF_REAL4 { -90.0 }
"VALIDMAX" CDF_REAL4 { 90.0 } .
! NRV values follow...
[ 1, 1 ] = 40.0
[ 1, 2 ] = 30.0
! Variable Data Number Record Dimension
! Name Type Elements Variance Variances
! -------- ---- -------- -------- ---------
"Temperature" CDF_REAL4 1 T T T
! Attribute Data
! Name Type Value
! -------- ---- -----
"VALIDMIN" CDF_REAL4 { -40.0 }
"VALIDMAX" CDF_REAL4 { 50.0 } .
#end
Assuming that SkeletonCDF was used to create a CDF containing the metadata and data in the above skeleton table, the following Fortran program would be used to complete the creation of the CDF.
PROGRAM exampleSKT
C----------------------------------------------------------------------------
C
C NSSDC/CDF Create an example CDF (using skeleton table).
C
C Version 1.0, 5-Jan-94, CDF, Inc.
C
C Modification history:
C
C V1.0 5-Jan-94, Joe Programmer Original version.
C
C----------------------------------------------------------------------------
INCLUDE '../../include/cdf.inc'
INTEGER*4 id ! CDF identifier.
INTEGER*4 status ! CDF completion status.
INTEGER*4 lun ! Logical unit number for input data file.
INTEGER*4 indices(2) ! Dimension indices.
INTEGER*4 rec_num ! Record number.
INTEGER*4 time_var_num ! 'Time' rVariable number.
INTEGER*4 tmp_var_num ! 'Temperature' rVariable number.
INTEGER*4 time ! 'Time' rVariable value.
REAL*4 lat ! 'Latitude' rVariable value.
REAL*4 lon ! 'Longitude' rVariable value.
REAL*4 tmp ! 'Temperature' rVariable value.
DATA lun/1/
C----------------------------------------------------------------------------
C Open the CDF.
C----------------------------------------------------------------------------
CALL CDF_open ('example2', id, status)
IF (status .NE. CDF_OK) CALL StatusHandler (status)
C----------------------------------------------------------------------------
C Determine rVariable numbers.
C----------------------------------------------------------------------------
time_var_num = CDF_var_num (id, 'Time')
IF (time_var_num .LT. CDF_OK) CALL StatusHandler (status)
tmp_var_num = CDF_var_num (id, 'Temperature')
IF (tmp_var_num .LT. CDF_OK) CALL StatusHandler (status)
C----------------------------------------------------------------------------
C Read input values for rVariables and write them to the CDF. Not
C every value must be written to the CDF - many of the values are redundant.
C The 'Time' value only has to be written once per CDF record (every 4 input
C records). The 'Longitude' and 'Latitude' values are not written at all
C because they had been specified in the skeleton table. Each 'Temperature'
C value read is written to the CDF.
C----------------------------------------------------------------------------
OPEN (lun, FILE='example.dat', ERR=99)
DO rec_num = 1, 24
DO x1 = 1, 2
DO x2 = 1, 2
indices(1) = x1
indices(2) = x2
READ (lun, *, ERR=99) time, lon, lat, tmp
IF (indices(1) .EQ. 1 .AND. indices(2) .EQ. 1) THEN
CALL CDF_var_put (id, time_var_num, rec_num, indices,
. time, status)
IF (status .NE. CDF_OK) CALL StatusHandler (status)
END IF
CALL CDF_var_put (id, tmp_var_num, rec_num, indices,
. tmp, status)
IF (status .NE. CDF_OK) CALL StatusHandler (status)
END DO
END DO
END DO
CLOSE (lun, ERR=99)
C----------------------------------------------------------------------------
C Close CDF.
C----------------------------------------------------------------------------
CALL CDF_close (id, status)
IF (status .NE. CDF_OK) CALL StatusHandler (status)
STOP
C----------------------------------------------------------------------------
C Input file error handler.
C----------------------------------------------------------------------------
99 WRITE (6,101)
101 FORMAT (' ','Error reading input file')
STOP
END
C----------------------------------------------------------------------------
C Status handler.
C----------------------------------------------------------------------------
SUBROUTINE StatusHandler (status)
INTEGER*4 status
INCLUDE '../../include/cdf.inc'
CHARACTER message*(CDF_ERRTEXT_LEN)
IF (status .LT. CDF_WARN) THEN
WRITE (6,10)
10 FORMAT (' ','Error (halting)...')
CALL CDF_error (status, message)
WRITE (6,11) message
11 FORMAT (' ',A)
STOP
ELSE
IF (status .LT. CDF_OK) THEN
WRITE (6,12)
12 FORMAT (' ','Warning...')
CALL CDF_error (status, message)
WRITE (6,13) message
13 FORMAT (' ',A)
ELSE
IF (status .GT. CDF_OK) THEN
WRITE (6,14)
14 FORMAT (' ','Be advised that...')
CALL CDF_error (status, message)
WRITE (6,15) message
15 FORMAT (' ',A)
END IF
END IF
END IF
RETURN
END
The CDF was opened (since it already existed) and the values for only the Time and Temperature rVariables were written to the CDF. All of the other functions performed by the program in Section 1.9.1 were done by the SkeletonCDF program when it read the skeleton table.