91 type(case_t),
intent(inout) :: neko_case
94 character(len=:),
allocatable :: string_val
95 logical :: has_scalar, freezeflow
96 type(field_t),
pointer :: u, v, w, p, s
97 type(json_file) :: json_subdict
103 u => neko_case%fluid%u
104 v => neko_case%fluid%v
105 w => neko_case%fluid%w
106 p => neko_case%fluid%p
107 if (
allocated(neko_case%scalars))
then
108 s => neko_case%scalars%scalar_fields(1)%s
117 call neko_case%time%reset()
118 t = neko_case%time%start_time
119 do i = 1,
size(neko_case%time%tlag)
120 neko_case%time%tlag(i) = t - i*neko_case%time%dtlag(i)
124 call neko_case%output_controller%set_counter(neko_case%time)
127 call neko_case%fluid%restart(neko_case%chkp)
128 if (
allocated(neko_case%scalars))
then
129 call neko_case%scalars%restart(neko_case%chkp)
133 do i = 1,
size(neko_case%time%dtlag)
134 call neko_case%fluid%ext_bdf%set_coeffs(neko_case%time%dtlag)
138 call neko_simcomps%restart(neko_case%time)
144 call json_get(neko_case%params, &
145 'case.fluid.initial_condition.type', string_val)
146 call json_get(neko_case%params,
'case.fluid.initial_condition', &
149 if (trim(string_val) .ne.
'user')
then
150 call set_flow_ic(u, v, w, p, &
151 neko_case%fluid%c_Xh, neko_case%fluid%gs_Xh, &
152 string_val, json_subdict)
154 call set_flow_ic(u, v, w, p, &
155 neko_case%fluid%c_Xh, neko_case%fluid%gs_Xh, &
156 neko_case%user%initial_conditions, neko_case%fluid%name)
160 call neko_case%fluid%ulag%set(u)
161 call neko_case%fluid%vlag%set(v)
162 call neko_case%fluid%wlag%set(w)
164 select type (f => neko_case%fluid)
165 type is (fluid_pnpn_t)
166 call field_rzero(f%abx1)
167 call field_rzero(f%aby1)
168 call field_rzero(f%abz1)
169 call field_rzero(f%abx2)
170 call field_rzero(f%aby2)
171 call field_rzero(f%abz2)
172 call field_copy(f%u_e, u)
173 call field_copy(f%v_e, v)
174 call field_copy(f%w_e, w)
176 call field_rzero(neko_case%fluid%f_x)
177 call field_rzero(neko_case%fluid%f_y)
178 call field_rzero(neko_case%fluid%f_z)
184 call json_get_or_default(neko_case%params, &
185 'case.scalar.enabled', has_scalar, .false.)
189 if (
size(neko_case%scalars%scalar_fields) .gt. 1)
then
190 call neko_error(
'Multiple scalars not supported')
193 call field_rzero(neko_case%scalars%scalar_fields(1)%f_Xh)
195 call json_get(neko_case%params, &
196 'case.scalar.initial_condition.type', string_val)
197 call json_get(neko_case%params, &
198 'case.scalar.initial_condition', json_subdict)
199 if (trim(string_val) .ne.
'user')
then
200 if (trim(neko_case%scalars%scalar_fields(1)%name) .eq. &
202 call set_scalar_ic(neko_case%scalars%scalar_fields(1)%s, &
203 neko_case%fluid%c_Xh, neko_case%fluid%gs_Xh, string_val, &
206 call set_scalar_ic(neko_case%scalars%scalar_fields(1)%s, &
207 neko_case%fluid%c_Xh, neko_case%fluid%gs_Xh, string_val, &
211 call set_scalar_ic(neko_case%scalars%scalar_fields(1)%name, &
212 neko_case%scalars%scalar_fields(1)%s, &
213 neko_case%scalars%scalar_fields(1)%c_Xh, &
214 neko_case%scalars%scalar_fields(1)%gs_Xh, &
215 neko_case%user%initial_conditions)
218 call neko_case%scalars%scalar_fields(1)%slag%set(&
219 neko_case%scalars%scalar_fields(1)%s)
226 call json_get_or_default(neko_case%params, &
227 'case.fluid.freeze_flow', freezeflow, .false.)
229 neko_case%fluid%freeze = freezeflow
244 type(case_t),
intent(inout) :: neko_case
247 character(len=:),
allocatable :: string_val
248 logical :: has_scalar, freezeflow
249 type(field_t),
pointer :: u_adj, v_adj, w_adj, p_adj, s_adj
250 type(json_file) :: json_subdict
256 u_adj => adjoint_case%fluid_adj%u_adj
257 v_adj => adjoint_case%fluid_adj%v_adj
258 w_adj => adjoint_case%fluid_adj%w_adj
259 p_adj => adjoint_case%fluid_adj%p_adj
260 if (
allocated(adjoint_case%adjoint_scalars))
then
261 s_adj => adjoint_case%adjoint_scalars%adjoint_scalar_fields(1)%s_adj
270 call adjoint_case%time%reset()
271 t = adjoint_case%time%start_time
272 do i = 1,
size(adjoint_case%time%tlag)
273 adjoint_case%time%tlag(i) = t - i*adjoint_case%time%dtlag(i)
277 call adjoint_case%output_controller%set_counter(adjoint_case%time)
280 do i = 1,
size(adjoint_case%time%dtlag)
281 call adjoint_case%fluid_adj%ext_bdf%set_coeffs(adjoint_case%time%dtlag)
289 call json_get(neko_case%params, &
290 'case.adjoint_fluid.initial_condition.type', string_val)
291 call json_get(neko_case%params,
'case.adjoint_fluid.initial_condition', &
294 if (trim(string_val) .ne.
'user')
then
295 call set_flow_ic(u_adj, v_adj, w_adj, p_adj, &
296 adjoint_case%fluid_adj%c_Xh, adjoint_case%fluid_adj%gs_Xh, &
297 string_val, json_subdict)
299 call neko_error(
"adjoint user initial conditions not supported")
303 call adjoint_case%fluid_adj%ulag%set(u_adj)
304 call adjoint_case%fluid_adj%vlag%set(v_adj)
305 call adjoint_case%fluid_adj%wlag%set(w_adj)
307 select type (f => adjoint_case%fluid_adj)
309 call field_rzero(f%abx1)
310 call field_rzero(f%aby1)
311 call field_rzero(f%abz1)
312 call field_rzero(f%abx2)
313 call field_rzero(f%aby2)
314 call field_rzero(f%abz2)
318 call field_rzero(adjoint_case%fluid_adj%f_adj_x)
319 call field_rzero(adjoint_case%fluid_adj%f_adj_y)
320 call field_rzero(adjoint_case%fluid_adj%f_adj_z)
326 call json_get_or_default(neko_case%params,
'case.scalar.enabled', &
331 if (
size(adjoint_case%adjoint_scalars%adjoint_scalar_fields) .gt. 1)
then
332 call neko_error(
'Multiple adjoint scalars not supported')
336 adjoint_case%adjoint_scalars%adjoint_scalar_fields(1)%f_Xh)
338 call json_get(neko_case%params, &
339 'case.adjoint_scalar.initial_condition.type', string_val)
340 call json_get(neko_case%params, &
341 'case.adjoint_scalar.initial_condition', json_subdict)
342 if (trim(string_val) .ne.
'user')
then
343 if (trim(neko_case%scalars%scalar_fields(1)%name) .eq. &
345 call set_scalar_ic( &
346 adjoint_case%adjoint_scalars%adjoint_scalar_fields(1)%s_adj, &
347 adjoint_case%fluid_adj%c_Xh, adjoint_case%fluid_adj%gs_Xh, &
348 string_val, json_subdict, 0)
350 call set_scalar_ic( &
351 adjoint_case%adjoint_scalars%adjoint_scalar_fields(1)%s_adj, &
352 adjoint_case%fluid_adj%c_Xh, adjoint_case%fluid_adj%gs_Xh, &
353 string_val, json_subdict, 1)
356 call neko_error(
"adjoint scalar user IC not supported")
359 call adjoint_case%adjoint_scalars%adjoint_scalar_fields(1)%s_adj_lag% &
360 set(adjoint_case%adjoint_scalars%adjoint_scalar_fields(1)%s_adj)
367 call json_get_or_default(neko_case%params, &
368 'case.adjoint_fluid.freeze_flow', freezeflow, .false.)
370 adjoint_case%fluid_adj%freeze = freezeflow
431 adjoint_scalars, primal_name)
432 integer,
intent(out) :: i_primal
433 integer,
intent(out) :: i_adjoint
434 type(scalars_t),
intent(inout) :: scalars
436 character(len=*),
intent(in) :: primal_name
437 integer :: i, n_primal_scalars, n_adjoint_scalars
442 n_primal_scalars =
size(scalars%scalar_fields)
444 if ((n_adjoint_scalars .eq. 1) .and. (n_primal_scalars .eq. 1))
then
450 do i = 1, n_adjoint_scalars
452 .eq. primal_name)
then
458 do i = 1, n_primal_scalars
459 if (scalars%scalar_fields(i)%name .eq. primal_name)
then
465 if (i_primal .le. 0 .or. i_adjoint .le. 0)
then
466 call neko_error(
'could not find matching primal and adjoint' // &