https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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{
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)
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
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}
DualNumber< Real, DNDerivativeType, true > ADReal
registerMooseObject("NavierStokesApp", PINSFVEnergyTimeDerivative)
MooseVariableFV< Real > & _var
const Elem *const & _current_elem
static InputParameters validParams()
Moose::ElemArg makeElemArg(const Elem *elem, bool correct_skewnewss=false) const
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 addRangeCheckedParam(const std::string &name, const T &value, const std::string &parsed_function, const std::string &doc_string)
void paramError(const std::string &param, Args... args) const
DotType dot(const ElemArg &elem, const StateArg &state) const
const Moose::Functor< ADReal > *const _rho_dot
the time derivative of the density
const bool _zero_scaling
whether a zero scaling factor has been specifed
static InputParameters validParams()
const Moose::Functor< ADReal > & _rho
the density
PINSFVEnergyTimeDerivative(const InputParameters &params)
const Real _scaling
scales the value of the kernel, used for faster steady state during pseudo transient
const Moose::Functor< ADReal > *const _cp
the specific heat or isobaric heat capacity
const Moose::Functor< ADReal > & _eps
the porosity
const Moose::Functor< ADReal > *const _h
the specific enthalpy
const Moose::Functor< ADReal > *const _h_dot
the time derivative of the specific enthalpy
const bool _is_solid
whether this kernel is being used for a solid or a fluid temperature
Moose::StateArg determineState() const
static const std::string density
Definition NS.h:34
static const std::string cp
Definition NS.h:125
static const std::string specific_enthalpy
Definition NS.h:69
static const std::string porosity
Definition NS.h:108
std::string time_deriv(const std::string &var)
Definition NS.h:98