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 
20 template <>
21 InputParameters
23 {
24  InputParameters params = validParams<Action>();
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  "The name of the displacement variables (relevant only for "
61  "mechanically-coupled simulations)");
62  params.addParam<std::string>("thermal_eigenstrain_name",
63  "thermal_eigenstrain",
64  "The eigenstrain_name used in the "
65  "ComputeThermalExpansionEigenstrain. Only needed for "
66  "thermally-coupled simulations with thermal expansion.");
67  params.addParam<bool>(
68  "use_displaced_mesh", false, "Use displaced mesh computations in mechanical kernels");
69  MooseEnum flux_limiter_type("MinMod VanLeer MC superbee None", "VanLeer");
70  params.addParam<MooseEnum>(
71  "flux_limiter_type",
72  flux_limiter_type,
73  "Type of flux limiter to use if stabilization=KT. 'None' means that no antidiffusion "
74  "will be added in the Kuzmin-Turek scheme");
75  MooseEnum stabilization("Full KT", "Full");
76  params.addParam<MooseEnum>("stabilization",
77  stabilization,
78  "Numerical stabilization used. 'Full' means full upwinding. 'KT' "
79  "means FEM-TVD stabilization of Kuzmin-Turek");
80  return params;
81 }
82 
83 PorousFlowActionBase::PorousFlowActionBase(const InputParameters & params)
84  : Action(params),
86  _included_objects(),
87  _dictator_name(getParam<std::string>("dictator_name")),
88  _num_aqueous_equilibrium(getParam<unsigned int>("number_aqueous_equilibrium")),
89  _num_aqueous_kinetic(getParam<unsigned int>("number_aqueous_kinetic")),
90  _gravity(getParam<RealVectorValue>("gravity")),
91  _mass_fraction_vars(getParam<std::vector<VariableName>>("mass_fraction_vars")),
92  _num_mass_fraction_vars(_mass_fraction_vars.size()),
93  _temperature_var(getParam<std::vector<VariableName>>("temperature")),
94  _displacements(getParam<std::vector<VariableName>>("displacements")),
95  _ndisp(_displacements.size()),
96  _coupled_displacements(_ndisp),
97  _flux_limiter_type(getParam<MooseEnum>("flux_limiter_type")),
98  _stabilization(getParam<MooseEnum>("stabilization").getEnum<StabilizationEnum>())
99 {
100  // convert vector of VariableName to vector of VariableName
101  for (unsigned int i = 0; i < _ndisp; ++i)
103 }
104 
105 void
106 PorousFlowActionBase::addRelationshipManagers(Moose::RelationshipManagerType input_rm_type)
107 {
108  InputParameters ips = (_stabilization == StabilizationEnum::KT
109  ? _factory.getValidParams("PorousFlowAdvectiveFluxCalculatorSaturated")
110  : emptyInputParameters());
111  addRelationshipManagers(input_rm_type, ips);
112 }
113 
114 void
116 {
117  // Check if the simulation is transient (note: can't do this in the ctor)
118  _transient = _problem->isTransient();
119 
120  // Make sure that all mesh subdomains have the same coordinate system
121  const auto & all_subdomains = _problem->mesh().meshSubdomains();
122  if (all_subdomains.empty())
123  mooseError("No subdomains found");
124  _coord_system = _problem->getCoordSystem(*all_subdomains.begin());
125  for (const auto & subdomain : all_subdomains)
126  if (_problem->getCoordSystem(subdomain) != _coord_system)
127  mooseError(
128  "The PorousFlow Actions require all subdomains to have the same coordinate system.");
129 
130  // Note: this must be called before addMaterials!
132 
133  // Make the vector of added objects unique
134  std::sort(_included_objects.begin(), _included_objects.end());
135  _included_objects.erase(std::unique(_included_objects.begin(), _included_objects.end()),
136  _included_objects.end());
137 
138  if (_current_task == "add_user_object")
139  addUserObjects();
140 
141  if (_current_task == "add_aux_variable" || _current_task == "add_aux_kernel")
142  addAuxObjects();
143 
144  if (_current_task == "add_kernel")
145  addKernels();
146 
147  if (_current_task == "add_material")
148  addMaterials();
149 }
150 
151 void
153 {
154  // Check to see if there are any other PorousFlow objects like BCs that
155  // may require specific versions of materials added using this action
156 
157  // Unique list of auxkernels added in input file
158  auto auxkernels = _awh.getActions<AddKernelAction>();
159  for (auto & auxkernel : auxkernels)
160  _included_objects.push_back(auxkernel->getMooseObjectType());
161 
162  // Unique list of postprocessors added in input file
163  auto postprocessors = _awh.getActions<AddPostprocessorAction>();
164  for (auto & postprocessor : postprocessors)
165  _included_objects.push_back(postprocessor->getMooseObjectType());
166 
167  // Unique list of BCs added in input file
168  auto bcs = _awh.getActions<AddBCAction>();
169  for (auto & bc : bcs)
170  _included_objects.push_back(bc->getMooseObjectType());
171 }
172 
173 void
175 {
176  addDictator();
177 }
178 
179 void
181 {
182 }
183 
184 void
186 {
187 }
188 
189 void
191 {
192 }
193 
194 void
196 {
197  std::string phase_str = Moose::stringify(phase);
198 
199  if (_current_task == "add_aux_variable")
200  {
201  auto var_params = _factory.getValidParams("MooseVariableConstMonomial");
202  _problem->addAuxVariable("MooseVariableConstMonomial", "saturation" + phase_str, var_params);
203  }
204 
205  if (_current_task == "add_aux_kernel")
206  {
207  std::string aux_kernel_type = "MaterialStdVectorAux";
208  InputParameters params = _factory.getValidParams(aux_kernel_type);
209 
210  std::string aux_kernel_name = "PorousFlowActionBase_SaturationAux" + phase_str;
211  params.set<MaterialPropertyName>("property") = "PorousFlow_saturation_qp";
212  params.set<unsigned>("index") = phase;
213  params.set<AuxVariableName>("variable") = "saturation" + phase_str;
214  params.set<ExecFlagEnum>("execute_on") = EXEC_TIMESTEP_END;
215  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
216  }
217 }
218 
219 void
220 PorousFlowActionBase::addDarcyAux(const RealVectorValue & gravity)
221 {
222  if (_current_task == "add_aux_variable")
223  {
224  auto var_params = _factory.getValidParams("MooseVariableConstMonomial");
225 
226  _problem->addAuxVariable("MooseVariableConstMonomial", "darcy_vel_x", var_params);
227  _problem->addAuxVariable("MooseVariableConstMonomial", "darcy_vel_y", var_params);
228  _problem->addAuxVariable("MooseVariableConstMonomial", "darcy_vel_z", var_params);
229  }
230 
231  if (_current_task == "add_aux_kernel")
232  {
233  std::string aux_kernel_type = "PorousFlowDarcyVelocityComponent";
234  InputParameters params = _factory.getValidParams(aux_kernel_type);
235 
236  params.set<RealVectorValue>("gravity") = gravity;
237  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
238  params.set<ExecFlagEnum>("execute_on") = EXEC_TIMESTEP_END;
239 
240  std::string aux_kernel_name = "PorousFlowActionBase_Darcy_x_Aux";
241  params.set<MooseEnum>("component") = "x";
242  params.set<AuxVariableName>("variable") = "darcy_vel_x";
243  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
244 
245  aux_kernel_name = "PorousFlowActionBase_Darcy_y_Aux";
246  params.set<MooseEnum>("component") = "y";
247  params.set<AuxVariableName>("variable") = "darcy_vel_y";
248  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
249 
250  aux_kernel_name = "PorousFlowActionBase_Darcy_z_Aux";
251  params.set<MooseEnum>("component") = "z";
252  params.set<AuxVariableName>("variable") = "darcy_vel_z";
253  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
254  }
255 }
256 
257 void
259 {
260  if (_current_task == "add_aux_variable")
261  {
262  auto var_params = _factory.getValidParams("MooseVariableConstMonomial");
263  _problem->addAuxVariable("MooseVariableConstMonomial", "stress_xx", var_params);
264  _problem->addAuxVariable("MooseVariableConstMonomial", "stress_xy", var_params);
265  _problem->addAuxVariable("MooseVariableConstMonomial", "stress_xz", var_params);
266  _problem->addAuxVariable("MooseVariableConstMonomial", "stress_yx", var_params);
267  _problem->addAuxVariable("MooseVariableConstMonomial", "stress_yy", var_params);
268  _problem->addAuxVariable("MooseVariableConstMonomial", "stress_yz", var_params);
269  _problem->addAuxVariable("MooseVariableConstMonomial", "stress_zx", var_params);
270  _problem->addAuxVariable("MooseVariableConstMonomial", "stress_zy", var_params);
271  _problem->addAuxVariable("MooseVariableConstMonomial", "stress_zz", var_params);
272  }
273 
274  if (_current_task == "add_aux_kernel")
275  {
276  std::string aux_kernel_type = "RankTwoAux";
277  InputParameters params = _factory.getValidParams(aux_kernel_type);
278 
279  params.set<MaterialPropertyName>("rank_two_tensor") = "stress";
280  params.set<ExecFlagEnum>("execute_on") = EXEC_TIMESTEP_END;
281 
282  std::string aux_kernel_name = "PorousFlowAction_stress_xx";
283  params.set<AuxVariableName>("variable") = "stress_xx";
284  params.set<unsigned>("index_i") = 0;
285  params.set<unsigned>("index_j") = 0;
286  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
287 
288  aux_kernel_name = "PorousFlowAction_stress_xy";
289  params.set<AuxVariableName>("variable") = "stress_xy";
290  params.set<unsigned>("index_i") = 0;
291  params.set<unsigned>("index_j") = 1;
292  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
293 
294  aux_kernel_name = "PorousFlowAction_stress_xz";
295  params.set<AuxVariableName>("variable") = "stress_xz";
296  params.set<unsigned>("index_i") = 0;
297  params.set<unsigned>("index_j") = 2;
298  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
299 
300  aux_kernel_name = "PorousFlowAction_stress_yx";
301  params.set<AuxVariableName>("variable") = "stress_yx";
302  params.set<unsigned>("index_i") = 1;
303  params.set<unsigned>("index_j") = 0;
304  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
305 
306  aux_kernel_name = "PorousFlowAction_stress_yy";
307  params.set<AuxVariableName>("variable") = "stress_yy";
308  params.set<unsigned>("index_i") = 1;
309  params.set<unsigned>("index_j") = 1;
310  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
311 
312  aux_kernel_name = "PorousFlowAction_stress_yz";
313  params.set<AuxVariableName>("variable") = "stress_yz";
314  params.set<unsigned>("index_i") = 1;
315  params.set<unsigned>("index_j") = 2;
316  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
317 
318  aux_kernel_name = "PorousFlowAction_stress_zx";
319  params.set<AuxVariableName>("variable") = "stress_zx";
320  params.set<unsigned>("index_i") = 2;
321  params.set<unsigned>("index_j") = 0;
322  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
323 
324  aux_kernel_name = "PorousFlowAction_stress_zy";
325  params.set<AuxVariableName>("variable") = "stress_zy";
326  params.set<unsigned>("index_i") = 2;
327  params.set<unsigned>("index_j") = 1;
328  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
329 
330  aux_kernel_name = "PorousFlowAction_stress_zz";
331  params.set<AuxVariableName>("variable") = "stress_zz";
332  params.set<unsigned>("index_i") = 2;
333  params.set<unsigned>("index_j") = 2;
334  _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
335  }
336 }
337 
338 void
340 {
341  if (_current_task == "add_material")
342  {
343  if (!parameters().hasDefaultCoupledValue("temperature"))
344  mooseError("Attempt to add a PorousFlowTemperature material without setting a temperature "
345  "variable");
346 
347  std::string material_type = "PorousFlowTemperature";
348  InputParameters params = _factory.getValidParams(material_type);
349 
350  params.applySpecificParameters(parameters(), {"temperature"});
351  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
352 
353  std::string material_name = "PorousFlowActionBase_Temperature_qp";
354  if (at_nodes)
355  material_name = "PorousFlowActionBase_Temperature";
356 
357  params.set<bool>("at_nodes") = at_nodes;
358  _problem->addMaterial(material_type, material_name, params);
359  }
360 }
361 
362 void
364 {
365  if (_current_task == "add_material")
366  {
367  if (!(parameters().hasDefaultCoupledValue("mass_fraction_vars") ||
368  parameters().hasCoupledValue("mass_fraction_vars")))
369  mooseError("Attempt to add a PorousFlowMassFraction material without setting the "
370  "mass_fraction_vars");
371 
372  std::string material_type = "PorousFlowMassFraction";
373  InputParameters params = _factory.getValidParams(material_type);
374 
375  params.applySpecificParameters(parameters(), {"mass_fraction_vars"});
376  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
377 
378  std::string material_name = "PorousFlowActionBase_MassFraction_qp";
379  if (at_nodes)
380  material_name = "PorousFlowActionBase_MassFraction";
381 
382  params.set<bool>("at_nodes") = at_nodes;
383  _problem->addMaterial(material_type, material_name, params);
384  }
385 }
386 
387 void
389 {
390  if (_current_task == "add_material")
391  {
392  std::string material_type = "PorousFlowEffectiveFluidPressure";
393  InputParameters params = _factory.getValidParams(material_type);
394 
395  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
396 
397  std::string material_name = "PorousFlowUnsaturated_EffectiveFluidPressure_qp";
398  if (at_nodes)
399  material_name = "PorousFlowUnsaturated_EffectiveFluidPressure";
400 
401  params.set<bool>("at_nodes") = at_nodes;
402  _problem->addMaterial(material_type, material_name, params);
403  }
404 }
405 
406 void
407 PorousFlowActionBase::addVolumetricStrainMaterial(const std::vector<VariableName> & displacements,
408  bool consistent_with_displaced_mesh)
409 {
410  if (_current_task == "add_material")
411  {
412  std::string material_type = "PorousFlowVolumetricStrain";
413  InputParameters params = _factory.getValidParams(material_type);
414 
415  std::string material_name = "PorousFlowActionBase_VolumetricStrain";
416  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
417  params.set<std::vector<VariableName>>("displacements") = displacements;
418  params.set<bool>("consistent_with_displaced_mesh") = consistent_with_displaced_mesh;
419  _problem->addMaterial(material_type, material_name, params);
420  }
421 }
422 
423 void
425  unsigned phase,
426  bool compute_density_and_viscosity,
427  bool compute_internal_energy,
428  bool compute_enthalpy,
429  const UserObjectName & fp)
430 {
431  if (_current_task == "add_material")
432  {
433  std::string material_type = "PorousFlowSingleComponentFluid";
434  InputParameters params = _factory.getValidParams(material_type);
435 
436  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
437  params.set<unsigned int>("phase") = phase;
438  params.set<bool>("compute_density_and_viscosity") = compute_density_and_viscosity;
439  params.set<bool>("compute_internal_energy") = compute_internal_energy;
440  params.set<bool>("compute_enthalpy") = compute_enthalpy;
441  params.set<UserObjectName>("fp") = fp;
442 
443  std::string material_name = "PorousFlowActionBase_FluidProperties_qp";
444  if (at_nodes)
445  material_name = "PorousFlowActionBase_FluidProperties";
446 
447  params.set<bool>("at_nodes") = at_nodes;
448  _problem->addMaterial(material_type, material_name, params);
449  }
450 }
451 
452 void
454  bool at_nodes,
455  unsigned phase,
456  bool compute_density_and_viscosity,
457  bool compute_internal_energy,
458  bool compute_enthalpy)
459 {
460  if (_current_task == "add_material")
461  {
462  std::string material_type = "PorousFlowBrine";
463  InputParameters params = _factory.getValidParams(material_type);
464 
465  params.set<std::vector<VariableName>>("xnacl") = {nacl_brine};
466  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
467  params.set<unsigned int>("phase") = phase;
468  params.set<bool>("compute_density_and_viscosity") = compute_density_and_viscosity;
469  params.set<bool>("compute_internal_energy") = compute_internal_energy;
470  params.set<bool>("compute_enthalpy") = compute_enthalpy;
471 
472  std::string material_name = "PorousFlowActionBase_FluidProperties_qp";
473  if (at_nodes)
474  material_name = "PorousFlowActionBase_FluidProperties";
475 
476  params.set<bool>("at_nodes") = at_nodes;
477  _problem->addMaterial(material_type, material_name, params);
478  }
479 }
480 
481 void
483  bool at_nodes, unsigned phase, Real n, Real s_res, Real sum_s_res)
484 
485 {
486  if (_current_task == "add_material")
487  {
488  std::string material_type = "PorousFlowRelativePermeabilityCorey";
489  InputParameters params = _factory.getValidParams(material_type);
490 
491  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
492  params.set<Real>("n") = n;
493  params.set<unsigned int>("phase") = phase;
494  params.set<Real>("s_res") = s_res;
495  params.set<Real>("sum_s_res") = sum_s_res;
496 
497  std::string material_name = "PorousFlowActionBase_RelativePermeability_qp";
498  if (at_nodes)
499  material_name = "PorousFlowActionBase_RelativePermeability_nodal";
500 
501  params.set<bool>("at_nodes") = at_nodes;
502  _problem->addMaterial(material_type, material_name, params);
503  }
504 }
505 
506 void
508  bool at_nodes, unsigned phase, Real m, Real s_res, Real sum_s_res)
509 {
510  if (_current_task == "add_material")
511  {
512  std::string material_type = "PorousFlowRelativePermeabilityFLAC";
513  InputParameters params = _factory.getValidParams(material_type);
514 
515  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
516  params.set<Real>("m") = m;
517  params.set<unsigned int>("phase") = phase;
518  params.set<Real>("s_res") = s_res;
519  params.set<Real>("sum_s_res") = sum_s_res;
520 
521  std::string material_name = "PorousFlowActionBase_RelativePermeability_qp";
522  if (at_nodes)
523  material_name = "PorousFlowActionBase_RelativePermeability_nodal";
524 
525  params.set<bool>("at_nodes") = at_nodes;
526  _problem->addMaterial(material_type, material_name, params);
527  }
528 }
529 
530 void
531 PorousFlowActionBase::addCapillaryPressureVG(Real m, Real alpha, std::string userobject_name)
532 {
533  if (_current_task == "add_user_object")
534  {
535  std::string userobject_type = "PorousFlowCapillaryPressureVG";
536  InputParameters params = _factory.getValidParams(userobject_type);
537  params.set<Real>("m") = m;
538  params.set<Real>("alpha") = alpha;
539  _problem->addUserObject(userobject_type, userobject_name, params);
540  }
541 }
542 
543 void
545  bool multiply_by_density,
546  std::string userobject_name)
547 {
548  if (_stabilization == StabilizationEnum::KT && _current_task == "add_user_object")
549  {
550  const std::string userobject_type = "PorousFlowAdvectiveFluxCalculatorSaturated";
551  InputParameters params = _factory.getValidParams(userobject_type);
552  params.set<MooseEnum>("flux_limiter_type") = _flux_limiter_type;
553  params.set<RealVectorValue>("gravity") = _gravity;
554  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
555  params.set<unsigned>("phase") = phase;
556  params.set<bool>("multiply_by_density") = multiply_by_density;
557  _problem->addUserObject(userobject_type, userobject_name, params);
558  }
559 }
560 
561 void
563  bool multiply_by_density,
564  std::string userobject_name)
565 {
566  if (_stabilization == StabilizationEnum::KT && _current_task == "add_user_object")
567  {
568  const std::string userobject_type = "PorousFlowAdvectiveFluxCalculatorUnsaturated";
569  InputParameters params = _factory.getValidParams(userobject_type);
570  params.set<MooseEnum>("flux_limiter_type") = _flux_limiter_type;
571  params.set<RealVectorValue>("gravity") = _gravity;
572  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
573  params.set<unsigned>("phase") = phase;
574  params.set<bool>("multiply_by_density") = multiply_by_density;
575  _problem->addUserObject(userobject_type, userobject_name, params);
576  }
577 }
578 
579 void
581  bool multiply_by_density,
582  std::string userobject_name)
583 {
584  if (_stabilization == StabilizationEnum::KT && _current_task == "add_user_object")
585  {
586  const std::string userobject_type = "PorousFlowAdvectiveFluxCalculatorSaturatedHeat";
587  InputParameters params = _factory.getValidParams(userobject_type);
588  params.set<MooseEnum>("flux_limiter_type") = _flux_limiter_type;
589  params.set<RealVectorValue>("gravity") = _gravity;
590  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
591  params.set<unsigned>("phase") = phase;
592  params.set<bool>("multiply_by_density") = multiply_by_density;
593  _problem->addUserObject(userobject_type, userobject_name, params);
594  }
595 }
596 
597 void
599  bool multiply_by_density,
600  std::string userobject_name)
601 {
602  if (_stabilization == StabilizationEnum::KT && _current_task == "add_user_object")
603  {
604  const std::string userobject_type = "PorousFlowAdvectiveFluxCalculatorUnsaturatedHeat";
605  InputParameters params = _factory.getValidParams(userobject_type);
606  params.set<MooseEnum>("flux_limiter_type") = _flux_limiter_type;
607  params.set<RealVectorValue>("gravity") = _gravity;
608  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
609  params.set<unsigned>("phase") = phase;
610  params.set<bool>("multiply_by_density") = multiply_by_density;
611  _problem->addUserObject(userobject_type, userobject_name, params);
612  }
613 }
614 
615 void
617  unsigned fluid_component,
618  bool multiply_by_density,
619  std::string userobject_name)
620 {
621  if (_stabilization == StabilizationEnum::KT && _current_task == "add_user_object")
622  {
623  const std::string userobject_type = "PorousFlowAdvectiveFluxCalculatorSaturatedMultiComponent";
624  InputParameters params = _factory.getValidParams(userobject_type);
625  params.set<MooseEnum>("flux_limiter_type") = _flux_limiter_type;
626  params.set<RealVectorValue>("gravity") = _gravity;
627  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
628  params.set<unsigned>("phase") = phase;
629  params.set<bool>("multiply_by_density") = multiply_by_density;
630  params.set<unsigned>("fluid_component") = fluid_component;
631  _problem->addUserObject(userobject_type, userobject_name, params);
632  }
633 }
634 
635 void
637  unsigned phase, unsigned fluid_component, bool multiply_by_density, std::string userobject_name)
638 {
639  if (_stabilization == StabilizationEnum::KT && _current_task == "add_user_object")
640  {
641  const std::string userobject_type =
642  "PorousFlowAdvectiveFluxCalculatorUnsaturatedMultiComponent";
643  InputParameters params = _factory.getValidParams(userobject_type);
644  params.set<MooseEnum>("flux_limiter_type") = _flux_limiter_type;
645  params.set<RealVectorValue>("gravity") = _gravity;
646  params.set<UserObjectName>("PorousFlowDictator") = _dictator_name;
647  params.set<unsigned>("phase") = phase;
648  params.set<bool>("multiply_by_density") = multiply_by_density;
649  params.set<unsigned>("fluid_component") = fluid_component;
650  _problem->addUserObject(userobject_type, userobject_name, params);
651  }
652 }
PorousFlowActionBase::_coord_system
Moose::CoordinateSystemType _coord_system
Coordinate system of the simulation (eg RZ, XYZ, etc)
Definition: PorousFlowActionBase.h:89
PorousFlowActionBase::addAuxObjects
virtual void addAuxObjects()
Add all AuxVariables and AuxKernels.
Definition: PorousFlowActionBase.C:180
PorousFlowActionBase::_transient
bool _transient
Flag to denote if the simulation is transient.
Definition: PorousFlowActionBase.h:92
PorousFlowActionBase::PorousFlowActionBase
PorousFlowActionBase(const InputParameters &params)
Definition: PorousFlowActionBase.C:83
PorousFlowActionBase::addMaterials
virtual void addMaterials()
Add all Materials.
Definition: PorousFlowActionBase.C:190
PorousFlowActionBase::_stabilization
enum PorousFlowActionBase::StabilizationEnum _stabilization
PorousFlowActionBase.h
PorousFlowActionBase::addStressAux
void addStressAux()
Add AuxVariables and AuxKernels to compute effective stress.
Definition: PorousFlowActionBase.C:258
PorousFlowDependencies
Holds the PorousFlow dependencies of kernels, auxkernels, materials, etc.
Definition: PorousFlowDependencies.h:28
PorousFlowActionBase::_displacements
const std::vector< VariableName > & _displacements
Displacement NonlinearVariable names (if any)
Definition: PorousFlowActionBase.h:75
PorousFlowActionBase::addAdvectiveFluxCalculatorSaturated
void addAdvectiveFluxCalculatorSaturated(unsigned phase, bool multiply_by_density, std::string userobject_name)
Definition: PorousFlowActionBase.C:544
PorousFlowActionBase::addUserObjects
virtual void addUserObjects()
Add all other UserObjects.
Definition: PorousFlowActionBase.C:174
PorousFlowActionBase::act
virtual void act() override
Definition: PorousFlowActionBase.C:115
PorousFlowActionBase::addKernels
virtual void addKernels()
Add all Kernels.
Definition: PorousFlowActionBase.C:185
PorousFlowActionBase::addAdvectiveFluxCalculatorUnsaturated
void addAdvectiveFluxCalculatorUnsaturated(unsigned phase, bool multiply_by_density, std::string userobject_name)
Definition: PorousFlowActionBase.C:562
PorousFlowActionBase::addRelationshipManagers
virtual void addRelationshipManagers(Moose::RelationshipManagerType when_type) override
Definition: PorousFlowActionBase.C:106
PorousFlowActionBase::_coupled_displacements
std::vector< VariableName > _coupled_displacements
Displacement Variable names.
Definition: PorousFlowActionBase.h:81
PorousFlowActionBase::addCapillaryPressureVG
void addCapillaryPressureVG(Real m, Real alpha, std::string userobject_name)
Adds a van Genuchten capillary pressure UserObject.
Definition: PorousFlowActionBase.C:531
validParams< PorousFlowActionBase >
InputParameters validParams< PorousFlowActionBase >()
Definition: PorousFlowActionBase.C:22
PorousFlowActionBase::addAdvectiveFluxCalculatorSaturatedMultiComponent
void addAdvectiveFluxCalculatorSaturatedMultiComponent(unsigned phase, unsigned fluid_component, bool multiply_by_density, std::string userobject_name)
Definition: PorousFlowActionBase.C:616
PorousFlowActionBase::StabilizationEnum
StabilizationEnum
Definition: PorousFlowActionBase.h:86
PorousFlowActionBase::addAdvectiveFluxCalculatorUnsaturatedMultiComponent
void addAdvectiveFluxCalculatorUnsaturatedMultiComponent(unsigned phase, unsigned fluid_component, bool multiply_by_density, std::string userobject_name)
Definition: PorousFlowActionBase.C:636
PorousFlowActionBase::_ndisp
const unsigned _ndisp
Number of displacement variables supplied.
Definition: PorousFlowActionBase.h:78
PorousFlowActionBase::addDarcyAux
void addDarcyAux(const RealVectorValue &gravity)
Add AuxVariables and AuxKernels to calculate Darcy velocity.
Definition: PorousFlowActionBase.C:220
PorousFlowActionBase::addTemperatureMaterial
void addTemperatureMaterial(bool at_nodes)
Adds a nodal and a quadpoint Temperature material.
Definition: PorousFlowActionBase.C:339
PorousFlowActionBase::_gravity
const RealVectorValue _gravity
Gravity.
Definition: PorousFlowActionBase.h:63
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
PorousFlowActionBase::addSingleComponentFluidMaterial
void addSingleComponentFluidMaterial(bool at_nodes, unsigned phase, bool compute_density_and_viscosity, bool compute_internal_energy, bool compute_enthalpy, const UserObjectName &fp)
Adds a single-component fluid Material.
Definition: PorousFlowActionBase.C:424
fp
Definition: DimensionlessFlowNumbers.h:19
PorousFlowActionBase::addMassFractionMaterial
void addMassFractionMaterial(bool at_nodes)
Adds a nodal and a quadpoint MassFraction material.
Definition: PorousFlowActionBase.C:363
PorousFlowActionBase::addAdvectiveFluxCalculatorSaturatedHeat
void addAdvectiveFluxCalculatorSaturatedHeat(unsigned phase, bool multiply_by_density, std::string userobject_name)
Definition: PorousFlowActionBase.C:580
PorousFlowActionBase::addDictator
virtual void addDictator()=0
Add the PorousFlowDictator object.
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
PorousFlowActionBase::addBrineMaterial
void addBrineMaterial(const VariableName xnacl, bool at_nodes, unsigned phase, bool compute_density_and_viscosity, bool compute_internal_energy, bool compute_enthalpy)
Adds a brine fluid Material.
Definition: PorousFlowActionBase.C:453
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::_flux_limiter_type
const MooseEnum _flux_limiter_type
Flux limiter type in the Kuzmin-Turek FEM-TVD stabilization scheme.
Definition: PorousFlowActionBase.h:84
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::addSaturationAux
void addSaturationAux(unsigned phase)
Add an AuxVariable and AuxKernel to calculate saturation.
Definition: PorousFlowActionBase.C:195
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
PorousFlowActionBase::addEffectiveFluidPressureMaterial
void addEffectiveFluidPressureMaterial(bool at_nodes)
Adds a nodal and a quadpoint effective fluid pressure material.
Definition: PorousFlowActionBase.C:388
PorousFlowActionBase::addMaterialDependencies
virtual void addMaterialDependencies()
Add all material dependencies so that the correct version of each material can be added.
Definition: PorousFlowActionBase.C:152