245 type(simulation_t),
intent(inout) :: simulation
246 character(len=:),
allocatable :: optimization_domain_zone_name
248 type(simple_brinkman_source_term_t) :: forward_brinkman, adjoint_brinkman
250 associate(dof =>
simulation%neko_case%fluid%dm_Xh)
252 call neko_field_registry%add_field(dof,
"design_indicator", .true.)
253 call neko_field_registry%add_field(dof,
"brinkman_amplitude", .true.)
254 call neko_field_registry%add_field(dof,
"sensitivity", .true.)
255 call neko_field_registry%add_field(dof,
"filtered_design", .true.)
259 this%design_indicator => &
260 neko_field_registry%get_field(
"design_indicator")
261 this%brinkman_amplitude => &
262 neko_field_registry%get_field(
"brinkman_amplitude")
263 this%sensitivity => &
264 neko_field_registry%get_field(
"sensitivity")
265 this%filtered_design => &
266 neko_field_registry%get_field(
"filtered_design")
272 this%design_indicator = 0.0_rp
273 this%brinkman_amplitude = 0.0_rp
274 this%design_indicator%x = 0.0_rp
276 n = this%design_indicator%dof%size()
278 if (sqrt((this%design_indicator%dof%x(i,1,1,1) - 0.5_rp)**2 + &
279 (this%design_indicator%dof%y(i,1,1,1) &
280 - 0.5_rp)**2) .lt. 0.25_rp)
then
281 this%design_indicator%x(i,1,1,1) = 1.0_rp
286 if (neko_bcknd_device .eq. 1)
then
287 call device_memcpy(this%design_indicator%x, &
288 this%design_indicator%x_d, n, &
289 host_to_device, sync = .false.)
296 this%if_mask = .true.
297 optimization_domain_zone_name =
"optimization_domain"
300 if (this%if_mask)
then
301 this%optimization_domain => &
302 neko_point_zone_registry%get_point_zone(&
303 optimization_domain_zone_name)
334 if (this%if_mask)
then
335 call mask_exterior_const(this%design_indicator, &
336 this%optimization_domain, 0.0_rp)
348 call this%output%init(sp,
'design', 3)
349 call this%output%fields%assign_to_field(1, this%design_indicator)
350 call this%output%fields%assign_to_field(2, this%brinkman_amplitude)
351 call this%output%fields%assign_to_field(3, this%sensitivity)
353 call this%init_base(n)
356 call forward_brinkman%init_from_components( &
360 this%brinkman_amplitude, &
366 call simulation%fluid_scheme%source_term%add(forward_brinkman)
369 call adjoint_brinkman%init_from_components( &
373 this%brinkman_amplitude, &
379 call simulation%adjoint_case%scheme%source_term%add(adjoint_brinkman)
422 type(vector_t),
intent(inout) :: x
426 call copy(this%design_indicator%x, x%x, n)
427 if (neko_bcknd_device .eq. 1)
then
428 call device_copy(this%design_indicator%x_d, x%x_d, n)
431 call this%map_forward()
433 call copy(x%x, this%design_indicator%x, n)
434 if (neko_bcknd_device .eq. 1)
then
435 call device_copy(x%x_d, this%design_indicator%x_d, n)
442 type(vector_t),
intent(in) :: sensitivity
443 type(field_t),
pointer :: df_dchi
444 type(field_t),
pointer :: dF_dfiltered_design
445 integer :: temp_indices(2)
449 call neko_scratch_registry%request_field(df_dchi, temp_indices(1))
456 call neko_scratch_registry%request_field(df_dfiltered_design, &
459 call this%mapping%apply_backward(df_dfiltered_design, df_dchi, &
460 this%filtered_design)
462 call this%filter%apply_backward(this%sensitivity, df_dfiltered_design, &
463 this%filtered_design)
475 if (this%if_mask)
then
476 call mask_exterior_const(this%sensitivity, this%optimization_domain, &
480 call neko_scratch_registry%relinquish_field(temp_indices)