program dimension_info
implicit none
C
C Parameter declaration.
C
character*7 FILE_NAME
character*11 SDS_NAME
character*6 DIM_NAME_X
character*6 DIM_NAME_Y
integer X_LENGTH, Y_LENGTH, RANK
parameter (FILE_NAME = 'SDS.hdf',
+ SDS_NAME = 'SDStemplate',
+ DIM_NAME_X = 'X_Axis',
+ DIM_NAME_Y = 'Y_Axis',
+ X_LENGTH = 5,
+ Y_LENGTH = 16,
+ RANK = 2)
integer DFACC_WRITE, DFNT_INT16, DFNT_FLOAT64
parameter (DFACC_WRITE = 2,
+ DFNT_INT16 = 22,
+ DFNT_FLOAT64 = 6)
C
C Function declaration.
C
integer sfstart, sfn2index, sfdimid, sfgdinfo
integer sfsdscale, sfgdscale, sfsdmname, sfendacc
integer sfend, sfselect
C
C**** Variable declaration *******************************************
C
integer sd_id, sds_id, sds_index, status
integer dim_index, dim_id
integer n_values, n_attrs, data_type
integer*2 data_X(X_LENGTH)
integer*2 data_X_out(X_LENGTH)
real*8 data_Y(Y_LENGTH)
real*8 data_Y_out(Y_LENGTH)
character*6 dim_name
integer i
C
C**** End of variable declaration ************************************
C
C
C Initialize dimension scales.
C
do 10 i = 1, X_LENGTH
data_X(i) = i - 1
10 continue
do 20 i = 1, Y_LENGTH
data_Y(i) = 0.1 * (i - 1)
20 continue
C
C Open the file and initialize SD interface.
C
sd_id = sfstart(FILE_NAME, DFACC_WRITE)
C
C Get the index of the data set with the name specified in SDS_NAME.
C
sds_index = sfn2index(sd_id, SDS_NAME)
C
C Select the data set corresponding to the returned index.
C
sds_id = sfselect(sd_id, sds_index)
C
C For each dimension of the data set,
C get its dimension identifier and set dimension name
C and dimension scales. Note that data type of dimension scale can
C be different between dimensions and can be different from SDS data type.
C
do 30 dim_index = 0, RANK - 1
C
C Select the dimension at position dim_index.
C
dim_id = sfdimid(sds_id, dim_index)
C
C Assign name and dimension scale to the dimension.
C
if (dim_index .eq. 0) then
status = sfsdmname(dim_id, DIM_NAME_X)
n_values = X_LENGTH
status = sfsdscale(dim_id, n_values, DFNT_INT16, data_X)
end if
if (dim_index .eq. 1) then
status = sfsdmname(dim_id, DIM_NAME_Y)
n_values = Y_LENGTH
status = sfsdscale(dim_id, n_values, DFNT_FLOAT64, data_Y)
end if
C
C Get and display information about dimension and its scale values.
C The following information is displayed:
C
C Information about 1 dimension :
C dimension name is X_Axis
C number of scale values is 5
C dimension scale data type is int16
C
C number of dimension attributes is 0
C Scale values are:
C 0 1 2 3 4
C
C Information about 2 dimension :
C dimension name is Y_Axis
C number of scale values is 16
C dimension scale data type is float64
C number of dimension attributes is 0
C
C Scale values are:
C 0.000 0.100 0.200 0.300
C 0.400 0.500 0.600 0.700
C 0.800 0.900 1.000 1.100
C 1.200 1.300 1.400 1.500
C
status = sfgdinfo(dim_id, dim_name, n_values, data_type, n_attrs)
C
write(*,*) "Information about ", dim_index+1," dimension :"
write(*,*) "dimension name is ", dim_name
write(*,*) "number of scale values is", n_values
if (data_type. eq. 22) then
write(*,*) "dimension scale data type is int16"
endif
if (data_type. eq. 6) then
write(*,*) "dimension scale data type is float64"
endif
write(*,*) "number of dimension attributes is ", n_attrs
C
write(*,*) "Scale values are:"
if (dim_index .eq. 0) then
status = sfgdscale(dim_id, data_X_out)
write(*,*) (data_X_out(i), i= 1, X_LENGTH)
endif
if (dim_index .eq. 1) then
status = sfgdscale(dim_id, data_Y_out)
write(*,100) (data_Y_out(i), i= 1, Y_LENGTH)
100 format(4(1x,f10.3)/)
endif
30 continue
C
C Terminate access to the data set.
C
status = sfendacc(sds_id)
C
C Terminate access to the SD interface and close the file.
C
status = sfend(sd_id)
end