summaryrefslogtreecommitdiffstats
path: root/HDF5Examples/FORTRAN/H5G/h5ex_g_intermediate.F90
blob: 751b747f8439fa67d40ff3016c012505c29ba3b2 (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
!************************************************************
!
!  This example shows how to create intermediate groups with
!  a single call to H5Gcreate.
!
!************************************************************/

MODULE g_intermediate

  USE HDF5
  USE ISO_C_BINDING
  IMPLICIT NONE

CONTAINS

!************************************************************
!
!  Operator function for H5Ovisit.  This function prints the
!  name and type of the object passed to it.
!
!************************************************************

  INTEGER FUNCTION op_func(loc_id, name, info, cptr) bind(C)

    USE HDF5
    USE ISO_C_BINDING
    IMPLICIT NONE
    
    INTEGER(HID_T), VALUE :: loc_id
    CHARACTER(LEN=1), DIMENSION(1:50) :: name ! We must have LEN=1 for bind(C) strings
                                              ! in order to be standard compliant
    TYPE(H5O_info_t) :: info
    CHARACTER(LEN=50) :: name_string = ' '
    TYPE(C_PTR) :: cptr
    INTEGER   :: i

    DO i = 1, 50
       IF(name(i)(1:1).EQ.C_NULL_CHAR) EXIT ! Read up to the C NULL termination
       name_string(i:i) = name(i)(1:1)
    ENDDO

    WRITE(*,"('/')",ADVANCE="NO")  !  Print root group in object path
    !
    ! Check if the current object is the root group, and if not print
    ! the full path name and type.
    !
    IF(name(1)(1:1) .EQ. '.')THEN         ! Root group, do not print '.'
        WRITE(*,"('  (Group)')")
    ELSE
       IF(info%type.EQ.H5O_TYPE_GROUP_F)THEN
          WRITE(*,'(A,"  (Group)")') TRIM(name_string)
       ELSE IF(info%type.EQ.H5O_TYPE_DATASET_F)THEN
          WRITE(*,'(A,"  (Dataset)")') TRIM(name_string)
       ELSE IF(info%type.EQ.H5O_TYPE_NAMED_DATATYPE_F)THEN
          WRITE(*,'(A,"  (Datatype)")') TRIM(name_string)
       ELSE
          WRITE(*,'(A,"  (Unknown)")') TRIM(name_string)
       ENDIF
    ENDIF

    op_func = 0 ! return successful

  END FUNCTION op_func

END MODULE g_intermediate

!************************************************************
!
!  Operator function to be called by H5Ovisit.
!
!************************************************************
PROGRAM main
  
  USE HDF5
  USE ISO_C_BINDING
  USE g_intermediate
  
  IMPLICIT NONE

  CHARACTER(LEN=22), PARAMETER :: filename  = "h5ex_g_intermediate.h5"
  INTEGER(HID_T)               :: file
  INTEGER(HID_T)               :: group
  INTEGER(HID_T)               :: lcpl
  INTEGER                      :: status
  TYPE(C_FUNPTR) :: funptr
  TYPE(C_PTR)    :: f_ptr
  INTEGER        :: ret_value

  !
  ! Initialize FORTRAN interface.
  !
  CALL H5open_f(status)

  file  = H5I_INVALID_HID_F
  group = H5I_INVALID_HID_F
  lcpl  = H5I_INVALID_HID_F

  !
  ! Create a new file using the default properties.
  !
  CALL H5Fcreate_f(filename, H5F_ACC_TRUNC_F, file, status)
  !
  ! Create link creation property list and set it to allow creation
  ! of intermediate groups.
  !
  CALL H5Pcreate_f(H5P_LINK_CREATE_F, lcpl, status)
  CALL H5Pset_create_inter_group_f(lcpl, 1, status)
  !
  ! Create the group /G1/G2/G3.  Note that /G1 and /G1/G2 do not
  ! exist yet.  This call would cause an error if we did not use the
  ! previously created property list.
  !
  CALL H5Gcreate_f(file, "/G1/G2/G3", group, status, lcpl_id=lcpl)
  !
  ! Print all the objects in the files to show that intermediate
  ! groups have been created.  See h5ex_g_visit_f for more information
  ! on how to use H5Ovisit_f.
  !
  WRITE(*,'(A)') "Objects in the file:"
  funptr = C_FUNLOC(op_func)
  f_ptr = C_NULL_PTR
  CALL H5Ovisit_f(file, H5_INDEX_NAME_F, H5_ITER_NATIVE_F, funptr, f_ptr, ret_value, status)
  !
  ! Close and release resources.
  !
  CALL H5Pclose_f(lcpl, status)
  CALL H5Gclose_f(group, status)
  CALL H5Fclose_f(file, status)

END PROGRAM main