summaryrefslogtreecommitdiffstats
path: root/hl/fortran/examples/ex_ds1.f90
blob: 3e0048ad555fb32408a8fe455fc22516516e1a8c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
! * Copyright by The HDF Group.                                               *
! * Copyright by the Board of Trustees of the University of Illinois.         *
! * All rights reserved.                                                      *
! *                                                                           *
! * This file is part of HDF5.  The full HDF5 copyright notice, including     *
! * terms governing use, modification, and redistribution, is contained in    *
!   the COPYING file, which can be found at the root of the source code       *
!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
!   If you do not have access to either file, you may request a copy from     *
!   help@hdfgroup.org.                                                        *
! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
PROGRAM example_ds

  USE HDF5
  USE H5LT
  USE H5DS

  IMPLICIT NONE

  INTEGER, PARAMETER :: RANK      = 2 ! rank of DATA dataset
  INTEGER, PARAMETER :: DIM_DATA  = 12
  INTEGER, PARAMETER :: DIM1_SIZE = 3
  INTEGER, PARAMETER :: DIM2_SIZE = 4
  INTEGER, PARAMETER :: DIM1      = 1
  INTEGER, PARAMETER :: DIM2      = 2

  CHARACTER(LEN=6), PARAMETER :: DSET_NAME = "MYDATA"
  CHARACTER(LEN=5), PARAMETER :: DS_1_NAME = "Xaxis"
  CHARACTER(LEN=5), PARAMETER :: DS_2_NAME = "Yaxis"


  INTEGER(hid_t) :: fid    ! file ID
  INTEGER(hid_t) :: did    ! dataset ID
  INTEGER(hid_t) :: dsid   ! DS dataset ID
  INTEGER :: rankds = 1    ! rank of DS dataset
  INTEGER(hsize_t), DIMENSION(1:rank) ::  dims  = (/DIM2_SIZE,DIM1_SIZE/) ! size of data dataset
  INTEGER, DIMENSION(1:DIM_DATA) :: buf = (/1,2,3,4,5,6,7,8,9,10,11,12/)  ! data of data dataset
  INTEGER(hsize_t), DIMENSION(1:1) ::  s1_dim  = (/DIM1_SIZE/)  ! size of DS 1 dataset
  INTEGER(hsize_t), DIMENSION(1:1) ::  s2_dim  = (/DIM2_SIZE/)  ! size of DS 2 dataset
  REAL, DIMENSION(1:DIM1_SIZE) :: s1_wbuf = (/10,20,30/)     ! data of DS 1 dataset
  REAL, DIMENSION(1:DIM2_SIZE) :: s2_wbuf = (/10,20,50,100/) ! data of DS 2 dataset
  INTEGER :: err
  INTEGER :: num_scales
  INTEGER(size_t) :: name_len
  CHARACTER(LEN=80) :: name
  INTEGER(size_t) :: label_len
  CHARACTER(LEN=80) :: label
  LOGICAL :: is_attached, is_scale

  !
  ! Initialize FORTRAN predefined datatypes.
  !
  CALL h5open_f(err)

  ! create a file using default properties
  CALL H5Fcreate_f("ex_ds1.h5",H5F_ACC_TRUNC_F, fid, err)

  ! make a dataset
  CALL H5LTmake_dataset_int_f(fid, DSET_NAME, rank,dims,buf, err)

  ! make a DS dataset for the first dimension
  CALL H5LTmake_dataset_float_f(fid,DS_1_NAME,rankds,s1_dim,s1_wbuf,err)

  ! make a DS dataset for the second dimension
  CALL H5LTmake_dataset_float_f(fid,DS_2_NAME,rankds,s2_dim,s2_wbuf,err)

  !-------------------------------------------------------------------------
  ! attach the DS_1_NAME dimension scale to DSET_NAME at dimension 1
  ! and then detach it.
  !-------------------------------------------------------------------------

  ! get the dataset id for DSET_NAME
  CALL H5Dopen_f(fid, DSET_NAME, did, err)

  ! get the DS dataset id
  CALL H5Dopen_f(fid, DS_1_NAME, dsid, err)

  WRITE(*,'(/,5A,I0)') &
       "Attach Dimension Scale """,TRIM(DS_1_NAME),'" to "', TRIM(DSET_NAME), '" at dimension ', DIM1

  ! attach the DS_1_NAME dimension scale to DSET_NAME at dimension index 1
  CALL H5DSattach_scale_f(did, dsid, DIM1, err)

  ! Test if dimension Scale Attached
  CALL H5DSis_attached_f(did, dsid, DIM1, is_attached, err)
  WRITE(*,'(/,5X,3(A,1X),I0,A,L1)') 'Is',TRIM(DS_1_NAME),&
       'attached to dimension',DIM1,' ... ',is_attached


  ! Check to see how many Dimension Scales are attached

  CALL H5DSget_num_scales_f(did, DIM1, num_scales, err)

  WRITE(*,'(5X,A,I0)') 'Total number of Dimension Scales Attached ... ', num_scales

  ! Detach scale
  CALL H5DSdetach_scale_f(did, dsid, DIM1, err)
  WRITE(*,'(/,5A,I0)') &
       "Detach Dimension Scale """,TRIM(DS_1_NAME),'" from "', TRIM(DSET_NAME), '" at dimension ', DIM1

  ! Check to see if a dimension scale is attached, should be .false.
  CALL H5DSis_attached_f(did, dsid, DIM1, is_attached, err)
  WRITE(*,'(/,5X,3(A,1X),I0,A,L1)') 'Is',TRIM(DS_1_NAME),&
       'attached to dimension',DIM1,' ... ',is_attached

  !-------------------------------------------------------------------------
  ! set the DS_1_NAME dimension scale to DSET_NAME at dimension 1
  !-------------------------------------------------------------------------

  WRITE(*,'(/,5A,I0)') &
       'Set Dimension Scale "', TRIM(DS_1_NAME), '" to "', TRIM(DSET_NAME), '" at dimension ', DIM1

  CALL H5DSset_scale_f(dsid, err, "Set X")

  ! Test if Dimension Scale

  CALL H5DSis_scale_f(dsid, is_scale, err)

  ! Get scale name

  name_len = 25
  name = ''
  CALL H5DSget_scale_name_f(dsid, name, name_len, err)

  WRITE(*,'(/,5X,A,A)') 'The Dimension Scale name is ... ', name(1:name_len)

  ! Setting Dimension Scale Label

  WRITE(*,'(/,A,I0)') "Setting Dimension Scale label ""X"" for dimension ", DIM1

  CALL H5DSset_label_f(did, DIM1, "X", err)

  label_len = 25
  label = ''
  CALL H5DSget_label_f(did, DIM1, label, label_len, err)

  WRITE(*,'(/,5X,A,I0,2A)') 'Dimension Scale Label for dimension ', DIM1, ' is ... ', label(1:label_len)

  ! close DS id
  CALL H5Dclose_f(dsid, err)

  !-------------------------------------------------------------------------
  ! attach the DS_2_NAME dimension scale to DSET_NAME
  !-------------------------------------------------------------------------

  ! get the DS dataset id
  CALL H5Dopen_f(fid, DS_2_NAME, dsid, err)

  ! attach the DS_2_NAME dimension scale to DSET_NAME as the 2nd dimension (index 2)

  WRITE(*,'(/,5A,I0)') &
       'Set Dimension Scale "', TRIM(DS_2_NAME), '" to "', TRIM(DSET_NAME), '" at dimension ', DIM2

  CALL H5DSattach_scale_f(did, dsid, DIM2, err)

  CALL H5DSis_attached_f(did, dsid, DIM2, is_attached, err)

  CALL H5DSset_scale_f(dsid, err, "Set Y")

  ! Get scale name
  name_len = 25
  name = ''
  CALL H5DSget_scale_name_f(dsid, name(1:name_len), name_len, err)

  WRITE(*,'(/,5X,A,A)') 'The Dimension Scale name is ... ', name(1:name_len)


  ! Setting Dimension Scale Label

  WRITE(*,'(/,A,I0)') "Setting Dimension Scale label ""Y"" for dimension ", DIM2

  CALL H5DSset_label_f(did, DIM2, "Y", err)

  ! Get Label

  label_len = 25
  label = ''
  CALL H5DSget_label_f(did, DIM2, label, label_len, err)

  WRITE(*,'(/,5X,A,I0,2A,/)') 'Dimension Scale Label for dimension ', DIM2, ' is ... ', label(1:label_len)

 ! close DS ids
  CALL H5Dclose_f(dsid, err)
  CALL H5Dclose_f(did, err)

 ! close file
  CALL H5Fclose_f(fid, err)

END PROGRAM example_ds