36 use json_module,
only: json_file
37 use json_utils,
only: json_get
38 use num_types,
only: rp
39 use point_zone,
only: point_zone_t
41 use vector,
only: vector_t
42 use utils,
only: neko_error
43 use vector_math,
only: vector_add2s1
60 real(kind=rp) ::
value
62 type(vector_t) :: sensitivity
64 character(len=25) :: name
68 class(point_zone_t),
pointer :: mask => null()
75 generic :: init => init_json, init_json_sim
78 procedure, pass(this) :: init_json => functional_init_json
80 procedure, pass(this) :: init_json_sim => functional_init_json_sim
85 procedure(functional_update_value), pass(this),
deferred :: update_value
87 procedure(functional_update_sensitivity), pass(this),
deferred :: &
91 procedure, pass(this) :: get_value => functional_get_value
93 procedure, pass(this) :: get_sensitivity => functional_get_sensitivity
95 procedure, pass(this) :: reset_value => functional_reset_value
97 procedure, pass(this) :: reset_sensitivity => functional_reset_sensitivity
99 procedure, pass(this) :: accumulate_value => functional_accumulate_value
101 procedure, pass(this) :: accumulate_sensitivity => &
102 functional_accumulate_sensitivity
115 class(base_functional_t),
intent(inout) :: this
119 subroutine functional_update_value(this, design)
121 class(base_functional_t),
intent(inout) :: this
122 class(design_t),
intent(in) :: design
123 end subroutine functional_update_value
126 subroutine functional_update_sensitivity(this, design)
128 class(base_functional_t),
intent(inout) :: this
129 class(design_t),
intent(in) :: design
130 end subroutine functional_update_sensitivity
137 subroutine functional_init_json(this, json, design)
138 class(base_functional_t),
intent(inout) :: this
139 type(json_file),
intent(inout) :: json
140 class(design_t),
intent(in) :: design
141 character(len=:),
allocatable :: type
143 call json_get(json,
'type', type)
144 call neko_error(
"Functional type: '" //
type // &
145 "' does not support initialization without simulation")
146 end subroutine functional_init_json
149 subroutine functional_init_json_sim(this, json, design, simulation)
150 class(base_functional_t),
intent(inout) :: this
151 type(json_file),
intent(inout) :: json
152 class(design_t),
intent(in) :: design
153 type(simulation_t),
target,
intent(inout) :: simulation
154 character(len=:),
allocatable :: type
156 call json_get(json,
'type', type)
157 call neko_error(
"Functional type: '" //
type // &
158 "' does not support initialization with simulation")
159 end subroutine functional_init_json_sim
163 function functional_get_value(this)
result(v)
164 class(base_functional_t),
intent(in) :: this
168 end function functional_get_value
171 subroutine functional_get_sensitivity(this, sensitivity)
172 class(base_functional_t),
intent(in) :: this
173 type(vector_t),
intent(inout) :: sensitivity
175 sensitivity = this%sensitivity
176 end subroutine functional_get_sensitivity
179 subroutine functional_reset_value(this)
180 class(base_functional_t),
intent(inout) :: this
183 end subroutine functional_reset_value
186 subroutine functional_reset_sensitivity(this)
187 class(base_functional_t),
intent(inout) :: this
189 this%sensitivity = 0.0_rp
190 end subroutine functional_reset_sensitivity
193 subroutine functional_accumulate_value(this, design, dt)
194 class(base_functional_t),
intent(inout) :: this
195 class(design_t),
intent(in) :: design
196 real(kind=rp),
intent(in) :: dt
197 real(kind=rp) :: temp1, temp2
200 call this%update_value(
design)
204 this%value = temp1 + temp2 * dt
205 end subroutine functional_accumulate_value
208 subroutine functional_accumulate_sensitivity(this, design, dt)
209 class(base_functional_t),
intent(inout) :: this
210 class(design_t),
intent(in) :: design
211 real(kind=rp),
intent(in) :: dt
212 type(vector_t) :: temp
214 temp = this%sensitivity
215 call this%update_sensitivity(
design)
218 call vector_add2s1(this%sensitivity, temp, dt)
220 end subroutine functional_accumulate_sensitivity
Defines the abstract the base_functional_t type.
Implements the steady_problem_t type.
The base functional type.