Line data Source code
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 "PINSFVEnergyTimeDerivative.h" 11 : #include "INSFVEnergyVariable.h" 12 : 13 : #include "NS.h" 14 : 15 : registerMooseObject("NavierStokesApp", PINSFVEnergyTimeDerivative); 16 : 17 : InputParameters 18 473 : PINSFVEnergyTimeDerivative::validParams() 19 : { 20 473 : InputParameters params = FVFunctorTimeKernel::validParams(); 21 473 : 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 473 : params.addRequiredParam<MooseFunctorName>(NS::density, "Density"); 26 1419 : params.addParam<MooseFunctorName>(NS::time_deriv(NS::density), "Density time derivative functor"); 27 473 : params.addParam<MooseFunctorName>(NS::cp, "Specific heat capacity"); 28 473 : params.addParam<MooseFunctorName>(NS::specific_enthalpy, "Specific enthalpy"); 29 1419 : params.addParam<MooseFunctorName>(NS::time_deriv(NS::specific_enthalpy), 30 : "Time derivative of the specific enthalpy"); 31 473 : params.addRequiredParam<MooseFunctorName>(NS::porosity, "Porosity"); 32 : 33 946 : params.addRequiredParam<bool>("is_solid", "Whether this kernel acts on the solid temperature"); 34 946 : 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 473 : return params; 40 0 : } 41 : 42 262 : PINSFVEnergyTimeDerivative::PINSFVEnergyTimeDerivative(const InputParameters & params) 43 : : FVFunctorTimeKernel(params), 44 262 : _rho(getFunctor<ADReal>(NS::density)), 45 262 : _rho_dot(isParamValid(NS::time_deriv(NS::density)) 46 536 : ? &getFunctor<ADReal>(NS::time_deriv(NS::density)) 47 : : nullptr), 48 398 : _cp(isParamValid(NS::cp) ? &getFunctor<ADReal>(NS::cp) : nullptr), 49 376 : _h(isParamValid(NS::specific_enthalpy) ? &getFunctor<ADReal>(NS::specific_enthalpy) : nullptr), 50 262 : _h_dot(isParamValid(NS::time_deriv(NS::specific_enthalpy)) 51 514 : ? &getFunctor<ADReal>(NS::time_deriv(NS::specific_enthalpy)) 52 : : nullptr), 53 262 : _eps(getFunctor<ADReal>(NS::porosity)), 54 524 : _is_solid(getParam<bool>("is_solid")), 55 524 : _scaling(getParam<Real>("scaling")), 56 262 : _zero_scaling(_scaling < 1e-8) 57 : { 58 262 : if (_h_dot && _cp) 59 0 : paramError(NS::time_deriv(NS::specific_enthalpy), 60 : "If specifying the specific enthalpy time derivative, no need to specify the " 61 : "specific heat"); 62 262 : if (!_h_dot && !_cp) 63 0 : paramError( 64 0 : NS::time_deriv(NS::specific_enthalpy), 65 : "One of either the specific heat or the time derivative of the enthalpy must be specified"); 66 262 : if (_rho_dot && (!_cp && !_h)) 67 0 : paramError(NS::time_deriv(NS::density), 68 : "If specifying the time derivative of the density, either the specific heat or the " 69 : "specific enthalpy must be specified"); 70 262 : } 71 : 72 : ADReal 73 1418042 : PINSFVEnergyTimeDerivative::computeQpResidual() 74 : { 75 1418042 : if (_zero_scaling) 76 0 : return 0.0; 77 : else 78 : { 79 1418042 : auto elem_arg = makeElemArg(_current_elem); 80 1418042 : const auto state = determineState(); 81 : ADReal time_derivative; 82 1418042 : if (_h_dot) 83 : { 84 845044 : time_derivative = _rho(elem_arg, state) * (*_h_dot)(elem_arg, state); 85 422522 : if (_rho_dot) 86 816044 : time_derivative += (*_rho_dot)(elem_arg, state) * (*_h)(elem_arg, state); 87 : } 88 : else 89 : { 90 1991040 : time_derivative = _rho(elem_arg, state) * (*_cp)(elem_arg, state) * _var.dot(elem_arg, state); 91 995520 : if (_rho_dot) 92 : time_derivative += 93 31920 : (*_rho_dot)(elem_arg, state) * (*_cp)(elem_arg, state) * _var(elem_arg, state); 94 : } 95 : 96 4212204 : return _scaling * (_is_solid ? 1 - _eps(elem_arg, state) : _eps(elem_arg, state)) * 97 : time_derivative; 98 : } 99 : }