Neko-TOP
A portable framework for high-order spectral element flow toplogy optimization.
Loading...
Searching...
No Matches
optimizer_hdf5_io.f90
1
38
40submodule(optimizer) optimizer_hdf5_io
41 use hdf5
42 use mpi_f08, only: mpi_info_null
43 use comm, only: neko_comm
44 use hdf5_session, only: hdf5_session_init, hdf5_session_finalize
45
46contains
47
48 ! -------------------------------------------------------------------------- !
49 ! Checkpointing methods for the optimizer optimizer
50
51 subroutine optimizer_save_checkpoint_hdf5(object, filename, overwrite)
52 class(optimizer_t), intent(inout) :: object
53 character(len=*), intent(in) :: filename
54 logical, intent(in), optional :: overwrite
55 logical :: overwrite_flag, file_exists
56
57 ! HDF5 variables
58 integer(hid_t) :: file_id, fapl_id, filespace, str_type
59 integer(hid_t) :: grp_id, optimizer_grp_id, attr_id
60 integer :: ierr, info
61 integer(hsize_t) :: ddim(1)
62 logical :: optimizer_exists
63
64 overwrite_flag = .false.
65 if (present(overwrite)) overwrite_flag = overwrite
66
67 ! ------------------------------------------------------------------------ !
68 ! Prepare the HDF5 file, settings for MPIO access and groups
69
70 call hdf5_session_init()
71 call h5pcreate_f(h5p_file_access_f, fapl_id, ierr)
72 info = mpi_info_null%mpi_val
73 call h5pset_fapl_mpio_f(fapl_id, neko_comm%mpi_val, info, ierr)
74
75 ! Handle overwriting if the file exists
76 file_exists = .false.
77 inquire(file=trim(filename), exist=file_exists)
78 if (.not. file_exists) then
79 call h5fcreate_f(trim(filename), h5f_acc_trunc_f, file_id, ierr, &
80 access_prp = fapl_id)
81
82 ! Create the Optimizer/checkpoint group
83 call h5gcreate_f(file_id, "Optimizer", optimizer_grp_id, ierr)
84 call h5gcreate_f(optimizer_grp_id, "checkpoint", grp_id, ierr)
85
86 else
87 call h5fopen_f(trim(filename), h5f_acc_rdwr_f, file_id, ierr, fapl_id)
88
89 ! Check for existing Optimizer group
90 optimizer_exists = .false.
91 call h5lexists_f(file_id, 'Optimizer', optimizer_exists, ierr)
92
93 if (.not. optimizer_exists) then
94 ! Create the Optimizer/checkpoint group
95 call h5gcreate_f(file_id, "Optimizer", optimizer_grp_id, ierr)
96 call h5gcreate_f(optimizer_grp_id, "checkpoint", grp_id, ierr)
97 else
98 ! Open the existing "Optimizer" group
99 call h5gopen_f(file_id, 'Optimizer', optimizer_grp_id, ierr)
100 call h5lexists_f(optimizer_grp_id, 'checkpoint', optimizer_exists, ierr)
101
102 if (optimizer_exists .and. overwrite_flag) then
103 call h5gunlink_f(optimizer_grp_id, "checkpoint", ierr)
104 call h5gcreate_f(optimizer_grp_id, "checkpoint", grp_id, ierr)
105 else
106 call neko_error('optimizer: HDF5 file "' // trim(filename) // '" ' &
107 // 'already contains Optimizer group; ' &
108 // 'use overwrite option to replace')
109 end if
110 end if
111 end if
112 call h5gclose_f(optimizer_grp_id, ierr)
113
114 ! ------------------------------------------------------------------------ !
115 ! Write the optimizer optimizer checkpoint group
116
117 ! Create the dataspace for attributes
118 call h5screate_f(h5s_scalar_f, filespace, ierr)
119
120 ! Save the optimizer type
121 call h5tcopy_f(h5t_fortran_s1, str_type, ierr)
122 call h5tset_strpad_f(str_type, h5t_str_spacepad_f, ierr)
123
124 ddim(1) = len_trim(object%optimizer_type)
125 call h5tset_size_f(str_type, ddim(1), ierr)
126 call h5acreate_f(grp_id, 'type', str_type, filespace, attr_id, &
127 ierr, h5p_default_f, h5p_default_f)
128 call h5awrite_f(attr_id, str_type, object%optimizer_type, ddim, ierr)
129 call h5aclose_f(attr_id, ierr)
130 call h5tclose_f(str_type, ierr)
131
132 ! Save the current iteration number
133 ddim = 1
134 call h5acreate_f(grp_id, 'iter', h5t_native_integer, filespace, attr_id, &
135 ierr, h5p_default_f, h5p_default_f)
136 call h5awrite_f(attr_id, h5t_native_integer, object%current_iteration, &
137 ddim, ierr)
138 call h5aclose_f(attr_id, ierr)
139
140 ! ------------------------------------------------------------------------ !
141 ! Close HDF5 objects
142 call h5sclose_f(filespace, ierr)
143 call h5gclose_f(grp_id, ierr)
144 call h5fclose_f(file_id, ierr)
145 call h5pclose_f(fapl_id, ierr)
146
147 call hdf5_session_finalize()
148
149 end subroutine optimizer_save_checkpoint_hdf5
150
151 subroutine optimizer_load_checkpoint_hdf5(object, filename)
152 class(optimizer_t), intent(inout) :: object
153 character(len=*), intent(in) :: filename
154
155 ! HDF5 variables
156 character(len=64) :: type_name
157 integer(hid_t) :: file_id, fapl_id, grp_id, attr_id, str_type
158 integer :: ierr, info
159 integer(hsize_t) :: ddim(1)
160 character(len=*), parameter :: h5_group = 'Optimizer/checkpoint'
161
162 ! Initialize reader variables
163 type_name = ''
164
165 ! ------------------------------------------------------------------------ !
166 ! Open the HDF5 context and read identification parameters
167
168 call hdf5_session_init()
169
170 ! Prepare the HDF5 settings for MPIO access
171 call h5pcreate_f(h5p_file_access_f, fapl_id, ierr)
172 info = mpi_info_null%mpi_val
173 call h5pset_fapl_mpio_f(fapl_id, neko_comm%mpi_val, info, ierr)
174
175 ! Open the HDF5 file
176 call h5fopen_f(trim(filename), h5f_acc_rdonly_f, file_id, ierr, &
177 access_prp = fapl_id)
178
179 ! Open the optimizer optimizer checkpoint group
180 call h5gopen_f(file_id, trim(h5_group), grp_id, ierr)
181
182 if (ierr .ne. 0) then
183 call neko_error('optimizer: unable to open HDF5 file "' // &
184 trim(filename) // '"')
185 end if
186
187 ! Read the optimizer type and verify
188 ddim(1) = 1
189 call h5aopen_f(grp_id, 'type', attr_id, ierr)
190 call h5aget_type_f(attr_id, str_type, ierr)
191 call h5aread_f(attr_id, str_type, type_name, ddim, ierr)
192 call h5tclose_f(str_type, ierr)
193 call h5aclose_f(attr_id, ierr)
194
195 ! Verify that the type is optimizer
196 if (trim(type_name) .ne. trim(object%optimizer_type)) then
197 call neko_error("Incompatible optimizer type in checkpoint file")
198 end if
199
200 ! Read the current optimizer iteration
201 ddim(1) = 1
202 call h5aopen_f(grp_id, 'iter', attr_id, ierr)
203 call h5aread_f(attr_id, h5t_native_integer, object%current_iteration, &
204 ddim, ierr)
205 call h5aclose_f(attr_id, ierr)
206
207 if (object%current_iteration .lt. 0) then
208 call neko_error("Incompatible optimizer iteration in checkpoint file")
209 end if
210
211 ! Read the current iteration
212 call h5gclose_f(grp_id, ierr)
213 call h5fclose_f(file_id, ierr)
214 call h5pclose_f(fapl_id, ierr)
215
216 call hdf5_session_finalize()
217
218 end subroutine optimizer_load_checkpoint_hdf5
219
220end submodule optimizer_hdf5_io
Defines the abstract type optimizer.
Definition optimizer.f90:40