14 #include "libmesh/string_to_enum.h" 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");
38 "Gravitational acceleration vector downwards (m/s^2)");
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");
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",
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",
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>>(
65 "The name of the displacement variables (relevant only for " 66 "mechanically-coupled simulations)");
67 params.
addParam<std::vector<MaterialPropertyName>>(
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.");
75 "use_displaced_mesh",
false,
"Use displaced mesh computations in mechanical kernels");
76 MooseEnum flux_limiter_type(
"MinMod VanLeer MC superbee None",
"VanLeer");
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");
85 "Numerical stabilization used. 'Full' means full upwinding. 'KT' " 86 "means FEM-TVD stabilization of Kuzmin-Turek");
88 "strain_at_nearest_qp",
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)");
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")),
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"))
125 for (
unsigned int i = 0; i < _ndisp; ++i)
126 _coupled_displacements[i] = _displacements[i];
145 std::set<SubdomainID> _subdomain_ids;
150 paramError(
"block",
"Subdomain \"" +
name +
"\" not found in mesh.");
152 _subdomain_ids.insert(
id);
156 const auto & all_subdomains =
159 if (all_subdomains.empty())
162 for (
const auto & subdomain : all_subdomains)
165 "The PorousFlow Actions require all subdomains to have the same coordinate system.");
199 for (
auto & auxkernel : auxkernels)
204 for (
auto & postprocessor : postprocessors)
209 for (
auto & bc : bcs)
214 for (
auto & dirac : diracs)
251 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"saturation" + phase_str, var_params);
256 std::string aux_kernel_type =
"MaterialStdVectorAux";
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;
264 _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
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);
284 std::string aux_kernel_type =
"PorousFlowDarcyVelocityComponent";
293 std::string aux_kernel_name =
"PorousFlowActionBase_Darcy_x_Aux";
295 params.
set<AuxVariableName>(
"variable") =
"darcy_vel_x";
296 _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
298 aux_kernel_name =
"PorousFlowActionBase_Darcy_y_Aux";
300 params.
set<AuxVariableName>(
"variable") =
"darcy_vel_y";
301 _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
303 aux_kernel_name =
"PorousFlowActionBase_Darcy_z_Aux";
305 params.
set<AuxVariableName>(
"variable") =
"darcy_vel_z";
306 _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
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);
331 std::string aux_kernel_type =
"RankTwoAux";
334 params.
set<MaterialPropertyName>(
"rank_two_tensor") =
"stress";
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);
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);
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);
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);
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);
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);
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);
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);
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);
398 if (!
parameters().hasDefaultCoupledValue(
"temperature"))
399 mooseError(
"Attempt to add a PorousFlowTemperature material without setting a temperature " 402 std::string material_type =
"PorousFlowTemperature";
410 std::string material_name =
"PorousFlowActionBase_Temperature_qp";
412 material_name =
"PorousFlowActionBase_Temperature";
414 params.
set<
bool>(
"at_nodes") = at_nodes;
415 _problem->addMaterial(material_type, material_name, params);
424 if (!(
parameters().hasDefaultCoupledValue(
"mass_fraction_vars") ||
425 parameters().hasCoupledValue(
"mass_fraction_vars")))
426 mooseError(
"Attempt to add a PorousFlowMassFraction material without setting the " 427 "mass_fraction_vars");
429 std::string material_type =
"PorousFlowMassFraction";
437 std::string material_name =
"PorousFlowActionBase_MassFraction_qp";
439 material_name =
"PorousFlowActionBase_MassFraction";
441 params.
set<
bool>(
"at_nodes") = at_nodes;
442 _problem->addMaterial(material_type, material_name, params);
451 std::string material_type =
"PorousFlowEffectiveFluidPressure";
458 std::string material_name =
"PorousFlowUnsaturated_EffectiveFluidPressure_qp";
460 material_name =
"PorousFlowUnsaturated_EffectiveFluidPressure";
462 params.
set<
bool>(
"at_nodes") = at_nodes;
463 _problem->addMaterial(material_type, material_name, params);
472 std::string material_type =
"PorousFlowNearestQp";
478 params.
set<
bool>(
"nodal_material") =
true;
480 std::string material_name =
"PorousFlowActionBase_NearestQp";
481 _problem->addMaterial(material_type, material_name, params);
487 const std::string & base_name)
491 std::string material_type =
"PorousFlowVolumetricStrain";
496 std::string material_name =
"PorousFlowActionBase_VolumetricStrain";
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);
508 bool compute_density_and_viscosity,
509 bool compute_internal_energy,
510 bool compute_enthalpy,
511 const UserObjectName &
fp,
518 std::string material_type =
"PorousFlowSingleComponentFluid";
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;
533 std::string material_name =
"PorousFlowActionBase_FluidProperties_qp";
535 material_name =
"PorousFlowActionBase_FluidProperties";
537 params.
set<
bool>(
"at_nodes") = at_nodes;
538 _problem->addMaterial(material_type, material_name, params);
546 bool compute_density_and_viscosity,
547 bool compute_internal_energy,
548 bool compute_enthalpy,
553 std::string material_type =
"PorousFlowBrine";
558 params.
set<std::vector<VariableName>>(
"xnacl") = {nacl_brine};
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;
566 std::string material_name =
"PorousFlowActionBase_FluidProperties_qp";
568 material_name =
"PorousFlowActionBase_FluidProperties";
570 params.
set<
bool>(
"at_nodes") = at_nodes;
571 _problem->addMaterial(material_type, material_name, params);
580 std::string material_type =
"PorousFlowRelativePermeabilityConst";
586 params.
set<
unsigned int>(
"phase") = phase;
588 std::string material_name =
"PorousFlowActionBase_RelativePermeability_qp";
590 material_name =
"PorousFlowActionBase_RelativePermeability_nodal";
592 params.
set<
bool>(
"at_nodes") = at_nodes;
593 _problem->addMaterial(material_type, material_name, params);
599 bool at_nodes,
unsigned phase, Real n, Real s_res, Real sum_s_res)
603 std::string material_type =
"PorousFlowRelativePermeabilityCorey";
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;
614 std::string material_name =
"PorousFlowActionBase_RelativePermeability_qp";
616 material_name =
"PorousFlowActionBase_RelativePermeability_nodal";
618 params.
set<
bool>(
"at_nodes") = at_nodes;
619 _problem->addMaterial(material_type, material_name, params);
625 bool at_nodes,
unsigned phase, Real m, Real s_res, Real sum_s_res)
629 std::string material_type =
"PorousFlowRelativePermeabilityFLAC";
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;
640 std::string material_name =
"PorousFlowActionBase_RelativePermeability_qp";
642 material_name =
"PorousFlowActionBase_RelativePermeability_nodal";
644 params.
set<
bool>(
"at_nodes") = at_nodes;
645 _problem->addMaterial(material_type, material_name, params);
654 std::string userobject_type =
"PorousFlowCapillaryPressureVG";
660 _problem->addUserObject(userobject_type, userobject_name, params);
666 bool multiply_by_density,
667 std::string userobject_name)
671 const std::string userobject_type =
"PorousFlowAdvectiveFluxCalculatorSaturated";
678 params.
set<
unsigned>(
"phase") = phase;
679 params.
set<
bool>(
"multiply_by_density") = multiply_by_density;
680 _problem->addUserObject(userobject_type, userobject_name, params);
686 bool multiply_by_density,
687 std::string userobject_name)
691 const std::string userobject_type =
"PorousFlowAdvectiveFluxCalculatorUnsaturated";
698 params.
set<
unsigned>(
"phase") = phase;
699 params.
set<
bool>(
"multiply_by_density") = multiply_by_density;
700 _problem->addUserObject(userobject_type, userobject_name, params);
706 bool multiply_by_density,
707 std::string userobject_name)
711 const std::string userobject_type =
"PorousFlowAdvectiveFluxCalculatorSaturatedHeat";
718 params.
set<
unsigned>(
"phase") = phase;
719 params.
set<
bool>(
"multiply_by_density") = multiply_by_density;
720 _problem->addUserObject(userobject_type, userobject_name, params);
726 bool multiply_by_density,
727 std::string userobject_name)
731 const std::string userobject_type =
"PorousFlowAdvectiveFluxCalculatorUnsaturatedHeat";
738 params.
set<
unsigned>(
"phase") = phase;
739 params.
set<
bool>(
"multiply_by_density") = multiply_by_density;
740 _problem->addUserObject(userobject_type, userobject_name, params);
746 unsigned fluid_component,
747 bool multiply_by_density,
748 std::string userobject_name)
752 const std::string userobject_type =
"PorousFlowAdvectiveFluxCalculatorSaturatedMultiComponent";
759 params.
set<
unsigned>(
"phase") = phase;
760 params.
set<
bool>(
"multiply_by_density") = multiply_by_density;
761 params.
set<
unsigned>(
"fluid_component") = fluid_component;
762 _problem->addUserObject(userobject_type, userobject_name, params);
768 unsigned phase,
unsigned fluid_component,
bool multiply_by_density, std::string userobject_name)
772 const std::string userobject_type =
773 "PorousFlowAdvectiveFluxCalculatorUnsaturatedMultiComponent";
780 params.
set<
unsigned>(
"phase") = phase;
781 params.
set<
bool>(
"multiply_by_density") = multiply_by_density;
782 params.
set<
unsigned>(
"fluid_component") = fluid_component;
783 _problem->addUserObject(userobject_type, userobject_name, params);
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.
const bool _subdomain_names_set
indicates, if the vector of subdomain names is set (dont set block restrictions, if not) ...
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 ¶ms)
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.
virtual const std::string & name() const
void addAdvectiveFluxCalculatorSaturated(unsigned phase, bool multiply_by_density, std::string userobject_name)
const SubdomainID INVALID_BLOCK_ID
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()
std::vector< SubdomainName > _subdomain_names
if this vector is not empty the variables, kernels and materials are restricted to these subdomains ...
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)
void paramError(const std::string ¶m, Args... args) const
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.
bool _transient
Flag to denote if the simulation is transient.
std::shared_ptr< MooseMesh > & _mesh
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual void addRelationshipManagers(Moose::RelationshipManagerType when_type) override
static const std::string alpha
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
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)