58 type(case_t),
intent(inout) :: neko_case
61 character(len=:),
allocatable :: string_val
62 logical :: has_scalar, freezeflow
63 type(field_t),
pointer :: u, v, w, p, s
64 type(json_file) :: json_subdict
70 u => neko_case%fluid%u
71 v => neko_case%fluid%v
72 w => neko_case%fluid%w
73 p => neko_case%fluid%p
74 if (
allocated(neko_case%scalars))
then
75 s => neko_case%scalars%scalar_fields(1)%s
84 call neko_case%time%reset()
85 t = neko_case%time%start_time
86 do i = 1,
size(neko_case%time%tlag)
87 neko_case%time%tlag(i) = t - i*neko_case%time%dtlag(i)
91 call neko_case%output_controller%set_counter(neko_case%time)
94 call neko_case%fluid%restart(neko_case%chkp)
95 if (
allocated(neko_case%scalars))
then
96 call neko_case%scalars%restart(neko_case%chkp)
100 do i = 1,
size(neko_case%time%dtlag)
101 call neko_case%fluid%ext_bdf%set_coeffs(neko_case%time%dtlag)
105 call neko_simcomps%restart(neko_case%time)
111 call json_get(neko_case%params, &
112 'case.fluid.initial_condition.type', string_val)
113 call json_get(neko_case%params,
'case.fluid.initial_condition', &
116 if (trim(string_val) .ne.
'user')
then
117 call set_flow_ic(u, v, w, p, &
118 neko_case%fluid%c_Xh, neko_case%fluid%gs_Xh, &
119 string_val, json_subdict)
121 call set_flow_ic(u, v, w, p, &
122 neko_case%fluid%c_Xh, neko_case%fluid%gs_Xh, &
123 neko_case%user%initial_conditions, neko_case%fluid%name)
127 call neko_case%fluid%ulag%set(u)
128 call neko_case%fluid%vlag%set(v)
129 call neko_case%fluid%wlag%set(w)
131 select type (f => neko_case%fluid)
132 type is (fluid_pnpn_t)
133 call field_rzero(f%abx1)
134 call field_rzero(f%aby1)
135 call field_rzero(f%abz1)
136 call field_rzero(f%abx2)
137 call field_rzero(f%aby2)
138 call field_rzero(f%abz2)
139 call field_copy(f%u_e, u)
140 call field_copy(f%v_e, v)
141 call field_copy(f%w_e, w)
143 call field_rzero(neko_case%fluid%f_x)
144 call field_rzero(neko_case%fluid%f_y)
145 call field_rzero(neko_case%fluid%f_z)
151 call json_get_or_default(neko_case%params, &
152 'case.scalar.enabled', has_scalar, .false.)
156 if (
size(neko_case%scalars%scalar_fields) .gt. 1)
then
157 call neko_error(
'Multiple scalars not supported')
160 call field_rzero(neko_case%scalars%scalar_fields(1)%f_Xh)
162 call json_get(neko_case%params, &
163 'case.scalar.initial_condition.type', string_val)
164 call json_get(neko_case%params, &
165 'case.scalar.initial_condition', json_subdict)
166 if (trim(string_val) .ne.
'user')
then
167 if (trim(neko_case%scalars%scalar_fields(1)%name) .eq. &
169 call set_scalar_ic(neko_case%scalars%scalar_fields(1)%s, &
170 neko_case%fluid%c_Xh, neko_case%fluid%gs_Xh, string_val, &
173 call set_scalar_ic(neko_case%scalars%scalar_fields(1)%s, &
174 neko_case%fluid%c_Xh, neko_case%fluid%gs_Xh, string_val, &
178 call set_scalar_ic(neko_case%scalars%scalar_fields(1)%name, &
179 neko_case%scalars%scalar_fields(1)%s, &
180 neko_case%scalars%scalar_fields(1)%c_Xh, &
181 neko_case%scalars%scalar_fields(1)%gs_Xh, &
182 neko_case%user%initial_conditions)
185 call neko_case%scalars%scalar_fields(1)%slag%set(&
186 neko_case%scalars%scalar_fields(1)%s)
193 call json_get_or_default(neko_case%params, &
194 'case.fluid.freeze_flow', freezeflow, .false.)
196 neko_case%fluid%freeze = freezeflow
211 type(case_t),
intent(inout) :: neko_case
214 character(len=:),
allocatable :: string_val
215 logical :: has_scalar, freezeflow
216 type(field_t),
pointer :: u_adj, v_adj, w_adj, p_adj, s_adj
217 type(json_file) :: json_subdict
223 u_adj => adjoint_case%fluid_adj%u_adj
224 v_adj => adjoint_case%fluid_adj%v_adj
225 w_adj => adjoint_case%fluid_adj%w_adj
226 p_adj => adjoint_case%fluid_adj%p_adj
227 if (
allocated(adjoint_case%adjoint_scalars))
then
228 s_adj => adjoint_case%adjoint_scalars%adjoint_scalar_fields(1)%s_adj
237 call adjoint_case%time%reset()
238 t = adjoint_case%time%start_time
239 do i = 1,
size(adjoint_case%time%tlag)
240 adjoint_case%time%tlag(i) = t - i*adjoint_case%time%dtlag(i)
244 call adjoint_case%output_controller%set_counter(adjoint_case%time)
247 do i = 1,
size(adjoint_case%time%dtlag)
248 call adjoint_case%fluid_adj%ext_bdf%set_coeffs(adjoint_case%time%dtlag)
256 call json_get(neko_case%params, &
257 'case.adjoint_fluid.initial_condition.type', string_val)
258 call json_get(neko_case%params,
'case.adjoint_fluid.initial_condition', &
261 if (trim(string_val) .ne.
'user')
then
262 call set_flow_ic(u_adj, v_adj, w_adj, p_adj, &
263 adjoint_case%fluid_adj%c_Xh, adjoint_case%fluid_adj%gs_Xh, &
264 string_val, json_subdict)
266 call neko_error(
"adjoint user initial conditions not supported")
270 call adjoint_case%fluid_adj%ulag%set(u_adj)
271 call adjoint_case%fluid_adj%vlag%set(v_adj)
272 call adjoint_case%fluid_adj%wlag%set(w_adj)
274 select type (f => adjoint_case%fluid_adj)
276 call field_rzero(f%abx1)
277 call field_rzero(f%aby1)
278 call field_rzero(f%abz1)
279 call field_rzero(f%abx2)
280 call field_rzero(f%aby2)
281 call field_rzero(f%abz2)
285 call field_rzero(adjoint_case%fluid_adj%f_adj_x)
286 call field_rzero(adjoint_case%fluid_adj%f_adj_y)
287 call field_rzero(adjoint_case%fluid_adj%f_adj_z)
293 call json_get_or_default(neko_case%params,
'case.scalar.enabled', &
298 if (
size(adjoint_case%adjoint_scalars%adjoint_scalar_fields) .gt. 1)
then
299 call neko_error(
'Multiple adjoint scalars not supported')
303 adjoint_case%adjoint_scalars%adjoint_scalar_fields(1)%f_Xh)
305 call json_get(neko_case%params, &
306 'case.adjoint_scalar.initial_condition.type', string_val)
307 call json_get(neko_case%params, &
308 'case.adjoint_scalar.initial_condition', json_subdict)
309 if (trim(string_val) .ne.
'user')
then
310 if (trim(neko_case%scalars%scalar_fields(1)%name) .eq. &
312 call set_scalar_ic( &
313 adjoint_case%adjoint_scalars%adjoint_scalar_fields(1)%s_adj, &
314 adjoint_case%fluid_adj%c_Xh, adjoint_case%fluid_adj%gs_Xh, &
315 string_val, json_subdict, 0)
317 call set_scalar_ic( &
318 adjoint_case%adjoint_scalars%adjoint_scalar_fields(1)%s_adj, &
319 adjoint_case%fluid_adj%c_Xh, adjoint_case%fluid_adj%gs_Xh, &
320 string_val, json_subdict, 1)
323 call neko_error(
"adjoint scalar user IC not supported")
326 call adjoint_case%adjoint_scalars%adjoint_scalar_fields(1)%s_adj_lag% &
327 set(adjoint_case%adjoint_scalars%adjoint_scalar_fields(1)%s_adj)
334 call json_get_or_default(neko_case%params, &
335 'case.adjoint_fluid.freeze_flow', freezeflow, .false.)
337 adjoint_case%fluid_adj%freeze = freezeflow
398 adjoint_scalars, primal_name)
399 integer,
intent(out) :: i_primal
400 integer,
intent(out) :: i_adjoint
401 type(scalars_t),
intent(inout) :: scalars
403 character(len=*),
intent(in) :: primal_name
404 integer :: i, n_primal_scalars, n_adjoint_scalars
409 n_primal_scalars =
size(scalars%scalar_fields)
411 if ((n_adjoint_scalars .eq. 1) .and. (n_primal_scalars .eq. 1))
then
417 do i = 1, n_adjoint_scalars
419 .eq. primal_name)
then
425 do i = 1, n_primal_scalars
426 if (scalars%scalar_fields(i)%name .eq. primal_name)
then
432 if (i_primal .le. 0 .or. i_adjoint .le. 0)
then
433 call neko_error(
'could not find matching primal and adjoint' // &