140 ulag, vlag, wlag, time_scheme, rho)
142 type(
mesh_t),
target,
intent(inout) :: msh
143 type(
coef_t),
target,
intent(inout) :: coef
144 type(
gs_t),
target,
intent(inout) :: gs
145 type(json_file),
target,
intent(inout) :: params
146 type(
user_t),
target,
intent(in) :: user
149 real(kind=
rp),
intent(in) :: rho
151 character(len=15),
parameter :: scheme =
'Modular (Pn/Pn)'
156 call this%scheme_init(msh, coef, gs, params, scheme, user, rho)
159 call ax_helm_factory(this%ax, full_formulation = .false.)
162 call scalar_residual_factory(this%res)
165 call rhs_maker_ext_fctry(this%makeext)
168 call rhs_maker_bdf_fctry(this%makebdf)
171 call rhs_maker_oifs_fctry(this%makeoifs)
174 associate(xh_lx => this%Xh%lx, xh_ly => this%Xh%ly, xh_lz => this%Xh%lz, &
175 dm_xh => this%dm_Xh, nelv => this%msh%nelv)
177 call this%s_res%init(dm_xh,
"s_res")
179 call this%abx1%init(dm_xh,
"abx1")
181 call this%abx2%init(dm_xh,
"abx2")
183 call this%advs%init(dm_xh,
"advs")
185 call this%ds%init(dm_xh,
'ds')
191 call this%bc_res%init_base(this%c_Xh)
192 do i = 1, this%n_dir_bcs
193 call this%bc_res%mark_facets(this%dir_bcs(i)%marked_facet)
197 if (this%user_bc%msk(0) .gt. 0)
then
198 call this%bc_res%mark_facets(this%user_bc%marked_facet)
201 call this%bc_res%mark_zones_from_list(msh%labeled_zones,
'd_s', &
203 call this%bc_res%finalize()
204 call this%bc_res%set_g(0.0_rp)
211 call this%proj_s%init(this%dm_Xh%size(), this%projection_dim, &
212 this%projection_activ_step)
222 call advection_factory(this%adv, params, this%c_Xh, &
223 ulag, vlag, wlag, this%chkp%dtlag, &
230 real(kind=rp) :: dtlag(10), tlag(10)
234 n = this%s%dof%size()
236 call col2(this%s%x, this%c_Xh%mult, n)
237 call col2(this%slag%lf(1)%x, this%c_Xh%mult, n)
238 call col2(this%slag%lf(2)%x, this%c_Xh%mult, n)
239 if (neko_bcknd_device .eq. 1)
then
240 call device_memcpy(this%s%x, this%s%x_d, &
241 n, host_to_device, sync = .false.)
242 call device_memcpy(this%slag%lf(1)%x, this%slag%lf(1)%x_d, &
243 n, host_to_device, sync = .false.)
244 call device_memcpy(this%slag%lf(2)%x, this%slag%lf(2)%x_d, &
245 n, host_to_device, sync = .false.)
246 call device_memcpy(this%abx1%x, this%abx1%x_d, &
247 n, host_to_device, sync = .false.)
248 call device_memcpy(this%abx2%x, this%abx2%x_d, &
249 n, host_to_device, sync = .false.)
250 call device_memcpy(this%advs%x, this%advs%x_d, &
251 n, host_to_device, sync = .false.)
254 call this%gs_Xh%op(this%s, gs_op_add)
255 call this%gs_Xh%op(this%slag%lf(1), gs_op_add)
256 call this%gs_Xh%op(this%slag%lf(2), gs_op_add)
302 real(kind=rp),
intent(inout) :: t
303 integer,
intent(inout) :: tstep
304 real(kind=rp),
intent(in) :: dt
305 type(time_scheme_controller_t),
intent(inout) :: ext_bdf
306 type(time_step_controller_t),
intent(in) :: dt_controller
310 type(ksp_monitor_t) :: ksp_results(1)
311 character(len=LOG_SIZE) :: log_buf
313 n = this%dm_Xh%size()
315 call profiler_start_region(
'Scalar', 2)
316 associate(u => this%u, v => this%v, w => this%w, s => this%s, &
317 cp => this%cp, rho => this%rho, &
319 s_res => this%s_res, &
320 ax => this%Ax, f_xh => this%f_Xh, xh => this%Xh, &
321 c_xh => this%c_Xh, dm_xh => this%dm_Xh, gs_xh => this%gs_Xh, &
322 slag => this%slag, oifs => this%oifs, &
323 lambda_field => this%lambda_field, &
324 projection_dim => this%projection_dim, &
325 msh => this%msh, res => this%res, makeoifs => this%makeoifs, &
326 makeext => this%makeext, makebdf => this%makebdf, &
327 if_variable_dt => dt_controller%if_variable_dt, &
328 dt_last_change => dt_controller%dt_last_change)
330 if (neko_log%level_ .ge. neko_log_debug)
then
331 write(log_buf,
'(A,A,E15.7,A,E15.7,A,E15.7)')
'Scalar debug', &
332 ' l2norm s', glsc2(this%s%x, this%s%x, n), &
333 ' slag1', glsc2(this%slag%lf(1)%x, this%slag%lf(1)%x, n), &
334 ' slag2', glsc2(this%slag%lf(2)%x, this%slag%lf(2)%x, n)
335 call neko_log%message(log_buf)
336 write(log_buf,
'(A,A,E15.7,A,E15.7)')
'Scalar debug2', &
337 ' l2norm abx1', glsc2(this%abx1%x, this%abx1%x, n), &
338 ' abx2', glsc2(this%abx2%x, this%abx2%x, n)
339 call neko_log%message(log_buf)
343 call this%source_term%compute(t, tstep)
346 if (this%if_gradient_jump_penalty .eqv. .true.)
then
347 call this%gradient_jump_penalty%compute(u, v, w, s)
348 call this%gradient_jump_penalty%perform(f_xh)
352 call bc_list_apply_scalar(this%bclst_neumann, this%f_Xh%x, dm_xh%size())
356 call this%adv%compute_scalar(u, v, w, s, this%advs, &
357 xh, this%c_Xh, dm_xh%size())
359 call makeext%compute_scalar(this%abx1, this%abx2, f_xh%x, rho, &
360 ext_bdf%advection_coeffs, n)
362 call makeoifs%compute_scalar(this%advs%x, f_xh%x, rho, dt, n)
365 call this%adv%compute_scalar(u, v, w, s, f_xh, &
366 xh, this%c_Xh, dm_xh%size())
372 call makeext%compute_scalar(this%abx1, this%abx2, f_xh%x, rho, &
373 ext_bdf%advection_coeffs, n)
376 call makebdf%compute_scalar(slag, f_xh%x, s, c_xh%B, rho, dt, &
377 ext_bdf%diffusion_coeffs, ext_bdf%ndiff, n)
385 call this%field_dir_bc%update(this%field_dir_bc%field_list, &
386 this%field_dirichlet_bcs, this%c_Xh, t, tstep,
"scalar")
387 call bc_list_apply_scalar(this%bclst_dirichlet, &
388 this%s%x, this%dm_Xh%size())
392 call this%update_material_properties()
395 call profiler_start_region(
'Scalar_residual', 20)
396 call res%compute(ax, s, s_res, f_xh, c_xh, msh, xh, lambda_field, &
397 rho*cp, ext_bdf%diffusion_coeffs(1), dt, dm_xh%size())
399 call gs_xh%op(s_res, gs_op_add)
402 call bc_list_apply_scalar(this%bclst_ds, s_res%x, dm_xh%size())
404 call profiler_end_region(
'Scalar_residual', 20)
406 call this%proj_s%pre_solving(s_res%x, tstep, c_xh, n, dt_controller)
408 call this%pc%update()
409 call profiler_start_region(
'Scalar_solve', 21)
410 ksp_results(1) = this%ksp%solve(ax, ds, s_res%x, n, &
411 c_xh, this%bclst_ds, gs_xh)
412 call profiler_end_region(
'Scalar_solve', 21)
414 call this%proj_s%post_solving(ds%x, ax, c_xh, &
415 this%bclst_ds, gs_xh, n, tstep, dt_controller)
418 if (neko_bcknd_device .eq. 1)
then
419 call device_add2s2(s%x_d, ds%x_d, 1.0_rp, n)
421 call add2s2(s%x, ds%x, 1.0_rp, n)
424 call scalar_step_info(tstep, t, dt, ksp_results)
427 call profiler_end_region(
'Scalar', 2)