22 params.addClassDescription(
23 "Viscous diffusion term, div(mu eps grad(u_d / eps)), in the porous media "
24 "incompressible Navier-Stokes momentum equation.");
25 params.addRequiredParam<MooseFunctorName>(
NS::porosity,
"Porosity auxiliary variable");
33 mooseError(
"PINSFVMomentumDiffusion may only be used with a superficial velocity "
34 "variable, of variable type PINSFVSuperficialVelocityVariable.");
42 const bool has_elem = (
_face_type == FaceInfo::VarFaceNeighbors::ELEM ||
43 _face_type == FaceInfo::VarFaceNeighbors::BOTH);
44 const bool has_neighbor = (
_face_type == FaceInfo::VarFaceNeighbors::NEIGHBOR ||
45 _face_type == FaceInfo::VarFaceNeighbors::BOTH);
47 const auto elem_face =
elemArg();
55 const auto mu_elem = has_elem ?
_mu(elem_face, state) :
_mu(neighbor_face, state);
56 const auto eps_elem = has_elem ?
_eps(elem_face, state) :
_eps(neighbor_face, state);
64 mu_neighbor = has_elem ?
_mu(neighbor_face, state) :
_mu(elem_face, state);
65 eps_neighbor = has_neighbor ?
_eps(neighbor_face, state) :
_eps(elem_face, state);
66 interpolate(Moose::FV::InterpMethod::Average, mu_face, mu_elem, mu_neighbor, *
_face_info,
true);
72 if (populate_a_coeffs)
79 _ae = dudn.derivatives()[dof_number];
85 _an = dudn.derivatives()[dof_number];
91 ADReal residual = mu_face * dudn;
94 const auto & grad_eps_face =
95 (has_elem && has_neighbor)
104 const auto coeff_one_side =
105 mu_elem / eps_elem * (has_elem ?
_var(elem_face, state) :
_var(neighbor_face, state));
107 coeff_face = coeff_one_side;
110 mooseAssert(has_elem,
"We should be defined on the element side if we're not on a boundary");
111 const auto coeff_neighbor = mu_neighbor / eps_neighbor *
112 (has_elem ?
_var(neighbor_face, state) :
_var(elem_face, state));
113 interpolate(Moose::FV::InterpMethod::Average,
121 residual -= coeff_face * grad_eps_face *
_normal;
DualNumber< Real, DNDerivativeType, true > ADReal
registerMooseObject("NavierStokesApp", PINSFVMomentumDiffusion)
Moose::ElemArg neighborArg(bool correct_skewness=false) const
Moose::ElemArg elemArg(bool correct_skewness=false) const
bool onBoundary(const FaceInfo &fi) const
MooseVariableFV< Real > & _var
Moose::FaceArg singleSidedFaceArg(const FaceInfo *fi=nullptr, Moose::FV::LimiterType limiter_type=Moose::FV::LimiterType::CentralDifference, bool correct_skewness=false, const Moose::StateArg *state_limiter=nullptr) const
const FaceInfo * _face_info
FaceInfo::VarFaceNeighbors _face_type
Moose::FaceArg makeCDFace(const FaceInfo &fi, const bool correct_skewness=false) const
const Point & normal() const
const Elem & elem() const
const Elem * neighborPtr() const
const Elem & neighbor() const
Moose::ElemArg makeElemArg(const Elem *elem, bool correct_skewnewss=false) const
ADReal _ae
The a coefficient for the element.
ADReal _an
The a coefficient for the neighbor.
static InputParameters validParams()
const Moose::Functor< ADReal > & _mu
The dynamic viscosity.
void mooseError(Args &&... args) const
unsigned int number() const
GradientType gradient(const ElemArg &elem, const StateArg &state) const
A flux kernel for diffusion of momentum in porous media across cell faces.
virtual ADReal computeStrongResidual(const bool populate_a_coeffs) override
Routine to compute this object's strong residual (e.g.
PINSFVMomentumDiffusion(const InputParameters ¶ms)
const Moose::Functor< ADReal > & _eps
the porosity
static InputParameters validParams()
unsigned int number() const
Moose::StateArg determineState() const
static const std::string porosity