https://mooseframework.inl.gov
Loading...
Searching...
No Matches
PINSFVEnergyDiffusion.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 "INSFVEnergyVariable.h"
12#include "NS.h"
13
15
18{
19 auto params = FVFluxKernel::validParams();
21 params.addClassDescription("Diffusion term in the porous media incompressible Navier-Stokes "
22 "fluid energy equations : $-div(eps * k * grad(T))$");
23 params.addRequiredParam<MooseFunctorName>(NS::porosity, "Porosity");
24 params.addRequiredParam<MooseFunctorName>(NS::k, "Thermal conductivity");
25 params.addParam<bool>(
26 "effective_diffusivity",
27 false,
28 "Whether the conductivity should be multiplied by porosity, or whether the provided "
29 "conductivity is an effective conductivity taking porosity effects into account");
30 params.renameParam("effective_diffusivity", "effective_conductivity", "");
31 MooseEnum coeff_interp_method("average harmonic", "harmonic");
32 params.addParam<MooseEnum>(
33 "kappa_interp_method",
34 coeff_interp_method,
35 "Switch that can select face interpolation method for the thermal conductivity.");
36
37 // We add the relationship manager here, this will select the right number of
38 // ghosting layers depending on the chosen interpolation method
39 params.addRelationshipManager(
40 "ElementSideNeighborLayers",
41 Moose::RelationshipManagerType::GEOMETRIC | Moose::RelationshipManagerType::ALGEBRAIC |
42 Moose::RelationshipManagerType::COUPLING,
43 [](const InputParameters & obj_params, InputParameters & rm_params)
44 { FVRelationshipManagerInterface::setRMParamsDiffusion(obj_params, rm_params, 3); });
45
46 params.set<unsigned short>("ghost_layers") = 2;
47 return params;
48}
49
51 : FVFluxKernel(params),
53 _k(getFunctor<ADReal>(NS::k)),
54 _eps(getFunctor<ADReal>(NS::porosity)),
55 _porosity_factored_in(getParam<bool>("effective_conductivity")),
56 _k_interp_method(
57 Moose::FV::selectInterpolationMethod(getParam<MooseEnum>("kappa_interp_method")))
58{
59 if (!dynamic_cast<INSFVEnergyVariable *>(&_var))
60 mooseError("PINSFVEnergyDiffusion may only be used with a fluid temperature variable, "
61 "of variable type INSFVEnergyVariable.");
62}
63
66{
67 // Interpolate thermal conductivity times porosity on the face
68 ADReal k_eps_face;
69 const auto state = determineState();
70
72 {
73 const auto ssf = singleSidedFaceArg();
74 k_eps_face = _porosity_factored_in ? _k(ssf, state) : _k(ssf, state) * _eps(ssf, state);
75 }
76 else
77 {
78 const auto face_elem = elemArg();
79 const auto face_neighbor = neighborArg();
80
81 auto value1 = _porosity_factored_in ? _k(face_elem, state)
82 : _k(face_elem, state) * _eps(face_elem, state);
83 auto value2 = _porosity_factored_in ? _k(face_neighbor, state)
84 : _k(face_neighbor, state) * _eps(face_neighbor, state);
85
86 // Adapt to users either passing 0 thermal conductivity, 0 porosity, or k correlations going
87 // negative. The solution is invalid only for the latter case.
88 auto k_interp_method = _k_interp_method;
89 if (value1 <= 0 || value2 <= 0)
90 {
91 flagInvalidSolution(
92 "Negative or null thermal conductivity value. If this is on purpose use arithmetic mean "
93 "interpolation instead of the default harmonic interpolation.");
94 if (_k_interp_method == Moose::FV::InterpMethod::HarmonicAverage)
95 k_interp_method = Moose::FV::InterpMethod::Average;
96 if (value1 < 0)
97 value1 = 0;
98 if (value2 < 0)
99 value2 = 0;
100 }
101
102 Moose::FV::interpolate(k_interp_method, k_eps_face, value1, value2, *_face_info, true);
103 }
104
105 // Compute the temperature gradient dotted with the surface normal
106 auto dTdn = gradUDotNormal(state, _correct_skewness);
107
108 return -k_eps_face * dTdn;
109}
DualNumber< Real, DNDerivativeType, true > ADReal
registerMooseObject("NavierStokesApp", PINSFVEnergyDiffusion)
static InputParameters validParams()
Moose::ElemArg neighborArg(bool correct_skewness=false) const
Moose::ElemArg elemArg(bool correct_skewness=false) const
static InputParameters validParams()
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
virtual ADReal gradUDotNormal(const Moose::StateArg &time, const bool correct_skewness) const
const FaceInfo * _face_info
static void setRMParamsDiffusion(const InputParameters &obj_params, InputParameters &rm_params, const unsigned short conditional_extended_layers)
void mooseError(Args &&... args) const
A flux kernel for diffusing energy in porous media across cell faces, using a scalar isotropic diffus...
ADReal computeQpResidual() override
static InputParameters validParams()
const Moose::Functor< ADReal > & _k
the thermal conductivity
const Moose::Functor< ADReal > & _eps
the porosity
const bool _porosity_factored_in
whether the diffusivity should be multiplied by porosity
PINSFVEnergyDiffusion(const InputParameters &params)
const Moose::FV::InterpMethod _k_interp_method
which interpolation method for the diffusivity on faces
Moose::StateArg determineState() const
void interpolate(InterpMethod m, T &result, const T2 &value1, const T3 &value2, const FaceInfo &fi, const bool one_is_elem)
static const std::string k
Definition NS.h:134
static const std::string porosity
Definition NS.h:108