Skip to content

adam_flume_fnl_mhd_glm_kernels ​

ADAM, FLUME FNL device kernels of the ideal MHD with GLM cleaning model.

The model-agnostic auxiliary-variables kernel (adam_flume_fnl_aux_kernels_agnostic.INC) and the MHD dt and conservation kernels (adam_flume_fnl_mhd_kernels_agnostic.INC) instantiated with NV_K = NV_MHD_GLM, NV_AUX_K = NV_AUX_MHD (issue #41, section 4). The face-flux kernel is the shared body with the MHD split (M2-P3). Same kernel rules as adam_flume_fnl_kernels (issue #35, D-11/D-12).

Source: src/app/flume/fnl/adam_flume_fnl_mhd_glm_kernels.F90

Dependencies

Contents ​

Subroutines ​

compute_face_fluxes_dev ​

Compute the WENO face fluxes of direction d: face (i,j,k) lies between cells (i,j,k) and (i+di,j+dj,k+dk), so the face array starts at index 0 along d.

Per face (device twin of the CPU compute_face_fluxes): gather the stencil m = 1-S ... S into constant-bound privates, project and split it, reconstruct every field (the private v is the packed stencil of the WENO primitive), back-project.

fortran
subroutine compute_face_fluxes_dev(d, di, dj, dk, ni, nj, nk, ngc, blocks_number, S, gamma, ch, is_characteristic, weno_a_gpu, weno_p_gpu, weno_d_gpu, weno_zeps, weno_sigma, q_gpu, q_aux_gpu, fl_gpu)

Arguments

NameTypeIntentAttributesDescription
dinteger(kind=I4P)inDirection, 1=x, 2=y, 3=z.
diinteger(kind=I4P)inUnit step along d.
djinteger(kind=I4P)inUnit step along d.
dkinteger(kind=I4P)inUnit step along d.
niinteger(kind=I4P)inGrid dimensions.
njinteger(kind=I4P)inGrid dimensions.
nkinteger(kind=I4P)inGrid dimensions.
ngcinteger(kind=I4P)inGrid dimensions.
blocks_numberinteger(kind=I4P)inActual blocks number.
Sinteger(kind=I4P)inWENO stencil half-width.
gammareal(kind=R8P)inSpecific heats ratio.
chreal(kind=R8P)inGLM cleaning speed (models with GLM only).
is_characteristiclogicalinCharacteristic (or conservative) variables.
weno_a_gpureal(kind=R8P)inWENO optimal weights.
weno_p_gpureal(kind=R8P)inWENO polynomials coefficients.
weno_d_gpureal(kind=R8P)inWENO smoothness indicators coefficients.
weno_zepsreal(kind=R8P)inWENO parameter avoiding division by zero.
weno_sigmareal(kind=R8P)inWENO descaler switch (0 Jiang-Shu, 1 SI).
q_gpureal(kind=R8P)inConservative variables.
q_aux_gpureal(kind=R8P)inAuxiliary variables.
fl_gpureal(kind=R8P)inoutFace fluxes of direction d.

Call graph

add_gravity_edge_correction_dev ​

Add the faces beyond the block to the gravity energy correction of direction d (issue #73, M7-G2a; device twin of the CPU add_gravity_edge_correction): cell 1 takes -g_d F^rho / 24 of face -1, cell n_d that of face n_d + 1, each face computed as compute_face_fluxes_dev does (the same body, its mass component kept).

fortran
subroutine add_gravity_edge_correction_dev(d, di, dj, dk, ni, nj, nk, ngc, blocks_number, S, gamma, ch, is_characteristic, weno_a_gpu, weno_p_gpu, weno_d_gpu, weno_zeps, weno_sigma, ir, gd, q_gpu, q_aux_gpu, gc_gpu)

Arguments

NameTypeIntentAttributesDescription
dinteger(kind=I4P)inDirection, 1=x, 2=y, 3=z.
diinteger(kind=I4P)inUnit step along d.
djinteger(kind=I4P)inUnit step along d.
dkinteger(kind=I4P)inUnit step along d.
niinteger(kind=I4P)inGrid dimensions.
njinteger(kind=I4P)inGrid dimensions.
nkinteger(kind=I4P)inGrid dimensions.
ngcinteger(kind=I4P)inGrid dimensions.
blocks_numberinteger(kind=I4P)inActual blocks number.
Sinteger(kind=I4P)inWENO stencil half-width.
gammareal(kind=R8P)inSpecific heats ratio.
chreal(kind=R8P)inGLM cleaning speed (models with GLM only).
is_characteristiclogicalinCharacteristic (or conservative) variables.
weno_a_gpureal(kind=R8P)inWENO optimal weights.
weno_p_gpureal(kind=R8P)inWENO polynomials coefficients.
weno_d_gpureal(kind=R8P)inWENO smoothness indicators coefficients.
weno_zepsreal(kind=R8P)inWENO parameter avoiding division by zero.
weno_sigmareal(kind=R8P)inWENO descaler switch (0 Jiang-Shu, 1 SI).
irinteger(kind=I4P)inIndex of the density (mass) variable.
gdreal(kind=R8P)inGravity along d.
q_gpureal(kind=R8P)inConservative variables.
q_aux_gpureal(kind=R8P)inAuxiliary variables.
gc_gpureal(kind=R8P)inoutGravity energy correction [..., 1].

Call graph

compute_q_aux_dev ​

Compute the auxiliary variables on every cell, ghost cells included.

fortran
subroutine compute_q_aux_dev(ni, nj, nk, ngc, blocks_number, gamma, R, q_gpu, q_aux_gpu)

Arguments

NameTypeIntentAttributesDescription
niinteger(kind=I4P)inGrid dimensions.
njinteger(kind=I4P)inGrid dimensions.
nkinteger(kind=I4P)inGrid dimensions.
ngcinteger(kind=I4P)inGrid dimensions.
blocks_numberinteger(kind=I4P)inActual blocks number.
gammareal(kind=R8P)inSpecific heats ratio.
Rreal(kind=R8P)inGas constant.
q_gpureal(kind=R8P)inConservative variables.
q_aux_gpureal(kind=R8P)inoutAuxiliary variables.

Call graph

count_nonfinite_dev ​

Count the non-finite (NaN or infinite) conservative values of the interior cells (issue #45): the exponent field has all its bits set. Tested on the bit pattern, so that no floating point mode (-fast) can fold the test away.

fortran
subroutine count_nonfinite_dev(ni, nj, nk, ngc, blocks_number, q_gpu, n)

Arguments

NameTypeIntentAttributesDescription
niinteger(kind=I4P)inGrid dimensions.
njinteger(kind=I4P)inGrid dimensions.
nkinteger(kind=I4P)inGrid dimensions.
ngcinteger(kind=I4P)inGrid dimensions.
blocks_numberinteger(kind=I4P)inActual blocks number.
q_gpureal(kind=R8P)inConservative variables.
ninteger(kind=I8P)outNon-finite values number.

Call graph

compute_conservation_dev ​

Compute the volume integrals of the conservative variables (interior cells), one reduction per variable. The cell volume includes the null directions (issue #37).

fortran
subroutine compute_conservation_dev(ni, nj, nk, ngc, blocks_number, dxyz_gpu, q_gpu, integrals)

Arguments

NameTypeIntentAttributesDescription
niinteger(kind=I4P)inGrid dimensions.
njinteger(kind=I4P)inGrid dimensions.
nkinteger(kind=I4P)inGrid dimensions.
ngcinteger(kind=I4P)inGrid dimensions.
blocks_numberinteger(kind=I4P)inActual blocks number.
dxyz_gpureal(kind=R8P)inBlocks space steps [nb, 3].
q_gpureal(kind=R8P)inConservative variables.
integralsreal(kind=R8P)outVolume integrals.

Call graph

compute_lambda_max_dev ​

Compute max(sum_d (|u_d| + c_{f,d}) / dx_d) over the interior cells (null directions excluded), c_{f,d} the fast magnetosonic speed along d (issue #41, section 3.5).

fortran
subroutine compute_lambda_max_dev(ni, nj, nk, ngc, blocks_number, gamma, R, dxyz_gpu, is_null, q_gpu, lambda_max)

Arguments

NameTypeIntentAttributesDescription
niinteger(kind=I4P)inGrid dimensions.
njinteger(kind=I4P)inGrid dimensions.
nkinteger(kind=I4P)inGrid dimensions.
ngcinteger(kind=I4P)inGrid dimensions.
blocks_numberinteger(kind=I4P)inActual blocks number.
gammareal(kind=R8P)inSpecific heats ratio.
Rreal(kind=R8P)inGas constant.
dxyz_gpureal(kind=R8P)inBlocks space steps [nb, 3].
is_nulllogicalinNull directions.
q_gpureal(kind=R8P)inConservative variables.
lambda_maxreal(kind=R8P)outMaximum of sum_d (|u_d| + c_{f,d}) / dx_d.

Call graph

compute_lambda_max_dissipative_dev ​

Device twin of the CPU MHD compute_lambda_max_dissipative (issue #65, D-M4-3).

fortran
subroutine compute_lambda_max_dissipative_dev(ni, nj, nk, ngc, blocks_number, gamma, R, cp, mu0, k0, eta, t_wall, tref, omega_mu, omega_k, dxyz_gpu, is_null, q_gpu, lambda_max, lambda_hyp, lambda_dif, re_cell_min)

Arguments

NameTypeIntentAttributesDescription
niinteger(kind=I4P)inGrid dimensions.
njinteger(kind=I4P)inGrid dimensions.
nkinteger(kind=I4P)inGrid dimensions.
ngcinteger(kind=I4P)inGrid dimensions.
blocks_numberinteger(kind=I4P)inActual blocks number.
gammareal(kind=R8P)inSpecific heats ratio, gas constant, cp.
Rreal(kind=R8P)inSpecific heats ratio, gas constant, cp.
cpreal(kind=R8P)inSpecific heats ratio, gas constant, cp.
mu0real(kind=R8P)inDissipative coefficients.
k0real(kind=R8P)inDissipative coefficients.
etareal(kind=R8P)inDissipative coefficients.
t_wallreal(kind=R8P)inHottest isothermal wall temperature, 0 if none.
trefreal(kind=R8P)inTemperature laws.
omega_mureal(kind=R8P)inTemperature laws.
omega_kreal(kind=R8P)inTemperature laws.
dxyz_gpureal(kind=R8P)inBlocks space steps [nb, 3].
is_nulllogicalinNull directions.
q_gpureal(kind=R8P)inConservative variables.
lambda_maxreal(kind=R8P)outMaximum of the sum.
lambda_hypreal(kind=R8P)outMaximum of the hyperbolic part.
lambda_difreal(kind=R8P)outMaximum of the diffusive part.
re_cell_minreal(kind=R8P)outMinimum cell Reynolds number.

Call graph

apply_floors_dev ​

Apply the MHD positivity floors to the interior cells of a stage state, before its ghost exchange (issue #41, section 3.8): a cell with rho < rho_floor or p < p_floor gets rho = max(rho, rho_floor) at fixed velocity and p = max(p, p_floor) (internal energy added; the model's cleaning_energy adapter adds psi^2 / 2 under EGLM, zero otherwise). Interior only: the exchange then carries the floored values to the ghost cells, and ghost cells that no map fills (never read by the stencils) are not inspected. Returns the floored cells, the cells with a non-positive density or pressure (counted before flooring) and the minimum density and pressure. Floors are not conservative: the caller logs the counters.

fortran
subroutine apply_floors_dev(ni, nj, nk, ngc, blocks_number, gamma, R, rho_floor, p_floor, q_gpu, floored, nonpositive, rho_min, p_min)

Arguments

NameTypeIntentAttributesDescription
niinteger(kind=I4P)inGrid dimensions.
njinteger(kind=I4P)inGrid dimensions.
nkinteger(kind=I4P)inGrid dimensions.
ngcinteger(kind=I4P)inGrid dimensions.
blocks_numberinteger(kind=I4P)inActual blocks number.
gammareal(kind=R8P)inSpecific heats ratio.
Rreal(kind=R8P)inGas constant.
rho_floorreal(kind=R8P)inDensity and pressure floors.
p_floorreal(kind=R8P)inDensity and pressure floors.
q_gpureal(kind=R8P)inoutConservative variables.
flooredinteger(kind=I4P)outFloored cells.
nonpositiveinteger(kind=I4P)outCells with non-positive density or pressure.
rho_minreal(kind=R8P)outMinimum density and pressure.
p_minreal(kind=R8P)outMinimum density and pressure.

Call graph

compute_speed_max_dev ​

Compute max(|u_d| + c_{f,d}) over the interior cells and the active directions, the fastest wave speed (the GLM c_h check, issue #41, section 3.5).

fortran
subroutine compute_speed_max_dev(ni, nj, nk, ngc, blocks_number, gamma, R, is_null, q_gpu, speed_max)

Arguments

NameTypeIntentAttributesDescription
niinteger(kind=I4P)inGrid dimensions.
njinteger(kind=I4P)inGrid dimensions.
nkinteger(kind=I4P)inGrid dimensions.
ngcinteger(kind=I4P)inGrid dimensions.
blocks_numberinteger(kind=I4P)inActual blocks number.
gammareal(kind=R8P)inSpecific heats ratio.
Rreal(kind=R8P)inGas constant.
is_nulllogicalinNull directions.
q_gpureal(kind=R8P)inConservative variables.
speed_maxreal(kind=R8P)outMaximum of |u_d| + c_{f,d}.

Call graph

compute_divb_norms_dev ​

Compute the div(B) norms over the interior cells (issue #41, D-10): max|div B|, sum |div B| dV and the maximum over the seam-local cells (within band cells of a block face with seam(b,face) /= 0, a 2:1 AMR or inter-realm seam). div B is the centred finite difference of the library (half stencil hs <= HS_MAX), null directions weighted zero; the cell volume includes the null directions (issue #37). The caller has refreshed the ghost cells.

fortran
subroutine compute_divb_norms_dev(ni, nj, nk, ngc, blocks_number, hs, band, dxyz_gpu, is_null, seam_gpu, q_gpu, divb_max, divb_l1, divb_seam_max)

Arguments

NameTypeIntentAttributesDescription
niinteger(kind=I4P)inGrid dimensions.
njinteger(kind=I4P)inGrid dimensions.
nkinteger(kind=I4P)inGrid dimensions.
ngcinteger(kind=I4P)inGrid dimensions.
blocks_numberinteger(kind=I4P)inActual blocks number.
hsinteger(kind=I4P)inFinite difference half stencil, <= min(ngc, HS_MAX).
bandinteger(kind=I4P)inSeam-local band width, in cells.
dxyz_gpureal(kind=R8P)inBlocks space steps [nb, 3].
is_nulllogicalinNull directions.
seam_gpuinteger(kind=I4P)inSeam faces flags [nb, 6] (0: not a seam face).
q_gpureal(kind=R8P)inConservative variables.
divb_maxreal(kind=R8P)outMaximum of |div B|.
divb_l1real(kind=R8P)outSum of |div B| dV.
divb_seam_maxreal(kind=R8P)outMaximum of |div B| over the seam-local cells.

Call graph

blend_inadmissible_ghosts_dev ​

Blend every inadmissible face ghost of q_gpu toward the adjacent interior cell and count the ghosts blended (device twin of the CPU blend_inadmissible_ghosts).

fortran
subroutine blend_inadmissible_ghosts_dev(ni, nj, nk, ngc, blocks_number, is_null, q_gpu, blended)

Arguments

NameTypeIntentAttributesDescription
niinteger(kind=I4P)inGrid dimensions.
njinteger(kind=I4P)inGrid dimensions.
nkinteger(kind=I4P)inGrid dimensions.
ngcinteger(kind=I4P)inGrid dimensions.
blocks_numberinteger(kind=I4P)inActual blocks number.
is_nulllogicalinNull directions.
q_gpureal(kind=R8P)inoutConservative variables (ghosts updated).
blendedinteger(kind=I4P)outGhosts blended.

Call graph

add_glm_damping_dev ​

Add the GLM damping source to the residuals of the interior cells, dq(psi) = dq(psi) - (c_h^2 / c_p^2) psi (mixed GLM, Dedner et al. 2002; issue #41, section 3.1): a local source, in every Runge-Kutta stage and never in the fluxes, so the reflux and the conservation of the other variables are untouched.

fortran
subroutine add_glm_damping_dev(ni, nj, nk, ngc, blocks_number, damping, q_gpu, dq_gpu)

Arguments

NameTypeIntentAttributesDescription
niinteger(kind=I4P)inGrid dimensions.
njinteger(kind=I4P)inGrid dimensions.
nkinteger(kind=I4P)inGrid dimensions.
ngcinteger(kind=I4P)inGrid dimensions.
blocks_numberinteger(kind=I4P)inActual blocks number.
dampingreal(kind=R8P)inDamping rate c_h^2 / c_p^2.
q_gpureal(kind=R8P)inConservative variables.
dq_gpureal(kind=R8P)inoutResiduals.

Call graph

face_split_fluxes ​

Split adapter of the shared face kernel (issue #41, M2-P3): the MHD split with GLM cleaning.

Attributes: pure

fortran
subroutine face_split_fluxes(gamma, ch, d, S, is_characteristic, qs, qas, fsplit, er, mu)

Arguments

NameTypeIntentAttributesDescription
gammareal(kind=R8P)inSpecific heats ratio.
chreal(kind=R8P)inGLM cleaning speed.
dinteger(kind=I4P)inDirection, 1=x, 2=y, 3=z.
Sinteger(kind=I4P)inWENO stencil half-width, S <= S_MAX.
is_characteristiclogicalinCharacteristic (or conservative) variables.
qsreal(kind=R8P)inStencil conservative variables.
qasreal(kind=R8P)inStencil auxiliary variables.
fsplitreal(kind=R8P)outSplit fields in the WENO upwind layout.
erreal(kind=R8P)outRight eigenvectors.
mureal(kind=R8P)outMagnitude of each field (WENO descaler).

Call graph

Functions ​

cleaning_energy ​

Cleaning-energy adapter of the floors kernel: zero, psi (if any) is not part of the energy of this model.

Attributes: pure

Returns: real(kind=R8P)

fortran
function cleaning_energy(q) result(e)

Arguments

NameTypeIntentAttributesDescription
qreal(kind=R8P)inConservative variables.

Call graph

internal_energy ​

Internal-energy adapter of the ghost positivity blend: E minus the kinetic and magnetic energies, per unit volume (the mixed GLM keeps psi out of the energy).

Attributes: pure

Returns: real(kind=R8P)

fortran
function internal_energy(q) result(e)

Arguments

NameTypeIntentAttributesDescription
qreal(kind=R8P)inConservative variables.

Call graph