38 rhs_maker_ext_fctry, rhs_maker_bdf_fctry, rhs_maker_oifs_fctry
64 use json_module,
only : json_file
82 class(
ax_t),
allocatable :: ax
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)
264 call this%scheme_free()
266 call bc_list_free(this%bclst_ds)
267 call this%proj_s%free()
269 call this%s_res%free()
273 call this%abx1%free()
274 call this%abx2%free()
276 call this%advs%free()
278 if (
allocated(this%Ax))
then
282 if (
allocated(this%res))
then
286 if (
allocated(this%makeext))
then
287 deallocate(this%makeext)
290 if (
allocated(this%makebdf))
then
291 deallocate(this%makebdf)
294 if (
allocated(this%makeoifs))
then
295 deallocate(this%makeoifs)
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)
Copy data between host and device (or device and device)
Retrieves a parameter by name or assigns a provided default value. In the latter case also adds the m...
Retrieves a parameter by name or throws an error.
Subroutines to add advection terms to the RHS of a transport equation.
Defines a Matrix-vector product.
Defines a boundary condition.
subroutine, public bc_list_add(bclst, bc)
Add a condition to a list of boundary conditions.
subroutine, public bc_list_init(bclst, size)
Constructor for a list of boundary conditions.
subroutine, public bc_list_free(bclst)
Destructor for a list of boundary conditions.
subroutine, public bc_list_apply_scalar(bclst, x, n, t, tstep)
Apply a list of boundary conditions to a scalar field.
subroutine, public device_col2(a_d, b_d, n)
Vector multiplication .
subroutine, public device_add2s2(a_d, b_d, c1, n)
Vector addition with scalar multiplication (multiplication on first argument)
Device abstraction, common interface for various accelerators.
integer, parameter, public host_to_device
Defines a dirichlet boundary condition.
Dirichlet condition applied in the facet normal direction.
Utilities for retrieving parameters from the case files.
Implements the base abstract type for Krylov solvers plus helper types.
integer, parameter, public neko_log_debug
Debug log level.
type(log_t), public neko_log
Global log stream.
integer, parameter, public log_size
real(kind=rp) function, public glsc2(a, b, n)
Weighted inner product .
subroutine, public col2(a, b, n)
Vector multiplication .
subroutine, public add2s2(a, b, c1, n)
Vector addition with scalar multiplication (multiplication on second argument)
integer, parameter neko_bcknd_device
Defines a Neumann boundary condition.
integer, parameter, public rp
Global precision used in computations.
subroutine, public profiler_start_region(name, region_id)
Started a named (name) profiler region.
subroutine, public profiler_end_region(name, region_id)
End the most recently started profiler region.
Project x onto X, the space of old solutions and back again.
Routines to generate the right-hand sides for the convection-diffusion equation. Employs the EXT/BDF ...
Auxiliary routines for fluid solvers.
subroutine scalar_step_info(step, t, dt, ksp_results)
Prints for prs, velx, vely, velz the following: Number of iterations, start residual,...
Containts the scalar_pnpn_t type.
subroutine scalar_pnpn_init(this, msh, coef, gs, params, user, ulag, vlag, wlag, time_scheme, rho)
Constructor.
subroutine scalar_pnpn_step(this, t, tstep, dt, ext_bdf, dt_controller)
subroutine scalar_pnpn_restart(this, dtlag, tlag)
I envision the arguments to this func might need to be expanded.
subroutine scalar_pnpn_free(this)
Defines the residual for the scalar transport equation.
Contains the scalar_scheme_t type.
Defines a registry for storing and requesting temporary fields This can be used when you have a funct...
type(scratch_registry_t), target, public neko_scratch_registry
Global scratch registry.
Compound scheme for the advection and diffusion operators in a transport equation.
Base class for time integration schemes.
Implements type time_step_controller.
Interfaces for user interaction with NEKO.
Base abstract type for computing the advection operator.
Base type for a matrix-vector product providing .
A list of boundary conditions.
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Generic Dirichlet boundary condition on .
Dirichlet condition in facet normal direction.
Type for storing initial and final residuals in a Krylov solver.
A Neumann boundary condition for scalar fields. Sets the flux of the field to the chosen value.
Abstract type to add contributions to F from lagged BD terms.
Abstract type to sum up contributions to kth order extrapolation scheme.
Abstract type to add contributions of kth order OIFS scheme.
Abstract type to compute scalar residual.
Base type for a scalar advection-diffusion solver.
Implements the logic to compute the time coefficients for the advection and diffusion operators in a ...
Provides a tool to set time step dt.