Class to set density and pressure floors for MHD fluid.
!!WARNING: Does not conserve density or energy.!!
Density and pressure floors are a brute-force method of enforcing positivity in regions where numerical oscillations, or where the kinetic or magnetic energy is large compared to the thermal energy, resulting in density or pressures going negative.
In the methods implemented here, when the density or pressure at a node is found to be below a threshold value ( \(\rho_{min}\) or \(P_{min}\)) the value is replaced. The replacement value is calculated one of two ways:
_eliminate_ke == false
(Default). When density or pressure fall below threshold values density and energy are recalculated using \(\rho_{min}\) and \(P_{min}\)
\begin{align*}
\rho_{out} &= \max (\rho_{min}, \rho_{in}) \\
\boldsymbol{p}_{out} &= \boldsymbol{p}_{in}, \\
e_{out} &= \frac{1}{\gamma-1} \max (P_{min}, P_{in}) + \frac{1}{2} \max \left(
\rho_{min}, \rho_{in} \right)^{-1} \left(p_x^2 + p_y^2 + p_z^2 \right)_{in}.
\end{align*}
_eliminate_ke == true
. When density falls below \(\rho_{min}\), the momentum is set to zero and kinetic energy is subtracted from total energy
\begin{align*}
\rho_{out} &= \rho_{min}, \\
\boldsymbol{p}_{out} &= 0, \\
e_{out} &= \frac{1}{\gamma - 1} P_{min}.
\end{align*}
In cases where \(\rho > \rho_{min}\)
\begin{align*}
\rho_{out} &= \rho_{in}, \\
\boldsymbol{p}_{out} &= \boldsymbol{p}_{in}, \\
e_{out} &= \frac{1}{\gamma-1} \max (P_{min}, P_{in}) + \frac{1}{2 \rho_{in}}
\left(p_x^2 + p_y^2 + p_z^2 \right)_{in}.
\end{align*}
|
| SetFloors () |
| Constructor.
|
|
| ~SetFloors () override |
| Destructor.
|
|
void | setup (const WxCryptSet &wxc) override |
| Setup.
|
|
const std::vector< int > & | getInputVariableIndexes (int flag) const override |
| Grab input variable indices.
|
|
const std::vector< int > & | getOutputVariableIndexes (int flag) const override |
| Grab output variable indices.
|
|
void | evaluate_function (const real *q, const real *aux, const solverVariables_t *pSV, real *result) const override |
| Redefinition of the function evaluator.
|
|
| WmApplication () |
|
virtual | ~WmApplication ()=default |
|
virtual void | setup (const WxCryptSet &wxc) |
|
virtual const std::vector< int > & | getAuxiliaryVariableIndexes (int flag=WMAPPLICATIONFLAG_NONE) const |
|
virtual const std::vector< int > & | getCrossVariableIndexes (int flag=WMAPPLICATIONFLAG_NONE) const |
|
const std::vector< std::string > & | getBoundaryNames () const |
|
bool | isOnBoundary (const std::string &boundaryName) const |
|
bool | has (int flag) const |
|
virtual real | numerical_flux (const real *q_l, const real *q_r, const real *aux_l, const real *aux_r, const solverVariables_t *pFV, real *numericalFlux) const |
|
virtual real | internal_flux (const real *q, const real *aux, const solverVariables_t *pSV, std::vector< std::vector< real > > &internalFlux) const |
|
virtual real | source (const real *q, const real *aux, const elementGeometry_t *pEG, real *source) const |
|
virtual void | bc_q (const real *q_in, const real *aux_in, const real *aux_out, const solverVariables_t *pFV, real *q_out) const |
| Boundary Condition Application which sets the boundary condition on ghost nodes.
|
|
virtual real | bcNumericalFlux (const real *q_l, const real *q_r, const real *aux_l, const real *aux_r, const solverVariables_t *pFV, real *numericalFlux) const |
|
virtual void | conserved_to_primitive (const real *q, const real *aux, real *w) const |
|
virtual void | primitive_to_conserved (const real *w, const real *aux, real *q) const |
|
virtual void | evaluate_function (const real *q, const real *aux, const solverVariables_t *pSV, real *result) const |
|
virtual void | bc_q_kinetic (const real *q_in, const real *aux_in, const solverVariables_t *pFV, real *q_out) const |
|
std::shared_ptr< std::string > | app_name () |
|
virtual const std::vector< int > & | getInputVariableIndexes (int flag=0) const |
|
virtual const std::vector< int > & | getOutputVariableIndexes (int flag=0) const |
|