https://mooseframework.inl.gov
WCNSFVEnergyFluxBC.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 
10 #include "WCNSFVEnergyFluxBC.h"
11 #include "INSFVEnergyVariable.h"
13 #include "NS.h"
14 
15 registerMooseObject("NavierStokesApp", WCNSFVEnergyFluxBC);
16 
19 {
21  params.addClassDescription("Flux boundary conditions for energy advection.");
22 
23  // Three different ways to input an advected energy flux
24  // 1) Postprocessor with the energy flow rate directly
25  // 2) Postprocessors for velocity and energy, functors for specific heat and density
26  // 3) Postprocessors for mass flow rate and energy, functor for specific heat
27  params.addParam<PostprocessorName>("energy_pp", "Postprocessor with the inlet energy flow rate");
28  params.addParam<PostprocessorName>("temperature_pp", "Postprocessor with the inlet temperature");
29  params.addParam<MooseFunctorName>(NS::cp, "specific heat capacity functor");
30  params.addRequiredParam<MooseFunctorName>(NS::T_fluid, "temperature functor");
31 
32  // Parameters to solve with the specific enthalpy variable
33  params.addParam<MooseFunctorName>(NS::pressure, "pressure functor");
34  params.addParam<MooseFunctorName>(NS::specific_enthalpy,
35  "Fluid specific enthalpy functor. This can be specified to "
36  "avoid using cp * T as the enthalpy");
37  params.addParam<UserObjectName>(NS::fluid, "Fluid properties object");
38  return params;
39 }
40 
42  : WCNSFVFluxBCBase(params),
43  _temperature_pp(isParamValid("temperature_pp") ? &getPostprocessorValue("temperature_pp")
44  : nullptr),
45  _energy_pp(isParamValid("energy_pp") ? &getPostprocessorValue("energy_pp") : nullptr),
46  _cp(isParamValid(NS::cp) ? &getFunctor<ADReal>(NS::cp) : nullptr),
47  _temperature(getFunctor<ADReal>(NS::T_fluid)),
48  _pressure(isParamValid(NS::pressure) ? &getFunctor<ADReal>(NS::pressure) : nullptr),
49  _h_fluid(isParamValid(NS::specific_enthalpy) ? &getFunctor<ADReal>(NS::specific_enthalpy)
50  : nullptr),
51  _fluid(isParamValid(NS::fluid)
53  : nullptr)
54 {
55  if (!dynamic_cast<INSFVEnergyVariable *>(&_var))
56  paramError("variable",
57  "The variable argument to WCNSFVEnergyFluxBC must be of type INSFVEnergyVariable");
58 
59  // Density is often set as global parameters so it is not checked
61  mooseWarning("If setting the energy flow rate directly, "
62  "no need for inlet velocity (magnitude or direction), mass flow or temperature");
63 
64  // Need enough information if trying to use a mass flow rate postprocessor
65  if (!_energy_pp)
66  {
67  if (!_temperature_pp)
68  mooseError("If not providing the energy flow rate, "
69  "the inlet temperature should be provided");
70  if (!_velocity_pp && !_mdot_pp)
71  mooseError("If not providing the inlet energy flow rate, the inlet velocity or mass flow "
72  "should be provided");
73  if (_mdot_pp && !_area_pp)
74  mooseError("If providing the inlet mass flow rate, the flow"
75  " area should be provided as well");
76  }
77  else if (!_area_pp)
78  paramError("energy_pp",
79  "If supplying the energy flow rate, the flow area should be provided as well");
80 }
81 
82 ADReal
84 {
85  const auto state = determineState();
86 
87  // Currently an outlet
88  if (!isInflow())
89  {
90  const auto fa = singleSidedFaceArg();
91  return varVelocity(state) * _normal * _rho(fa, state) * enthalpy(fa, state, false);
92  }
93  // Currently an inlet with a set enthalpy
94  else if (_energy_pp)
95  return -_scaling_factor * *_energy_pp / *_area_pp;
96  // Currently an inlet, compute the enthalpy
97  return -_scaling_factor * inflowMassFlux(state) * enthalpy(singleSidedFaceArg(), state, true);
98 }
99 
100 bool
102 {
103  if (_mdot_pp)
104  return *_mdot_pp >= 0;
105  else if (_velocity_pp)
106  return *_velocity_pp >= 0;
107  else if (_energy_pp)
108  return *_energy_pp >= 0;
109 
110  mooseError(
111  "Either mdot_pp or velocity_pp or energy_pp need to be provided OR this function must be "
112  "overridden in derived classes if other input parameter combinations are valid. "
113  "Neither mdot_pp nor velocity_pp are provided.");
114  return true;
115 }
116 
117 template <typename T>
118 ADReal
120  const Moose::StateArg & state,
121  const bool inflow) const
122 {
123  // Outlet, use interior values
124  if (!inflow)
125  {
126  if (_h_fluid)
127  return (*_h_fluid)(loc_arg, state);
128  else if (_fluid)
129  return _fluid->h_from_p_T((*_pressure)(loc_arg, state), _temperature(loc_arg, state));
130  else if (_temperature_pp)
131  return (*_cp)(loc_arg, state) * _temperature(loc_arg, state);
132  }
133  else
134  {
135  if (_temperature_pp)
136  {
137  // Preferable to use the fluid property if we know it
138  if (_fluid)
139  return _fluid->h_from_p_T((*_pressure)(loc_arg, state), (*_temperature_pp));
140  else if (_cp)
141  return (*_cp)(loc_arg, state) * (*_temperature_pp);
142  }
143  }
144  mooseError("Should not reach here, constructor checks required functor inputs to flux BC");
145 }
const PostprocessorValue *const _velocity_pp
Postprocessor with the inlet velocity.
const PostprocessorValue *const _mdot_pp
Postprocessor with the inlet mass flow rate.
const PostprocessorValue *const _temperature_pp
Postprocessor with the inlet temperature.
const bool _direction_specified_by_user
Flag to store if the flow direction is specified by the user.
registerMooseObject("NavierStokesApp", WCNSFVEnergyFluxBC)
const Moose::Functor< ADReal > & _rho
Fluid density functor.
ADRealVectorValue varVelocity(const Moose::StateArg &state) const
returns the velocity vector (vel_x, vel_y, vel_z)
void paramError(const std::string &param, Args... args) const
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
Moose::StateArg determineState() const
ADReal inflowMassFlux(const Moose::StateArg &state) const
computes the inflow massflux
static const std::string fluid
Definition: NS.h:87
Base class for weakly compressible flux boundary conditions.
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
MooseVariableFV< Real > & _var
const Moose::Functor< ADReal > & _temperature
Fluid temperature functor.
ADReal enthalpy(const T &loc_arg, const Moose::StateArg &state, const bool inflow) const
Computes the enthalpy using what the user has specified.
DualNumber< Real, DNDerivativeType, true > ADReal
void addRequiredParam(const std::string &name, const std::string &doc_string)
virtual bool isInflow() const override
override because energy_pp is not considered in base class
static InputParameters validParams()
const SinglePhaseFluidProperties *const _fluid
Fluid properties object.
static const std::string cp
Definition: NS.h:121
static InputParameters validParams()
static const std::string T_fluid
Definition: NS.h:106
const PostprocessorValue *const _energy_pp
Postprocessor with the inlet energy flow rate.
const PostprocessorValue *const _area_pp
Postprocessor with the inlet area.
ADRealVectorValue _normal
Common class for single phase fluid properties.
ADReal computeQpResidual() override
const Moose::Functor< ADReal > *const _h_fluid
Pointer to the specific enthalpy functor.
static const std::string pressure
Definition: NS.h:56
void mooseWarning(Args &&... args) const
const Real _scaling_factor
Scaling factor.
const Moose::Functor< ADReal > *const _pressure
Fluid pressure functor.
void mooseError(Args &&... args) const
void addClassDescription(const std::string &doc_string)
WCNSFVEnergyFluxBC(const InputParameters &params)
Flux boundary condition for the weakly compressible energy equation.
const Moose::Functor< ADReal > * _cp
Fluid specific heat capacity functor.
static const std::string specific_enthalpy
Definition: NS.h:68