https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
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)
52 ? &UserObjectInterface::getUserObject<SinglePhaseFluidProperties>(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
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)
96 // Currently an inlet, compute the enthalpy
97 return -_scaling_factor * inflowMassFlux(state) * enthalpy(singleSidedFaceArg(), state, true);
98}
99
100bool
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
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
117template <typename T>
118ADReal
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}
DualNumber< Real, DNDerivativeType, true > ADReal
const double T
registerMooseObject("NavierStokesApp", WCNSFVEnergyFluxBC)
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
ADRealVectorValue _normal
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
void paramError(const std::string &param, Args... args) const
void mooseError(Args &&... args) const
void mooseWarning(Args &&... args) const
Common class for single phase fluid properties.
Moose::StateArg determineState() const
Flux boundary condition for the weakly compressible energy equation.
ADReal enthalpy(const T &loc_arg, const Moose::StateArg &state, const bool inflow) const
Computes the enthalpy using what the user has specified.
const Moose::Functor< ADReal > * _cp
Fluid specific heat capacity functor.
static InputParameters validParams()
const Moose::Functor< ADReal > & _temperature
Fluid temperature functor.
virtual bool isInflow() const override
override because energy_pp is not considered in base class
const Moose::Functor< ADReal > *const _h_fluid
Pointer to the specific enthalpy functor.
const Moose::Functor< ADReal > *const _pressure
Fluid pressure functor.
const PostprocessorValue *const _energy_pp
Postprocessor with the inlet energy flow rate.
const PostprocessorValue *const _temperature_pp
Postprocessor with the inlet temperature.
WCNSFVEnergyFluxBC(const InputParameters &params)
const SinglePhaseFluidProperties *const _fluid
Fluid properties object.
ADReal computeQpResidual() override
Base class for weakly compressible flux boundary conditions.
const Moose::Functor< ADReal > & _rho
Fluid density functor.
const bool _direction_specified_by_user
Flag to store if the flow direction is specified by the user.
ADReal inflowMassFlux(const Moose::StateArg &state) const
computes the inflow massflux
static InputParameters validParams()
const PostprocessorValue *const _mdot_pp
Postprocessor with the inlet mass flow rate.
const Real _scaling_factor
Scaling factor.
const PostprocessorValue *const _velocity_pp
Postprocessor with the inlet velocity.
const PostprocessorValue *const _area_pp
Postprocessor with the inlet area.
ADRealVectorValue varVelocity(const Moose::StateArg &state) const
returns the velocity vector (vel_x, vel_y, vel_z)
static const std::string T_fluid
Definition NS.h:110
static const std::string cp
Definition NS.h:125
static const std::string specific_enthalpy
Definition NS.h:69
static const std::string fluid
Definition NS.h:88
static const std::string pressure
Definition NS.h:57