22 "diffusion term in a partial differential equation.");
24 "use_nonorthogonal_correction",
26 "If the nonorthogonal correction should be used when computing the normal gradient.");
28 "use_nonorthogonal_correction_on_boundary",
29 "If the nonorthogonal correction should be used when computing the normal gradient.");
31 "Functor describing a diagonal diffusion tensor.");
38 _use_nonorthogonal_correction(getParam<bool>(
"use_nonorthogonal_correction")),
39 _use_nonorthogonal_correction_on_boundary(
40 isParamValid(
"use_nonorthogonal_correction_on_boundary")
41 ? getParam<bool>(
"use_nonorthogonal_correction_on_boundary")
42 : _use_nonorthogonal_correction),
43 _flux_matrix_contribution(0.0),
44 _flux_rhs_contribution(0.0)
53 if (!dynamic_cast<const LinearFVAdvectionDiffusionBC *>(bc.second))
55 bc.second->type(),
" is not a compatible boundary condition with ", this->
type(),
"!");
125 const auto interp_coeffs =
128 const auto interpolated_gradient =
129 (interp_coeffs.first * grad_elem + interp_coeffs.second * grad_neighbor);
140 interpolated_gradient;
146 const auto correction_vector =
152 normal_scaled_diff_tensor * interpolated_gradient * correction_vector;
166 mooseAssert(diff_bc,
"This should be a valid BC!");
168 auto grad_contrib = diff_bc->computeBoundaryGradientMatrixContribution() *
_current_face_area;
171 if (!diff_bc->includesMaterialPropertyMultiplier())
182 grad_contrib *= normal_scaled_diff_tensor;
192 mooseAssert(diff_bc,
"This should be a valid BC!");
195 auto grad_contrib = diff_bc->computeBoundaryGradientRHSContribution();
207 if (!diff_bc->includesMaterialPropertyMultiplier())
208 grad_contrib *= normal_scaled_diff_tensor;
212 const Real boundary_normal_multiplier =
215 grad_contrib += (scaled_diff_tensor - normal_scaled_diff_tensor * boundary_normal_multiplier *
227 const auto correction_vector =
231 normal_scaled_diff_tensor * boundary_grad * boundary_normal_multiplier * correction_vector;
MetaPhysicL::DualNumber< V, D, asd > abs(const MetaPhysicL::DualNumber< V, D, asd > &a)
Base class for boundary conditions for linear FV systems.
std::pair< Real, Real > interpCoeffs(const InterpMethod m, const FaceInfo &fi, const bool one_is_elem, const T &face_flux=0.0)
Produce the interpolation coefficients in the equation:
const Moose::Functor< RealVectorValue > & _diffusion_tensor
The functor for the diagonal diffusion tensor (diagonal entries arranged in a vector) ...
virtual Real computeElemMatrixContribution() override
Computes the system matrix contribution from an element side on an internal face. ...
Moose::FaceArg singleSidedFaceArg(const FaceInfo *fi, Moose::FV::LimiterType limiter_type=Moose::FV::LimiterType::CentralDifference, bool correct_skewness=false) const
Determine the single sided face argument when evaluating a functor on a face.
registerMooseObject("MooseApp", LinearFVAnisotropicDiffusion)
Moose::StateArg determineState() const
Create a functor state argument that corresponds to the implicit state of this object.
const ElemInfo * neighborInfo() const
const Point & faceCentroid() const
Returns the coordinates of the face centroid.
Finite volume kernel that contributes approximations of discretized face flux terms to the matrix and...
MooseLinearVariableFV< Real > & _var
Reference to the linear finite volume variable.
Kernel that adds contributions from an anisotropic diffusion term discretized using the finite volume...
static constexpr std::size_t dim
This is the dimension of all vector and tensor datastructures used in MOOSE.
const ElemInfo * elemInfo() const
FaceInfo::VarFaceNeighbors _current_face_type
Face ownership information for the current face.
virtual Real computeBoundaryMatrixContribution(const LinearFVBoundaryCondition &bc) override
Computes the matrix contribution from a boundary face.
LinearFVAnisotropicDiffusion(const InputParameters ¶ms)
Class constructor.
Base class for boundary conditions that are valid for advection diffusion problems.
static InputParameters validParams()
const FaceInfo * _current_face_info
Pointer to the face info we are operating on right now.
virtual Real computeNeighborRightHandSideContribution() override
Computes the right hand side contribution from the neighbor side on an internal face.
virtual Real computeElemRightHandSideContribution() override
Computes the right hand side contribution from the element side on an internal face.
const std::string & type() const
Get the type of this class.
virtual Real computeNeighborMatrixContribution() override
Computes the system matrix contribution from the neighbor side on an internal face.
const bool _use_nonorthogonal_correction_on_boundary
Switch to enable/disable nonorthogonal correction on boundary, this is mostly used to disable boundar...
const bool _use_nonorthogonal_correction
Switch to enable/disable nonorthogonal correction.
virtual Real computeBoundaryRHSContribution(const LinearFVBoundaryCondition &bc) override
Computes the right hand side contribution from a boundary face.
const Point & normal() const
Returns the unit normal vector for the face oriented outward from the face's elem element...
Real _flux_matrix_contribution
The cached matrix contribution.
bool _cached_rhs_contribution
If we already built the right hand side contribution.
virtual void initialSetup() override
Gets called at the beginning of the simulation before this object is asked to do its job...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const Point & eCN() const
const std::unordered_map< BoundaryID, LinearFVBoundaryCondition * > & getBoundaryConditionMap()
Real computeFluxMatrixContribution()
Computes the matrix contribution from the diffusive face flux.
const VectorValue< Real > gradSln(const ElemInfo &elem_info) const
Get the variable gradient at a cell center.
IntRange< T > make_range(T beg, T end)
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type and optionally a file path to the top-level block p...
static InputParameters validParams()
bool _cached_matrix_contribution
If we already built the matrix contribution.
Real _current_face_area
The current, coordinate system specific face area.
Moose::FaceArg makeCDFace(const FaceInfo &fi, const bool correct_skewness=false) const
Make a functor face argument with a central differencing limiter, e.g.
void computeCellGradients()
Switch to request cell gradient computations.
Real _flux_rhs_contribution
The cached right hand side contribution.
Real computeFluxRHSContribution()
Computes the right hand side contribution from the diffusive face flux.
const Point & dCN() const