LCOV - code coverage report
Current view: top level - src/userobjects - Q2PRelPermPowerGas.C (source / functions) Hit Total Coverage
Test: idaholab/moose richards: #31405 (292dce) with base fef103 Lines: 29 30 96.7 %
Date: 2025-09-04 07:56:35 Functions: 5 5 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             : //  "PowerGas" form of relative permeability
      11             : //
      12             : #include "Q2PRelPermPowerGas.h"
      13             : 
      14             : registerMooseObject("RichardsApp", Q2PRelPermPowerGas);
      15             : 
      16             : InputParameters
      17          46 : Q2PRelPermPowerGas::validParams()
      18             : {
      19          46 :   InputParameters params = RichardsRelPerm::validParams();
      20          92 :   params.addRequiredRangeCheckedParam<Real>(
      21             :       "simm",
      22             :       "simm >= 0 & simm < 1",
      23             :       "Immobile saturation.  Must be between 0 and 1.   Define s = "
      24             :       "seff/(1 - simm).  Then relperm = 1 - (n+1)s^n + ns^(n+1)");
      25          92 :   params.addRequiredRangeCheckedParam<Real>("n",
      26             :                                             "n >= 2",
      27             :                                             "Exponent.  Must be >= 2.   Define s = "
      28             :                                             "(eff/(1 - simm).  Then relperm = 1 - "
      29             :                                             "(n+1)s^n + ns^(n+1)");
      30          46 :   params.addClassDescription("Power form of relative permeability that might be useful for gases "
      31             :                              "as a function of water saturation in Q2P models.  Define s = seff/(1 "
      32             :                              "- simm).  Then relperm = 1 - (n+1)s^n + ns^(n+1) if seff<1-simm, "
      33             :                              "otherwise relperm=1.  Here seff is the water saturation");
      34          46 :   return params;
      35           0 : }
      36             : 
      37          21 : Q2PRelPermPowerGas::Q2PRelPermPowerGas(const InputParameters & parameters)
      38          63 :   : RichardsRelPerm(parameters), _simm(getParam<Real>("simm")), _n(getParam<Real>("n"))
      39             : {
      40          21 : }
      41             : 
      42             : Real
      43       34604 : Q2PRelPermPowerGas::relperm(Real seff) const
      44             : {
      45       34604 :   if (seff >= 1.0 - _simm)
      46             :     return 0.0;
      47             : 
      48       34542 :   if (seff <= 0)
      49             :     return 1.0;
      50             : 
      51       34515 :   Real s_internal = seff / (1.0 - _simm);
      52       34515 :   Real krel = 1 - (_n + 1) * std::pow(s_internal, _n) + _n * std::pow(s_internal, _n + 1);
      53             : 
      54             :   // bound, just in case
      55       34515 :   if (krel < 0)
      56             :   {
      57             :     krel = 0;
      58             :   }
      59       34515 :   if (krel > 1)
      60             :   {
      61             :     krel = 1;
      62             :   }
      63             :   return krel;
      64             : }
      65             : 
      66             : Real
      67       34526 : Q2PRelPermPowerGas::drelperm(Real seff) const
      68             : {
      69       34526 :   if (seff >= 1.0 - _simm)
      70             :     return 0.0;
      71             : 
      72       34464 :   if (seff <= 0)
      73             :     return 0.0;
      74             : 
      75       34437 :   Real s_internal = seff / (1.0 - _simm);
      76             :   Real krelp =
      77       34437 :       -(_n + 1) * _n * std::pow(s_internal, _n - 1) + _n * (_n + 1) * std::pow(s_internal, _n);
      78       34437 :   return krelp / (1.0 - _simm);
      79             : }
      80             : 
      81             : Real
      82         606 : Q2PRelPermPowerGas::d2relperm(Real seff) const
      83             : {
      84         606 :   if (seff >= 1.0 - _simm)
      85             :     return 0.0;
      86             : 
      87         606 :   if (seff <= 0)
      88             :     return 0.0;
      89             : 
      90         606 :   Real s_internal = seff / (1.0 - _simm);
      91         606 :   Real krelpp = -(_n + 1) * _n * (_n - 1) * std::pow(s_internal, _n - 2) +
      92         606 :                 _n * (_n + 1) * _n * std::pow(s_internal, _n - 1);
      93         606 :   return krelpp / std::pow(1.0 - _simm, 2);
      94             : }

Generated by: LCOV version 1.14