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
124 procedure,
public, pass(this) :: set_output_counter => &
125 design_set_output_counter
130 procedure, pass(this) :: init_base => design_init_base
132 procedure, pass(this) :: free_base => design_free_base
135 procedure,
public, pass(this) :: get_name => design_get_name
137 procedure,
public, pass(this) :: size => design_size
139 procedure,
public, pass(this) :: size_global => design_size_global
142 procedure, pass(this) :: design_get_x
144 procedure, pass(this) :: design_get_x_i
146 procedure, pass(this) :: design_get_y
148 procedure, pass(this) :: design_get_y_i
150 procedure, pass(this) :: design_get_z
152 procedure, pass(this) :: design_get_z_i
169 module subroutine design_factory(object, parameters, simulation)
170 class(design_t),
allocatable,
intent(inout) :: object
171 type(json_file),
intent(inout) :: parameters
172 type(simulation_t),
intent(inout),
optional :: simulation
173 end subroutine design_factory
174 end interface design_factory
180 subroutine design_free(this)
182 class(design_t),
intent(inout) :: this
183 end subroutine design_free
185 subroutine design_get_values(this, values)
186 import design_t, vector_t
187 class(design_t),
intent(in) :: this
188 type(vector_t),
intent(inout) :: values
189 end subroutine design_get_values
191 subroutine design_update_design(this, values)
192 import design_t, vector_t
193 class(design_t),
intent(inout) :: this
194 type(vector_t),
intent(inout) :: values
195 end subroutine design_update_design
197 subroutine design_map_forward(this)
199 class(design_t),
intent(inout) :: this
200 end subroutine design_map_forward
202 subroutine design_map_backward(this, sensitivity)
203 import design_t, vector_t
204 class(design_t),
intent(inout) :: this
205 type(vector_t),
intent(in) :: sensitivity
206 end subroutine design_map_backward
208 subroutine design_write(this, idx)
210 class(design_t),
intent(inout) :: this
211 integer,
intent(in) :: idx
212 end subroutine design_write
214 subroutine set_output_counter(this, idx)
216 class(design_t),
intent(inout) :: this
217 integer,
intent(in) :: idx
218 end subroutine set_output_counter
225 module subroutine design_save_checkpoint_hdf5(this, filename, overwrite)
226 class(design_t),
intent(in) :: this
227 character(len=*),
intent(in) :: filename
228 logical,
intent(in),
optional :: overwrite
229 end subroutine design_save_checkpoint_hdf5
231 module subroutine design_load_checkpoint_hdf5(this, filename)
232 class(design_t),
intent(inout) :: this
233 character(len=*),
intent(in) :: filename
234 end subroutine design_load_checkpoint_hdf5
237 public :: design_t, design_factory
247 subroutine design_init_from_json(this, parameters)
248 class(design_t),
intent(inout) :: this
249 type(json_file),
intent(inout) :: parameters
251 call neko_error(
"Design type does not support initialization " // &
252 "without simulation")
253 end subroutine design_init_from_json
259 subroutine design_init_from_json_sim(this, parameters, simulation)
260 class(design_t),
intent(inout) :: this
261 type(json_file),
intent(inout) :: parameters
262 type(simulation_t),
intent(inout) :: simulation
264 call neko_error(
"Design type does not support initialization " // &
266 end subroutine design_init_from_json_sim
272 subroutine design_init_base(this, name, n)
273 class(design_t),
intent(inout) :: this
274 character(len=*),
intent(in) :: name
275 integer,
intent(in) :: n
280 call mpi_allreduce(n, this%n_global, 1, mpi_integer, mpi_sum, &
282 end subroutine design_init_base
286 subroutine design_free_base(this)
287 class(design_t),
intent(inout) :: this
291 end subroutine design_free_base
300 subroutine design_save_checkpoint(this, filename, overwrite)
301 class(design_t),
intent(in) :: this
302 character(len=*),
intent(in) :: filename
303 logical,
intent(in),
optional :: overwrite
304 character(len=12) :: file_ext
307 call filename_suffix(filename, file_ext)
309 select case (trim(file_ext))
310 case (
'h5',
'hdf5',
'hf5')
311 call design_save_checkpoint_hdf5(this, filename, overwrite)
313 call neko_error(
'design_save_checkpoint: Unsupported file format: ' // &
317 end subroutine design_save_checkpoint
322 subroutine design_load_checkpoint(this, filename)
323 class(design_t),
intent(inout) :: this
324 character(len=*),
intent(in) :: filename
325 character(len=12) :: file_ext
328 call filename_suffix(filename, file_ext)
330 select case (trim(file_ext))
331 case (
'h5',
'hdf5',
'hf5')
332 call design_load_checkpoint_hdf5(this, filename)
334 call neko_error(
'design_load_checkpoint: Unsupported file format: ' // &
338 end subroutine design_load_checkpoint
342 subroutine design_set_output_counter(this, idx)
343 class(design_t),
intent(inout) :: this
344 integer,
intent(in) :: idx
346 end subroutine design_set_output_counter
354 function design_get_name(this)
result(name)
355 class(design_t),
intent(in) :: this
356 character(len=:),
allocatable :: name
358 end function design_get_name
363 pure function design_size(this)
result(n)
364 class(design_t),
intent(in) :: this
367 end function design_size
370 pure function design_size_global(this)
result(n)
371 class(design_t),
intent(in) :: this
374 end function design_size_global
376 subroutine design_get_x(this, x)
377 class(design_t),
intent(in) :: this
378 type(vector_t),
intent(inout) :: x
379 call neko_error(
"Design type does not support x retrieval")
380 end subroutine design_get_x
382 function design_get_x_i(this, i)
result(x_i)
383 class(design_t),
intent(in) :: this
384 integer,
intent(in) :: i
387 call neko_error(
"Design type does not support x retrieval")
388 end function design_get_x_i
390 subroutine design_get_y(this, y)
391 class(design_t),
intent(in) :: this
392 type(vector_t),
intent(inout) :: y
393 call neko_error(
"Design type does not support y retrieval")
394 end subroutine design_get_y
396 function design_get_y_i(this, i)
result(y_i)
397 class(design_t),
intent(in) :: this
398 integer,
intent(in) :: i
401 call neko_error(
"Design type does not support y retrieval")
402 end function design_get_y_i
404 subroutine design_get_z(this, z)
405 class(design_t),
intent(in) :: this
406 type(vector_t),
intent(inout) :: z
407 call neko_error(
"Design type does not support z retrieval")
408 end subroutine design_get_z
410 function design_get_z_i(this, i)
result(z_i)
411 class(design_t),
intent(in) :: this
412 integer,
intent(in) :: i
415 call neko_error(
"Design type does not support z retrieval")
416 end function design_get_z_i
422 module subroutine design_save_checkpoint_hdf5(this, filename, overwrite)
423 class(design_t),
intent(in) :: this
424 character(len=*),
intent(in) :: filename
425 logical,
intent(in),
optional :: overwrite
426 call neko_error(
'design: HDF5 support not enabled rebuild with HAVE_HDF5')
427 end subroutine design_save_checkpoint_hdf5
429 module subroutine design_load_checkpoint_hdf5(this, filename)
430 class(design_t),
intent(inout) :: this
431 character(len=*),
intent(in) :: filename
432 call neko_error(
'design: HDF5 support not enabled rebuild with HAVE_HDF5')
433 end subroutine design_load_checkpoint_hdf5
Factory function for the design object.
Implements the steady_problem_t type.