36 use json_module,
only : json_file
69 real(kind=
rp) :: c_avisc_entropy
70 real(kind=
rp) :: c_avisc_low
78 type(
field_t),
pointer :: max_wave_speed => null()
79 type(
mesh_t),
pointer :: msh => null()
81 type(
gs_t),
pointer :: gs => null()
100 type(json_file),
intent(inout) :: json
101 type(
coef_t),
intent(in),
target :: coef
102 type(
dofmap_t),
intent(in),
target :: dof
103 type(
field_t),
intent(in),
target :: reg_coeff
105 call this%init_base(json, coef, dof, reg_coeff)
110 call this%entropy_residual%init(dof,
'entropy_residual')
117 nullify(this%max_wave_speed)
127 call this%free_base()
128 call this%entropy_residual%free()
129 call this%S_lag%free()
136 nullify(this%max_wave_speed)
146 integer,
intent(in) :: tstep
147 real(kind=
rp),
intent(in) :: dt
149 call this%compute_residual(tstep, dt, time%dtlag)
150 call this%compute_viscosity(tstep)
156 integer,
intent(in) :: tstep
157 real(kind=
rp),
intent(in) :: dt
158 real(kind=
rp),
intent(in) :: dt_lag(10)
160 type(
field_t),
pointer :: us_field, vs_field, ws_field, div_field
161 integer :: temp_indices(4)
162 real(kind=
rp) :: bdf_coeffs(4)
164 real(kind=
rp) :: dt_local(10)
166 if (tstep .le. 3)
then
176 call bdf_scheme%compute_coeffs(bdf_coeffs, dt_local, 3)
180 this%entropy_residual%x_d, &
181 this%S%x_d, this%S_lag%lf(1)%x_d, &
182 this%S_lag%lf(2)%x_d, this%S_lag%lf(3)%x_d, &
186 this%entropy_residual%x, &
187 this%S%x, this%S_lag%lf(1)%x, &
188 this%S_lag%lf(2)%x, this%S_lag%lf(3)%x, &
198 call device_col3(us_field%x_d, this%u%x_d, this%S%x_d, n)
199 call device_col3(vs_field%x_d, this%v%x_d, this%S%x_d, n)
200 call device_col3(ws_field%x_d, this%w%x_d, this%S%x_d, n)
203 ws_field%x, this%u%x, this%v%x, this%w%x, this%S%x, n)
206 call div(div_field%x, us_field%x, vs_field%x, ws_field%x, this%coef)
209 call device_memcpy(this%entropy_residual%x, this%entropy_residual%x_d, &
218 call device_memcpy(this%entropy_residual%x, this%entropy_residual%x_d, &
228 integer,
intent(in) :: tstep
229 integer :: n, temp_indices(1)
230 real(kind=
rp) :: s_mean, n_s
231 type(
field_t),
pointer :: temp_field
235 if (tstep .le. 3)
then
253 call absval(temp_field%x, n)
257 n_s =
glmax(temp_field%x, n)
261 if (n_s < 1.0e-12_rp)
then
268 this%reg_coeff%x_d, this%entropy_residual%x_d, &
269 this%h%x_d, this%c_avisc_entropy, n_s, n)
272 this%reg_coeff%x, this%entropy_residual%x, &
273 this%h%x, this%c_avisc_entropy, n_s, n)
279 this%reg_coeff%x_d, this%h%x_d, this%max_wave_speed%x_d, &
283 this%reg_coeff%x, this%h%x, this%max_wave_speed%x, &
287 call this%apply_element_max()
289 call this%smooth_viscosity()
298 type(
field_t),
pointer :: temp_field, mult_field
299 integer :: temp_indices(2)
306 call field_copy(temp_field, this%reg_coeff, n)
314 this%reg_coeff%x_d, temp_field%x_d, mult_field%x_d, n)
317 this%reg_coeff%x, temp_field%x, mult_field%x, n)
332 this%reg_coeff%x_d, lx, this%msh%nelv)
335 this%reg_coeff%x, lx, this%msh%nelv)
343 type(
field_t),
target,
intent(inout) :: s
344 type(
field_t),
target,
intent(in) :: u, v, w, h, max_wave_speed
345 type(
mesh_t),
target,
intent(in) :: msh
346 type(
space_t),
target,
intent(in) :: xh
347 type(
gs_t),
target,
intent(in) :: gs
354 this%max_wave_speed => max_wave_speed
359 call this%S_lag%init(s, 3)
366 call this%S_lag%update()
371 integer,
intent(in) :: n
372 real(kind=
rp),
intent(out) :: us(n), vs(n), ws(n)
373 real(kind=
rp),
intent(in) :: u(n), v(n), w(n), s(n)
389 integer,
intent(in) :: n
390 real(kind=
rp),
intent(inout) :: entropy_residual(n)
391 real(kind=
rp),
intent(in) :: div_field(n)
399 entropy_residual(i) = abs(entropy_residual(i) + div_field(i))
407 integer,
intent(in) :: i
408 real(kind=
rp) :: visc
410 visc = this%c_avisc_low * this%h%x(i,1,1,1) * this%max_wave_speed%x(i,1,1,1)
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...
Compute the divergence of a vector field.
Backward-differencing scheme for time integration.
real(kind=rp) function, public device_glsum(a_d, n, strm)
Sum a vector of length n.
subroutine, public device_absval(a_d, n, strm)
subroutine, public device_col3(a_d, b_d, c_d, n, strm)
Vector multiplication with 3 vectors .
Device abstraction, common interface for various accelerators.
integer, parameter, public host_to_device
integer, parameter, public device_to_host
Defines a mapping of the degrees of freedom.
CPU backend for entropy viscosity regularization.
subroutine, public entropy_viscosity_compute_viscosity_cpu(reg_coeff, entropy_residual, h, c_avisc_entropy, n_s, n)
Compute viscosity from entropy residual on CPU.
subroutine, public entropy_viscosity_compute_residual_cpu(entropy_residual, s, s_lag1, s_lag2, s_lag3, bdf_coeffs, dt, n)
Compute entropy residual on CPU.
subroutine, public entropy_viscosity_smooth_divide_cpu(reg_coeff, temp_field, mult_field, n)
Divide by multiplicity for smoothing on CPU.
subroutine, public entropy_viscosity_clamp_to_low_order_cpu(reg_coeff, h, max_wave_speed, c_avisc_low, n)
Clamp regularization coefficient to low-order viscosity on CPU.
subroutine, public entropy_viscosity_apply_element_max_cpu(reg_coeff, lx, nelv)
Apply element-wise maximum on CPU.
Device backend for entropy viscosity regularization.
subroutine, public entropy_viscosity_smooth_divide_device(reg_coeff_d, temp_field_d, mult_field_d, n)
Divide by multiplicity for smoothing on device.
subroutine, public entropy_viscosity_clamp_to_low_order_device(reg_coeff_d, h_d, max_wave_speed_d, c_avisc_low, n)
Clamp regularization coefficient to low-order viscosity on device.
subroutine, public entropy_viscosity_apply_element_max_device(reg_coeff_d, lx, nelv)
Apply element-wise maximum on device.
subroutine, public entropy_viscosity_compute_residual_device(entropy_residual_d, s_d, s_lag1_d, s_lag2_d, s_lag3_d, bdf_coeffs, dt, n)
Compute entropy residual on device.
subroutine, public entropy_viscosity_compute_viscosity_device(reg_coeff_d, entropy_residual_d, h_d, c_avisc_entropy, n_s, n)
Compute viscosity from entropy residual on device.
subroutine entropy_viscosity_apply_element_max(this)
subroutine entropy_viscosity_abs_add_cpu(entropy_residual, div_field, n)
subroutine entropy_viscosity_col3_vector_cpu(us, vs, ws, u, v, w, s, n)
subroutine entropy_viscosity_update_lag(this)
subroutine entropy_viscosity_smooth_viscosity(this)
Cross-element smoothing via gather-scatter averaging. Averages viscosity values at shared nodes betwe...
subroutine entropy_viscosity_compute_viscosity(this, tstep)
subroutine entropy_viscosity_compute_residual(this, tstep, dt, dt_lag)
subroutine entropy_viscosity_compute(this, time, tstep, dt)
subroutine entropy_viscosity_init(this, json, coef, dof, reg_coeff)
subroutine entropy_viscosity_free(this)
pure real(kind=rp) function entropy_viscosity_low_order(this, i)
Compute low-order viscosity at point i: c_avisc_low * h * max_wave_speed.
subroutine, public entropy_viscosity_set_fields(this, s, u, v, w, h, max_wave_speed, msh, xh, gs)
subroutine, public field_cadd(a, s, n)
Add a scalar to vector .
subroutine, public field_cfill(a, c, n)
Set all elements to a constant c .
real(kind=rp) function, public field_glsum(a, n)
subroutine, public field_copy(a, b, n)
Copy a vector .
Contains the field_serties_t type.
Defines Gather-scatter operations.
integer, parameter, public gs_op_add
Utilities for retrieving parameters from the case files.
subroutine, public absval(a, n)
Take the absolute value of an array.
real(kind=rp) function, public glmax(a, n)
Max of a vector of length n.
integer, parameter neko_bcknd_device
integer, parameter, public rp
Global precision used in computations.
Defines a registry for storing and requesting temporary objects This can be used when you have a func...
type(scratch_registry_t), target, public neko_scratch_registry
Global scratch registry.
Defines a function space.
Module with things related to the simulation time.
Implicit backward-differencing scheme for time integration.
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Stores a series (sequence) of fields, logically connected to a base field, and arranged according to ...
The function space for the SEM solution fields.
A struct that contains all info about the time, expand as needed.