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
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
119 ! ----------------------------------------------------------------------- !
120 ! Methods
121
123 procedure, pass(this) :: init_base => design_init_base
125 procedure, pass(this) :: free_base => design_free_base
127 procedure, public, pass(this) :: size => design_size
129 procedure, public, pass(this) :: size_global => design_size_global
130
132 procedure, pass(this) :: design_get_x
134 procedure, pass(this) :: design_get_x_i
136 procedure, pass(this) :: design_get_y
138 procedure, pass(this) :: design_get_y_i
140 procedure, pass(this) :: design_get_z
142 procedure, pass(this) :: design_get_z_i
143 end type design_t
144
145 ! ========================================================================== !
146 ! Interface for the factory function
147
158 module subroutine design_factory(object, parameters, simulation)
159 class(design_t), allocatable, intent(inout) :: object
160 type(json_file), intent(inout) :: parameters
161 type(simulation_t), intent(inout), optional :: simulation
162 end subroutine design_factory
163 end interface design_factory
164
165
166 ! ========================================================================== !
167 ! Public interface for the deferred methods
168
169 abstract interface
170 subroutine design_free(this)
171 import design_t
172 class(design_t), intent(inout) :: this
173 end subroutine design_free
174
175 subroutine design_get_values(this, values)
176 import design_t, vector_t
177 class(design_t), intent(in) :: this
178 type(vector_t), intent(inout) :: values
179 end subroutine design_get_values
180
181 subroutine design_update_design(this, values)
182 import design_t, vector_t
183 class(design_t), intent(inout) :: this
184 type(vector_t), intent(inout) :: values
185 end subroutine design_update_design
186
187 subroutine design_map_forward(this)
188 import design_t
189 class(design_t), intent(inout) :: this
190 end subroutine design_map_forward
191
192 subroutine design_map_backward(this, sensitivity)
193 import design_t, vector_t
194 class(design_t), intent(inout) :: this
195 type(vector_t), intent(in) :: sensitivity
196 end subroutine design_map_backward
197
198 subroutine design_write(this, idx)
199 import design_t
200 class(design_t), intent(inout) :: this
201 integer, intent(in) :: idx
202 end subroutine design_write
203 end interface
204
205 public :: design_t, design_factory
206contains
207
211 subroutine design_init_from_json(this, parameters)
212 class(design_t), intent(inout) :: this
213 type(json_file), intent(inout) :: parameters
214
215 call neko_error("Design type does not support initialization " // &
216 "without simulation")
217 end subroutine design_init_from_json
218
223 subroutine design_init_from_json_sim(this, parameters, simulation)
224 class(design_t), intent(inout) :: this
225 type(json_file), intent(inout) :: parameters
226 type(simulation_t), intent(inout) :: simulation
227
228 call neko_error("Design type does not support initialization " // &
229 "with simulation")
230 end subroutine design_init_from_json_sim
231
236 subroutine design_init_base(this, name, n)
237 class(design_t), intent(inout) :: this
238 character(len=*), intent(in) :: name
239 integer, intent(in) :: n
240 integer :: ierr
241
242 this%name = name
243 this%n = n
244 call mpi_allreduce(n, this%n_global, 1, mpi_integer, mpi_sum, &
245 neko_comm, ierr)
246 end subroutine design_init_base
247
250 subroutine design_free_base(this)
251 class(design_t), intent(inout) :: this
252 this%name = ""
253 this%n = 0
254 this%n_global = 0
255 end subroutine design_free_base
256
260 pure function design_size(this) result(n)
261 class(design_t), intent(in) :: this
262 integer :: n
263 n = this%n
264 end function design_size
265
267 pure function design_size_global(this) result(n)
268 class(design_t), intent(in) :: this
269 integer :: n
270 n = this%n_global
271 end function design_size_global
272
273 subroutine design_get_x(this, x)
274 class(design_t), intent(in) :: this
275 type(vector_t), intent(inout) :: x
276 call neko_error("Design type does not support x retrieval")
277 end subroutine design_get_x
278
279 function design_get_x_i(this, i) result(x_i)
280 class(design_t), intent(in) :: this
281 integer, intent(in) :: i
282 real(kind=rp) :: x_i
283 x_i = -huge(x_i)
284 call neko_error("Design type does not support x retrieval")
285 end function design_get_x_i
286
287 subroutine design_get_y(this, y)
288 class(design_t), intent(in) :: this
289 type(vector_t), intent(inout) :: y
290 call neko_error("Design type does not support y retrieval")
291 end subroutine design_get_y
292
293 function design_get_y_i(this, i) result(y_i)
294 class(design_t), intent(in) :: this
295 integer, intent(in) :: i
296 real(kind=rp) :: y_i
297 y_i = -huge(y_i)
298 call neko_error("Design type does not support y retrieval")
299 end function design_get_y_i
300
301 subroutine design_get_z(this, z)
302 class(design_t), intent(in) :: this
303 type(vector_t), intent(inout) :: z
304 call neko_error("Design type does not support z retrieval")
305 end subroutine design_get_z
306
307 function design_get_z_i(this, i) result(z_i)
308 class(design_t), intent(in) :: this
309 integer, intent(in) :: i
310 real(kind=rp) :: z_i
311 z_i = -huge(z_i)
312 call neko_error("Design type does not support z retrieval")
313 end function design_get_z_i
314
315end module design
Factory function for the design object.
Definition design.f90:157
Implements the design_t.
Definition design.f90:36
Implements the steady_problem_t type.
An abstract design type.
Definition design.f90:54