www.mooseframework.org
PorousFlowBasicTHM.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 "PorousFlowBasicTHM.h"
11 
12 #include "FEProblem.h"
13 #include "Conversion.h"
14 #include "libmesh/string_to_enum.h"
15 
16 registerMooseAction("PorousFlowApp", PorousFlowBasicTHM, "add_user_object");
17 
18 registerMooseAction("PorousFlowApp", PorousFlowBasicTHM, "add_kernel");
19 
20 registerMooseAction("PorousFlowApp", PorousFlowBasicTHM, "add_material");
21 
22 registerMooseAction("PorousFlowApp", PorousFlowBasicTHM, "add_aux_variable");
23 
24 registerMooseAction("PorousFlowApp", PorousFlowBasicTHM, "add_aux_kernel");
25 
26 template <>
27 InputParameters
29 {
30  InputParameters params = validParams<PorousFlowSinglePhaseBase>();
31  params.addParam<bool>("multiply_by_density",
32  false,
33  "If true, then the Kernels for fluid flow are multiplied by "
34  "the fluid density. If false, this multiplication is not "
35  "performed, which means the problem linearises, but that care "
36  "must be taken when using other PorousFlow objects.");
37  params.addClassDescription("Adds Kernels and fluid-property Materials necessary to simulate a "
38  "single-phase, single-component fully-saturated flow problem. No "
39  "upwinding and no mass lumping of the fluid mass are used. The "
40  "fluid-mass time derivative is close to linear, and is perfectly "
41  "linear if multiply_by_density=false. These features mean the "
42  "results may differ slightly from the "
43  "Unsaturated Action case. To run a simulation "
44  "you will also need to provide various other Materials for each mesh "
45  "block, depending on your simulation type, viz: permeability, "
46  "constant Biot modulus, constant thermal expansion coefficient, "
47  "porosity, elasticity tensor, strain calculator, stress calculator, "
48  "matrix internal energy, thermal conductivity, diffusivity");
49  return params;
50 }
51 
52 PorousFlowBasicTHM::PorousFlowBasicTHM(const InputParameters & params)
53  : PorousFlowSinglePhaseBase(params), _multiply_by_density(getParam<bool>("multiply_by_density"))
54 {
55  if (_num_mass_fraction_vars != 0)
56  mooseError("PorousFlowBasicTHM can only be used for a single-component fluid, so that no "
57  "mass-fraction variables should be provided");
58 }
59 
60 void
62 {
64 
65  // Add necessary objects to list of PorousFlow objects added by this action
66  _included_objects.push_back("PorousFlowFullySaturatedDarcyBase");
67 
68  if (_transient)
69  _included_objects.push_back("PorousFlowFullySaturatedMassTimeDerivative");
70 
71  if (_thermal)
72  _included_objects.push_back("PorousFlowFullySaturatedHeatAdvection");
73 }
74 
75 void
77 {
79 
80  std::string kernel_name = "PorousFlowBasicTHM_DarcyFlow";
81  std::string kernel_type = "PorousFlowFullySaturatedDarcyBase";
82  InputParameters params = _factory.getValidParams(kernel_type);
83  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
84  params.set<RealVectorValue>("gravity") = _gravity;
85  params.set<bool>("multiply_by_density") = _multiply_by_density;
86  params.set<NonlinearVariableName>("variable") = _pp_var;
87  _problem->addKernel(kernel_type, kernel_name, params);
88 
89  if (_transient)
90  {
91  std::string kernel_name = "PorousFlowBasicTHM_MassTimeDerivative";
92  std::string kernel_type = "PorousFlowFullySaturatedMassTimeDerivative";
93  InputParameters params = _factory.getValidParams(kernel_type);
94  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
95  params.set<NonlinearVariableName>("variable") = _pp_var;
96  params.set<Real>("biot_coefficient") = _biot_coefficient;
97  params.set<bool>("multiply_by_density") = _multiply_by_density;
98  params.set<MooseEnum>("coupling_type") = parameters().get<MooseEnum>("coupling_type");
99  _problem->addKernel(kernel_type, kernel_name, params);
100  }
101 
102  if (_thermal)
103  {
104  std::string kernel_name = "PorousFlowBasicTHM_HeatAdvection";
105  std::string kernel_type = "PorousFlowFullySaturatedHeatAdvection";
106  InputParameters params = _factory.getValidParams(kernel_type);
107  params.set<NonlinearVariableName>("variable") = _temperature_var[0];
108  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
109  params.set<RealVectorValue>("gravity") = _gravity;
110  _problem->addKernel(kernel_type, kernel_name, params);
111  }
112 }
113 
114 void
116 {
118 
119  if (_deps.dependsOn(_included_objects, "pressure_saturation_qp"))
120  {
121  std::string material_type = "PorousFlow1PhaseFullySaturated";
122  InputParameters params = _factory.getValidParams(material_type);
123  std::string material_name = "PorousFlowBasicTHM_1PhaseP_qp";
124  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
125  params.set<std::vector<VariableName>>("porepressure") = {_pp_var};
126  params.set<bool>("at_nodes") = false;
127  _problem->addMaterial(material_type, material_name, params);
128  }
129 
130  if (_deps.dependsOn(_included_objects, "pressure_saturation_nodal"))
131  {
132  std::string material_type = "PorousFlow1PhaseFullySaturated";
133  InputParameters params = _factory.getValidParams(material_type);
134  std::string material_name = "PorousFlowBasicTHM_1PhaseP";
135  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
136  params.set<std::vector<VariableName>>("porepressure") = {_pp_var};
137  params.set<bool>("at_nodes") = true;
138  _problem->addMaterial(material_type, material_name, params);
139  }
140 
141  if ((_deps.dependsOn(_included_objects, "volumetric_strain_qp") ||
142  _deps.dependsOn(_included_objects, "volumetric_strain_nodal")) &&
143  _mechanical)
145 
146  if (_deps.dependsOn(_included_objects, "relative_permeability_qp"))
147  addRelativePermeabilityCorey(false, 0, 0.0, 0.0, 0.0);
148 
149  if (_deps.dependsOn(_included_objects, "relative_permeability_nodal"))
150  addRelativePermeabilityCorey(true, 0, 0.0, 0.0, 0.0);
151 }
PorousFlowBasicTHM
Action for simulation involving a single phase, single component, fully saturated fluid,...
Definition: PorousFlowBasicTHM.h:25
PorousFlowBasicTHM.h
PorousFlowActionBase::_num_mass_fraction_vars
const unsigned _num_mass_fraction_vars
Number of mass-fraction variables.
Definition: PorousFlowActionBase.h:69
PorousFlowBasicTHM::addKernels
virtual void addKernels() override
Add all Kernels.
Definition: PorousFlowBasicTHM.C:76
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
PorousFlowSinglePhaseBase::_mechanical
const bool _mechanical
Definition: PorousFlowSinglePhaseBase.h:47
PorousFlowBasicTHM::addMaterialDependencies
virtual void addMaterialDependencies() override
Add all material dependencies so that the correct version of each material can be added.
Definition: PorousFlowBasicTHM.C:61
PorousFlowBasicTHM::_multiply_by_density
const bool _multiply_by_density
Definition: PorousFlowBasicTHM.h:36
PorousFlowSinglePhaseBase::_biot_coefficient
const Real _biot_coefficient
Fluid specific heat capacity at constant volume.
Definition: PorousFlowSinglePhaseBase.h:53
PorousFlowSinglePhaseBase::_pp_var
const VariableName _pp_var
Porepressure NonlinearVariable name.
Definition: PorousFlowSinglePhaseBase.h:35
PorousFlowBasicTHM::addMaterials
virtual void addMaterials() override
Add all Materials.
Definition: PorousFlowBasicTHM.C:115
PorousFlowActionBase::_coupled_displacements
std::vector< VariableName > _coupled_displacements
Displacement Variable names.
Definition: PorousFlowActionBase.h:81
PorousFlowDependencies::_deps
DependencyResolver< std::string > _deps
All dependencies of kernels, auxkernels, materials, etc, are stored in _dependencies.
Definition: PorousFlowDependencies.h:37
PorousFlowBasicTHM::PorousFlowBasicTHM
PorousFlowBasicTHM(const InputParameters &params)
Definition: PorousFlowBasicTHM.C:52
PorousFlowSinglePhaseBase::addKernels
virtual void addKernels() override
Add all Kernels.
Definition: PorousFlowSinglePhaseBase.C:127
registerMooseAction
registerMooseAction("PorousFlowApp", PorousFlowBasicTHM, "add_user_object")
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::_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
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
validParams< PorousFlowBasicTHM >
InputParameters validParams< PorousFlowBasicTHM >()
Definition: PorousFlowBasicTHM.C:28