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.");
27 params.
addParam<MooseFunctorName>(
"diffusion_coeff", 1.0,
"The diffusion coefficient.");
28 params.
addParam<InterpolationMethodName>(
29 "coeff_interp_method",
30 "Optional finite volume interpolation method used to compute a face-centered diffusion "
31 "coefficient. If omitted, the functor is evaluated directly on the face.");
38 _diffusion_coeff(getFunctor<Real>(
"diffusion_coeff")),
39 _coeff_interp_method(isParamValid(
"coeff_interp_method")
40 ? &getFVFaceInterpolationMethod(
41 getParam<InterpolationMethodName>(
"coeff_interp_method"))
43 _use_nonorthogonal_correction(getParam<bool>(
"use_nonorthogonal_correction")),
44 _flux_matrix_contribution(0.0),
45 _flux_rhs_contribution(0.0),
46 _cached_face_diffusivity(false),
47 _face_diffusivity(0.0)
59 "faceDiffusivity() is only valid for two-sided internal faces.");
88 bc.second->type(),
" is not a compatible boundary condition with ", this->
type(),
"!");
149 const auto interp_coeffs =
154 const auto correction_vector =
161 (interp_coeffs.first * grad_elem + interp_coeffs.second * grad_neighbor) *
172 const auto *
const diff_bc = libMesh::cast_ptr<const LinearFVAdvectionDiffusionBC *>(&bc);
174 auto grad_contrib = diff_bc->computeBoundaryGradientMatrixContribution() *
_current_face_area;
177 if (!diff_bc->includesMaterialPropertyMultiplier())
190 mooseAssert(diff_bc,
"This should be a valid BC!");
194 auto grad_contrib = diff_bc->computeBoundaryGradientRHSContribution() *
_current_face_area;
198 if (!diff_bc->includesMaterialPropertyMultiplier())
213 const Real boundary_normal_multiplier =
219 const auto correction_vector =
registerMooseObject("MooseApp", LinearFVDiffusion)
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
virtual Real interpolate(const FaceInfo &face, Real elem_value, Real neighbor_value) const =0
Face interpolation operation for this method.
Helper interface for objects that need access to FVInterpolationMethod instances.
Moose::FaceArg makeCDFace(const FaceInfo &fi, const bool correct_skewness=false) const
Make a functor face argument with a central differencing limiter, e.g.
This data structure is used to store geometric and variable related metadata about each cell face in ...
const Point & normal() const
Returns the unit normal vector for the face oriented outward from the face's elem element.
const Point & eCN() const
const ElemInfo * elemInfo() const
const ElemInfo * neighborInfo() const
const Point & dCN() const
const Point & faceCentroid() const
Returns the coordinates of the face centroid.
Base class for boundary conditions that are valid for advection diffusion problems.
Base class for boundary conditions for linear FV systems.
Kernel that adds contributions from a diffusion term discretized using the finite volume method to a ...
const FVFaceInterpolationMethod * _coeff_interp_method
Optional interpolation method for the diffusion coefficient.
const bool _use_nonorthogonal_correction
Switch to enable/disable nonorthogonal correction.
LinearFVDiffusion(const InputParameters ¶ms)
Class constructor.
virtual Real computeNeighborMatrixContribution() override
Computes the system matrix contribution from the neighbor side on an internal face.
static InputParameters validParams()
virtual Real computeElemRightHandSideContribution() override
Computes the right hand side contribution from the element side on an internal face.
Real computeFluxMatrixContribution()
Computes the matrix contribution from the diffusive face flux.
virtual Real computeBoundaryMatrixContribution(const LinearFVBoundaryCondition &bc) override
Computes the matrix contribution from a boundary face.
Real _flux_matrix_contribution
The cached matrix contribution.
bool _cached_face_diffusivity
Cache for interpolated diffusion coefficient.
virtual void setupFaceData(const FaceInfo *face_info) override
Set the current FaceInfo object.
Real computeFluxRHSContribution()
Computes the right hand side contribution from the diffusive face flux.
virtual Real computeBoundaryRHSContribution(const LinearFVBoundaryCondition &bc) override
Computes the right hand side contribution from a boundary face.
const Moose::Functor< Real > & _diffusion_coeff
The functor for the diffusion coefficient.
Real faceDiffusivity() const
Returns the diffusion coefficient interpolated to the current face.
Real _flux_rhs_contribution
The cached right hand side contribution.
virtual Real computeElemMatrixContribution() override
Computes the system matrix contribution from an element side on an internal face.
virtual Real computeNeighborRightHandSideContribution() override
Computes the right hand side contribution from the neighbor side on an internal face.
virtual void initialSetup() override
Gets called at the beginning of the simulation before this object is asked to do its job.
Finite volume kernel that contributes approximations of discretized face flux terms to the matrix and...
bool _cached_matrix_contribution
If we already built the matrix contribution.
bool _cached_rhs_contribution
If we already built the right hand side contribution.
FaceInfo::VarFaceNeighbors _current_face_type
Face ownership information for the current 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.
virtual void setupFaceData(const FaceInfo *face_info)
Set the current FaceInfo object.
Real _current_face_area
The current, coordinate system specific face area.
const FaceInfo * _current_face_info
Pointer to the face info we are operating on right now.
static InputParameters validParams()
MooseLinearVariableFV< Real > & _var
Reference to the linear finite volume variable.
const std::string & type() const
Get the type of this class.
void computeCellGradients()
Switch to request cell gradient computations.
const std::unordered_map< BoundaryID, LinearFVBoundaryCondition * > & getBoundaryConditionMap() const
VectorValue< Real > gradSln(const ElemInfo &elem_info, const StateArg &state) const
Get the variable gradient at a cell center.
Moose::StateArg determineState() const
Create a functor state argument that corresponds to the implicit state of this object.
@ Average
gc*elem+(1-gc)*neighbor