LCOV - code coverage report
Current view: top level - src/kernels - PorousFlowFullySaturatedAdvectiveFlux.C (source / functions) Hit Total Coverage
Test: idaholab/moose porous_flow: #33380 (547b29) with base 8581c3 Lines: 36 39 92.3 %
Date: 2026-07-20 19:40:36 Functions: 7 8 87.5 %
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 "PorousFlowFullySaturatedAdvectiveFlux.h"
      11             : 
      12             : registerMooseObject("PorousFlowApp", PorousFlowFullySaturatedAdvectiveFlux);
      13             : registerMooseObject("PorousFlowApp", ADPorousFlowFullySaturatedAdvectiveFlux);
      14             : 
      15             : template <bool is_ad>
      16             : InputParameters
      17         676 : PorousFlowFullySaturatedAdvectiveFluxTempl<is_ad>::validParams()
      18             : {
      19         676 :   InputParameters params = PorousFlowDarcyBaseTempl<is_ad>::validParams();
      20        1352 :   params.addParam<unsigned int>(
      21        1352 :       "fluid_component", 0, "The index corresponding to the fluid component for this kernel");
      22        1352 :   params.addParam<bool>("multiply_by_density",
      23        1352 :                         true,
      24             :                         "If true, then this Kernel is the fluid mass "
      25             :                         "flux.  If false, then this Kernel is the "
      26             :                         "fluid volume flux (which is common in "
      27             :                         "poro-mechanics)");
      28         676 :   params.addClassDescription("Fully-upwinded advective flux of the fluid component given by "
      29             :                              "fluid_component, in a single-phase fluid");
      30         676 :   return params;
      31           0 : }
      32             : 
      33             : template <bool is_ad>
      34         390 : PorousFlowFullySaturatedAdvectiveFluxTempl<is_ad>::PorousFlowFullySaturatedAdvectiveFluxTempl(
      35             :     const InputParameters & parameters)
      36             :   : PorousFlowDarcyBaseTempl<is_ad>(parameters),
      37         390 :     _mass_fractions(
      38         780 :         this->template getGenericMaterialProperty<std::vector<std::vector<Real>>, is_ad>(
      39             :             "PorousFlow_mass_frac_nodal")),
      40         390 :     _dmass_fractions_dvar(
      41             :         is_ad ? nullptr
      42         348 :               : &this->template getMaterialProperty<std::vector<std::vector<std::vector<Real>>>>(
      43             :                     "dPorousFlow_mass_frac_nodal_dvar")),
      44         780 :     _fluid_component(this->template getParam<unsigned int>("fluid_component")),
      45        1170 :     _multiply_by_density(this->template getParam<bool>("multiply_by_density"))
      46             : {
      47         390 :   if (_dictator.numPhases() != 1)
      48           0 :     mooseError(
      49             :         "PorousFlowFullySaturatedAdvectiveFlux should not be used for multi-phase scenarios as "
      50             :         "it does not include relative-permeability effects");
      51         390 : }
      52             : 
      53             : template <bool is_ad>
      54             : GenericReal<is_ad>
      55     4916025 : PorousFlowFullySaturatedAdvectiveFluxTempl<is_ad>::mobility(unsigned nodenum, unsigned phase) const
      56             : {
      57     4916025 :   if (_multiply_by_density == false)
      58       62868 :     return _mass_fractions[nodenum][phase][_fluid_component] / _fluid_viscosity[nodenum][phase];
      59     4853157 :   return _mass_fractions[nodenum][phase][_fluid_component] * _fluid_density_node[nodenum][phase] /
      60     4853289 :          _fluid_viscosity[nodenum][phase];
      61             : }
      62             : 
      63             : template <bool is_ad>
      64             : Real
      65     2752149 : PorousFlowFullySaturatedAdvectiveFluxTempl<is_ad>::dmobility(unsigned nodenum,
      66             :                                                              unsigned phase,
      67             :                                                              unsigned pvar) const
      68             : {
      69             :   if constexpr (!is_ad)
      70             :   {
      71     2752149 :     if (_multiply_by_density == false)
      72       34620 :       return (*_dmass_fractions_dvar)[nodenum][phase][_fluid_component][pvar] /
      73       34620 :                  _fluid_viscosity[nodenum][phase] -
      74       34620 :              _mass_fractions[nodenum][phase][_fluid_component] *
      75       34620 :                  (*_dfluid_viscosity_dvar)[nodenum][phase][pvar] /
      76       34620 :                  Utility::pow<2>(_fluid_viscosity[nodenum][phase]);
      77     2717529 :     Real dm = (*_dmass_fractions_dvar)[nodenum][phase][_fluid_component][pvar] *
      78     2717529 :               _fluid_density_node[nodenum][phase] / _fluid_viscosity[nodenum][phase];
      79     2717529 :     dm += _mass_fractions[nodenum][phase][_fluid_component] *
      80     2717529 :           (*_dfluid_density_node_dvar)[nodenum][phase][pvar] / _fluid_viscosity[nodenum][phase];
      81     2717529 :     dm -= _mass_fractions[nodenum][phase][_fluid_component] * _fluid_density_node[nodenum][phase] *
      82     2717529 :           (*_dfluid_viscosity_dvar)[nodenum][phase][pvar] /
      83             :           Utility::pow<2>(_fluid_viscosity[nodenum][phase]);
      84     2717529 :     return dm;
      85             :   }
      86             :   else
      87             :     libmesh_ignore(nodenum, phase, pvar);
      88           0 :   return 0.0;
      89             : }
      90             : 
      91             : template class PorousFlowFullySaturatedAdvectiveFluxTempl<false>;
      92             : template class PorousFlowFullySaturatedAdvectiveFluxTempl<true>;

Generated by: LCOV version 1.14