37 use json_module,
only: json_file
39 use num_types,
only: rp
40 use vector,
only: vector_t
41 use utils,
only: neko_error, filename_suffix
42 use point_zone,
only: point_zone_t
43 use comm,
only: neko_comm
44 use mpi_f08,
only: mpi_allreduce, mpi_integer, mpi_sum
57 character(len=:),
allocatable :: name
62 integer :: n_global = 0
79 procedure, pass(this) :: init_from_json_sim => design_init_from_json_sim
89 procedure, pass(this) :: init_from_json => design_init_from_json
92 procedure(design_free),
public, pass(this),
deferred :: free
95 procedure(design_get_values),
public, pass(this),
deferred :: get_values
97 generic :: get_x => design_get_x
98 generic :: x => design_get_x_i
100 generic :: get_y => design_get_y
101 generic :: y => design_get_y_i
103 generic :: get_z => design_get_z
104 generic :: z => design_get_z_i
107 procedure(design_update_design),
public, pass(this),
deferred :: &
111 procedure(design_map_forward),
public, pass(this),
deferred :: &
114 procedure(design_map_backward),
public, pass(this),
deferred :: &
117 procedure(design_write),
public, pass(this),
deferred :: write
120 procedure,
public, pass(this) :: save_checkpoint => design_save_checkpoint
122 procedure,
public, pass(this) :: load_checkpoint => design_load_checkpoint
128 procedure, pass(this) :: init_base => design_init_base
130 procedure, pass(this) :: free_base => design_free_base
133 procedure,
public, pass(this) :: get_name => design_get_name
135 procedure,
public, pass(this) :: size => design_size
137 procedure,
public, pass(this) :: size_global => design_size_global
140 procedure, pass(this) :: design_get_x
142 procedure, pass(this) :: design_get_x_i
144 procedure, pass(this) :: design_get_y
146 procedure, pass(this) :: design_get_y_i
148 procedure, pass(this) :: design_get_z
150 procedure, pass(this) :: design_get_z_i
167 module subroutine design_factory(object, parameters, simulation)
168 class(design_t),
allocatable,
intent(inout) :: object
169 type(json_file),
intent(inout) :: parameters
170 type(simulation_t),
intent(inout),
optional :: simulation
171 end subroutine design_factory
172 end interface design_factory
178 subroutine design_free(this)
180 class(design_t),
intent(inout) :: this
181 end subroutine design_free
183 subroutine design_get_values(this, values)
184 import design_t, vector_t
185 class(design_t),
intent(in) :: this
186 type(vector_t),
intent(inout) :: values
187 end subroutine design_get_values
189 subroutine design_update_design(this, values)
190 import design_t, vector_t
191 class(design_t),
intent(inout) :: this
192 type(vector_t),
intent(inout) :: values
193 end subroutine design_update_design
195 subroutine design_map_forward(this)
197 class(design_t),
intent(inout) :: this
198 end subroutine design_map_forward
200 subroutine design_map_backward(this, sensitivity)
201 import design_t, vector_t
202 class(design_t),
intent(inout) :: this
203 type(vector_t),
intent(in) :: sensitivity
204 end subroutine design_map_backward
206 subroutine design_write(this, idx)
208 class(design_t),
intent(inout) :: this
209 integer,
intent(in) :: idx
210 end subroutine design_write
217 module subroutine design_save_checkpoint_hdf5(this, filename, overwrite)
218 class(design_t),
intent(in) :: this
219 character(len=*),
intent(in) :: filename
220 logical,
intent(in),
optional :: overwrite
221 end subroutine design_save_checkpoint_hdf5
223 module subroutine design_load_checkpoint_hdf5(this, filename)
224 class(design_t),
intent(inout) :: this
225 character(len=*),
intent(in) :: filename
226 end subroutine design_load_checkpoint_hdf5
229 public :: design_t, design_factory
239 subroutine design_init_from_json(this, parameters)
240 class(design_t),
intent(inout) :: this
241 type(json_file),
intent(inout) :: parameters
243 call neko_error(
"Design type does not support initialization " // &
244 "without simulation")
245 end subroutine design_init_from_json
251 subroutine design_init_from_json_sim(this, parameters, simulation)
252 class(design_t),
intent(inout) :: this
253 type(json_file),
intent(inout) :: parameters
254 type(simulation_t),
intent(inout) :: simulation
256 call neko_error(
"Design type does not support initialization " // &
258 end subroutine design_init_from_json_sim
264 subroutine design_init_base(this, name, n)
265 class(design_t),
intent(inout) :: this
266 character(len=*),
intent(in) :: name
267 integer,
intent(in) :: n
272 call mpi_allreduce(n, this%n_global, 1, mpi_integer, mpi_sum, &
274 end subroutine design_init_base
278 subroutine design_free_base(this)
279 class(design_t),
intent(inout) :: this
283 end subroutine design_free_base
292 subroutine design_save_checkpoint(this, filename, overwrite)
293 class(design_t),
intent(in) :: this
294 character(len=*),
intent(in) :: filename
295 logical,
intent(in),
optional :: overwrite
296 character(len=12) :: file_ext
299 call filename_suffix(filename, file_ext)
301 select case (trim(file_ext))
302 case (
'h5',
'hdf5',
'hf5')
303 call design_save_checkpoint_hdf5(this, filename, overwrite)
305 call neko_error(
'design_save_checkpoint: Unsupported file format: ' // &
309 end subroutine design_save_checkpoint
314 subroutine design_load_checkpoint(this, filename)
315 class(design_t),
intent(inout) :: this
316 character(len=*),
intent(in) :: filename
317 character(len=12) :: file_ext
320 call filename_suffix(filename, file_ext)
322 select case (trim(file_ext))
323 case (
'h5',
'hdf5',
'hf5')
324 call design_load_checkpoint_hdf5(this, filename)
326 call neko_error(
'design_load_checkpoint: Unsupported file format: ' // &
330 end subroutine design_load_checkpoint
338 function design_get_name(this)
result(name)
339 class(design_t),
intent(in) :: this
340 character(len=:),
allocatable :: name
342 end function design_get_name
347 pure function design_size(this)
result(n)
348 class(design_t),
intent(in) :: this
351 end function design_size
354 pure function design_size_global(this)
result(n)
355 class(design_t),
intent(in) :: this
358 end function design_size_global
360 subroutine design_get_x(this, x)
361 class(design_t),
intent(in) :: this
362 type(vector_t),
intent(inout) :: x
363 call neko_error(
"Design type does not support x retrieval")
364 end subroutine design_get_x
366 function design_get_x_i(this, i)
result(x_i)
367 class(design_t),
intent(in) :: this
368 integer,
intent(in) :: i
371 call neko_error(
"Design type does not support x retrieval")
372 end function design_get_x_i
374 subroutine design_get_y(this, y)
375 class(design_t),
intent(in) :: this
376 type(vector_t),
intent(inout) :: y
377 call neko_error(
"Design type does not support y retrieval")
378 end subroutine design_get_y
380 function design_get_y_i(this, i)
result(y_i)
381 class(design_t),
intent(in) :: this
382 integer,
intent(in) :: i
385 call neko_error(
"Design type does not support y retrieval")
386 end function design_get_y_i
388 subroutine design_get_z(this, z)
389 class(design_t),
intent(in) :: this
390 type(vector_t),
intent(inout) :: z
391 call neko_error(
"Design type does not support z retrieval")
392 end subroutine design_get_z
394 function design_get_z_i(this, i)
result(z_i)
395 class(design_t),
intent(in) :: this
396 integer,
intent(in) :: i
399 call neko_error(
"Design type does not support z retrieval")
400 end function design_get_z_i
406 module subroutine design_save_checkpoint_hdf5(this, filename, overwrite)
407 class(design_t),
intent(in) :: this
408 character(len=*),
intent(in) :: filename
409 logical,
intent(in),
optional :: overwrite
410 call neko_error(
'design: HDF5 support not enabled rebuild with HAVE_HDF5')
411 end subroutine design_save_checkpoint_hdf5
413 module subroutine design_load_checkpoint_hdf5(this, filename)
414 class(design_t),
intent(inout) :: this
415 character(len=*),
intent(in) :: filename
416 call neko_error(
'design: HDF5 support not enabled rebuild with HAVE_HDF5')
417 end subroutine design_load_checkpoint_hdf5
Factory function for the design object.
Implements the steady_problem_t type.