www.mooseframework.org
PorousFlowUnsaturated.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 "PorousFlowUnsaturated.h"
11 
12 #include "FEProblem.h"
13 #include "Conversion.h"
14 #include "libmesh/string_to_enum.h"
15 
16 registerMooseAction("PorousFlowApp", PorousFlowUnsaturated, "add_user_object");
17 
18 registerMooseAction("PorousFlowApp", PorousFlowUnsaturated, "add_kernel");
19 
20 registerMooseAction("PorousFlowApp", PorousFlowUnsaturated, "add_material");
21 
22 registerMooseAction("PorousFlowApp", PorousFlowUnsaturated, "add_aux_variable");
23 
24 registerMooseAction("PorousFlowApp", PorousFlowUnsaturated, "add_aux_kernel");
25 
26 template <>
27 InputParameters
29 {
30  InputParameters params = validParams<PorousFlowSinglePhaseBase>();
31  params.addParam<bool>("add_saturation_aux", true, "Add an AuxVariable that records saturation");
32  params.addRangeCheckedParam<Real>(
33  "van_genuchten_alpha",
34  1.0E-6,
35  "van_genuchten_alpha > 0.0",
36  "Van Genuchten alpha parameter used to determine saturation from porepressure");
37  params.addRangeCheckedParam<Real>(
38  "van_genuchten_m",
39  0.6,
40  "van_genuchten_m > 0 & van_genuchten_m < 1",
41  "Van Genuchten m parameter used to determine saturation from porepressure");
42  MooseEnum relperm_type_choice("FLAC Corey", "FLAC");
43  params.addParam<MooseEnum>("relative_permeability_type",
44  relperm_type_choice,
45  "Type of relative-permeability function. FLAC relperm = (1+m)S^m - "
46  "mS^(1+m). Corey relperm = S^m. m is the exponent. Here S = "
47  "(saturation - residual)/(1 - residual)");
48  params.addRangeCheckedParam<Real>("relative_permeability_exponent",
49  3.0,
50  "relative_permeability_exponent>=0",
51  "Relative permeability exponent");
52  params.addRangeCheckedParam<Real>(
53  "residual_saturation",
54  0.0,
55  "residual_saturation>=0.0 & residual_saturation<1.0",
56  "Residual saturation to use in the relative permeability expression");
57  params.addClassDescription("Adds Kernels and fluid-property Materials necessary to simulate a "
58  "single-phase saturated-unsaturated flow problem. The saturation is "
59  "computed using van Genuchten's expression. No Kernels for diffusion "
60  "and dispersion of fluid components are added. To run a simulation "
61  "you will also need to provide various other Materials for each mesh "
62  "block, depending on your simulation type, viz: permeability, "
63  "porosity, elasticity tensor, strain calculator, stress calculator, "
64  "matrix internal energy, thermal conductivity, diffusivity");
65  return params;
66 }
67 
68 PorousFlowUnsaturated::PorousFlowUnsaturated(const InputParameters & params)
69  : PorousFlowSinglePhaseBase(params),
70  _add_saturation_aux(getParam<bool>("add_saturation_aux")),
71  _van_genuchten_alpha(getParam<Real>("van_genuchten_alpha")),
72  _van_genuchten_m(getParam<Real>("van_genuchten_m")),
73  _relperm_type(
74  getParam<MooseEnum>("relative_permeability_type").getEnum<RelpermTypeChoiceEnum>()),
75  _relative_permeability_exponent(getParam<Real>("relative_permeability_exponent")),
76  _s_res(getParam<Real>("residual_saturation")),
77  _capillary_pressure_name("PorousFlowUnsaturated_CapillaryPressureVG")
78 {
79 }
80 
81 void
83 {
85 
86  // Add necessary objects to list of PorousFlow objects added by this action
87  _included_objects.push_back("PorousFlowAdvectiveFlux");
88 
89  if (_transient)
90  _included_objects.push_back("PorousFlowMassTimeDerivative");
91 
92  if (_mechanical && _transient)
93  _included_objects.push_back("PorousFlowMassVolumetricExpansion");
94 
95  if (_thermal)
96  _included_objects.push_back("PorousFlowHeatAdvection");
97 
99  _included_objects.push_back("SaturationAux");
100 
102  _included_objects.push_back("PorousFlowAdvectiveFluxCalculatorUnsaturatedMultiComponent");
103 
105  _included_objects.push_back("PorousFlowAdvectiveFluxCalculatorUnsaturatedHeat");
106 }
107 
108 void
110 {
112 
113  // add the kernels
115  {
116  const std::string kernel_type = "PorousFlowAdvectiveFlux";
117  InputParameters params = _factory.getValidParams(kernel_type);
118  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
119  params.set<RealVectorValue>("gravity") = _gravity;
120 
121  for (unsigned i = 0; i < _num_mass_fraction_vars; ++i)
122  {
123  const std::string kernel_name = "PorousFlowUnsaturated_AdvectiveFlux" + Moose::stringify(i);
124  params.set<unsigned int>("fluid_component") = i;
125  params.set<NonlinearVariableName>("variable") = _mass_fraction_vars[i];
126  _problem->addKernel(kernel_type, kernel_name, params);
127  }
128  const std::string kernel_name =
129  "PorousFlowUnsaturated_AdvectiveFlux" + Moose::stringify(_num_mass_fraction_vars);
130  params.set<unsigned int>("fluid_component") = _num_mass_fraction_vars;
131  params.set<NonlinearVariableName>("variable") = _pp_var;
132  _problem->addKernel(kernel_type, kernel_name, params);
133  }
135  {
136  const std::string kernel_type = "PorousFlowFluxLimitedTVDAdvection";
137  InputParameters params = _factory.getValidParams(kernel_type);
138  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
139 
140  for (unsigned i = 0; i < _num_mass_fraction_vars; ++i)
141  {
142  const std::string kernel_name = "PorousFlowFluxLimited_DarcyFlow" + Moose::stringify(i);
143  params.set<UserObjectName>("advective_flux_calculator") =
144  "PorousFlowUnsaturated_AC_" + Moose::stringify(i);
145  params.set<NonlinearVariableName>("variable") = _mass_fraction_vars[i];
146  _problem->addKernel(kernel_type, kernel_name, params);
147  }
148  const std::string kernel_name =
149  "PorousFlowFluxLimited_DarcyFlow" + Moose::stringify(_num_mass_fraction_vars);
150  params.set<NonlinearVariableName>("variable") = _pp_var;
151  params.set<UserObjectName>("advective_flux_calculator") =
152  "PorousFlowUnsaturated_AC_" + Moose::stringify(_num_mass_fraction_vars);
153  _problem->addKernel(kernel_type, kernel_name, params);
154  }
155 
156  if (_transient)
157  {
158  std::string kernel_name = "PorousFlowUnsaturated_MassTimeDerivative";
159  std::string kernel_type = "PorousFlowMassTimeDerivative";
160  InputParameters params = _factory.getValidParams(kernel_type);
161  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
162 
163  for (unsigned i = 0; i < _num_mass_fraction_vars; ++i)
164  {
165  kernel_name = "PorousFlowUnsaturated_MassTimeDerivative" + Moose::stringify(i);
166  params.set<unsigned int>("fluid_component") = i;
167  params.set<NonlinearVariableName>("variable") = _mass_fraction_vars[i];
168  _problem->addKernel(kernel_type, kernel_name, params);
169  }
170  kernel_name =
171  "PorousFlowUnsaturated_MassTimeDerivative" + Moose::stringify(_num_mass_fraction_vars);
172  params.set<unsigned int>("fluid_component") = _num_mass_fraction_vars;
173  params.set<NonlinearVariableName>("variable") = _pp_var;
174  _problem->addKernel(kernel_type, kernel_name, params);
175  }
176 
177  if (_mechanical && _transient)
178  {
179  std::string kernel_name = "PorousFlowUnsaturated_MassVolumetricExpansion";
180  std::string kernel_type = "PorousFlowMassVolumetricExpansion";
181  InputParameters params = _factory.getValidParams(kernel_type);
182  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
183 
184  for (unsigned i = 0; i < _num_mass_fraction_vars; ++i)
185  {
186  kernel_name = "PorousFlowUnsaturated_MassVolumetricExpansion" + Moose::stringify(i);
187  params.set<unsigned>("fluid_component") = i;
188  params.set<NonlinearVariableName>("variable") = _mass_fraction_vars[i];
189  _problem->addKernel(kernel_type, kernel_name, params);
190  }
191  kernel_name =
192  "PorousFlowUnsaturated_MassVolumetricExpansion" + Moose::stringify(_num_mass_fraction_vars);
193  params.set<unsigned>("fluid_component") = _num_mass_fraction_vars;
194  params.set<NonlinearVariableName>("variable") = _pp_var;
195  _problem->addKernel(kernel_type, kernel_name, params);
196  }
197 
198  if (_thermal)
199  {
201  {
202  const std::string kernel_name = "PorousFlowUnsaturated_HeatAdvection";
203  const std::string kernel_type = "PorousFlowHeatAdvection";
204  InputParameters params = _factory.getValidParams(kernel_type);
205  params.set<NonlinearVariableName>("variable") = _temperature_var[0];
206  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
207  params.set<RealVectorValue>("gravity") = _gravity;
208  _problem->addKernel(kernel_type, kernel_name, params);
209  }
211  {
212  const std::string kernel_name = "PorousFlowUnsaturated_HeatAdvection";
213  const std::string kernel_type = "PorousFlowFluxLimitedTVDAdvection";
214  InputParameters params = _factory.getValidParams(kernel_type);
215  params.set<NonlinearVariableName>("variable") = _temperature_var[0];
216  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
217  params.set<UserObjectName>("advective_flux_calculator") = "PorousFlowUnsaturatedHeat_AC";
218  _problem->addKernel(kernel_type, kernel_name, params);
219  }
220  }
221 }
222 
223 void
225 {
227 
228  // Add the capillary pressure UserObject
230 
231  // add Advective Flux calculator UserObjects, if required
233  {
234  for (unsigned i = 0; i < _num_mass_fraction_vars; ++i)
235  {
236  const std::string userobject_name = "PorousFlowUnsaturated_AC_" + Moose::stringify(i);
237  addAdvectiveFluxCalculatorUnsaturatedMultiComponent(0, i, true, userobject_name);
238  }
239  const std::string userobject_name =
240  "PorousFlowUnsaturated_AC_" + Moose::stringify(_num_mass_fraction_vars);
241  if (_num_mass_fraction_vars == 0)
242  addAdvectiveFluxCalculatorUnsaturated(0, true, userobject_name); // 1 component only
243  else
245  0, _num_mass_fraction_vars, true, userobject_name);
246 
247  if (_thermal)
248  {
249  const std::string userobject_name = "PorousFlowUnsaturatedHeat_AC";
250  addAdvectiveFluxCalculatorUnsaturatedHeat(0, true, userobject_name);
251  }
252  }
253 }
254 
255 void
257 {
259 
260  if (_deps.dependsOn(_included_objects, "pressure_saturation_qp"))
261  {
262  const std::string material_type = "PorousFlow1PhaseP";
263  InputParameters params = _factory.getValidParams(material_type);
264  const std::string material_name = "PorousFlowUnsaturated_1PhaseP_VG_qp";
265  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
266  params.set<std::vector<VariableName>>("porepressure") = {_pp_var};
267  params.set<UserObjectName>("capillary_pressure") = _capillary_pressure_name;
268  params.set<bool>("at_nodes") = false;
269  _problem->addMaterial(material_type, material_name, params);
270  }
271  if (_deps.dependsOn(_included_objects, "pressure_saturation_nodal"))
272  {
273  const std::string material_type = "PorousFlow1PhaseP";
274  InputParameters params = _factory.getValidParams(material_type);
275  const std::string material_name = "PorousFlowUnsaturated_1PhaseP_VG_nodal";
276  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
277  params.set<std::vector<VariableName>>("porepressure") = {_pp_var};
278  params.set<UserObjectName>("capillary_pressure") = _capillary_pressure_name;
279  params.set<bool>("at_nodes") = true;
280  _problem->addMaterial(material_type, material_name, params);
281  }
282 
283  if (_deps.dependsOn(_included_objects, "relative_permeability_qp"))
284  {
287  else
289  }
290 
291  if (_deps.dependsOn(_included_objects, "relative_permeability_nodal"))
292  {
295  else
297  }
298 
299  if (_deps.dependsOn(_included_objects, "volumetric_strain_qp") ||
300  _deps.dependsOn(_included_objects, "volumetric_strain_nodal"))
302 }
303 
304 void
306 {
308 
310  addSaturationAux(0);
311 }
PorousFlowActionBase::_num_mass_fraction_vars
const unsigned _num_mass_fraction_vars
Number of mass-fraction variables.
Definition: PorousFlowActionBase.h:69
PorousFlowActionBase::_transient
bool _transient
Flag to denote if the simulation is transient.
Definition: PorousFlowActionBase.h:92
PorousFlowSinglePhaseBase
Base class for actions involving a single fluid phase.
Definition: PorousFlowSinglePhaseBase.h:22
PorousFlowUnsaturated::_van_genuchten_alpha
const Real _van_genuchten_alpha
Van Genuchten alpha parameter.
Definition: PorousFlowUnsaturated.h:40
PorousFlowUnsaturated.h
PorousFlowUnsaturated::_capillary_pressure_name
const std::string _capillary_pressure_name
Name of the capillary pressure UserObject.
Definition: PorousFlowUnsaturated.h:55
PorousFlowUnsaturated::addKernels
virtual void addKernels() override
Add all Kernels.
Definition: PorousFlowUnsaturated.C:109
PorousFlowActionBase::_stabilization
enum PorousFlowActionBase::StabilizationEnum _stabilization
PorousFlowSinglePhaseBase::_mechanical
const bool _mechanical
Definition: PorousFlowSinglePhaseBase.h:47
PorousFlowActionBase::addUserObjects
virtual void addUserObjects()
Add all other UserObjects.
Definition: PorousFlowActionBase.C:174
PorousFlowSinglePhaseBase::addAuxObjects
virtual void addAuxObjects() override
Add all AuxVariables and AuxKernels.
Definition: PorousFlowSinglePhaseBase.C:207
registerMooseAction
registerMooseAction("PorousFlowApp", PorousFlowUnsaturated, "add_user_object")
PorousFlowUnsaturated
Action for simulation involving a single phase, partially or fully saturated fluid.
Definition: PorousFlowUnsaturated.h:24
PorousFlowUnsaturated::_s_res
const Real _s_res
Residual saturation to use in the relative permeability expressions.
Definition: PorousFlowUnsaturated.h:52
PorousFlowActionBase::addAdvectiveFluxCalculatorUnsaturated
void addAdvectiveFluxCalculatorUnsaturated(unsigned phase, bool multiply_by_density, std::string userobject_name)
Definition: PorousFlowActionBase.C:562
PorousFlowUnsaturated::_relperm_type
enum PorousFlowUnsaturated::RelpermTypeChoiceEnum _relperm_type
PorousFlowSinglePhaseBase::_pp_var
const VariableName _pp_var
Porepressure NonlinearVariable name.
Definition: PorousFlowSinglePhaseBase.h:35
PorousFlowActionBase::_coupled_displacements
std::vector< VariableName > _coupled_displacements
Displacement Variable names.
Definition: PorousFlowActionBase.h:81
PorousFlowActionBase::_mass_fraction_vars
const std::vector< VariableName > & _mass_fraction_vars
Name of the mass-fraction variables (if any)
Definition: PorousFlowActionBase.h:66
validParams< PorousFlowUnsaturated >
InputParameters validParams< PorousFlowUnsaturated >()
Definition: PorousFlowUnsaturated.C:28
PorousFlowDependencies::_deps
DependencyResolver< std::string > _deps
All dependencies of kernels, auxkernels, materials, etc, are stored in _dependencies.
Definition: PorousFlowDependencies.h:37
PorousFlowActionBase::StabilizationEnum::Full
PorousFlowUnsaturated::addAuxObjects
virtual void addAuxObjects() override
Add all AuxVariables and AuxKernels.
Definition: PorousFlowUnsaturated.C:305
PorousFlowSinglePhaseBase::addKernels
virtual void addKernels() override
Add all Kernels.
Definition: PorousFlowSinglePhaseBase.C:127
PorousFlowActionBase::addCapillaryPressureVG
void addCapillaryPressureVG(Real m, Real alpha, std::string userobject_name)
Adds a van Genuchten capillary pressure UserObject.
Definition: PorousFlowActionBase.C:531
PorousFlowUnsaturated::PorousFlowUnsaturated
PorousFlowUnsaturated(const InputParameters &params)
Definition: PorousFlowUnsaturated.C:68
PorousFlowActionBase::addAdvectiveFluxCalculatorUnsaturatedMultiComponent
void addAdvectiveFluxCalculatorUnsaturatedMultiComponent(unsigned phase, unsigned fluid_component, bool multiply_by_density, std::string userobject_name)
Definition: PorousFlowActionBase.C:636
PorousFlowActionBase::_gravity
const RealVectorValue _gravity
Gravity.
Definition: PorousFlowActionBase.h:63
validParams< PorousFlowSinglePhaseBase >
InputParameters validParams< PorousFlowSinglePhaseBase >()
Definition: PorousFlowSinglePhaseBase.C:18
PorousFlowActionBase::addRelativePermeabilityFLAC
void addRelativePermeabilityFLAC(bool at_nodes, unsigned phase, Real m, Real s_res, Real sum_s_res)
Adds a relative-permeability Material of the FLAC variety.
Definition: PorousFlowActionBase.C:507
PorousFlowSinglePhaseBase::addMaterialDependencies
virtual void addMaterialDependencies() override
Add all material dependencies so that the correct version of each material can be added.
Definition: PorousFlowSinglePhaseBase.C:97
PorousFlowUnsaturated::_van_genuchten_m
const Real _van_genuchten_m
Van Genuchten m parameter.
Definition: PorousFlowUnsaturated.h:43
PorousFlowUnsaturated::RelpermTypeChoiceEnum::FLAC
PorousFlowUnsaturated::_add_saturation_aux
const bool _add_saturation_aux
Add an Aux Variable to record saturation.
Definition: PorousFlowUnsaturated.h:37
PorousFlowActionBase::_temperature_var
const std::vector< VariableName > & _temperature_var
Name of the temperature variable (if any)
Definition: PorousFlowActionBase.h:72
PorousFlowUnsaturated::addUserObjects
virtual void addUserObjects() override
Add all other UserObjects.
Definition: PorousFlowUnsaturated.C:224
PorousFlowSinglePhaseBase::addMaterials
virtual void addMaterials() override
Add all Materials.
Definition: PorousFlowSinglePhaseBase.C:219
PorousFlowUnsaturated::addMaterialDependencies
virtual void addMaterialDependencies() override
Add all material dependencies so that the correct version of each material can be added.
Definition: PorousFlowUnsaturated.C:82
PorousFlowActionBase::_dictator_name
const std::string _dictator_name
The name of the PorousFlowDictator object to be added.
Definition: PorousFlowActionBase.h:54
PorousFlowActionBase::addAdvectiveFluxCalculatorUnsaturatedHeat
void addAdvectiveFluxCalculatorUnsaturatedHeat(unsigned phase, bool multiply_by_density, std::string userobject_name)
Definition: PorousFlowActionBase.C:598
PorousFlowSinglePhaseBase::_thermal
const bool _thermal
Flags to indicate whether thermal or mechanical effects are included.
Definition: PorousFlowSinglePhaseBase.h:46
PorousFlowActionBase::addVolumetricStrainMaterial
void addVolumetricStrainMaterial(const std::vector< VariableName > &displacements, bool consistent_with_displaced_mesh)
Adds a quadpoint volumetric strain material.
Definition: PorousFlowActionBase.C:407
PorousFlowUnsaturated::addMaterials
virtual void addMaterials() override
Add all Materials.
Definition: PorousFlowUnsaturated.C:256
PorousFlowActionBase::addRelativePermeabilityCorey
void addRelativePermeabilityCorey(bool at_nodes, unsigned phase, Real n, Real s_res, Real sum_s_res)
Adds a relative-permeability Material of the Corey variety.
Definition: PorousFlowActionBase.C:482
PorousFlowUnsaturated::RelpermTypeChoiceEnum
RelpermTypeChoiceEnum
Fluid relative permeability type (FLAC or Corey)
Definition: PorousFlowUnsaturated.h:46
PorousFlowActionBase::addSaturationAux
void addSaturationAux(unsigned phase)
Add an AuxVariable and AuxKernel to calculate saturation.
Definition: PorousFlowActionBase.C:195
PorousFlowUnsaturated::_relative_permeability_exponent
const Real _relative_permeability_exponent
Relative permeability exponent.
Definition: PorousFlowUnsaturated.h:49
PorousFlowActionBase::_included_objects
std::vector< std::string > _included_objects
List of Kernels, AuxKernels, Materials, etc, that are added in this input file.
Definition: PorousFlowActionBase.h:51
PorousFlowActionBase::StabilizationEnum::KT