24 "Minmod interpolation for advected quantities implemented as limited blending weights "
25 "(no MUSCL reconstruction, no deferred correction).");
29 "Whether to limit the scheme to be no more downwind-biased than linear interpolation.");
33 "blending_factor>=0 & blending_factor<=1",
34 "Scales the high-order blending strength; 0 gives pure upwind, 1 gives the full limited "
35 "blending. Values < 1 can improve linear solver robustness for fully implicit assembly.");
41 _limit_to_linear(getParam<bool>(
"limit_to_linear")),
42 _blending_factor(getParam<Real>(
"blending_factor"))
50 const VectorValue<Real> * elem_grad,
51 const VectorValue<Real> * neighbor_grad,
54 mooseAssert(elem_grad && neighbor_grad,
55 "Minmod advected interpolation requires both element and neighbor gradients.");
57 const bool upwind_is_elem = mass_flux >= 0.0;
59 const Real phi_upwind = upwind_is_elem ? elem_value : neighbor_value;
60 const Real phi_downwind = upwind_is_elem ? neighbor_value : elem_value;
62 const VectorValue<Real> grad_upwind = upwind_is_elem ? *elem_grad : *neighbor_grad;
63 const Point upwind_to_downwind = upwind_is_elem ? face.
dCN() : Point(-face.
dCN());
65 const auto r_f =
Moose::FV::rF(phi_upwind, phi_downwind, grad_upwind, upwind_to_downwind);
66 const Real beta = std::max(Real(0.0), std::min(Real(1.0), r_f));
69 const Real w_f = upwind_is_elem ? face.
gC() : (1.0 - face.
gC());
74 const Real g_clamped = std::min(std::max(g_unclamped, 0.0), 1.0 - w_f);
78 const Real w_upwind = 1.0 - g;
79 const Real w_downwind = g;
82 const Real w_elem = upwind_is_elem ? w_upwind : w_downwind;
83 const Real w_neighbor = upwind_is_elem ? w_downwind : w_upwind;
95 const VectorValue<Real> * elem_grad,
96 const VectorValue<Real> * neighbor_grad,
100 advectedInterpolate(face, elem_value, neighbor_value, elem_grad, neighbor_grad, mass_flux);
101 return result.weights_matrix.first * elem_value + result.weights_matrix.second * neighbor_value;
registerMooseObject("MooseApp", FVAdvectedMinmodWeightBased)
Minmod interpolation for advected quantities that blends between upwind and the higher-order limited ...
AdvectedSystemContribution advectedInterpolate(const FaceInfo &face, Real elem_value, Real neighbor_value, const VectorValue< Real > *elem_grad, const VectorValue< Real > *neighbor_grad, Real mass_flux) const override
Compute the matrix weights for the advected face value.
const bool _limit_to_linear
Whether to clamp the blending to be no more downwind-biased than linear.
Real advectedInterpolateValue(const FaceInfo &face, Real elem_value, Real neighbor_value, const VectorValue< Real > *elem_grad, const VectorValue< Real > *neighbor_grad, Real mass_flux) const override
Compute the advected face value.
const Real _blending_factor
Scales the high-order blending strength (0 = upwind, 1 = full limited blending).
static InputParameters validParams()
FVAdvectedMinmodWeightBased(const InputParameters ¶ms)
Registered base class for linear FV interpolation objects.
static InputParameters validParams()
This data structure is used to store geometric and variable related metadata about each cell face in ...
const Point & dCN() const
Real gC() const
Return the geometric weighting factor.
Scalar rF(const Scalar &phiC, const Scalar &phiD, const Vector &gradC, const RealVectorValue &dCD)
From Moukalled 12.30.
Matrix/RHS contribution for an advected face interpolation.
std::pair< Real, Real > weights_matrix