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
123
124 ! ----------------------------------------------------------------------- !
125 ! Methods
126
128 procedure, pass(this) :: init_base => design_init_base
130 procedure, pass(this) :: free_base => design_free_base
131
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
138
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
151
152 end type design_t
153
154 ! ========================================================================== !
155 ! Interface for the factory function
156
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
173
174 ! ========================================================================== !
175 ! Public interface for the deferred methods
176
177 abstract interface
178 subroutine design_free(this)
179 import design_t
180 class(design_t), intent(inout) :: this
181 end subroutine design_free
182
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
188
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
194
195 subroutine design_map_forward(this)
196 import design_t
197 class(design_t), intent(inout) :: this
198 end subroutine design_map_forward
199
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
205
206 subroutine design_write(this, idx)
207 import design_t
208 class(design_t), intent(inout) :: this
209 integer, intent(in) :: idx
210 end subroutine design_write
211 end interface
212
213 ! ========================================================================== !
214 ! Module subroutine implementations
215
216 interface
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
222
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
227 end interface
228
229 public :: design_t, design_factory
230
231contains
232
233 ! ========================================================================== !
234 ! Initializers and destructors
235
239 subroutine design_init_from_json(this, parameters)
240 class(design_t), intent(inout) :: this
241 type(json_file), intent(inout) :: parameters
242
243 call neko_error("Design type does not support initialization " // &
244 "without simulation")
245 end subroutine design_init_from_json
246
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
255
256 call neko_error("Design type does not support initialization " // &
257 "with simulation")
258 end subroutine design_init_from_json_sim
259
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
268 integer :: ierr
269
270 this%name = name
271 this%n = n
272 call mpi_allreduce(n, this%n_global, 1, mpi_integer, mpi_sum, &
273 neko_comm, ierr)
274 end subroutine design_init_base
275
278 subroutine design_free_base(this)
279 class(design_t), intent(inout) :: this
280 this%name = ""
281 this%n = 0
282 this%n_global = 0
283 end subroutine design_free_base
284
285 ! ========================================================================== !
286 ! IO methods
287
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
297
298 ! Determine the file extension
299 call filename_suffix(filename, file_ext)
300
301 select case (trim(file_ext))
302 case ('h5', 'hdf5', 'hf5')
303 call design_save_checkpoint_hdf5(this, filename, overwrite)
304 case default
305 call neko_error('design_save_checkpoint: Unsupported file format: ' // &
306 trim(file_ext))
307 end select
308
309 end subroutine design_save_checkpoint
310
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
318
319 ! Determine the file extension
320 call filename_suffix(filename, file_ext)
321
322 select case (trim(file_ext))
323 case ('h5', 'hdf5', 'hf5')
324 call design_load_checkpoint_hdf5(this, filename)
325 case default
326 call neko_error('design_load_checkpoint: Unsupported file format: ' // &
327 trim(file_ext))
328 end select
329
330 end subroutine design_load_checkpoint
331
332 ! ========================================================================== !
333 ! Getter methods
334
338 function design_get_name(this) result(name)
339 class(design_t), intent(in) :: this
340 character(len=:), allocatable :: name
341 name = this%name
342 end function design_get_name
343
347 pure function design_size(this) result(n)
348 class(design_t), intent(in) :: this
349 integer :: n
350 n = this%n
351 end function design_size
352
354 pure function design_size_global(this) result(n)
355 class(design_t), intent(in) :: this
356 integer :: n
357 n = this%n_global
358 end function design_size_global
359
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
365
366 function design_get_x_i(this, i) result(x_i)
367 class(design_t), intent(in) :: this
368 integer, intent(in) :: i
369 real(kind=rp) :: x_i
370 x_i = -huge(x_i)
371 call neko_error("Design type does not support x retrieval")
372 end function design_get_x_i
373
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
379
380 function design_get_y_i(this, i) result(y_i)
381 class(design_t), intent(in) :: this
382 integer, intent(in) :: i
383 real(kind=rp) :: y_i
384 y_i = -huge(y_i)
385 call neko_error("Design type does not support y retrieval")
386 end function design_get_y_i
387
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
393
394 function design_get_z_i(this, i) result(z_i)
395 class(design_t), intent(in) :: this
396 integer, intent(in) :: i
397 real(kind=rp) :: z_i
398 z_i = -huge(z_i)
399 call neko_error("Design type does not support z retrieval")
400 end function design_get_z_i
401
402 ! ========================================================================= !
403 ! Dummy implementations for module procedures
404
405#if !HAVE_HDF5
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
412
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
418#endif
419
420end module design
Factory function for the design object.
Definition design.f90:166
Implements the design_t.
Definition design.f90:36
Implements the steady_problem_t type.
An abstract design type.
Definition design.f90:54