LCOV - code coverage report
Current view: top level - src/materials - PorousFlowPorosityExponentialBase.C (source / functions) Hit Total Coverage
Test: idaholab/moose porous_flow: #31405 (292dce) with base fef103 Lines: 50 51 98.0 %
Date: 2025-09-04 07:55:56 Functions: 4 4 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 "PorousFlowPorosityExponentialBase.h"
      11             : 
      12             : InputParameters
      13       10181 : PorousFlowPorosityExponentialBase::validParams()
      14             : {
      15       10181 :   InputParameters params = PorousFlowPorosityBase::validParams();
      16       20362 :   params.addParam<bool>("strain_at_nearest_qp",
      17       20362 :                         false,
      18             :                         "When calculating nodal porosity that depends on strain, use the strain at "
      19             :                         "the nearest quadpoint.  This adds a small extra computational burden, and "
      20             :                         "is not necessary for simulations involving only linear lagrange elements. "
      21             :                         " If you set this to true, you will also want to set the same parameter to "
      22             :                         "true for related Kernels and Materials");
      23       20362 :   params.addParam<bool>("ensure_positive",
      24       20362 :                         true,
      25             :                         "Modify the usual exponential relationships that "
      26             :                         "governs porosity so that porosity is always "
      27             :                         "positive");
      28       10181 :   params.addClassDescription("Base class Material for porosity that is computed via an exponential "
      29             :                              "relationship with coupled variables (strain, porepressure, "
      30             :                              "temperature, chemistry)");
      31       10181 :   return params;
      32           0 : }
      33             : 
      34        8009 : PorousFlowPorosityExponentialBase::PorousFlowPorosityExponentialBase(
      35        8009 :     const InputParameters & parameters)
      36             :   : PorousFlowPorosityBase(parameters),
      37        8009 :     _strain_at_nearest_qp(getParam<bool>("strain_at_nearest_qp")),
      38       24027 :     _ensure_positive(getParam<bool>("ensure_positive"))
      39             : {
      40        8009 : }
      41             : 
      42             : void
      43      219092 : PorousFlowPorosityExponentialBase::initQpStatefulProperties()
      44             : {
      45      219092 :   const Real a = atNegInfinityQp();
      46      219092 :   const Real b = atZeroQp();
      47             :   mooseAssert(a > b, "PorousFlowPorosityExponentialBase a must be larger than b");
      48      219092 :   const Real decay = decayQp();
      49             : 
      50      219092 :   if (decay <= 0.0 || !_ensure_positive)
      51      216856 :     _porosity[_qp] = a + (b - a) * std::exp(decay);
      52             :   else
      53             :   {
      54        2236 :     const Real c = std::log(a / (a - b));
      55        2236 :     const Real expx = std::exp(-decay / c);
      56        2236 :     _porosity[_qp] = a + (b - a) * std::exp(c * (1.0 - expx));
      57             :   }
      58      219092 : }
      59             : 
      60             : void
      61     9369357 : PorousFlowPorosityExponentialBase::computeQpProperties()
      62             : {
      63     9369357 :   const Real a = atNegInfinityQp();
      64     9369357 :   const Real b = atZeroQp();
      65     9369357 :   const Real decay = decayQp();
      66             :   Real exp_term = 1.0; // set appropriately below
      67             : 
      68             :   Real deriv = 0.0; // = d(porosity)/d(decay)
      69     9369357 :   if (decay <= 0.0 || !_ensure_positive)
      70             :   {
      71     9322907 :     exp_term = std::exp(decay);
      72     9322907 :     _porosity[_qp] = a + (b - a) * exp_term;
      73     9322907 :     deriv = _porosity[_qp] - a;
      74             :   }
      75             :   else
      76             :   {
      77       46450 :     const Real c = std::log(a / (a - b));
      78       46450 :     const Real expx = std::exp(-decay / c);
      79             :     // note that at decay = 0, we have expx = 1, so porosity = a + b - a = b
      80             :     // and at decay = infinity, expx = 0, so porosity = a + (b - a) * a / (a - b) = 0
      81       46450 :     exp_term = std::exp(c * (1.0 - expx));
      82       46450 :     _porosity[_qp] = a + (b - a) * exp_term;
      83       46450 :     deriv = (_porosity[_qp] - a) * expx;
      84             :   }
      85             : 
      86     9369357 :   (*_dporosity_dvar)[_qp].resize(_num_var);
      87     9369357 :   (*_dporosity_dgradvar)[_qp].resize(_num_var);
      88    32161329 :   for (unsigned int v = 0; v < _num_var; ++v)
      89             :   {
      90    22791972 :     (*_dporosity_dvar)[_qp][v] = ddecayQp_dvar(v) * deriv;
      91    22791972 :     (*_dporosity_dgradvar)[_qp][v] = ddecayQp_dgradvar(v) * deriv;
      92             : 
      93    22791972 :     const Real da = datNegInfinityQp(v);
      94    22791972 :     const Real db = datZeroQp(v);
      95    22791972 :     (*_dporosity_dvar)[_qp][v] += da * (1 - exp_term) + db * exp_term;
      96             : 
      97    22791972 :     if (!(decay <= 0.0 || !_ensure_positive))
      98             :     {
      99      222198 :       const Real c = std::log(a / (a - b));
     100      222198 :       const Real expx = std::exp(-decay / c);
     101      222198 :       const Real dc = (a - b) * (da * b / a - db) / std::pow(a, 2);
     102      222198 :       (*_dporosity_dvar)[_qp][v] += (b - a) * exp_term * dc * (1 - expx - expx / c);
     103             :     }
     104             :   }
     105     9369357 : }

Generated by: LCOV version 1.14