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
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
58 integer(hid_t) :: file_id, fapl_id, filespace, str_type
59 integer(hid_t) :: grp_id, optimizer_grp_id, attr_id
61 integer(hsize_t) :: ddim(1)
62 logical :: optimizer_exists
64 overwrite_flag = .false.
65 if (
present(overwrite)) overwrite_flag = overwrite
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)
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, &
83 call h5gcreate_f(file_id,
"Optimizer", optimizer_grp_id, ierr)
84 call h5gcreate_f(optimizer_grp_id,
"checkpoint", grp_id, ierr)
87 call h5fopen_f(trim(filename), h5f_acc_rdwr_f, file_id, ierr, fapl_id)
90 optimizer_exists = .false.
91 call h5lexists_f(file_id,
'Optimizer', optimizer_exists, ierr)
93 if (.not. optimizer_exists)
then
95 call h5gcreate_f(file_id,
"Optimizer", optimizer_grp_id, ierr)
96 call h5gcreate_f(optimizer_grp_id,
"checkpoint", grp_id, ierr)
99 call h5gopen_f(file_id,
'Optimizer', optimizer_grp_id, ierr)
100 call h5lexists_f(optimizer_grp_id,
'checkpoint', optimizer_exists, ierr)
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)
106 call neko_error(
'optimizer: HDF5 file "' // trim(filename) //
'" ' &
107 //
'already contains Optimizer group; ' &
108 //
'use overwrite option to replace')
112 call h5gclose_f(optimizer_grp_id, ierr)
118 call h5screate_f(h5s_scalar_f, filespace, ierr)
121 call h5tcopy_f(h5t_fortran_s1, str_type, ierr)
122 call h5tset_strpad_f(str_type, h5t_str_spacepad_f, ierr)
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)
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, &
138 call h5aclose_f(attr_id, ierr)
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)
147 call hdf5_session_finalize()
149 end subroutine optimizer_save_checkpoint_hdf5
151 subroutine optimizer_load_checkpoint_hdf5(object, filename)
152 class(optimizer_t),
intent(inout) :: object
153 character(len=*),
intent(in) :: filename
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'
168 call hdf5_session_init()
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)
176 call h5fopen_f(trim(filename), h5f_acc_rdonly_f, file_id, ierr, &
177 access_prp = fapl_id)
180 call h5gopen_f(file_id, trim(h5_group), grp_id, ierr)
182 if (ierr .ne. 0)
then
183 call neko_error(
'optimizer: unable to open HDF5 file "' // &
184 trim(filename) //
'"')
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)
196 if (trim(type_name) .ne. trim(object%optimizer_type))
then
197 call neko_error(
"Incompatible optimizer type in checkpoint file")
202 call h5aopen_f(grp_id,
'iter', attr_id, ierr)
203 call h5aread_f(attr_id, h5t_native_integer, object%current_iteration, &
205 call h5aclose_f(attr_id, ierr)
207 if (object%current_iteration .lt. 0)
then
208 call neko_error(
"Incompatible optimizer iteration in checkpoint file")
212 call h5gclose_f(grp_id, ierr)
213 call h5fclose_f(file_id, ierr)
214 call h5pclose_f(fapl_id, ierr)
216 call hdf5_session_finalize()
218 end subroutine optimizer_load_checkpoint_hdf5
220end submodule optimizer_hdf5_io
Defines the abstract type optimizer.