www.mooseframework.org
PorousFlowFullySaturated.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 
11 
12 #include "FEProblem.h"
13 #include "Conversion.h"
14 #include "libmesh/string_to_enum.h"
15 
16 registerMooseAction("PorousFlowApp", PorousFlowFullySaturated, "add_user_object");
17 
18 registerMooseAction("PorousFlowApp", PorousFlowFullySaturated, "add_kernel");
19 
20 registerMooseAction("PorousFlowApp", PorousFlowFullySaturated, "add_material");
21 
22 registerMooseAction("PorousFlowApp", PorousFlowFullySaturated, "add_aux_variable");
23 
24 registerMooseAction("PorousFlowApp", PorousFlowFullySaturated, "add_aux_kernel");
25 
26 template <>
27 InputParameters
29 {
30  InputParameters params = validParams<PorousFlowSinglePhaseBase>();
31  params.addClassDescription(
32  "Adds Kernels and fluid-property Materials necessary to simulate a "
33  "single-phase fully-saturated flow problem. Full-upwinding of fluid flow is not available "
34  "in this Action, so the results may differ slightly from the Unsaturated Action. However KT "
35  "stabilization may be employed for both the fluid and any heat flow. No Kernels for "
36  "diffusion and dispersion of "
37  "fluid components are added. To run a simulation you will also "
38  "need to provide various other Materials for each mesh "
39  "block, depending on your simulation type, viz: permeability, "
40  "porosity, elasticity tensor, strain calculator, stress calculator, "
41  "matrix internal energy, thermal conductivity, diffusivity");
42  return params;
43 }
44 
47 {
48 }
49 
50 void
52 {
54 
55  // Add necessary objects to list of PorousFlow objects added by this action
56  _included_objects.push_back("PorousFlowFullySaturatedDarcyFlow");
57 
58  if (_transient)
59  _included_objects.push_back("PorousFlowMassTimeDerivative");
60 
61  if (_mechanical && _transient)
62  _included_objects.push_back("PorousFlowMassVolumetricExpansion");
63 
64  if (_thermal)
65  _included_objects.push_back("PorousFlowFullySaturatedHeatAdvection");
66 
68  _included_objects.push_back("PorousFlowAdvectiveFluxCalculatorSaturatedMultiComponent");
69 
71  _included_objects.push_back("PorousFlowAdvectiveFluxCalculatorSaturatedHeat");
72 }
73 
74 void
76 {
78 
80  {
81  const std::string kernel_type = "PorousFlowFullySaturatedDarcyFlow";
82  InputParameters params = _factory.getValidParams(kernel_type);
83  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
84  params.set<RealVectorValue>("gravity") = _gravity;
85 
86  for (unsigned i = 0; i < _num_mass_fraction_vars; ++i)
87  {
88  const std::string kernel_name = "PorousFlowFullySaturated_DarcyFlow" + Moose::stringify(i);
89  params.set<unsigned int>("fluid_component") = i;
90  params.set<NonlinearVariableName>("variable") = _mass_fraction_vars[i];
91  _problem->addKernel(kernel_type, kernel_name, params);
92  }
93 
94  const std::string kernel_name =
95  "PorousFlowFullySaturated_DarcyFlow" + Moose::stringify(_num_mass_fraction_vars);
96  params.set<unsigned int>("fluid_component") = _num_mass_fraction_vars;
97  params.set<NonlinearVariableName>("variable") = _pp_var;
98  _problem->addKernel(kernel_type, kernel_name, params);
99  }
101  {
102  const std::string kernel_type = "PorousFlowFluxLimitedTVDAdvection";
103  InputParameters params = _factory.getValidParams(kernel_type);
104  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
105 
106  for (unsigned i = 0; i < _num_mass_fraction_vars; ++i)
107  {
108  const std::string kernel_name = "PorousFlowFluxLimited_DarcyFlow" + Moose::stringify(i);
109  params.set<UserObjectName>("advective_flux_calculator") =
110  "PorousFlowFullySaturated_AC_" + Moose::stringify(i);
111  params.set<NonlinearVariableName>("variable") = _mass_fraction_vars[i];
112  _problem->addKernel(kernel_type, kernel_name, params);
113  }
114 
115  const std::string kernel_name =
116  "PorousFlowFluxLimited_DarcyFlow" + Moose::stringify(_num_mass_fraction_vars);
117  params.set<NonlinearVariableName>("variable") = _pp_var;
118  params.set<UserObjectName>("advective_flux_calculator") =
119  "PorousFlowFullySaturated_AC_" + Moose::stringify(_num_mass_fraction_vars);
120  _problem->addKernel(kernel_type, kernel_name, params);
121  }
122 
123  if (_transient)
124  {
125  std::string kernel_name = "PorousFlowFullySaturated_MassTimeDerivative";
126  std::string kernel_type = "PorousFlowMassTimeDerivative";
127  InputParameters params = _factory.getValidParams(kernel_type);
128  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
129 
130  for (unsigned i = 0; i < _num_mass_fraction_vars; ++i)
131  {
132  kernel_name = "PorousFlowFullySaturated_MassTimeDerivative" + Moose::stringify(i);
133  params.set<unsigned int>("fluid_component") = i;
134  params.set<NonlinearVariableName>("variable") = _mass_fraction_vars[i];
135  _problem->addKernel(kernel_type, kernel_name, params);
136  }
137 
138  kernel_name =
139  "PorousFlowFullySaturated_MassTimeDerivative" + Moose::stringify(_num_mass_fraction_vars);
140  params.set<unsigned int>("fluid_component") = _num_mass_fraction_vars;
141  params.set<NonlinearVariableName>("variable") = _pp_var;
142  _problem->addKernel(kernel_type, kernel_name, params);
143  }
144 
145  if (_mechanical && _transient)
146  {
147  std::string kernel_name = "PorousFlowFullySaturated_MassVolumetricExpansion";
148  std::string kernel_type = "PorousFlowMassVolumetricExpansion";
149  InputParameters params = _factory.getValidParams(kernel_type);
150  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
151 
152  for (unsigned i = 0; i < _num_mass_fraction_vars; ++i)
153  {
154  kernel_name = "PorousFlowFullySaturated_MassVolumetricExpansion" + Moose::stringify(i);
155  params.set<unsigned>("fluid_component") = i;
156  params.set<NonlinearVariableName>("variable") = _mass_fraction_vars[i];
157  _problem->addKernel(kernel_type, kernel_name, params);
158  }
159 
160  kernel_name = "PorousFlowFullySaturated_MassVolumetricExpansion" +
161  Moose::stringify(_num_mass_fraction_vars);
162  params.set<unsigned>("fluid_component") = _num_mass_fraction_vars;
163  params.set<NonlinearVariableName>("variable") = _pp_var;
164  _problem->addKernel(kernel_type, kernel_name, params);
165  }
166 
167  if (_thermal)
168  {
170  {
171  std::string kernel_name = "PorousFlowFullySaturated_HeatAdvection";
172  std::string kernel_type = "PorousFlowFullySaturatedHeatAdvection";
173  InputParameters params = _factory.getValidParams(kernel_type);
174  params.set<NonlinearVariableName>("variable") = _temperature_var[0];
175  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
176  params.set<RealVectorValue>("gravity") = _gravity;
177  _problem->addKernel(kernel_type, kernel_name, params);
178  }
180  {
181  const std::string kernel_name = "PorousFlowFullySaturated_HeatAdvection";
182  const std::string kernel_type = "PorousFlowFluxLimitedTVDAdvection";
183  InputParameters params = _factory.getValidParams(kernel_type);
184  params.set<NonlinearVariableName>("variable") = _temperature_var[0];
185  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
186  params.set<UserObjectName>("advective_flux_calculator") = "PorousFlowFullySaturatedHeat_AC";
187  _problem->addKernel(kernel_type, kernel_name, params);
188  }
189  }
190 }
191 
192 void
194 {
196 
197  // add Advective Flux calculator UserObjects, if required
199  {
200  for (unsigned i = 0; i < _num_mass_fraction_vars; ++i)
201  {
202  const std::string userobject_name = "PorousFlowFullySaturated_AC_" + Moose::stringify(i);
203  addAdvectiveFluxCalculatorSaturatedMultiComponent(0, i, true, userobject_name);
204  }
205 
206  const std::string userobject_name =
207  "PorousFlowFullySaturated_AC_" + Moose::stringify(_num_mass_fraction_vars);
208 
209  if (_num_mass_fraction_vars == 0)
210  addAdvectiveFluxCalculatorSaturated(0, true, userobject_name); // 1 component only
211  else
213  0, _num_mass_fraction_vars, true, userobject_name);
214 
215  if (_thermal)
216  {
217  const std::string userobject_name = "PorousFlowFullySaturatedHeat_AC";
218  addAdvectiveFluxCalculatorSaturatedHeat(0, true, userobject_name);
219  }
220  }
221 }
222 
223 void
225 {
227 
228  // add Materials
229  if (_deps.dependsOn(_included_objects, "pressure_saturation_qp"))
230  {
231  // saturation is always unity, so is trivially calculated using PorousFlow1PhaseFullySaturated
232  std::string material_type = "PorousFlow1PhaseFullySaturated";
233  InputParameters params = _factory.getValidParams(material_type);
234  std::string material_name = "PorousFlowFullySaturated_1PhaseP_qp";
235  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
236  params.set<std::vector<VariableName>>("porepressure") = {_pp_var};
237  params.set<bool>("at_nodes") = false;
238  _problem->addMaterial(material_type, material_name, params);
239  }
240 
241  if (_deps.dependsOn(_included_objects, "pressure_saturation_nodal"))
242  {
243  std::string material_type = "PorousFlow1PhaseFullySaturated";
244  InputParameters params = _factory.getValidParams(material_type);
245  std::string material_name = "PorousFlowFullySaturated_1PhaseP";
246  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
247  params.set<std::vector<VariableName>>("porepressure") = {_pp_var};
248  params.set<bool>("at_nodes") = true;
249  _problem->addMaterial(material_type, material_name, params);
250  }
251 
252  if (_deps.dependsOn(_included_objects, "volumetric_strain_qp") ||
253  _deps.dependsOn(_included_objects, "volumetric_strain_nodal"))
255 
256  if (_deps.dependsOn(_included_objects, "relative_permeability_qp"))
257  addRelativePermeabilityCorey(false, 0, 0.0, 0.0, 0.0);
258 
259  if (_deps.dependsOn(_included_objects, "relative_permeability_nodal"))
260  addRelativePermeabilityCorey(true, 0, 0.0, 0.0, 0.0);
261 }
PorousFlowActionBase::_num_mass_fraction_vars
const unsigned _num_mass_fraction_vars
Number of mass-fraction variables.
Definition: PorousFlowActionBase.h:69
PorousFlowFullySaturated::addMaterials
virtual void addMaterials() override
Add all Materials.
Definition: PorousFlowFullySaturated.C:224
PorousFlowActionBase::_transient
bool _transient
Flag to denote if the simulation is transient.
Definition: PorousFlowActionBase.h:92
PorousFlowFullySaturated::PorousFlowFullySaturated
PorousFlowFullySaturated(const InputParameters &params)
Definition: PorousFlowFullySaturated.C:45
PorousFlowSinglePhaseBase
Base class for actions involving a single fluid phase.
Definition: PorousFlowSinglePhaseBase.h:22
PorousFlowFullySaturated::addUserObjects
virtual void addUserObjects() override
Add all other UserObjects.
Definition: PorousFlowFullySaturated.C:193
PorousFlowActionBase::_stabilization
enum PorousFlowActionBase::StabilizationEnum _stabilization
PorousFlowActionBase::addAdvectiveFluxCalculatorSaturated
void addAdvectiveFluxCalculatorSaturated(unsigned phase, bool multiply_by_density, std::string userobject_name)
Definition: PorousFlowActionBase.C:544
PorousFlowFullySaturated::addKernels
virtual void addKernels() override
Add all Kernels.
Definition: PorousFlowFullySaturated.C:75
PorousFlowSinglePhaseBase::_mechanical
const bool _mechanical
Definition: PorousFlowSinglePhaseBase.h:47
PorousFlowActionBase::addUserObjects
virtual void addUserObjects()
Add all other UserObjects.
Definition: PorousFlowActionBase.C:174
PorousFlowFullySaturated
Action for simulation involving a single phase fully saturated fluid.
Definition: PorousFlowFullySaturated.h:22
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
PorousFlowDependencies::_deps
DependencyResolver< std::string > _deps
All dependencies of kernels, auxkernels, materials, etc, are stored in _dependencies.
Definition: PorousFlowDependencies.h:37
PorousFlowActionBase::StabilizationEnum::Full
PorousFlowFullySaturated.h
PorousFlowSinglePhaseBase::addKernels
virtual void addKernels() override
Add all Kernels.
Definition: PorousFlowSinglePhaseBase.C:127
PorousFlowActionBase::addAdvectiveFluxCalculatorSaturatedMultiComponent
void addAdvectiveFluxCalculatorSaturatedMultiComponent(unsigned phase, unsigned fluid_component, bool multiply_by_density, std::string userobject_name)
Definition: PorousFlowActionBase.C:616
validParams< PorousFlowFullySaturated >
InputParameters validParams< PorousFlowFullySaturated >()
Definition: PorousFlowFullySaturated.C:28
PorousFlowActionBase::_gravity
const RealVectorValue _gravity
Gravity.
Definition: PorousFlowActionBase.h:63
validParams< PorousFlowSinglePhaseBase >
InputParameters validParams< PorousFlowSinglePhaseBase >()
Definition: PorousFlowSinglePhaseBase.C:18
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
PorousFlowActionBase::_temperature_var
const std::vector< VariableName > & _temperature_var
Name of the temperature variable (if any)
Definition: PorousFlowActionBase.h:72
PorousFlowSinglePhaseBase::addMaterials
virtual void addMaterials() override
Add all Materials.
Definition: PorousFlowSinglePhaseBase.C:219
PorousFlowActionBase::addAdvectiveFluxCalculatorSaturatedHeat
void addAdvectiveFluxCalculatorSaturatedHeat(unsigned phase, bool multiply_by_density, std::string userobject_name)
Definition: PorousFlowActionBase.C:580
PorousFlowActionBase::_dictator_name
const std::string _dictator_name
The name of the PorousFlowDictator object to be added.
Definition: PorousFlowActionBase.h:54
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
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
PorousFlowFullySaturated::addMaterialDependencies
virtual void addMaterialDependencies() override
Add all material dependencies so that the correct version of each material can be added.
Definition: PorousFlowFullySaturated.C:51
registerMooseAction
registerMooseAction("PorousFlowApp", PorousFlowFullySaturated, "add_user_object")
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