www.mooseframework.org
PorousFlowActionBase.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 "PorousFlowActionBase.h"
11 
12 #include "FEProblem.h"
13 #include "MooseMesh.h"
14 #include "libmesh/string_to_enum.h"
15 #include "Conversion.h"
16 #include "AddKernelAction.h"
17 #include "AddPostprocessorAction.h"
18 #include "AddBCAction.h"
19 #include "AddDiracKernelAction.h"
20 
23 {
25  params.addParam<std::string>(
26  "dictator_name",
27  "dictator",
28  "The name of the dictator user object that is created by this Action");
29  params.addClassDescription("Adds the PorousFlowDictator UserObject. This class also contains "
30  "many utility functions for adding other pieces of an input file, "
31  "which may be used by derived classes.");
32  params.addParam<RealVectorValue>("gravity",
33  RealVectorValue(0.0, 0.0, -10.0),
34  "Gravitational acceleration vector downwards (m/s^2)");
35  params.addCoupledVar("temperature",
36  293.0,
37  "For isothermal simulations, this is the temperature "
38  "at which fluid properties (and stress-free strains) "
39  "are evaluated at. Otherwise, this is the name of "
40  "the temperature variable. Units = Kelvin");
41  params.addCoupledVar("mass_fraction_vars",
42  "List of variables that represent the mass fractions. Format is 'f_ph0^c0 "
43  "f_ph0^c1 f_ph0^c2 ... f_ph0^c(N-1) f_ph1^c0 f_ph1^c1 fph1^c2 ... "
44  "fph1^c(N-1) ... fphP^c0 f_phP^c1 fphP^c2 ... fphP^c(N-1)' where "
45  "N=num_components and P=num_phases, and it is assumed that "
46  "f_ph^cN=1-sum(f_ph^c,{c,0,N-1}) so that f_ph^cN need not be given. If no "
47  "variables are provided then num_phases=1=num_components.");
48  params.addParam<unsigned int>("number_aqueous_equilibrium",
49  0,
50  "The number of secondary species in the aqueous-equilibrium "
51  "reaction system. (Leave as zero if the simulation does not "
52  "involve chemistry)");
53  params.addParam<unsigned int>("number_aqueous_kinetic",
54  0,
55  "The number of secondary species in the aqueous-kinetic reaction "
56  "system involved in precipitation and dissolution. (Leave as zero "
57  "if the simulation does not involve chemistry)");
58  params.addParam<std::vector<VariableName>>(
59  "displacements",
60  {},
61  "The name of the displacement variables (relevant only for "
62  "mechanically-coupled simulations)");
63  params.addParam<std::vector<MaterialPropertyName>>(
64  "eigenstrain_names",
65  {},
66  "List of all eigenstrain models used in mechanics calculations. "
67  "Typically the eigenstrain_name used in "
68  "ComputeThermalExpansionEigenstrain. Only needed for "
69  "thermally-coupled simulations with thermal expansion.");
70  params.addParam<bool>(
71  "use_displaced_mesh", false, "Use displaced mesh computations in mechanical kernels");
72  MooseEnum flux_limiter_type("MinMod VanLeer MC superbee None", "VanLeer");
73  params.addParam<MooseEnum>(
74  "flux_limiter_type",
75  flux_limiter_type,
76  "Type of flux limiter to use if stabilization=KT. 'None' means that no antidiffusion "
77  "will be added in the Kuzmin-Turek scheme");
78  MooseEnum stabilization("None Full KT", "Full");
79  params.addParam<MooseEnum>("stabilization",
80  stabilization,
81  "Numerical stabilization used. 'Full' means full upwinding. 'KT' "
82  "means FEM-TVD stabilization of Kuzmin-Turek");
83  params.addParam<bool>(
84  "strain_at_nearest_qp",
85  false,
86  "Only relevant for models in which porosity depends on strain. If true, then when "
87  "calculating nodal porosity that depends on strain, the strain at the nearest quadpoint will "
88  "be used. This adds a small extra computational burden, and is only necessary for "
89  "simulations involving: (1) elements that are not linear lagrange or (2) certain PorousFlow "
90  "Dirac Kernels (as specified in their documentation). If you set this to true, you will "
91  "also want to set the same parameter to true for related Kernels and Materials (which is "
92  "probably easiest to do in the GlobalParams block)");
93  return params;
94 }
95 
97  : Action(params),
99  _included_objects(),
100  _dictator_name(getParam<std::string>("dictator_name")),
101  _num_aqueous_equilibrium(getParam<unsigned int>("number_aqueous_equilibrium")),
102  _num_aqueous_kinetic(getParam<unsigned int>("number_aqueous_kinetic")),
103  _gravity(getParam<RealVectorValue>("gravity")),
104  _mass_fraction_vars(isParamValid("mass_fraction_vars")
105  ? getParam<std::vector<VariableName>>("mass_fraction_vars")
106  : std::vector<VariableName>{}),
107  _num_mass_fraction_vars(_mass_fraction_vars.size()),
108  _temperature_var(isParamValid("temperature")
109  ? getParam<std::vector<VariableName>>("temperature")
110  : std::vector<VariableName>{}),
111  _displacements(getParam<std::vector<VariableName>>("displacements")),
112  _ndisp(_displacements.size()),
113  _coupled_displacements(_ndisp),
114  _flux_limiter_type(getParam<MooseEnum>("flux_limiter_type")),
115  _stabilization(getParam<MooseEnum>("stabilization").getEnum<StabilizationEnum>()),
116  _strain_at_nearest_qp(getParam<bool>("strain_at_nearest_qp"))
117 {
118  // convert vector of VariableName to vector of VariableName
119  for (unsigned int i = 0; i < _ndisp; ++i)
120  _coupled_displacements[i] = _displacements[i];
121 }
122 
123 void
125 {
127  ? _factory.getValidParams("PorousFlowAdvectiveFluxCalculatorSaturated")
129  addRelationshipManagers(input_rm_type, ips);
130 }
131 
132 void
134 {
135  // Check if the simulation is transient (note: can't do this in the ctor)
136  _transient = _problem->isTransient();
137 
138  // Make sure that all mesh subdomains have the same coordinate system
139  const auto & all_subdomains = _problem->mesh().meshSubdomains();
140  if (all_subdomains.empty())
141  mooseError("No subdomains found");
142  _coord_system = _problem->getCoordSystem(*all_subdomains.begin());
143  for (const auto & subdomain : all_subdomains)
144  if (_problem->getCoordSystem(subdomain) != _coord_system)
145  mooseError(
146  "The PorousFlow Actions require all subdomains to have the same coordinate system.");
147 
148  // Note: this must be called before addMaterials!
150 
151  // Make the vector of added objects unique
152  std::sort(_included_objects.begin(), _included_objects.end());
153  _included_objects.erase(std::unique(_included_objects.begin(), _included_objects.end()),
154  _included_objects.end());
155 
156  if (_current_task == "add_user_object")
157  addUserObjects();
158 
159  if (_current_task == "add_aux_variable" || _current_task == "add_aux_kernel")
160  addAuxObjects();
161 
162  if (_current_task == "add_kernel")
163  addKernels();
164 
165  if (_current_task == "add_material")
166  addMaterials();
167 }
168 
169 void
171 {
173  _included_objects.push_back("PorousFlowNearestQp");
174 
175  // Check to see if there are any other PorousFlow objects like BCs that
176  // may require specific versions of materials added using this action
177 
178  // Unique list of auxkernels added in input file
179  auto auxkernels = _awh.getActions<AddKernelAction>();
180  for (auto & auxkernel : auxkernels)
181  _included_objects.push_back(auxkernel->getMooseObjectType());
182 
183  // Unique list of postprocessors added in input file
184  auto postprocessors = _awh.getActions<AddPostprocessorAction>();
185  for (auto & postprocessor : postprocessors)
186  _included_objects.push_back(postprocessor->getMooseObjectType());
187 
188  // Unique list of BCs added in input file
189  auto bcs = _awh.getActions<AddBCAction>();
190  for (auto & bc : bcs)
191  _included_objects.push_back(bc->getMooseObjectType());
192 
193  // Unique list of Dirac kernels added in input file
194  auto diracs = _awh.getActions<AddDiracKernelAction>();
195  for (auto & dirac : diracs)
196  _included_objects.push_back(dirac->getMooseObjectType());
197 }
198 
199 void
201 {
202  addDictator();
203 }
204 
205 void
207 {
208 }
209 
210 void
212 {
213 }
214 
215 void
217 {
218  if (_strain_at_nearest_qp && _deps.dependsOn(_included_objects, "nearest_qp_nodal"))
220 }
221 
222 void
224 {
225  std::string phase_str = Moose::stringify(phase);
226 
227  if (_current_task == "add_aux_variable")
228  {
229  auto var_params = _factory.getValidParams("MooseVariableConstMonomial");
230  _problem->addAuxVariable("MooseVariableConstMonomial", "saturation" + phase_str, var_params);
231  }
232 
233  if (_current_task == "add_aux_kernel")
234  {
235  std::string aux_kernel_type = "MaterialStdVectorAux";
236  InputParameters params = _factory.getValidParams(aux_kernel_type);
237 
238  std::string aux_kernel_name = "PorousFlowActionBase_SaturationAux" + phase_str;
239  params.set<MaterialPropertyName>("property") = "PorousFlow_saturation_qp";
240  params.set<unsigned>("index") = phase;
241  params.set<AuxVariableName>("variable") = "saturation" + phase_str;
242  params.set<ExecFlagEnum>("execute_on") = EXEC_TIMESTEP_END;
243  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
244  }
245 }
246 
247 void
249 {
250  if (_current_task == "add_aux_variable")
251  {
252  auto var_params = _factory.getValidParams("MooseVariableConstMonomial");
253 
254  _problem->addAuxVariable("MooseVariableConstMonomial", "darcy_vel_x", var_params);
255  _problem->addAuxVariable("MooseVariableConstMonomial", "darcy_vel_y", var_params);
256  _problem->addAuxVariable("MooseVariableConstMonomial", "darcy_vel_z", var_params);
257  }
258 
259  if (_current_task == "add_aux_kernel")
260  {
261  std::string aux_kernel_type = "PorousFlowDarcyVelocityComponent";
262  InputParameters params = _factory.getValidParams(aux_kernel_type);
263 
264  params.set<RealVectorValue>("gravity") = gravity;
265  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
266  params.set<ExecFlagEnum>("execute_on") = EXEC_TIMESTEP_END;
267 
268  std::string aux_kernel_name = "PorousFlowActionBase_Darcy_x_Aux";
269  params.set<MooseEnum>("component") = "x";
270  params.set<AuxVariableName>("variable") = "darcy_vel_x";
271  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
272 
273  aux_kernel_name = "PorousFlowActionBase_Darcy_y_Aux";
274  params.set<MooseEnum>("component") = "y";
275  params.set<AuxVariableName>("variable") = "darcy_vel_y";
276  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
277 
278  aux_kernel_name = "PorousFlowActionBase_Darcy_z_Aux";
279  params.set<MooseEnum>("component") = "z";
280  params.set<AuxVariableName>("variable") = "darcy_vel_z";
281  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
282  }
283 }
284 
285 void
287 {
288  if (_current_task == "add_aux_variable")
289  {
290  auto var_params = _factory.getValidParams("MooseVariableConstMonomial");
291  _problem->addAuxVariable("MooseVariableConstMonomial", "stress_xx", var_params);
292  _problem->addAuxVariable("MooseVariableConstMonomial", "stress_xy", var_params);
293  _problem->addAuxVariable("MooseVariableConstMonomial", "stress_xz", var_params);
294  _problem->addAuxVariable("MooseVariableConstMonomial", "stress_yx", var_params);
295  _problem->addAuxVariable("MooseVariableConstMonomial", "stress_yy", var_params);
296  _problem->addAuxVariable("MooseVariableConstMonomial", "stress_yz", var_params);
297  _problem->addAuxVariable("MooseVariableConstMonomial", "stress_zx", var_params);
298  _problem->addAuxVariable("MooseVariableConstMonomial", "stress_zy", var_params);
299  _problem->addAuxVariable("MooseVariableConstMonomial", "stress_zz", var_params);
300  }
301 
302  if (_current_task == "add_aux_kernel")
303  {
304  std::string aux_kernel_type = "RankTwoAux";
305  InputParameters params = _factory.getValidParams(aux_kernel_type);
306 
307  params.set<MaterialPropertyName>("rank_two_tensor") = "stress";
308  params.set<ExecFlagEnum>("execute_on") = EXEC_TIMESTEP_END;
309 
310  std::string aux_kernel_name = "PorousFlowAction_stress_xx";
311  params.set<AuxVariableName>("variable") = "stress_xx";
312  params.set<unsigned>("index_i") = 0;
313  params.set<unsigned>("index_j") = 0;
314  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
315 
316  aux_kernel_name = "PorousFlowAction_stress_xy";
317  params.set<AuxVariableName>("variable") = "stress_xy";
318  params.set<unsigned>("index_i") = 0;
319  params.set<unsigned>("index_j") = 1;
320  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
321 
322  aux_kernel_name = "PorousFlowAction_stress_xz";
323  params.set<AuxVariableName>("variable") = "stress_xz";
324  params.set<unsigned>("index_i") = 0;
325  params.set<unsigned>("index_j") = 2;
326  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
327 
328  aux_kernel_name = "PorousFlowAction_stress_yx";
329  params.set<AuxVariableName>("variable") = "stress_yx";
330  params.set<unsigned>("index_i") = 1;
331  params.set<unsigned>("index_j") = 0;
332  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
333 
334  aux_kernel_name = "PorousFlowAction_stress_yy";
335  params.set<AuxVariableName>("variable") = "stress_yy";
336  params.set<unsigned>("index_i") = 1;
337  params.set<unsigned>("index_j") = 1;
338  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
339 
340  aux_kernel_name = "PorousFlowAction_stress_yz";
341  params.set<AuxVariableName>("variable") = "stress_yz";
342  params.set<unsigned>("index_i") = 1;
343  params.set<unsigned>("index_j") = 2;
344  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
345 
346  aux_kernel_name = "PorousFlowAction_stress_zx";
347  params.set<AuxVariableName>("variable") = "stress_zx";
348  params.set<unsigned>("index_i") = 2;
349  params.set<unsigned>("index_j") = 0;
350  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
351 
352  aux_kernel_name = "PorousFlowAction_stress_zy";
353  params.set<AuxVariableName>("variable") = "stress_zy";
354  params.set<unsigned>("index_i") = 2;
355  params.set<unsigned>("index_j") = 1;
356  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
357 
358  aux_kernel_name = "PorousFlowAction_stress_zz";
359  params.set<AuxVariableName>("variable") = "stress_zz";
360  params.set<unsigned>("index_i") = 2;
361  params.set<unsigned>("index_j") = 2;
362  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
363  }
364 }
365 
366 void
368 {
369  if (_current_task == "add_material")
370  {
371  if (!parameters().hasDefaultCoupledValue("temperature"))
372  mooseError("Attempt to add a PorousFlowTemperature material without setting a temperature "
373  "variable");
374 
375  std::string material_type = "PorousFlowTemperature";
376  InputParameters params = _factory.getValidParams(material_type);
377 
378  params.applySpecificParameters(parameters(), {"temperature"});
379  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
380 
381  std::string material_name = "PorousFlowActionBase_Temperature_qp";
382  if (at_nodes)
383  material_name = "PorousFlowActionBase_Temperature";
384 
385  params.set<bool>("at_nodes") = at_nodes;
386  _problem->addMaterial(material_type, material_name, params);
387  }
388 }
389 
390 void
392 {
393  if (_current_task == "add_material")
394  {
395  if (!(parameters().hasDefaultCoupledValue("mass_fraction_vars") ||
396  parameters().hasCoupledValue("mass_fraction_vars")))
397  mooseError("Attempt to add a PorousFlowMassFraction material without setting the "
398  "mass_fraction_vars");
399 
400  std::string material_type = "PorousFlowMassFraction";
401  InputParameters params = _factory.getValidParams(material_type);
402 
403  params.applySpecificParameters(parameters(), {"mass_fraction_vars"});
404  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
405 
406  std::string material_name = "PorousFlowActionBase_MassFraction_qp";
407  if (at_nodes)
408  material_name = "PorousFlowActionBase_MassFraction";
409 
410  params.set<bool>("at_nodes") = at_nodes;
411  _problem->addMaterial(material_type, material_name, params);
412  }
413 }
414 
415 void
417 {
418  if (_current_task == "add_material")
419  {
420  std::string material_type = "PorousFlowEffectiveFluidPressure";
421  InputParameters params = _factory.getValidParams(material_type);
422 
423  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
424 
425  std::string material_name = "PorousFlowUnsaturated_EffectiveFluidPressure_qp";
426  if (at_nodes)
427  material_name = "PorousFlowUnsaturated_EffectiveFluidPressure";
428 
429  params.set<bool>("at_nodes") = at_nodes;
430  _problem->addMaterial(material_type, material_name, params);
431  }
432 }
433 
434 void
436 {
437  if (_current_task == "add_material")
438  {
439  std::string material_type = "PorousFlowNearestQp";
440  InputParameters params = _factory.getValidParams(material_type);
441 
442  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
443  params.set<bool>("nodal_material") = true;
444 
445  std::string material_name = "PorousFlowActionBase_NearestQp";
446  _problem->addMaterial(material_type, material_name, params);
447  }
448 }
449 
450 void
451 PorousFlowActionBase::addVolumetricStrainMaterial(const std::vector<VariableName> & displacements,
452  const std::string & base_name)
453 {
454  if (_current_task == "add_material")
455  {
456  std::string material_type = "PorousFlowVolumetricStrain";
457  InputParameters params = _factory.getValidParams(material_type);
458 
459  std::string material_name = "PorousFlowActionBase_VolumetricStrain";
460  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
461  params.set<std::vector<VariableName>>("displacements") = displacements;
462  if (!base_name.empty())
463  params.set<std::string>("base_name") = base_name;
464  _problem->addMaterial(material_type, material_name, params);
465  }
466 }
467 
468 void
470  unsigned phase,
471  bool compute_density_and_viscosity,
472  bool compute_internal_energy,
473  bool compute_enthalpy,
474  const UserObjectName & fp,
475  const MooseEnum & temperature_unit,
476  const MooseEnum & pressure_unit,
477  const MooseEnum & time_unit)
478 {
479  if (_current_task == "add_material")
480  {
481  std::string material_type = "PorousFlowSingleComponentFluid";
482  InputParameters params = _factory.getValidParams(material_type);
483 
484  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
485  params.set<unsigned int>("phase") = phase;
486  params.set<bool>("compute_density_and_viscosity") = compute_density_and_viscosity;
487  params.set<bool>("compute_internal_energy") = compute_internal_energy;
488  params.set<bool>("compute_enthalpy") = compute_enthalpy;
489  params.set<UserObjectName>("fp") = fp;
490  params.set<MooseEnum>("temperature_unit") = temperature_unit;
491  params.set<MooseEnum>("pressure_unit") = pressure_unit;
492  params.set<MooseEnum>("time_unit") = time_unit;
493 
494  std::string material_name = "PorousFlowActionBase_FluidProperties_qp";
495  if (at_nodes)
496  material_name = "PorousFlowActionBase_FluidProperties";
497 
498  params.set<bool>("at_nodes") = at_nodes;
499  _problem->addMaterial(material_type, material_name, params);
500  }
501 }
502 
503 void
505  bool at_nodes,
506  unsigned phase,
507  bool compute_density_and_viscosity,
508  bool compute_internal_energy,
509  bool compute_enthalpy,
510  const MooseEnum & temperature_unit)
511 {
512  if (_current_task == "add_material")
513  {
514  std::string material_type = "PorousFlowBrine";
515  InputParameters params = _factory.getValidParams(material_type);
516 
517  params.set<std::vector<VariableName>>("xnacl") = {nacl_brine};
518  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
519  params.set<unsigned int>("phase") = phase;
520  params.set<bool>("compute_density_and_viscosity") = compute_density_and_viscosity;
521  params.set<bool>("compute_internal_energy") = compute_internal_energy;
522  params.set<bool>("compute_enthalpy") = compute_enthalpy;
523  params.set<MooseEnum>("temperature_unit") = temperature_unit;
524 
525  std::string material_name = "PorousFlowActionBase_FluidProperties_qp";
526  if (at_nodes)
527  material_name = "PorousFlowActionBase_FluidProperties";
528 
529  params.set<bool>("at_nodes") = at_nodes;
530  _problem->addMaterial(material_type, material_name, params);
531  }
532 }
533 
534 void
535 PorousFlowActionBase::addRelativePermeabilityConst(bool at_nodes, unsigned phase, Real kr)
536 {
537  if (_current_task == "add_material")
538  {
539  std::string material_type = "PorousFlowRelativePermeabilityConst";
540  InputParameters params = _factory.getValidParams(material_type);
541 
542  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
543  params.set<unsigned int>("phase") = phase;
544  params.set<Real>("kr") = kr;
545  std::string material_name = "PorousFlowActionBase_RelativePermeability_qp";
546  if (at_nodes)
547  material_name = "PorousFlowActionBase_RelativePermeability_nodal";
548 
549  params.set<bool>("at_nodes") = at_nodes;
550  _problem->addMaterial(material_type, material_name, params);
551  }
552 }
553 
554 void
556  bool at_nodes, unsigned phase, Real n, Real s_res, Real sum_s_res)
557 {
558  if (_current_task == "add_material")
559  {
560  std::string material_type = "PorousFlowRelativePermeabilityCorey";
561  InputParameters params = _factory.getValidParams(material_type);
562 
563  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
564  params.set<Real>("n") = n;
565  params.set<unsigned int>("phase") = phase;
566  params.set<Real>("s_res") = s_res;
567  params.set<Real>("sum_s_res") = sum_s_res;
568 
569  std::string material_name = "PorousFlowActionBase_RelativePermeability_qp";
570  if (at_nodes)
571  material_name = "PorousFlowActionBase_RelativePermeability_nodal";
572 
573  params.set<bool>("at_nodes") = at_nodes;
574  _problem->addMaterial(material_type, material_name, params);
575  }
576 }
577 
578 void
580  bool at_nodes, unsigned phase, Real m, Real s_res, Real sum_s_res)
581 {
582  if (_current_task == "add_material")
583  {
584  std::string material_type = "PorousFlowRelativePermeabilityFLAC";
585  InputParameters params = _factory.getValidParams(material_type);
586 
587  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
588  params.set<Real>("m") = m;
589  params.set<unsigned int>("phase") = phase;
590  params.set<Real>("s_res") = s_res;
591  params.set<Real>("sum_s_res") = sum_s_res;
592 
593  std::string material_name = "PorousFlowActionBase_RelativePermeability_qp";
594  if (at_nodes)
595  material_name = "PorousFlowActionBase_RelativePermeability_nodal";
596 
597  params.set<bool>("at_nodes") = at_nodes;
598  _problem->addMaterial(material_type, material_name, params);
599  }
600 }
601 
602 void
603 PorousFlowActionBase::addCapillaryPressureVG(Real m, Real alpha, std::string userobject_name)
604 {
605  if (_current_task == "add_user_object")
606  {
607  std::string userobject_type = "PorousFlowCapillaryPressureVG";
608  InputParameters params = _factory.getValidParams(userobject_type);
609  params.set<Real>("m") = m;
610  params.set<Real>("alpha") = alpha;
611  _problem->addUserObject(userobject_type, userobject_name, params);
612  }
613 }
614 
615 void
617  bool multiply_by_density,
618  std::string userobject_name)
619 {
620  if (_stabilization == StabilizationEnum::KT && _current_task == "add_user_object")
621  {
622  const std::string userobject_type = "PorousFlowAdvectiveFluxCalculatorSaturated";
623  InputParameters params = _factory.getValidParams(userobject_type);
624  params.set<MooseEnum>("flux_limiter_type") = _flux_limiter_type;
625  params.set<RealVectorValue>("gravity") = _gravity;
626  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
627  params.set<unsigned>("phase") = phase;
628  params.set<bool>("multiply_by_density") = multiply_by_density;
629  _problem->addUserObject(userobject_type, userobject_name, params);
630  }
631 }
632 
633 void
635  bool multiply_by_density,
636  std::string userobject_name)
637 {
638  if (_stabilization == StabilizationEnum::KT && _current_task == "add_user_object")
639  {
640  const std::string userobject_type = "PorousFlowAdvectiveFluxCalculatorUnsaturated";
641  InputParameters params = _factory.getValidParams(userobject_type);
642  params.set<MooseEnum>("flux_limiter_type") = _flux_limiter_type;
643  params.set<RealVectorValue>("gravity") = _gravity;
644  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
645  params.set<unsigned>("phase") = phase;
646  params.set<bool>("multiply_by_density") = multiply_by_density;
647  _problem->addUserObject(userobject_type, userobject_name, params);
648  }
649 }
650 
651 void
653  bool multiply_by_density,
654  std::string userobject_name)
655 {
656  if (_stabilization == StabilizationEnum::KT && _current_task == "add_user_object")
657  {
658  const std::string userobject_type = "PorousFlowAdvectiveFluxCalculatorSaturatedHeat";
659  InputParameters params = _factory.getValidParams(userobject_type);
660  params.set<MooseEnum>("flux_limiter_type") = _flux_limiter_type;
661  params.set<RealVectorValue>("gravity") = _gravity;
662  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
663  params.set<unsigned>("phase") = phase;
664  params.set<bool>("multiply_by_density") = multiply_by_density;
665  _problem->addUserObject(userobject_type, userobject_name, params);
666  }
667 }
668 
669 void
671  bool multiply_by_density,
672  std::string userobject_name)
673 {
674  if (_stabilization == StabilizationEnum::KT && _current_task == "add_user_object")
675  {
676  const std::string userobject_type = "PorousFlowAdvectiveFluxCalculatorUnsaturatedHeat";
677  InputParameters params = _factory.getValidParams(userobject_type);
678  params.set<MooseEnum>("flux_limiter_type") = _flux_limiter_type;
679  params.set<RealVectorValue>("gravity") = _gravity;
680  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
681  params.set<unsigned>("phase") = phase;
682  params.set<bool>("multiply_by_density") = multiply_by_density;
683  _problem->addUserObject(userobject_type, userobject_name, params);
684  }
685 }
686 
687 void
689  unsigned fluid_component,
690  bool multiply_by_density,
691  std::string userobject_name)
692 {
693  if (_stabilization == StabilizationEnum::KT && _current_task == "add_user_object")
694  {
695  const std::string userobject_type = "PorousFlowAdvectiveFluxCalculatorSaturatedMultiComponent";
696  InputParameters params = _factory.getValidParams(userobject_type);
697  params.set<MooseEnum>("flux_limiter_type") = _flux_limiter_type;
698  params.set<RealVectorValue>("gravity") = _gravity;
699  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
700  params.set<unsigned>("phase") = phase;
701  params.set<bool>("multiply_by_density") = multiply_by_density;
702  params.set<unsigned>("fluid_component") = fluid_component;
703  _problem->addUserObject(userobject_type, userobject_name, params);
704  }
705 }
706 
707 void
709  unsigned phase, unsigned fluid_component, bool multiply_by_density, std::string userobject_name)
710 {
711  if (_stabilization == StabilizationEnum::KT && _current_task == "add_user_object")
712  {
713  const std::string userobject_type =
714  "PorousFlowAdvectiveFluxCalculatorUnsaturatedMultiComponent";
715  InputParameters params = _factory.getValidParams(userobject_type);
716  params.set<MooseEnum>("flux_limiter_type") = _flux_limiter_type;
717  params.set<RealVectorValue>("gravity") = _gravity;
718  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
719  params.set<unsigned>("phase") = phase;
720  params.set<bool>("multiply_by_density") = multiply_by_density;
721  params.set<unsigned>("fluid_component") = fluid_component;
722  _problem->addUserObject(userobject_type, userobject_name, params);
723  }
724 }
Moose::CoordinateSystemType _coord_system
Coordinate system of the simulation (eg RZ, XYZ, etc)
virtual void addKernels()
Add all Kernels.
void addStressAux()
Add AuxVariables and AuxKernels to compute effective stress.
void addSaturationAux(unsigned phase)
Add an AuxVariable and AuxKernel to calculate saturation.
RelationshipManagerType
ActionWarehouse & _awh
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void applySpecificParameters(const InputParameters &common, const std::vector< std::string > &include, bool allow_private=false)
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.
PorousFlowActionBase(const InputParameters &params)
T & set(const std::string &name, bool quiet_mode=false)
void addEffectiveFluidPressureMaterial(bool at_nodes)
Adds a nodal and a quadpoint effective fluid pressure material.
InputParameters getValidParams(const std::string &name) const
bool dependsOn(const std::string &key, const std::string &value)
void addRelativePermeabilityConst(bool at_nodes, unsigned phase, Real kr)
Adds a relative-permeability Material of the constant variety (primarily to add kr = 1 in actions tha...
void addNearestQpMaterial()
Adds a PorousFlowNearestQp material.
std::vector< std::string > _included_objects
List of Kernels, AuxKernels, Materials, etc, that are added in this input file.
const ExecFlagType EXEC_TIMESTEP_END
virtual void addMaterials()
Add all Materials.
void addSingleComponentFluidMaterial(bool at_nodes, unsigned phase, bool compute_density_and_viscosity, bool compute_internal_energy, bool compute_enthalpy, const UserObjectName &fp, const MooseEnum &temperature_unit, const MooseEnum &pressure_unit, const MooseEnum &time_unit)
Adds a single-component fluid Material.
InputParameters emptyInputParameters()
void addAdvectiveFluxCalculatorSaturated(unsigned phase, bool multiply_by_density, std::string userobject_name)
Factory & _factory
void addCapillaryPressureVG(Real m, Real alpha, std::string userobject_name)
Adds a van Genuchten capillary pressure UserObject.
virtual void addDictator()=0
Add the PorousFlowDictator object.
static InputParameters validParams()
virtual void act() override
void addBrineMaterial(const VariableName xnacl, bool at_nodes, unsigned phase, bool compute_density_and_viscosity, bool compute_internal_energy, bool compute_enthalpy, const MooseEnum &temperature_unit)
Adds a brine fluid Material.
void addAdvectiveFluxCalculatorSaturatedMultiComponent(unsigned phase, unsigned fluid_component, bool multiply_by_density, std::string userobject_name)
static InputParameters validParams()
void addDarcyAux(const RealVectorValue &gravity)
Add AuxVariables and AuxKernels to calculate Darcy velocity.
const std::string & _current_task
void addAdvectiveFluxCalculatorUnsaturated(unsigned phase, bool multiply_by_density, std::string userobject_name)
std::string stringify(const T &t)
void addTemperatureMaterial(bool at_nodes)
Adds a nodal and a quadpoint Temperature material.
const RealVectorValue _gravity
Gravity.
void addMassFractionMaterial(bool at_nodes)
Adds a nodal and a quadpoint MassFraction material.
void addCoupledVar(const std::string &name, const std::string &doc_string)
bool _transient
Flag to denote if the simulation is transient.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual void addRelationshipManagers(Moose::RelationshipManagerType when_type) override
static const std::string alpha
Definition: NS.h:126
Holds the PorousFlow dependencies of kernels, auxkernels, materials, etc.
const std::string _dictator_name
The name of the PorousFlowDictator object to be added.
const bool _strain_at_nearest_qp
Evaluate strain at the nearest quadpoint for porosity that depends on strain.
virtual void addAuxObjects()
Add all AuxVariables and AuxKernels.
void addVolumetricStrainMaterial(const std::vector< VariableName > &displacements, const std::string &base_name)
Adds a quadpoint volumetric strain material.
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.
void mooseError(Args &&... args) const
void addClassDescription(const std::string &doc_string)
std::shared_ptr< FEProblemBase > & _problem
const InputParameters & parameters() const
virtual void addUserObjects()
Add all other UserObjects.
std::vector< const T *> getActions()
void addAdvectiveFluxCalculatorUnsaturatedMultiComponent(unsigned phase, unsigned fluid_component, bool multiply_by_density, std::string userobject_name)
void addAdvectiveFluxCalculatorSaturatedHeat(unsigned phase, bool multiply_by_density, std::string userobject_name)
virtual void addMaterialDependencies()
Add all material dependencies so that the correct version of each material can be added...
void ErrorVector unsigned int
const MooseEnum _flux_limiter_type
Flux limiter type in the Kuzmin-Turek FEM-TVD stabilization scheme.
enum PorousFlowActionBase::StabilizationEnum _stabilization
DependencyResolver< std::string > _deps
All dependencies of kernels, auxkernels, materials, etc, are stored in _dependencies.
void addAdvectiveFluxCalculatorUnsaturatedHeat(unsigned phase, bool multiply_by_density, std::string userobject_name)