LCOV - code coverage report
Current view: top level - src/bcs - PorousFlowEnthalpySink.C (source / functions) Hit Total Coverage
Test: idaholab/moose porous_flow: #31405 (292dce) with base fef103 Lines: 42 43 97.7 %
Date: 2025-09-04 07:55:56 Functions: 6 6 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 "PorousFlowEnthalpySink.h"
      11             : #include "Function.h"
      12             : #include "PorousFlowDictator.h"
      13             : #include "SinglePhaseFluidProperties.h"
      14             : #include "MooseVariable.h"
      15             : #include "PorousFlowSinkBC.h"
      16             : 
      17             : #include "libmesh/quadrature.h"
      18             : 
      19             : #include <iostream>
      20             : 
      21             : registerMooseObject("PorousFlowApp", PorousFlowEnthalpySink);
      22             : 
      23             : InputParameters
      24         190 : PorousFlowEnthalpySink::validParams()
      25             : {
      26         190 :   InputParameters params = IntegratedBC::validParams();
      27         190 :   params += PorousFlowSinkBC::validParamsCommon();
      28         380 :   params.addRequiredParam<UserObjectName>(
      29             :       "PorousFlowDictator", "The UserObject that holds the list of PorousFlow variable names");
      30         190 :   params.addClassDescription(
      31             :       "Applies a source equal to the product of the mass flux and the "
      32             :       "fluid enthalpy. The enthalpy is computed at temperature T_in and pressure equal to the "
      33             :       "porepressure in the porous medium, if fluid_phase is given, otherwise at the supplied "
      34             :       "porepressure. Hence this adds heat energy to the porous medium at rate corresponding to a "
      35             :       "fluid being injected at (porepressure, T_in) at rate (-flux_function).");
      36             : 
      37         190 :   return params;
      38           0 : }
      39             : 
      40         106 : PorousFlowEnthalpySink::PorousFlowEnthalpySink(const InputParameters & parameters)
      41             :   : IntegratedBC(parameters),
      42         106 :     _dictator(getUserObject<PorousFlowDictator>("PorousFlowDictator")),
      43         141 :     _pressure(isCoupled("porepressure_var") ? &coupledValue("porepressure_var") : nullptr),
      44         354 :     _ph(isParamValid("fluid_phase") ? getParam<unsigned int>("fluid_phase")
      45             :                                     : libMesh::invalid_uint),
      46         106 :     _m_func(getFunction("flux_function")),
      47         212 :     _pp(getMaterialProperty<std::vector<Real>>("PorousFlow_porepressure_nodal")),
      48         106 :     _dpp_dvar(
      49         106 :         getMaterialProperty<std::vector<std::vector<Real>>>("dPorousFlow_porepressure_nodal_dvar")),
      50         212 :     _T_in(getParam<Real>("T_in")),
      51         212 :     _fp(getUserObject<SinglePhaseFluidProperties>("fp"))
      52             : {
      53         176 :   if ((_pressure != nullptr) && (isParamValid("fluid_phase")))
      54           2 :     mooseError(name(), ": Cannot specify both pressure and pore pressure.");
      55             : 
      56         315 :   if ((_pressure == nullptr) && (!isParamValid("fluid_phase")))
      57           2 :     mooseError(name(), ": You have to specify either 'pressure' or 'fluid_phase'.");
      58             : 
      59         204 :   if (isParamValid("fluid_phase"))
      60          69 :     if (_ph >= _dictator.numPhases())
      61           2 :       mooseError(name(),
      62             :                  ": Specified 'fluid_phase' is larger than the number of phases available in the "
      63             :                  "simulation (",
      64           2 :                  _dictator.numPhases(),
      65             :                  ").");
      66         100 : }
      67             : 
      68             : Real
      69       48632 : PorousFlowEnthalpySink::computeQpResidual()
      70             : {
      71             :   Real h;
      72       48632 :   if (_pressure)
      73       10208 :     h = _fp.h_from_p_T((*_pressure)[_qp], _T_in);
      74             :   else
      75       38424 :     h = _fp.h_from_p_T(_pp[_i][_ph], _T_in);
      76             : 
      77       48632 :   return _test[_i][_qp] * _m_func.value(_t, _q_point[_qp]) * h;
      78             : }
      79             : 
      80             : Real
      81      286100 : PorousFlowEnthalpySink::computeQpJacobian()
      82             : {
      83      286100 :   return jac(_var.number());
      84             : }
      85             : 
      86             : Real
      87      286100 : PorousFlowEnthalpySink::computeQpOffDiagJacobian(unsigned int jvar)
      88             : {
      89      286100 :   return jac(jvar);
      90             : }
      91             : 
      92             : Real
      93      572200 : PorousFlowEnthalpySink::jac(unsigned int jvar) const
      94             : {
      95      572200 :   if (_dictator.notPorousFlowVariable(jvar))
      96             :     return 0.0;
      97             : 
      98      572200 :   const unsigned int pvar = _dictator.porousFlowVariableNum(jvar);
      99             : 
     100      572200 :   if (_i != _j)
     101             :     return 0.0;
     102             : 
     103             :   Real jac;
     104       71668 :   if (_pressure)
     105             :   {
     106             :     jac = 0.;
     107             :   }
     108             :   else
     109             :   {
     110             :     Real h, dh_dpp, dh_dT;
     111       56996 :     _fp.h_from_p_T(_pp[_i][_ph], _T_in, h, dh_dpp, dh_dT);
     112       56996 :     jac = dh_dpp * _dpp_dvar[_i][_ph][pvar];
     113             :   }
     114       71668 :   return _test[_i][_qp] * _m_func.value(_t, _q_point[_qp]) * jac;
     115             : }

Generated by: LCOV version 1.14