LCOV - code coverage report
Current view: top level - src/kernels - PorousFlowHeatVolumetricExpansion.C (source / functions) Hit Total Coverage
Test: idaholab/moose porous_flow: #32971 (54bef8) with base c6cf66 Lines: 78 79 98.7 %
Date: 2026-05-29 20:38:56 Functions: 7 7 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 "PorousFlowHeatVolumetricExpansion.h"
      11             : 
      12             : #include "MooseVariable.h"
      13             : 
      14             : registerMooseObject("PorousFlowApp", PorousFlowHeatVolumetricExpansion);
      15             : 
      16             : InputParameters
      17         212 : PorousFlowHeatVolumetricExpansion::validParams()
      18             : {
      19         212 :   InputParameters params = TimeKernel::validParams();
      20         424 :   params.addParam<bool>("strain_at_nearest_qp",
      21         424 :                         false,
      22             :                         "When calculating nodal porosity that depends on strain, use the strain at "
      23             :                         "the nearest quadpoint.  This adds a small extra computational burden, and "
      24             :                         "is not necessary for simulations involving only linear lagrange elements. "
      25             :                         " If you set this to true, you will also want to set the same parameter to "
      26             :                         "true for related Kernels and Materials");
      27         424 :   params.addRequiredParam<UserObjectName>(
      28             :       "PorousFlowDictator", "The UserObject that holds the list of PorousFlow variable names.");
      29         212 :   params.set<bool>("use_displaced_mesh") = false;
      30         212 :   params.suppressParameter<bool>("use_displaced_mesh");
      31         212 :   params.addClassDescription("Energy-density*rate_of_solid_volumetric_expansion.  The "
      32             :                              "energy-density is lumped to the nodes");
      33         212 :   return params;
      34           0 : }
      35             : 
      36         112 : PorousFlowHeatVolumetricExpansion::PorousFlowHeatVolumetricExpansion(
      37         112 :     const InputParameters & parameters)
      38             :   : TimeKernel(parameters),
      39         112 :     _dictator(getUserObject<PorousFlowDictator>("PorousFlowDictator")),
      40         112 :     _var_is_porflow_var(_dictator.isPorousFlowVariable(_var.number())),
      41         112 :     _num_phases(_dictator.numPhases()),
      42         112 :     _fluid_present(_num_phases > 0),
      43         224 :     _strain_at_nearest_qp(getParam<bool>("strain_at_nearest_qp")),
      44         224 :     _porosity(getMaterialProperty<Real>("PorousFlow_porosity_nodal")),
      45         224 :     _dporosity_dvar(getMaterialProperty<std::vector<Real>>("dPorousFlow_porosity_nodal_dvar")),
      46         112 :     _dporosity_dgradvar(
      47         112 :         getMaterialProperty<std::vector<RealGradient>>("dPorousFlow_porosity_nodal_dgradvar")),
      48         224 :     _nearest_qp(_strain_at_nearest_qp
      49         119 :                     ? &getMaterialProperty<unsigned int>("PorousFlow_nearestqp_nodal")
      50             :                     : nullptr),
      51         224 :     _rock_energy_nodal(getMaterialProperty<Real>("PorousFlow_matrix_internal_energy_nodal")),
      52         112 :     _drock_energy_nodal_dvar(
      53         112 :         getMaterialProperty<std::vector<Real>>("dPorousFlow_matrix_internal_energy_nodal_dvar")),
      54         224 :     _fluid_density(_fluid_present ? &getMaterialProperty<std::vector<Real>>(
      55             :                                         "PorousFlow_fluid_phase_density_nodal")
      56             :                                   : nullptr),
      57         224 :     _dfluid_density_dvar(_fluid_present ? &getMaterialProperty<std::vector<std::vector<Real>>>(
      58             :                                               "dPorousFlow_fluid_phase_density_nodal_dvar")
      59             :                                         : nullptr),
      60         112 :     _fluid_saturation_nodal(
      61         224 :         _fluid_present ? &getMaterialProperty<std::vector<Real>>("PorousFlow_saturation_nodal")
      62             :                        : nullptr),
      63         224 :     _dfluid_saturation_nodal_dvar(_fluid_present
      64         224 :                                       ? &getMaterialProperty<std::vector<std::vector<Real>>>(
      65             :                                             "dPorousFlow_saturation_nodal_dvar")
      66             :                                       : nullptr),
      67         224 :     _energy_nodal(_fluid_present ? &getMaterialProperty<std::vector<Real>>(
      68             :                                        "PorousFlow_fluid_phase_internal_energy_nodal")
      69             :                                  : nullptr),
      70         224 :     _denergy_nodal_dvar(_fluid_present ? &getMaterialProperty<std::vector<std::vector<Real>>>(
      71             :                                              "dPorousFlow_fluid_phase_internal_energy_nodal_dvar")
      72             :                                        : nullptr),
      73         224 :     _strain_rate_qp(getMaterialProperty<Real>("PorousFlow_volumetric_strain_rate_qp")),
      74         224 :     _dstrain_rate_qp_dvar(getMaterialProperty<std::vector<RealGradient>>(
      75         112 :         "dPorousFlow_volumetric_strain_rate_qp_dvar"))
      76             : {
      77         112 : }
      78             : 
      79             : Real
      80      192784 : PorousFlowHeatVolumetricExpansion::computeQpResidual()
      81             : {
      82      192784 :   Real energy = (1.0 - _porosity[_i]) * _rock_energy_nodal[_i];
      83      400448 :   for (unsigned ph = 0; ph < _num_phases; ++ph)
      84      207664 :     energy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *
      85      207664 :               (*_energy_nodal)[_i][ph] * _porosity[_i];
      86             : 
      87      192784 :   return _test[_i][_qp] * energy * _strain_rate_qp[_qp];
      88             : }
      89             : 
      90             : Real
      91      677824 : PorousFlowHeatVolumetricExpansion::computeQpJacobian()
      92             : {
      93      677824 :   return computedEnergyQpJac(_var.number()) + computedVolQpJac(_var.number());
      94             : }
      95             : 
      96             : Real
      97     2335040 : PorousFlowHeatVolumetricExpansion::computeQpOffDiagJacobian(unsigned int jvar)
      98             : {
      99     2335040 :   return computedEnergyQpJac(jvar) + computedVolQpJac(jvar);
     100             : }
     101             : 
     102             : Real
     103     3012864 : PorousFlowHeatVolumetricExpansion::computedVolQpJac(unsigned int jvar)
     104             : {
     105     3012864 :   if (_dictator.notPorousFlowVariable(jvar))
     106             :     return 0.0;
     107             : 
     108     3012864 :   Real energy = (1.0 - _porosity[_i]) * _rock_energy_nodal[_i];
     109     6217728 :   for (unsigned ph = 0; ph < _num_phases; ++ph)
     110     3204864 :     energy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *
     111     3204864 :               (*_energy_nodal)[_i][ph] * _porosity[_i];
     112             : 
     113     3012864 :   const unsigned int pvar = _dictator.porousFlowVariableNum(jvar);
     114     3012864 :   Real dvol = _dstrain_rate_qp_dvar[_qp][pvar] * _grad_phi[_j][_qp];
     115             : 
     116     3012864 :   return _test[_i][_qp] * energy * dvol;
     117             : }
     118             : Real
     119     3012864 : PorousFlowHeatVolumetricExpansion::computedEnergyQpJac(unsigned int jvar)
     120             : {
     121     3012864 :   if (_dictator.notPorousFlowVariable(jvar))
     122             :     return 0.0;
     123             : 
     124     3012864 :   const unsigned int pvar = _dictator.porousFlowVariableNum(jvar);
     125     3012864 :   const unsigned nearest_qp = (_strain_at_nearest_qp ? (*_nearest_qp)[_i] : _i);
     126             : 
     127     3012864 :   Real denergy = -_dporosity_dgradvar[_i][pvar] * _grad_phi[_j][_i] * _rock_energy_nodal[_i];
     128     6217728 :   for (unsigned ph = 0; ph < _num_phases; ++ph)
     129     3204864 :     denergy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *
     130     3204864 :                (*_energy_nodal)[_i][ph] * _dporosity_dgradvar[_i][pvar] * _grad_phi[_j][nearest_qp];
     131             : 
     132     3012864 :   if (_i != _j)
     133     2450176 :     return _test[_i][_qp] * denergy * _strain_rate_qp[_qp];
     134             : 
     135      562688 :   denergy += _drock_energy_nodal_dvar[_i][pvar] * (1.0 - _porosity[_i]);
     136      562688 :   denergy -= _rock_energy_nodal[_i] * _dporosity_dvar[_i][pvar];
     137     1173376 :   for (unsigned ph = 0; ph < _num_phases; ++ph)
     138             :   {
     139      610688 :     denergy += (*_dfluid_density_dvar)[_i][ph][pvar] * (*_fluid_saturation_nodal)[_i][ph] *
     140      610688 :                (*_energy_nodal)[_i][ph] * _porosity[_i];
     141      610688 :     denergy += (*_fluid_density)[_i][ph] * (*_dfluid_saturation_nodal_dvar)[_i][ph][pvar] *
     142      610688 :                (*_energy_nodal)[_i][ph] * _porosity[_i];
     143      610688 :     denergy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *
     144      610688 :                (*_denergy_nodal_dvar)[_i][ph][pvar] * _porosity[_i];
     145      610688 :     denergy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *
     146      610688 :                (*_energy_nodal)[_i][ph] * _dporosity_dvar[_i][pvar];
     147             :   }
     148             : 
     149      562688 :   return _test[_i][_qp] * denergy * _strain_rate_qp[_qp];
     150             : }

Generated by: LCOV version 1.14