Skip to content

adam_flume_cpu_euler_kernels ​

ADAM, FLUME CPU kernels of the Euler model.

The model-agnostic loop bodies (adam_flume_cpu_{face,aux}_kernels_agnostic.INC) instantiated on the Euler physics: the local arrays are sized by the Euler constants NV_K = NV_EULER, NV_AUX_K = NV_AUX (issue #41, section 4), plus the Euler signal-speed loop.

Source: src/app/flume/cpu/adam_flume_cpu_euler_kernels.F90

Dependencies

Contents ​

Subroutines ​

compute_face_fluxes ​

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: gather the stencil m = 1-S ... S into constant-bound locals, project and split it, reconstruct every field (the local v is the packed stencil of the WENO primitive), back-project.

fortran
subroutine compute_face_fluxes(d, di, dj, dk, ni, nj, nk, ngc, blocks_number, gamma, ch, is_characteristic, weno, q, q_aux, fl)

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.
gammareal(kind=R8P)inSpecific heats ratio.
chreal(kind=R8P)inGLM cleaning speed (models with GLM only).
is_characteristiclogicalinCharacteristic (or conservative) variables.
wenotype(weno_object)inWENO coefficients.
qreal(kind=R8P)inConservative variables.
q_auxreal(kind=R8P)inAuxiliary variables.
flreal(kind=R8P)inoutFace fluxes of direction d.

Call graph

add_gravity_edge_correction ​

Add the faces beyond the block to the gravity energy correction of direction d (issue #73, M7-G2a): cell 1 takes -g_d F^rho / 24 of face -1 (between cells -1 and 0), cell n_d that of face n_d + 1 (between cells n_d + 1 and n_d + 2), the two terms of g_d (-F_{i-3/2} + F_{i-1/2} + F_{i+1/2} - F_{i+3/2}) / 24 whose faces the block does not hold. Each face is computed as compute_face_fluxes does (the same body, its mass component kept), from the ghosts: its stencil reaches S + 1 ghost cells, which the initialisation requires with gravity.

fortran
subroutine add_gravity_edge_correction(d, di, dj, dk, ni, nj, nk, ngc, blocks_number, gamma, ch, is_characteristic, weno, ir, gd, q, q_aux, gc)

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.
gammareal(kind=R8P)inSpecific heats ratio.
chreal(kind=R8P)inGLM cleaning speed (models with GLM only).
is_characteristiclogicalinCharacteristic (or conservative) variables.
wenotype(weno_object)inWENO coefficients.
irinteger(kind=I4P)inIndex of the density (mass) variable.
gdreal(kind=R8P)inGravity along d.
qreal(kind=R8P)inConservative variables.
q_auxreal(kind=R8P)inAuxiliary variables.
gcreal(kind=R8P)inoutGravity energy correction [1, ...].

Call graph

compute_q_aux ​

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

fortran
subroutine compute_q_aux(ni, nj, nk, ngc, blocks_number, gamma, R, q, q_aux)

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.
qreal(kind=R8P)inConservative variables.
q_auxreal(kind=R8P)inoutAuxiliary variables.

Call graph

count_nonfinite ​

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 can fold the test away.

fortran
subroutine count_nonfinite(ni, nj, nk, ngc, blocks_number, q, 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.
qreal(kind=R8P)inConservative variables.
ninteger(kind=I8P)outNon-finite values number.

Call graph

compute_positivity_factors ​

Compute the cell factor Lambda of every interior cell into lam(1,:,:,:,:) (the other components untouched) and count the cells whose backbone is not admissible (Lambda = 0 there: the floors, if enabled, take over) and those with a non-finite high-order face flux (Lambda = 0 too: a NaN or infinite flux carries no information, and every comparison with it is false, so the corner factors would keep it; tested on the bit pattern as count_nonfinite).

fortran
subroutine compute_positivity_factors(ni, nj, nk, ngc, blocks_number, gamma, ch, damping, hs, dt, g, has_phi, phi, dxyz, is_null, q, q_aux, flx, fly, flz, gc, lam, bad, nonfinite)

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.
chreal(kind=R8P)inGLM cleaning speed (EGLM only).
dampingreal(kind=R8P)inGLM damping rate (EGLM only).
hsinteger(kind=I4P)inHalf stencil of the high-order sources.
dtreal(kind=R8P)inForward-Euler step of the stage.
greal(kind=R8P)inGravity (issue #73), zero without it.
has_philogicalinThe cell potential is applied (issue #81).
phireal(kind=R8P)inGravitational potential (read with has_phi).
dxyzreal(kind=R8P)inBlocks space steps [3, nb].
is_nulllogicalinNull directions.
qreal(kind=R8P)inConservative variables (ghosts updated).
q_auxreal(kind=R8P)inAuxiliary variables.
flxreal(kind=R8P)inX-face high-order fluxes.
flyreal(kind=R8P)inY-face high-order fluxes.
flzreal(kind=R8P)inZ-face high-order fluxes.
gcreal(kind=R8P)inGravity energy correction (zero without it).
lamreal(kind=R8P)inoutCell factors (component 1).
badinteger(kind=I4P)outCells with an inadmissible backbone.
nonfiniteinteger(kind=I4P)outCells with a non-finite high-order face flux.

Call graph

compute_seam_positivity_factors ​

Recompute the factor of the cells beside a 2:1 seam with the seam faces' backbone and high-order fluxes overridden (issue #50, D1: per-stage seam flux synchronisation). Cell n is cell(1:4,n) = (i, j, k, b); its face fec (1..6: -x, +x, -y, +y, -z, +z) takes olo(:,fec,n) and ohi(:,fec,n) where omask(fec,n), the backbone flux of q and the high-order flux of flx/fly/flz elsewhere, exactly as compute_positivity_factors. dbad and dnonfinite return the change of the two counts against the factors without the overrides, which compute_positivity_factors has already counted.

fortran
subroutine compute_seam_positivity_factors(ngc, gamma, ch, damping, hs, dt, g, has_phi, phi, dxyz, is_null, q, q_aux, flx, fly, flz, gc, ncells, cell, omask, olo, ohi, lam, dbad, dnonfinite)

Arguments

NameTypeIntentAttributesDescription
ngcinteger(kind=I4P)inGhost cells number.
gammareal(kind=R8P)inSpecific heats ratio.
chreal(kind=R8P)inGLM cleaning speed (EGLM only).
dampingreal(kind=R8P)inGLM damping rate (EGLM only).
hsinteger(kind=I4P)inHalf stencil of the high-order sources.
dtreal(kind=R8P)inForward-Euler step of the stage.
greal(kind=R8P)inGravity (issue #73), zero without it.
has_philogicalinThe cell potential is applied (issue #81).
phireal(kind=R8P)inGravitational potential (read with has_phi).
dxyzreal(kind=R8P)inBlocks space steps [3, nb].
is_nulllogicalinNull directions.
qreal(kind=R8P)inConservative variables (ghosts updated).
q_auxreal(kind=R8P)inAuxiliary variables.
flxreal(kind=R8P)inX-face high-order fluxes.
flyreal(kind=R8P)inY-face high-order fluxes.
flzreal(kind=R8P)inZ-face high-order fluxes.
gcreal(kind=R8P)inGravity energy correction (zero without it).
ncellsinteger(kind=I4P)inSeam cells.
cellinteger(kind=I4P)inSeam cells (i, j, k, b) [4, ncells].
omasklogicalinOverridden faces [6, ncells].
oloreal(kind=R8P)inOverride backbone fluxes [nv, 6, ncells].
ohireal(kind=R8P)inOverride high-order fluxes [nv, 6, ncells].
lamreal(kind=R8P)inoutCell factors (component 1).
dbadinteger(kind=I4P)outChange of the inadmissible backbones count.
dnonfiniteinteger(kind=I4P)outChange of the non-finite cells count.

Call graph

compute_backbone_fluxes ​

Compute the backbone flux of n face state pairs of direction d (issue #50: the fine faces of a 2:1 seam take the coarse donor cell as their outer state).

fortran
subroutine compute_backbone_fluxes(n, d, gamma, ch, qL, qR, flo)

Arguments

NameTypeIntentAttributesDescription
ninteger(kind=I4P)inFaces number.
dinteger(kind=I4P)inDirection, 1=x, 2=y, 3=z.
gammareal(kind=R8P)inSpecific heats ratio.
chreal(kind=R8P)inGLM cleaning speed (EGLM only).
qLreal(kind=R8P)inLeft states [nv, n].
qRreal(kind=R8P)inRight states [nv, n].
floreal(kind=R8P)outBackbone fluxes [nv, n].

Call graph

positivity_cell_factor ​

The factor of one cell from its backbone update qb, the antidiffusive differences dlt(:,1:nf) of its active faces and the source difference dsrc: status 1 (and lc = 0) if the backbone is not admissible, 2 (and lc = 0) if a face difference is not finite (a NaN passes every comparison of the corners), else 0 with lc the largest factor of the corner box.

Attributes: pure

fortran
subroutine positivity_cell_factor(nf, qb, dlt, dsrc, lc, status)

Arguments

NameTypeIntentAttributesDescription
nfinteger(kind=I4P)inActive faces.
qbreal(kind=R8P)inBackbone update.
dltreal(kind=R8P)inAntidiffusive differences.
dsrcreal(kind=R8P)inSource difference.
lcreal(kind=R8P)outCell factor.
statusinteger(kind=I4P)out0 admissible, 1 inadmissible backbone, 2 non-finite.

Call graph

blend_positivity_fluxes ​

Blend the face fluxes of direction d with the backbone: F <- F^LLF + theta (F - F^LLF), theta the smaller factor of the two cells (ghost factors from the exchange; a ghost never written keeps 1, so a physical-boundary face takes the interior cell's factor). Faces with theta = 1 are left untouched (bitwise), and counted otherwise; a face with theta = 0 takes the backbone flux itself (0 * NaN would keep a non-finite high-order flux).

fortran
subroutine blend_positivity_fluxes(d, di, dj, dk, ni, nj, nk, ngc, blocks_number, gamma, ch, q, lam, fl, limited)

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.
gammareal(kind=R8P)inSpecific heats ratio.
chreal(kind=R8P)inGLM cleaning speed (EGLM only).
qreal(kind=R8P)inConservative variables.
lamreal(kind=R8P)inCell factors (component 1).
flreal(kind=R8P)inoutFace fluxes of direction d.
limitedinteger(kind=I4P)outFaces with theta < 1.

Call graph

blend_inadmissible_ghosts ​

Blend every inadmissible face ghost of q toward the adjacent interior cell and count the ghosts blended.

fortran
subroutine blend_inadmissible_ghosts(ni, nj, nk, ngc, blocks_number, is_null, q, 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.
qreal(kind=R8P)inoutConservative variables (ghosts updated).
blendedinteger(kind=I4P)outGhosts blended.

Call graph

compute_lambda_max ​

Compute max(sum_d (|u_d| + a) / dx_d) over the interior cells (null directions excluded).

fortran
subroutine compute_lambda_max(ni, nj, nk, ngc, blocks_number, gamma, R, dxyz, is_null, q, 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.
dxyzreal(kind=R8P)inBlocks space steps [3, nb].
is_nulllogicalinNull directions.
qreal(kind=R8P)inConservative variables.
lambda_maxreal(kind=R8P)outMaximum of sum_d (|u_d| + a) / dx_d.

Call graph

compute_lambda_max_dissipative ​

Compute max(sum_d (|u_d| + a) / dx_d + 2 nu sum_d 1 / dx_d^2) over the interior cells (issue #65, D-M4-3), nu the largest diffusivity of the cell, with the maxima of the two parts and the minimum cell Reynolds number sum_d (|u_d| + a) / dx_d / (nu sum_d 1 / dx_d^2), (|u| + a) dx / nu on a uniform 1D grid.

fortran
subroutine compute_lambda_max_dissipative(ni, nj, nk, ngc, blocks_number, gamma, R, cp, mu0, k0, eta, t_wall, tref, omega_mu, omega_k, dxyz, is_null, q, 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.
dxyzreal(kind=R8P)inBlocks space steps [3, nb].
is_nulllogicalinNull directions.
qreal(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

face_split_fluxes ​

Split adapter of the shared face kernel (issue #41, M2-P3): the Euler split, ch unused.

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

backbone_face_flux ​

Backbone adapter of the positivity limiter: the Rusanov flux, ch unused.

Attributes: pure

fortran
subroutine backbone_face_flux(gamma, ch, d, qL, qR, f)

Arguments

NameTypeIntentAttributesDescription
gammareal(kind=R8P)inSpecific heats ratio.
chreal(kind=R8P)inGLM cleaning speed.
dinteger(kind=I4P)inDirection, 1=x, 2=y, 3=z.
qLreal(kind=R8P)inLeft state.
qRreal(kind=R8P)inRight state.
freal(kind=R8P)outFlux.

Call graph

cell_sources ​

Sources adapter of the positivity limiter: none (Euler).

Attributes: pure

fortran
subroutine cell_sources(ngc, hs, damping, dxyz, is_null, q, q_aux, i, j, k, b, s_lo, s_hi)

Arguments

NameTypeIntentAttributesDescription
ngcinteger(kind=I4P)inGhost cells number.
hsinteger(kind=I4P)inHalf stencil of the high-order sources.
dampingreal(kind=R8P)inGLM damping rate.
dxyzreal(kind=R8P)inBlock space steps.
is_nulllogicalinNull directions.
qreal(kind=R8P)inConservative variables.
q_auxreal(kind=R8P)inAuxiliary variables.
iinteger(kind=I4P)inCell indexes.
jinteger(kind=I4P)inCell indexes.
kinteger(kind=I4P)inCell indexes.
binteger(kind=I4P)inCell indexes.
s_loreal(kind=R8P)outBackbone sources.
s_hireal(kind=R8P)outHigh-order sources.

Call graph

Functions ​

internal_energy ​

Internal-energy adapter of the positivity limiter: E minus the kinetic energy, per unit volume.

Attributes: pure

Returns: real(kind=R8P)

fortran
function internal_energy(q) result(e)

Arguments

NameTypeIntentAttributesDescription
qreal(kind=R8P)inConservative variables.

Call graph