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 point_zone, only: point_zone_t
43 use comm, only: neko_comm
44 use mpi_f08, only: mpi_allreduce, mpi_integer, mpi_sum
45 implicit none
46 private
47
54 type, abstract :: design_t
55 private
57 character(len=:), allocatable :: name
58
60 integer :: n = 0
62 integer :: n_global = 0
63
64 contains
65
66 ! ----------------------------------------------------------------------- !
67 ! Interfaces
68
79 procedure, pass(this) :: init_from_json_sim => design_init_from_json_sim
80
89 procedure, pass(this) :: init_from_json => design_init_from_json
90
92 procedure(design_free), public, pass(this), deferred :: free
93
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
105
107 procedure(design_update_design), public, pass(this), deferred :: &
108 update_design
109
111 procedure(design_map_forward), public, pass(this), deferred :: &
112 map_forward
114 procedure(design_map_backward), public, pass(this), deferred :: &
115 map_backward
117 procedure(design_write), public, pass(this), deferred :: write
118
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
126 ! ----------------------------------------------------------------------- !
127 ! Methods
128
130 procedure, pass(this) :: init_base => design_init_base
132 procedure, pass(this) :: free_base => design_free_base
133
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
140
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
153
154 end type design_t
155
156 ! ========================================================================== !
157 ! Interface for the factory function
158
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
175
176 ! ========================================================================== !
177 ! Public interface for the deferred methods
178
179 abstract interface
180 subroutine design_free(this)
181 import design_t
182 class(design_t), intent(inout) :: this
183 end subroutine design_free
184
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
190
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
196
197 subroutine design_map_forward(this)
198 import design_t
199 class(design_t), intent(inout) :: this
200 end subroutine design_map_forward
201
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
207
208 subroutine design_write(this, idx)
209 import design_t
210 class(design_t), intent(inout) :: this
211 integer, intent(in) :: idx
212 end subroutine design_write
213
214 subroutine set_output_counter(this, idx)
215 import design_t
216 class(design_t), intent(inout) :: this
217 integer, intent(in) :: idx
218 end subroutine set_output_counter
219 end interface
220
221 ! ========================================================================== !
222 ! Module subroutine implementations
223
224 interface
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
230
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
235 end interface
236
237 public :: design_t, design_factory
238
239contains
240
241 ! ========================================================================== !
242 ! Initializers and destructors
243
247 subroutine design_init_from_json(this, parameters)
248 class(design_t), intent(inout) :: this
249 type(json_file), intent(inout) :: parameters
250
251 call neko_error("Design type does not support initialization " // &
252 "without simulation")
253 end subroutine design_init_from_json
254
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
263
264 call neko_error("Design type does not support initialization " // &
265 "with simulation")
266 end subroutine design_init_from_json_sim
267
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
276 integer :: ierr
277
278 this%name = name
279 this%n = n
280 call mpi_allreduce(n, this%n_global, 1, mpi_integer, mpi_sum, &
281 neko_comm, ierr)
282 end subroutine design_init_base
283
286 subroutine design_free_base(this)
287 class(design_t), intent(inout) :: this
288 this%name = ""
289 this%n = 0
290 this%n_global = 0
291 end subroutine design_free_base
292
293 ! ========================================================================== !
294 ! IO methods
295
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
305
306 ! Determine the file extension
307 call filename_suffix(filename, file_ext)
308
309 select case (trim(file_ext))
310 case ('h5', 'hdf5', 'hf5')
311 call design_save_checkpoint_hdf5(this, filename, overwrite)
312 case default
313 call neko_error('design_save_checkpoint: Unsupported file format: ' // &
314 trim(file_ext))
315 end select
316
317 end subroutine design_save_checkpoint
318
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
326
327 ! Determine the file extension
328 call filename_suffix(filename, file_ext)
329
330 select case (trim(file_ext))
331 case ('h5', 'hdf5', 'hf5')
332 call design_load_checkpoint_hdf5(this, filename)
333 case default
334 call neko_error('design_load_checkpoint: Unsupported file format: ' // &
335 trim(file_ext))
336 end select
337
338 end subroutine design_load_checkpoint
339
342 subroutine design_set_output_counter(this, idx)
343 class(design_t), intent(inout) :: this
344 integer, intent(in) :: idx
345
346 end subroutine design_set_output_counter
347
348 ! ========================================================================== !
349 ! Getter methods
350
354 function design_get_name(this) result(name)
355 class(design_t), intent(in) :: this
356 character(len=:), allocatable :: name
357 name = this%name
358 end function design_get_name
359
363 pure function design_size(this) result(n)
364 class(design_t), intent(in) :: this
365 integer :: n
366 n = this%n
367 end function design_size
368
370 pure function design_size_global(this) result(n)
371 class(design_t), intent(in) :: this
372 integer :: n
373 n = this%n_global
374 end function design_size_global
375
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
381
382 function design_get_x_i(this, i) result(x_i)
383 class(design_t), intent(in) :: this
384 integer, intent(in) :: i
385 real(kind=rp) :: x_i
386 x_i = -huge(x_i)
387 call neko_error("Design type does not support x retrieval")
388 end function design_get_x_i
389
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
395
396 function design_get_y_i(this, i) result(y_i)
397 class(design_t), intent(in) :: this
398 integer, intent(in) :: i
399 real(kind=rp) :: y_i
400 y_i = -huge(y_i)
401 call neko_error("Design type does not support y retrieval")
402 end function design_get_y_i
403
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
409
410 function design_get_z_i(this, i) result(z_i)
411 class(design_t), intent(in) :: this
412 integer, intent(in) :: i
413 real(kind=rp) :: z_i
414 z_i = -huge(z_i)
415 call neko_error("Design type does not support z retrieval")
416 end function design_get_z_i
417
418 ! ========================================================================= !
419 ! Dummy implementations for module procedures
420
421#if !HAVE_HDF5
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
428
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
434#endif
435
436end module design
Factory function for the design object.
Definition design.f90:168
Implements the design_t.
Definition design.f90:36
Implements the steady_problem_t type.
An abstract design type.
Definition design.f90:54