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