LCOV - code coverage report
Current view: top level - src/fvkernels - PINSFVEnergyTimeDerivative.C (source / functions) Hit Total Coverage
Test: idaholab/moose navier_stokes: ba1ead Lines: 40 46 87.0 %
Date: 2025-08-13 06:50:25 Functions: 3 3 100.0 %
Legend: Lines: hit not hit

          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             : }

Generated by: LCOV version 1.14