https://mooseframework.inl.gov
INSFVMomentumPressureFlux.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
11 #include "INSFVVelocityVariable.h"
12 #include "NS.h"
13 
15 
18 {
19  auto params = FVFluxKernel::validParams();
21  params.addClassDescription("Momentum pressure term eps grad_P, as a flux kernel "
22  "using the divergence theoreom, in the "
23  "incompressible Navier-Stokes momentum equation.");
24  params.addRequiredParam<MooseFunctorName>(NS::pressure, "The pressure");
25  return params;
26 }
27 
29  : FVFluxKernel(params), INSFVMomentumResidualObject(*this), _p(getFunctor<ADReal>(NS::pressure))
30 {
31  if (!dynamic_cast<INSFVVelocityVariable *>(&_var))
32  mooseError("INSFVMomentumPressureFlux may only be used with a Navier-Stokes velocity, "
33  "of variable type INSFVSuperficialVelocityVariable.");
34 }
35 
36 ADReal
38 {
39  ADReal eps_p_interface;
40  // Momentum and porosity domains should match
41  const auto & face_type = _face_info->faceType(std::make_pair(_var.number(), _var.sys().number()));
42  const bool use_elem = (face_type == FaceInfo::VarFaceNeighbors::ELEM) ||
43  (face_type == FaceInfo::VarFaceNeighbors::BOTH);
44 
45  const auto * const elem_ptr = use_elem ? &_face_info->elem() : _face_info->neighborPtr();
46  const auto & elem = makeElemArg(elem_ptr);
47  const auto state = determineState();
48 
49  if (onBoundary(*_face_info))
50  eps_p_interface = epsilon()(elem, state) * _p(singleSidedFaceArg(), state);
51  else
52  {
53  const auto * neighbor_ptr = use_elem ? _face_info->neighborPtr() : &_face_info->elem();
54  const auto & neighbor = makeElemArg(neighbor_ptr);
55 
57  eps_p_interface,
58  epsilon()(elem, state) * _p(elem, state),
59  epsilon()(neighbor, state) * _p(neighbor, state),
60  *_face_info,
61  true);
62  }
63 
64  return eps_p_interface * _normal(_index);
65 }
unsigned int number() const
const Elem & elem() const
const FaceInfo * _face_info
registerMooseObject("NavierStokesApp", INSFVMomentumPressureFlux)
Moose::StateArg determineState() const
const unsigned int _index
index x|y|z
virtual ADReal computeQpResidual() override
RealVectorValue _normal
DualNumber< Real, DNDerivativeType, true > ADReal
Moose::ElemArg makeElemArg(const Elem *elem, bool correct_skewnewss=false) const
bool onBoundary(const FaceInfo &fi) const
static InputParameters validParams()
const Elem * neighborPtr() const
A flux kernel using the divergence theorem for the pressure gradient term in the momentum equation...
unsigned int number() const
static InputParameters validParams()
All objects that contribute to pressure-based (e.g.
virtual const Moose::FunctorBase< ADReal > & epsilon() const
static const std::string pressure
Definition: NS.h:56
void mooseError(Args &&... args) const
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 Moose::Functor< ADReal > & _p
The pressure.
MooseVariableFV< Real > & _var
static InputParameters validParams()
INSFVMomentumPressureFlux(const InputParameters &params)
void interpolate(InterpMethod m, T &result, const T2 &value1, const T3 &value2, const FaceInfo &fi, const bool one_is_elem)
VarFaceNeighbors faceType(const std::pair< unsigned int, unsigned int > &var_sys) const