Neko-TOP
A portable framework for high-order spectral element flow toplogy optimization.
Loading...
Searching...
No Matches
design.f90
Go to the documentation of this file.
1
34
36module design
37 use json_module, only: json_file
38 use simulation_m, only: simulation_t
39 use num_types, only: rp
40 use vector, only: vector_t
41 use utils, only: neko_error, filename_suffix
42 use comm, only: neko_comm
43 use mpi_f08, only: mpi_allreduce, mpi_integer, mpi_sum
44 implicit none
45 private
46
53 type, abstract :: design_t
54 private
56 character(len=:), allocatable :: name
57
59 integer :: n = 0
61 integer :: n_global = 0
62
63 contains
64
65 ! ----------------------------------------------------------------------- !
66 ! Interfaces
67
78 procedure, pass(this) :: init_from_json_sim => design_init_from_json_sim
79
88 procedure, pass(this) :: init_from_json => design_init_from_json
89
91 procedure(design_free), public, pass(this), deferred :: free
92
94 procedure(design_get_values), public, pass(this), deferred :: get_values
96 generic :: get_x => design_get_x
97 generic :: x => design_get_x_i
99 generic :: get_y => design_get_y
100 generic :: y => design_get_y_i
102 generic :: get_z => design_get_z
103 generic :: z => design_get_z_i
104
106 procedure(design_update_design), public, pass(this), deferred :: &
107 update_design
108
110 procedure(design_map_forward), public, pass(this), deferred :: &
111 map_forward
113 procedure(design_map_backward), public, pass(this), deferred :: &
114 map_backward
116 procedure(design_write), public, pass(this), deferred :: write
117
119 procedure, public, pass(this) :: save_checkpoint => design_save_checkpoint
121 procedure, public, pass(this) :: load_checkpoint => design_load_checkpoint
123 procedure, public, pass(this) :: set_output_counter => &
124 design_set_output_counter
125 ! ----------------------------------------------------------------------- !
126 ! Methods
127
129 procedure, pass(this) :: init_base => design_init_base
131 procedure, pass(this) :: free_base => design_free_base
132
134 procedure, public, pass(this) :: get_name => design_get_name
136 procedure, public, pass(this) :: size => design_size
138 procedure, public, pass(this) :: size_global => design_size_global
139
141 procedure, pass(this) :: design_get_x
143 procedure, pass(this) :: design_get_x_i
145 procedure, pass(this) :: design_get_y
147 procedure, pass(this) :: design_get_y_i
149 procedure, pass(this) :: design_get_z
151 procedure, pass(this) :: design_get_z_i
152
153 end type design_t
154
155 ! ========================================================================== !
156 ! Interface for the factory function
157
168 module subroutine design_factory(object, parameters, simulation)
169 class(design_t), allocatable, intent(inout) :: object
170 type(json_file), intent(inout) :: parameters
171 type(simulation_t), intent(inout), optional :: simulation
172 end subroutine design_factory
173 end interface design_factory
174
175 ! ========================================================================== !
176 ! Public interface for the deferred methods
177
178 abstract interface
179 subroutine design_free(this)
180 import design_t
181 class(design_t), intent(inout) :: this
182 end subroutine design_free
183
184 subroutine design_get_values(this, values)
185 import design_t, vector_t
186 class(design_t), intent(in) :: this
187 type(vector_t), intent(inout) :: values
188 end subroutine design_get_values
189
190 subroutine design_update_design(this, values)
191 import design_t, vector_t
192 class(design_t), intent(inout) :: this
193 type(vector_t), intent(inout) :: values
194 end subroutine design_update_design
195
196 subroutine design_map_forward(this)
197 import design_t
198 class(design_t), intent(inout) :: this
199 end subroutine design_map_forward
200
201 subroutine design_map_backward(this, sensitivity)
202 import design_t, vector_t
203 class(design_t), intent(inout) :: this
204 type(vector_t), intent(in) :: sensitivity
205 end subroutine design_map_backward
206
207 subroutine design_write(this, idx)
208 import design_t
209 class(design_t), intent(inout) :: this
210 integer, intent(in) :: idx
211 end subroutine design_write
212
213 subroutine set_output_counter(this, idx)
214 import design_t
215 class(design_t), intent(inout) :: this
216 integer, intent(in) :: idx
217 end subroutine set_output_counter
218 end interface
219
220 ! ========================================================================== !
221 ! Module subroutine implementations
222
223 interface
224 module subroutine design_save_checkpoint_hdf5(this, filename, overwrite)
225 class(design_t), intent(in) :: this
226 character(len=*), intent(in) :: filename
227 logical, intent(in), optional :: overwrite
228 end subroutine design_save_checkpoint_hdf5
229
230 module subroutine design_load_checkpoint_hdf5(this, filename)
231 class(design_t), intent(inout) :: this
232 character(len=*), intent(in) :: filename
233 end subroutine design_load_checkpoint_hdf5
234 end interface
235
236 public :: design_t, design_factory
237
238contains
239
240 ! ========================================================================== !
241 ! Initializers and destructors
242
246 subroutine design_init_from_json(this, parameters)
247 class(design_t), intent(inout) :: this
248 type(json_file), intent(inout) :: parameters
249
250 call neko_error("Design type does not support initialization " // &
251 "without simulation")
252 end subroutine design_init_from_json
253
258 subroutine design_init_from_json_sim(this, parameters, simulation)
259 class(design_t), intent(inout) :: this
260 type(json_file), intent(inout) :: parameters
261 type(simulation_t), intent(inout) :: simulation
262
263 call neko_error("Design type does not support initialization " // &
264 "with simulation")
265 end subroutine design_init_from_json_sim
266
271 subroutine design_init_base(this, name, n)
272 class(design_t), intent(inout) :: this
273 character(len=*), intent(in) :: name
274 integer, intent(in) :: n
275 integer :: ierr
276
277 this%name = name
278 this%n = n
279 call mpi_allreduce(n, this%n_global, 1, mpi_integer, mpi_sum, &
280 neko_comm, ierr)
281 end subroutine design_init_base
282
285 subroutine design_free_base(this)
286 class(design_t), intent(inout) :: this
287 this%name = ""
288 this%n = 0
289 this%n_global = 0
290 end subroutine design_free_base
291
292 ! ========================================================================== !
293 ! IO methods
294
299 subroutine design_save_checkpoint(this, filename, overwrite)
300 class(design_t), intent(in) :: this
301 character(len=*), intent(in) :: filename
302 logical, intent(in), optional :: overwrite
303 character(len=12) :: file_ext
304
305 ! Determine the file extension
306 call filename_suffix(filename, file_ext)
307
308 select case (trim(file_ext))
309 case ('h5', 'hdf5', 'hf5')
310 call design_save_checkpoint_hdf5(this, filename, overwrite)
311 case default
312 call neko_error('design_save_checkpoint: Unsupported file format: ' // &
313 trim(file_ext))
314 end select
315
316 end subroutine design_save_checkpoint
317
321 subroutine design_load_checkpoint(this, filename)
322 class(design_t), intent(inout) :: this
323 character(len=*), intent(in) :: filename
324 character(len=12) :: file_ext
325
326 ! Determine the file extension
327 call filename_suffix(filename, file_ext)
328
329 select case (trim(file_ext))
330 case ('h5', 'hdf5', 'hf5')
331 call design_load_checkpoint_hdf5(this, filename)
332 case default
333 call neko_error('design_load_checkpoint: Unsupported file format: ' // &
334 trim(file_ext))
335 end select
336
337 end subroutine design_load_checkpoint
338
341 subroutine design_set_output_counter(this, idx)
342 class(design_t), intent(inout) :: this
343 integer, intent(in) :: idx
344
345 end subroutine design_set_output_counter
346
347 ! ========================================================================== !
348 ! Getter methods
349
353 function design_get_name(this) result(name)
354 class(design_t), intent(in) :: this
355 character(len=:), allocatable :: name
356 name = this%name
357 end function design_get_name
358
362 pure function design_size(this) result(n)
363 class(design_t), intent(in) :: this
364 integer :: n
365 n = this%n
366 end function design_size
367
369 pure function design_size_global(this) result(n)
370 class(design_t), intent(in) :: this
371 integer :: n
372 n = this%n_global
373 end function design_size_global
374
375 subroutine design_get_x(this, x)
376 class(design_t), intent(in) :: this
377 type(vector_t), intent(inout) :: x
378 call neko_error("Design type does not support x retrieval")
379 end subroutine design_get_x
380
381 function design_get_x_i(this, i) result(x_i)
382 class(design_t), intent(in) :: this
383 integer, intent(in) :: i
384 real(kind=rp) :: x_i
385 x_i = -huge(x_i)
386 call neko_error("Design type does not support x retrieval")
387 end function design_get_x_i
388
389 subroutine design_get_y(this, y)
390 class(design_t), intent(in) :: this
391 type(vector_t), intent(inout) :: y
392 call neko_error("Design type does not support y retrieval")
393 end subroutine design_get_y
394
395 function design_get_y_i(this, i) result(y_i)
396 class(design_t), intent(in) :: this
397 integer, intent(in) :: i
398 real(kind=rp) :: y_i
399 y_i = -huge(y_i)
400 call neko_error("Design type does not support y retrieval")
401 end function design_get_y_i
402
403 subroutine design_get_z(this, z)
404 class(design_t), intent(in) :: this
405 type(vector_t), intent(inout) :: z
406 call neko_error("Design type does not support z retrieval")
407 end subroutine design_get_z
408
409 function design_get_z_i(this, i) result(z_i)
410 class(design_t), intent(in) :: this
411 integer, intent(in) :: i
412 real(kind=rp) :: z_i
413 z_i = -huge(z_i)
414 call neko_error("Design type does not support z retrieval")
415 end function design_get_z_i
416
417 ! ========================================================================= !
418 ! Dummy implementations for module procedures
419
420#if !HAVE_HDF5
421 module subroutine design_save_checkpoint_hdf5(this, filename, overwrite)
422 class(design_t), intent(in) :: this
423 character(len=*), intent(in) :: filename
424 logical, intent(in), optional :: overwrite
425 call neko_error('design: HDF5 support not enabled rebuild with HAVE_HDF5')
426 end subroutine design_save_checkpoint_hdf5
427
428 module subroutine design_load_checkpoint_hdf5(this, filename)
429 class(design_t), intent(inout) :: this
430 character(len=*), intent(in) :: filename
431 call neko_error('design: HDF5 support not enabled rebuild with HAVE_HDF5')
432 end subroutine design_load_checkpoint_hdf5
433#endif
434
435end module design
Factory function for the design object.
Definition design.f90:167
Implements the design_t.
Definition design.f90:36
Implements the steady_problem_t type.
An abstract design type.
Definition design.f90:53