LCOV - code coverage report
Current view: top level - src/userobjects - PorousFlowDictator.C (source / functions) Hit Total Coverage
Test: idaholab/moose porous_flow: #31405 (292dce) with base fef103 Lines: 72 73 98.6 %
Date: 2025-09-04 07:55:56 Functions: 14 14 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 "PorousFlowDictator.h"
      11             : #include "NonlinearSystem.h"
      12             : 
      13             : registerMooseObject("PorousFlowApp", PorousFlowDictator);
      14             : 
      15             : InputParameters
      16       19354 : PorousFlowDictator::validParams()
      17             : {
      18       19354 :   InputParameters params = GeneralUserObject::validParams();
      19       19354 :   params.addClassDescription("Holds information on the PorousFlow variable names");
      20       38708 :   params.addRequiredCoupledVar("porous_flow_vars",
      21             :                                "List of primary variables that are used in the PorousFlow "
      22             :                                "simulation.  Jacobian entries involving derivatives wrt these "
      23             :                                "variables will be computed.  In single-phase models you will just "
      24             :                                "have one (eg \'pressure\'), in two-phase models you will have two "
      25             :                                "(eg \'p_water p_gas\', or \'p_water s_water\'), etc.");
      26       38708 :   params.addRequiredParam<unsigned int>("number_fluid_phases",
      27             :                                         "The number of fluid phases in the simulation");
      28       38708 :   params.addRequiredParam<unsigned int>("number_fluid_components",
      29             :                                         "The number of fluid components in the simulation");
      30       38708 :   params.addParam<unsigned int>("number_aqueous_equilibrium",
      31       38708 :                                 0,
      32             :                                 "The number of secondary species in the aqueous-equilibrium "
      33             :                                 "reaction system.  (Leave as zero if the simulation does not "
      34             :                                 "involve chemistry)");
      35       38708 :   params.addParam<unsigned int>("number_aqueous_kinetic",
      36       38708 :                                 0,
      37             :                                 "The number of secondary species in the aqueous-kinetic reaction "
      38             :                                 "system involved in precipitation and dissolution.  (Leave as zero "
      39             :                                 "if the simulation does not involve chemistry)");
      40       38708 :   params.addParam<unsigned int>("aqueous_phase_number",
      41       38708 :                                 0,
      42             :                                 "The fluid phase number of the aqueous phase in which the "
      43             :                                 "equilibrium and kinetic chemical reactions occur");
      44             : 
      45       38708 :   params.addParam<SolverSystemName>("solver_sys", "Name of the solver system for the porepressure");
      46       38708 :   params.addParamNamesToGroup("solver_sys", "Advanced");
      47       19354 :   return params;
      48           0 : }
      49             : 
      50        9679 : PorousFlowDictator::PorousFlowDictator(const InputParameters & parameters)
      51             :   : GeneralUserObject(parameters),
      52             :     Coupleable(this, false),
      53        9679 :     _num_variables(coupledComponents("porous_flow_vars")),
      54       19358 :     _num_phases(getParam<unsigned int>("number_fluid_phases")),
      55       19358 :     _num_components(getParam<unsigned int>("number_fluid_components")),
      56       19358 :     _num_aqueous_equilibrium(getParam<unsigned int>("number_aqueous_equilibrium")),
      57       19358 :     _num_aqueous_kinetic(getParam<unsigned int>("number_aqueous_kinetic")),
      58       19358 :     _aqueous_phase_number(getParam<unsigned int>("aqueous_phase_number")),
      59        9679 :     _consistent_fe_type(false),
      60        9679 :     _fe_type(0)
      61             : {
      62        9679 :   _moose_var_num.resize(_num_variables);
      63       25293 :   for (unsigned int i = 0; i < _num_variables; ++i)
      64       15614 :     _moose_var_num[i] = coupled("porous_flow_vars", i);
      65             : 
      66        9679 :   if (_num_variables > 0)
      67             :   {
      68        7729 :     _consistent_fe_type = true;
      69        7729 :     _fe_type = FEType(getFieldVar("porous_flow_vars", 0)->feType());
      70       15614 :     for (unsigned int i = 1; i < _num_variables; ++i)
      71       15770 :       if (getFieldVar("porous_flow_vars", i)->feType() != _fe_type)
      72         260 :         _consistent_fe_type = false;
      73             :   }
      74             : 
      75        9679 :   _pf_var_num.assign(_sys.nVariables(),
      76        9679 :                      _num_variables); // Note: the _num_variables assignment indicates that "this is
      77             :                                       // not a PorousFlow variable"
      78       25290 :   for (unsigned int i = 0; i < _num_variables; ++i)
      79             :   {
      80       15612 :     if (_moose_var_num[i] < _pf_var_num.size())
      81       15611 :       _pf_var_num[_moose_var_num[i]] = i;
      82             :     else
      83             :       // should not couple AuxVariables to the Dictator (Jacobian entries are not calculated for
      84             :       // them)
      85           1 :       mooseError("PorousFlowDictator: AuxVariables variables must not be coupled into the Dictator "
      86             :                  "for this is against specification #1984.  Variable '",
      87           1 :                  coupledName("porous_flow_vars", /*comp=*/i),
      88             :                  "' is either an AuxVariable or from a different nonlinear system.");
      89             :   }
      90             : 
      91        9678 :   if ((_num_phases > 0) && (_aqueous_phase_number >= _num_phases))
      92           3 :     mooseError("PorousflowDictator: The aqueous phase number must be less than the number of fluid "
      93             :                "phases.  The Dictator does not appreciate jokes.");
      94             : 
      95             :   // Don't include permeabiity derivatives in the Jacobian by default (overwrite using
      96             :   // usePermDerivs()) when necessary in permeabiity material classes
      97        9675 :   _perm_derivs = false;
      98        9683 : }
      99             : 
     100             : unsigned int
     101     6013257 : PorousFlowDictator::numVariables() const
     102             : {
     103     6013257 :   return _num_variables;
     104             : }
     105             : 
     106             : unsigned int
     107      457510 : PorousFlowDictator::numPhases() const
     108             : {
     109      457510 :   return _num_phases;
     110             : }
     111             : 
     112             : unsigned int
     113      353505 : PorousFlowDictator::numComponents() const
     114             : {
     115      353505 :   return _num_components;
     116             : }
     117             : 
     118             : unsigned int
     119         675 : PorousFlowDictator::numAqueousEquilibrium() const
     120             : {
     121         675 :   return _num_aqueous_equilibrium;
     122             : }
     123             : 
     124             : unsigned int
     125     8812392 : PorousFlowDictator::numAqueousKinetic() const
     126             : {
     127     8812392 :   return _num_aqueous_kinetic;
     128             : }
     129             : 
     130             : unsigned int
     131       12742 : PorousFlowDictator::aqueousPhaseNumber() const
     132             : {
     133       12742 :   return _aqueous_phase_number;
     134             : }
     135             : 
     136             : unsigned int
     137  5894506453 : PorousFlowDictator::porousFlowVariableNum(unsigned int moose_var_num) const
     138             : {
     139  5894506453 :   if (moose_var_num >= _pf_var_num.size() || _pf_var_num[moose_var_num] == _num_variables)
     140           4 :     mooseError("The Dictator proclaims that the moose variable with number ",
     141             :                moose_var_num,
     142             :                " is not a PorousFlow variable.  Exiting with error code 1984.");
     143  5894506449 :   return _pf_var_num[moose_var_num];
     144             : }
     145             : 
     146             : unsigned int
     147     3766486 : PorousFlowDictator::mooseVariableNum(unsigned int porous_flow_var_num) const
     148             : {
     149     3766486 :   if (porous_flow_var_num >= _num_variables)
     150           1 :     mooseError("The Dictator proclaims that there is no such PorousFlow variable with number ",
     151             :                porous_flow_var_num,
     152             :                ".  Exiting with error code 1984.");
     153     3766485 :   return _moose_var_num[porous_flow_var_num];
     154             : }
     155             : 
     156             : bool
     157   205929853 : PorousFlowDictator::isPorousFlowVariable(unsigned int moose_var_num) const
     158             : {
     159   205929853 :   return !notPorousFlowVariable(moose_var_num);
     160             : }
     161             : 
     162             : bool
     163  5409246288 : PorousFlowDictator::notPorousFlowVariable(unsigned int moose_var_num) const
     164             : {
     165  5409246288 :   return moose_var_num >= _pf_var_num.size() || _pf_var_num[moose_var_num] == _num_variables;
     166             : }
     167             : 
     168             : bool
     169        1107 : PorousFlowDictator::consistentFEType() const
     170             : {
     171        1107 :   return _consistent_fe_type;
     172             : }
     173             : 
     174             : FEType
     175        1112 : PorousFlowDictator::feType() const
     176             : {
     177        1112 :   return _fe_type;
     178             : }

Generated by: LCOV version 1.14