56 type(case_t),
intent(inout) :: neko_case
59 character(len=:),
allocatable :: string_val
60 logical :: has_scalar, freezeflow
61 type(field_t),
pointer :: u, v, w, p, s
62 type(json_file) :: json_subdict
68 u => neko_case%fluid%u
69 v => neko_case%fluid%v
70 w => neko_case%fluid%w
71 p => neko_case%fluid%p
72 if (
allocated(neko_case%scalars))
then
73 s => neko_case%scalars%scalar_fields(1)%s
82 call neko_case%time%reset()
83 t = neko_case%time%start_time
84 do i = 1,
size(neko_case%time%tlag)
85 neko_case%time%tlag(i) = t - i*neko_case%time%dtlag(i)
89 call neko_case%output_controller%set_counter(neko_case%time)
92 call neko_case%fluid%restart(neko_case%chkp)
93 if (
allocated(neko_case%scalars))
then
94 call neko_case%scalars%restart(neko_case%chkp)
98 do i = 1,
size(neko_case%time%dtlag)
99 call neko_case%fluid%ext_bdf%set_coeffs(neko_case%time%dtlag)
103 call neko_simcomps%restart(neko_case%time)
109 call json_get(neko_case%params, &
110 'case.fluid.initial_condition.type', string_val)
111 call json_get(neko_case%params,
'case.fluid.initial_condition', &
114 if (trim(string_val) .ne.
'user')
then
115 call set_flow_ic(u, v, w, p, &
116 neko_case%fluid%c_Xh, neko_case%fluid%gs_Xh, &
117 string_val, json_subdict)
119 call set_flow_ic(u, v, w, p, &
120 neko_case%fluid%c_Xh, neko_case%fluid%gs_Xh, &
121 neko_case%user%initial_conditions, neko_case%fluid%name)
126 call field_rzero(neko_case%fluid%f_x)
127 call field_rzero(neko_case%fluid%f_y)
128 call field_rzero(neko_case%fluid%f_z)
129 call neko_case%fluid%ulag%set(neko_case%fluid%f_x)
130 call neko_case%fluid%vlag%set(neko_case%fluid%f_x)
131 call neko_case%fluid%wlag%set(neko_case%fluid%f_x)
137 call json_get_or_default(neko_case%params, &
138 'case.scalar.enabled', has_scalar, .false.)
142 if (
size(neko_case%scalars%scalar_fields) .gt. 1)
then
143 call neko_error(
'Multiple scalars not supported')
146 call neko_case%scalars%scalar_fields(1)%slag%set(neko_case%fluid%f_x)
147 call field_rzero(neko_case%scalars%scalar_fields(1)%f_Xh)
149 call json_get(neko_case%params, &
150 'case.scalar.initial_condition.type', string_val)
151 call json_get(neko_case%params, &
152 'case.scalar.initial_condition', json_subdict)
153 if (trim(string_val) .ne.
'user')
then
154 if (trim(neko_case%scalars%scalar_fields(1)%name) .eq. &
156 call set_scalar_ic(neko_case%scalars%scalar_fields(1)%s, &
157 neko_case%fluid%c_Xh, neko_case%fluid%gs_Xh, string_val, &
160 call set_scalar_ic(neko_case%scalars%scalar_fields(1)%s, &
161 neko_case%fluid%c_Xh, neko_case%fluid%gs_Xh, string_val, &
165 call set_scalar_ic(neko_case%scalars%scalar_fields(1)%name, &
166 neko_case%scalars%scalar_fields(1)%s, &
167 neko_case%scalars%scalar_fields(1)%c_Xh, &
168 neko_case%scalars%scalar_fields(1)%gs_Xh, &
169 neko_case%user%initial_conditions)
177 call json_get_or_default(neko_case%params, &
178 'case.fluid.freeze_flow', freezeflow, .false.)
180 neko_case%fluid%freeze = freezeflow
195 type(case_t),
intent(inout) :: neko_case
198 character(len=:),
allocatable :: string_val
199 logical :: has_scalar, freezeflow
200 type(field_t),
pointer :: u_adj, v_adj, w_adj, p_adj, s_adj
201 type(json_file) :: json_subdict
207 u_adj => adjoint_case%fluid_adj%u_adj
208 v_adj => adjoint_case%fluid_adj%v_adj
209 w_adj => adjoint_case%fluid_adj%w_adj
210 p_adj => adjoint_case%fluid_adj%p_adj
211 if (
allocated(adjoint_case%adjoint_scalars))
then
212 s_adj => adjoint_case%adjoint_scalars%adjoint_scalar_fields(1)%s_adj
221 call adjoint_case%time%reset()
222 t = adjoint_case%time%start_time
223 do i = 1,
size(adjoint_case%time%tlag)
224 adjoint_case%time%tlag(i) = t - i*adjoint_case%time%dtlag(i)
228 call adjoint_case%output_controller%set_counter(adjoint_case%time)
231 do i = 1,
size(adjoint_case%time%dtlag)
232 call adjoint_case%fluid_adj%ext_bdf%set_coeffs(adjoint_case%time%dtlag)
240 call json_get(neko_case%params, &
241 'case.adjoint_fluid.initial_condition.type', string_val)
242 call json_get(neko_case%params,
'case.adjoint_fluid.initial_condition', &
245 if (trim(string_val) .ne.
'user')
then
246 call set_flow_ic(u_adj, v_adj, w_adj, p_adj, &
247 adjoint_case%fluid_adj%c_Xh, adjoint_case%fluid_adj%gs_Xh, &
248 string_val, json_subdict)
250 call neko_error(
"adjoint user initial conditions not supported")
255 call field_rzero(adjoint_case%fluid_adj%f_adj_x)
256 call field_rzero(adjoint_case%fluid_adj%f_adj_y)
257 call field_rzero(adjoint_case%fluid_adj%f_adj_z)
258 call adjoint_case%fluid_adj%ulag%set(adjoint_case%fluid_adj%f_adj_x)
259 call adjoint_case%fluid_adj%vlag%set(adjoint_case%fluid_adj%f_adj_x)
260 call adjoint_case%fluid_adj%wlag%set(adjoint_case%fluid_adj%f_adj_x)
266 call json_get_or_default(neko_case%params,
'case.scalar.enabled', &
271 if (
size(adjoint_case%adjoint_scalars%adjoint_scalar_fields) .gt. 1)
then
272 call neko_error(
'Multiple adjoint scalars not supported')
275 call adjoint_case%adjoint_scalars%adjoint_scalar_fields(1)%s_adj_lag% &
276 set(adjoint_case%fluid_adj%f_adj_x)
278 adjoint_case%adjoint_scalars%adjoint_scalar_fields(1)%f_Xh)
280 call json_get(neko_case%params, &
281 'case.adjoint_scalar.initial_condition.type', string_val)
282 call json_get(neko_case%params, &
283 'case.adjoint_scalar.initial_condition', json_subdict)
284 if (trim(string_val) .ne.
'user')
then
285 if (trim(neko_case%scalars%scalar_fields(1)%name) .eq. &
287 call set_scalar_ic( &
288 adjoint_case%adjoint_scalars%adjoint_scalar_fields(1)%s_adj, &
289 adjoint_case%fluid_adj%c_Xh, adjoint_case%fluid_adj%gs_Xh, &
290 string_val, json_subdict, 0)
292 call set_scalar_ic( &
293 adjoint_case%adjoint_scalars%adjoint_scalar_fields(1)%s_adj, &
294 adjoint_case%fluid_adj%c_Xh, adjoint_case%fluid_adj%gs_Xh, &
295 string_val, json_subdict, 1)
298 call neko_error(
"adjoint scalar user IC not supported")
306 call json_get_or_default(neko_case%params, &
307 'case.adjoint_fluid.freeze_flow', freezeflow, .false.)
309 adjoint_case%fluid_adj%freeze = freezeflow
370 adjoint_scalars, primal_name)
371 integer,
intent(out) :: i_primal
372 integer,
intent(out) :: i_adjoint
373 type(scalars_t),
intent(inout) :: scalars
375 character(len=*),
intent(in) :: primal_name
376 integer :: i, n_primal_scalars, n_adjoint_scalars
381 n_primal_scalars =
size(scalars%scalar_fields)
383 if ((n_adjoint_scalars .eq. 1) .and. (n_primal_scalars .eq. 1))
then
389 do i = 1, n_adjoint_scalars
391 .eq. primal_name)
then
397 do i = 1, n_primal_scalars
398 if (scalars%scalar_fields(i)%name .eq. primal_name)
then
404 if (i_primal .le. 0 .or. i_adjoint .le. 0)
then
405 call neko_error(
'could not find matching primal and adjoint' // &