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
152 call this%compute_residual(tstep, dt, time%dtlag)
153 call this%compute_viscosity(tstep)
159 integer,
intent(in) :: tstep
160 real(kind=
rp),
intent(in) :: dt
161 real(kind=
rp),
intent(in) :: dt_lag(10)
163 type(
field_t),
pointer :: us_field, vs_field, ws_field, div_field
164 integer :: temp_indices(4)
165 real(kind=
rp) :: bdf_coeffs(4)
167 real(kind=
rp) :: dt_local(10)
169 if (tstep .le. 3)
then
179 call bdf_scheme%compute_coeffs(bdf_coeffs, dt_local, 3)
183 this%entropy_residual%x_d, &
184 this%S%x_d, this%S_lag%lf(1)%x_d, &
185 this%S_lag%lf(2)%x_d, this%S_lag%lf(3)%x_d, &
189 this%entropy_residual%x, &
190 this%S%x, this%S_lag%lf(1)%x, &
191 this%S_lag%lf(2)%x, this%S_lag%lf(3)%x, &
201 call device_col3(us_field%x_d, this%u%x_d, this%S%x_d, n)
202 call device_col3(vs_field%x_d, this%v%x_d, this%S%x_d, n)
203 call device_col3(ws_field%x_d, this%w%x_d, this%S%x_d, n)
206 us_field%x(i,1,1,1) = this%u%x(i,1,1,1) * this%S%x(i,1,1,1)
207 vs_field%x(i,1,1,1) = this%v%x(i,1,1,1) * this%S%x(i,1,1,1)
208 ws_field%x(i,1,1,1) = this%w%x(i,1,1,1) * this%S%x(i,1,1,1)
212 call div(div_field%x, us_field%x, vs_field%x, ws_field%x, this%coef)
215 call device_memcpy(this%entropy_residual%x, this%entropy_residual%x_d, &
222 this%entropy_residual%x(i,1,1,1) = abs(this%entropy_residual%x(i,1,1,1) &
223 + div_field%x(i,1,1,1))
227 call device_memcpy(this%entropy_residual%x, this%entropy_residual%x_d, &
237 integer,
intent(in) :: tstep
238 integer :: i, n, temp_indices(1)
239 real(kind=
rp) :: s_mean, n_s
240 type(
field_t),
pointer :: temp_field
244 if (tstep .le. 3)
then
262 call absval(temp_field%x, n)
266 n_s =
glmax(temp_field%x, n)
270 if (n_s < 1.0e-12_rp)
then
277 this%reg_coeff%x_d, this%entropy_residual%x_d, &
278 this%h%x_d, this%c_avisc_entropy, n_s, n)
281 this%reg_coeff%x, this%entropy_residual%x, &
282 this%h%x, this%c_avisc_entropy, n_s, n)
288 this%reg_coeff%x_d, this%h%x_d, this%max_wave_speed%x_d, &
292 this%reg_coeff%x, this%h%x, this%max_wave_speed%x, &
296 call this%apply_element_max()
298 call this%smooth_viscosity()
307 type(
field_t),
pointer :: temp_field, mult_field
308 integer :: temp_indices(2)
315 call field_copy(temp_field, this%reg_coeff, n)
323 this%reg_coeff%x_d, temp_field%x_d, mult_field%x_d, n)
326 this%reg_coeff%x, temp_field%x, mult_field%x, n)
341 this%reg_coeff%x_d, lx, this%msh%nelv)
344 this%reg_coeff%x, lx, this%msh%nelv)
352 type(
field_t),
target,
intent(inout) :: s
353 type(
field_t),
target,
intent(in) :: u, v, w, h, max_wave_speed
354 type(
mesh_t),
target,
intent(in) :: msh
355 type(
space_t),
target,
intent(in) :: xh
356 type(
gs_t),
target,
intent(in) :: gs
363 this%max_wave_speed => max_wave_speed
368 call this%S_lag%init(s, 3)
375 call this%S_lag%update()
382 integer,
intent(in) :: i
383 real(kind=
rp) :: visc
385 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...
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_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.
subroutine, public div(res, ux, uy, uz, coef)
Compute the divergence of a vector field.
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.