https://mooseframework.inl.gov
PINSFVEnergyTimeDerivative.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 
13 #include "NS.h"
14 
16 
19 {
21  params.addClassDescription(
22  "Adds the time derivative term to the Navier-Stokes energy equation: "
23  "for fluids: d(eps * rho * cp * T)/dt, for solids: (1 - eps) * d(rho * cp * T)/dt"
24  "Material property derivatives are ignored if not provided.");
25  params.addRequiredParam<MooseFunctorName>(NS::density, "Density");
26  params.addParam<MooseFunctorName>(NS::time_deriv(NS::density), "Density time derivative functor");
27  params.addParam<MooseFunctorName>(NS::cp, "Specific heat capacity");
28  params.addParam<MooseFunctorName>(NS::specific_enthalpy, "Specific enthalpy");
29  params.addParam<MooseFunctorName>(NS::time_deriv(NS::specific_enthalpy),
30  "Time derivative of the specific enthalpy");
31  params.addRequiredParam<MooseFunctorName>(NS::porosity, "Porosity");
32 
33  params.addRequiredParam<bool>("is_solid", "Whether this kernel acts on the solid temperature");
34  params.addRangeCheckedParam<Real>("scaling",
35  1,
36  "scaling >= 0.0",
37  "scaling factor to reduce the thermal mass during pseudo "
38  "transients; this can accelerate convergence to steady state");
39  return params;
40 }
41 
43  : FVFunctorTimeKernel(params),
44  _rho(getFunctor<ADReal>(NS::density)),
45  _rho_dot(isParamValid(NS::time_deriv(NS::density))
46  ? &getFunctor<ADReal>(NS::time_deriv(NS::density))
47  : nullptr),
48  _cp(isParamValid(NS::cp) ? &getFunctor<ADReal>(NS::cp) : nullptr),
49  _h(isParamValid(NS::specific_enthalpy) ? &getFunctor<ADReal>(NS::specific_enthalpy) : nullptr),
50  _h_dot(isParamValid(NS::time_deriv(NS::specific_enthalpy))
51  ? &getFunctor<ADReal>(NS::time_deriv(NS::specific_enthalpy))
52  : nullptr),
53  _eps(getFunctor<ADReal>(NS::porosity)),
54  _is_solid(getParam<bool>("is_solid")),
55  _scaling(getParam<Real>("scaling")),
56  _zero_scaling(_scaling < 1e-8)
57 {
58  if (_h_dot && _cp)
60  "If specifying the specific enthalpy time derivative, no need to specify the "
61  "specific heat");
62  if (!_h_dot && !_cp)
63  paramError(
65  "One of either the specific heat or the time derivative of the enthalpy must be specified");
66  if (_rho_dot && (!_cp && !_h))
68  "If specifying the time derivative of the density, either the specific heat or the "
69  "specific enthalpy must be specified");
70 }
71 
72 ADReal
74 {
75  if (_zero_scaling)
76  return 0.0;
77  else
78  {
79  auto elem_arg = makeElemArg(_current_elem);
80  const auto state = determineState();
81  ADReal time_derivative;
82  if (_h_dot)
83  {
84  time_derivative = _rho(elem_arg, state) * (*_h_dot)(elem_arg, state);
85  if (_rho_dot)
86  time_derivative += (*_rho_dot)(elem_arg, state) * (*_h)(elem_arg, state);
87  }
88  else
89  {
90  time_derivative = _rho(elem_arg, state) * (*_cp)(elem_arg, state) * _var.dot(elem_arg, state);
91  if (_rho_dot)
92  time_derivative +=
93  (*_rho_dot)(elem_arg, state) * (*_cp)(elem_arg, state) * _var(elem_arg, state);
94  }
95 
96  return _scaling * (_is_solid ? 1 - _eps(elem_arg, state) : _eps(elem_arg, state)) *
97  time_derivative;
98  }
99 }
const bool _is_solid
whether this kernel is being used for a solid or a fluid temperature
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
const Moose::Functor< ADReal > *const _h
the specific enthalpy
Moose::StateArg determineState() const
static const std::string density
Definition: NS.h:33
static InputParameters validParams()
DualNumber< Real, DNDerivativeType, true > ADReal
const Moose::Functor< ADReal > & _rho
the density
const Moose::Functor< ADReal > & _eps
the porosity
void addRequiredParam(const std::string &name, const std::string &doc_string)
Moose::ElemArg makeElemArg(const Elem *elem, bool correct_skewnewss=false) const
static const std::string porosity
Definition: NS.h:104
static const std::string cp
Definition: NS.h:121
static InputParameters validParams()
const Elem *const & _current_elem
const Moose::Functor< ADReal > *const _cp
the specific heat or isobaric heat capacity
registerMooseObject("NavierStokesApp", PINSFVEnergyTimeDerivative)
void paramError(const std::string &param, Args... args) const
const Moose::Functor< ADReal > *const _rho_dot
the time derivative of the density
PINSFVEnergyTimeDerivative(const InputParameters &params)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
DotType dot(const ElemArg &elem, const StateArg &state) const
const Real _scaling
scales the value of the kernel, used for faster steady state during pseudo transient ...
void addClassDescription(const std::string &doc_string)
void addRangeCheckedParam(const std::string &name, const T &value, const std::string &parsed_function, const std::string &doc_string)
const Moose::Functor< ADReal > *const _h_dot
the time derivative of the specific enthalpy
MooseVariableFV< Real > & _var
std::string time_deriv(const std::string &var)
Definition: NS.h:97
const bool _zero_scaling
whether a zero scaling factor has been specifed
static const std::string specific_enthalpy
Definition: NS.h:68