40 use num_types,
only: rp
41 use field_list,
only: field_list_t
42 use json_module,
only: json_file
43 use json_utils,
only: json_get, json_get_or_default
44 use source_term,
only: source_term_t
45 use coefs,
only: coef_t
46 use neko_config,
only: neko_bcknd_device
47 use utils,
only: neko_error
48 use field,
only: field_t
49 use field_math,
only: field_subcol3, field_add2, field_add2s2
50 use json_module,
only: json_file
52 use simcomp_executor,
only: neko_simcomps
53 use fluid_user_source_term,
only: fluid_user_source_term_t
54 use num_types,
only: rp
55 use field,
only: field_t
56 use field_registry,
only: neko_field_registry
57 use math,
only: rzero, copy, chsign
58 use device_math,
only: device_copy, device_cmult
59 use neko_config,
only: neko_bcknd_device
60 use operators,
only: curl
61 use scratch_registry,
only: neko_scratch_registry
63 use point_zone,
only: point_zone_t
69 type,
public,
extends(source_term_t) :: &
72 type(field_t),
pointer :: u => null()
74 type(field_t),
pointer :: v => null()
76 type(field_t),
pointer :: w => null()
78 real(kind=rp) :: obj_scale
80 class(point_zone_t),
pointer :: mask => null()
86 procedure, pass(this) :: init => &
87 adjoint_minimum_dissipation_source_term_init_from_json
89 procedure, pass(this) :: init_from_components => &
90 adjoint_minimum_dissipation_source_term_init_from_components
92 procedure, pass(this) :: free => &
93 adjoint_minimum_dissipation_source_term_free
95 procedure, pass(this) :: compute_ => &
96 adjoint_minimum_dissipation_source_term_compute
106 subroutine adjoint_minimum_dissipation_source_term_init_from_json(this, &
107 json, fields, coef, variable_name)
109 type(json_file),
intent(inout) :: json
110 type(field_list_t),
intent(in),
target :: fields
111 type(coef_t),
intent(in),
target :: coef
112 character(len=*),
intent(in) :: variable_name
118 end subroutine adjoint_minimum_dissipation_source_term_init_from_json
128 subroutine adjoint_minimum_dissipation_source_term_init_from_components(this,&
130 u, v, w, obj_scale, &
134 type(field_t),
pointer,
intent(in) :: f_x, f_y, f_z
135 type(field_list_t) :: fields
137 real(kind=rp) :: start_time
138 real(kind=rp) :: end_time
139 real(kind=rp) :: obj_scale
140 type(field_t),
intent(in),
target :: u, v, w
141 class(point_zone_t),
intent(in),
target :: mask
147 end_time = 100000000.0_rp
154 call fields%assign(1, f_x)
155 call fields%assign(2, f_y)
156 call fields%assign(3, f_z)
158 call this%init_base(fields, coef, start_time, end_time)
165 this%obj_scale = obj_scale
167 this%if_mask = if_mask
168 if (this%if_mask)
then
172 end subroutine adjoint_minimum_dissipation_source_term_init_from_components
175 subroutine adjoint_minimum_dissipation_source_term_free(this)
178 call this%free_base()
179 end subroutine adjoint_minimum_dissipation_source_term_free
185 subroutine adjoint_minimum_dissipation_source_term_compute(this, t, tstep)
187 real(kind=rp),
intent(in) :: t
188 integer,
intent(in) :: tstep
189 type(field_t),
pointer :: u, v, w
190 type(field_t),
pointer :: fu, fv, fw
194 type(field_t),
pointer :: wo1, wo2, wo3, wo4, wo5, wo6
195 type(field_t),
pointer :: t1 , t2
196 integer :: temp_indices(8)
200 fu => this%fields%get_by_index(1)
201 fv => this%fields%get_by_index(2)
202 fw => this%fields%get_by_index(3)
212 call neko_scratch_registry%request_field(wo1, temp_indices(1))
213 call neko_scratch_registry%request_field(wo2, temp_indices(2))
214 call neko_scratch_registry%request_field(wo3, temp_indices(3))
215 call neko_scratch_registry%request_field(wo4, temp_indices(4))
216 call neko_scratch_registry%request_field(wo5, temp_indices(5))
217 call neko_scratch_registry%request_field(wo6, temp_indices(6))
218 call neko_scratch_registry%request_field(t1 , temp_indices(7))
219 call neko_scratch_registry%request_field(t2 , temp_indices(8))
241 call curl(wo1, wo2, wo3, u, v, w, t1, t2, this%coef)
242 call curl(wo4, wo5, wo6, wo1, wo2, wo3, t1, t2, this%coef)
245 if (this%if_mask)
then
251 call field_add2s2(fu, wo4, this%obj_scale)
252 call field_add2s2(fv, wo5, this%obj_scale)
253 call field_add2s2(fw, wo6, this%obj_scale)
257 call neko_scratch_registry%relinquish_field(temp_indices)
259 end subroutine adjoint_minimum_dissipation_source_term_compute
Implements the adjoint_minimum_dissipation_source_term_t type.
Some common Masking operations we may need.
Implements the steady_simcomp_t type.
An adjoint source term for objectives of minimum dissipation.
The steady_simcomp_t type is a simulation component that terminates a simulation when the normed diff...