12 #include "FEProblem.h"
13 #include "Conversion.h"
14 #include "libmesh/string_to_enum.h"
31 params.addParam<
bool>(
"add_saturation_aux",
true,
"Add an AuxVariable that records saturation");
32 params.addRangeCheckedParam<Real>(
33 "van_genuchten_alpha",
35 "van_genuchten_alpha > 0.0",
36 "Van Genuchten alpha parameter used to determine saturation from porepressure");
37 params.addRangeCheckedParam<Real>(
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",
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",
50 "relative_permeability_exponent>=0",
51 "Relative permeability exponent");
52 params.addRangeCheckedParam<Real>(
53 "residual_saturation",
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");
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")),
75 _relative_permeability_exponent(getParam<Real>(
"relative_permeability_exponent")),
76 _s_res(getParam<Real>(
"residual_saturation")),
77 _capillary_pressure_name(
"PorousFlowUnsaturated_CapillaryPressureVG")
102 _included_objects.push_back(
"PorousFlowAdvectiveFluxCalculatorUnsaturatedMultiComponent");
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;
123 const std::string kernel_name =
"PorousFlowUnsaturated_AdvectiveFlux" + Moose::stringify(i);
124 params.set<
unsigned int>(
"fluid_component") = i;
126 _problem->addKernel(kernel_type, kernel_name, params);
128 const std::string kernel_name =
131 params.set<NonlinearVariableName>(
"variable") =
_pp_var;
132 _problem->addKernel(kernel_type, kernel_name, params);
136 const std::string kernel_type =
"PorousFlowFluxLimitedTVDAdvection";
137 InputParameters params = _factory.getValidParams(kernel_type);
138 params.set<UserObjectName>(
"PorousFlowDictator") =
_dictator_name;
142 const std::string kernel_name =
"PorousFlowFluxLimited_DarcyFlow" + Moose::stringify(i);
143 params.set<UserObjectName>(
"advective_flux_calculator") =
144 "PorousFlowUnsaturated_AC_" + Moose::stringify(i);
146 _problem->addKernel(kernel_type, kernel_name, params);
148 const std::string kernel_name =
150 params.set<NonlinearVariableName>(
"variable") =
_pp_var;
151 params.set<UserObjectName>(
"advective_flux_calculator") =
153 _problem->addKernel(kernel_type, kernel_name, params);
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;
165 kernel_name =
"PorousFlowUnsaturated_MassTimeDerivative" + Moose::stringify(i);
166 params.set<
unsigned int>(
"fluid_component") = i;
168 _problem->addKernel(kernel_type, kernel_name, params);
173 params.set<NonlinearVariableName>(
"variable") =
_pp_var;
174 _problem->addKernel(kernel_type, kernel_name, params);
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;
186 kernel_name =
"PorousFlowUnsaturated_MassVolumetricExpansion" + Moose::stringify(i);
187 params.set<
unsigned>(
"fluid_component") = i;
189 _problem->addKernel(kernel_type, kernel_name, params);
194 params.set<NonlinearVariableName>(
"variable") =
_pp_var;
195 _problem->addKernel(kernel_type, kernel_name, params);
202 const std::string kernel_name =
"PorousFlowUnsaturated_HeatAdvection";
203 const std::string kernel_type =
"PorousFlowHeatAdvection";
204 InputParameters params = _factory.getValidParams(kernel_type);
206 params.set<UserObjectName>(
"PorousFlowDictator") =
_dictator_name;
207 params.set<RealVectorValue>(
"gravity") =
_gravity;
208 _problem->addKernel(kernel_type, kernel_name, params);
212 const std::string kernel_name =
"PorousFlowUnsaturated_HeatAdvection";
213 const std::string kernel_type =
"PorousFlowFluxLimitedTVDAdvection";
214 InputParameters params = _factory.getValidParams(kernel_type);
216 params.set<UserObjectName>(
"PorousFlowDictator") =
_dictator_name;
217 params.set<UserObjectName>(
"advective_flux_calculator") =
"PorousFlowUnsaturatedHeat_AC";
218 _problem->addKernel(kernel_type, kernel_name, params);
236 const std::string userobject_name =
"PorousFlowUnsaturated_AC_" + Moose::stringify(i);
239 const std::string userobject_name =
249 const std::string userobject_name =
"PorousFlowUnsaturatedHeat_AC";
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};
268 params.set<
bool>(
"at_nodes") =
false;
269 _problem->addMaterial(material_type, material_name, params);
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};
279 params.set<
bool>(
"at_nodes") =
true;
280 _problem->addMaterial(material_type, material_name, params);