11 #include "libmesh/utility.h" 17 MooseEnum p_or_t_choice(
"pressure=0 temperature=1",
"pressure");
20 "Modifying functions will be a function of either pressure and " 21 "permeability (eg, for boreholes that pump fluids) or " 22 "temperature and thermal conductivity (eg, for boreholes that " 23 "pump pure heat with no fluid flow)");
26 "User Object of type=PorousFlowSumQuantity in which to place the total " 27 "outflow from the line sink for each time step.");
29 "PorousFlowDictator",
"The UserObject that holds the list of PorousFlow variable names");
33 "The fluid phase whose pressure (and potentially mobility, enthalpy, etc) " 34 "controls the flux to the line sink. For p_or_t=temperature, and without " 35 "any use_*, this parameter is irrelevant");
36 params.
addParam<
unsigned int>(
"mass_fraction_component",
37 "The index corresponding to a fluid " 38 "component. If supplied, the flux will " 39 "be multiplied by the nodal mass " 40 "fraction for the component");
42 "use_relative_permeability",
false,
"Multiply the flux by the fluid relative permeability");
43 params.
addParam<
bool>(
"use_mobility",
false,
"Multiply the flux by the fluid mobility");
44 params.
addParam<
bool>(
"use_enthalpy",
false,
"Multiply the flux by the fluid enthalpy");
46 "use_internal_energy",
false,
"Multiply the flux by the fluid internal energy");
47 params.
addCoupledVar(
"multiplying_var", 1.0,
"Fluxes will be moultiplied by this variable");
48 params.
addClassDescription(
"Approximates a line sink in the mesh by a sequence of weighted Dirac " 49 "points whose positions are read from a file");
60 hasMaterialProperty<
std::vector<
Real>>(
"PorousFlow_porepressure_qp") &&
61 hasMaterialProperty<
std::vector<
std::vector<
Real>>>(
"dPorousFlow_porepressure_qp_dvar")),
62 _has_temperature(hasMaterialProperty<
Real>(
"PorousFlow_temperature_qp") &&
63 hasMaterialProperty<
std::vector<
Real>>(
"dPorousFlow_temperature_qp_dvar")),
65 hasMaterialProperty<
std::vector<
std::vector<
Real>>>(
"PorousFlow_mass_frac_nodal") &&
66 hasMaterialProperty<
std::vector<
std::vector<
std::vector<
Real>>>>(
67 "dPorousFlow_mass_frac_nodal_dvar")),
68 _has_relative_permeability(
69 hasMaterialProperty<
std::vector<
Real>>(
"PorousFlow_relative_permeability_nodal") &&
70 hasMaterialProperty<
std::vector<
std::vector<
Real>>>(
71 "dPorousFlow_relative_permeability_nodal_dvar")),
73 hasMaterialProperty<
std::vector<
Real>>(
"PorousFlow_relative_permeability_nodal") &&
74 hasMaterialProperty<
std::vector<
std::vector<
Real>>>(
75 "dPorousFlow_relative_permeability_nodal_dvar") &&
76 hasMaterialProperty<
std::vector<
Real>>(
"PorousFlow_fluid_phase_density_nodal") &&
77 hasMaterialProperty<
std::vector<
std::vector<
Real>>>(
78 "dPorousFlow_fluid_phase_density_nodal_dvar") &&
79 hasMaterialProperty<
std::vector<
Real>>(
"PorousFlow_viscosity_nodal") &&
80 hasMaterialProperty<
std::vector<
std::vector<
Real>>>(
"dPorousFlow_viscosity_nodal_dvar")),
81 _has_enthalpy(hasMaterialProperty<
std::vector<
Real>>(
"PorousFlow_fluid_phase_enthalpy_nodal") &&
82 hasMaterialProperty<
std::vector<
std::vector<
Real>>>(
83 "dPorousFlow_fluid_phase_enthalpy_nodal_dvar")),
85 hasMaterialProperty<
std::vector<
Real>>(
"PorousFlow_fluid_phase_internal_energy_nodal") &&
86 hasMaterialProperty<
std::vector<
std::vector<
Real>>>(
87 "dPorousFlow_fluid_phase_internal_energy_nodal_dvar")),
90 _use_mass_fraction(isParamValid(
"mass_fraction_component")),
91 _use_relative_permeability(getParam<bool>(
"use_relative_permeability")),
92 _use_mobility(getParam<bool>(
"use_mobility")),
93 _use_enthalpy(getParam<bool>(
"use_enthalpy")),
94 _use_internal_energy(getParam<bool>(
"use_internal_energy")),
96 _ph(getParam<unsigned
int>(
"fluid_phase")),
97 _sp(_use_mass_fraction ? getParam<unsigned
int>(
"mass_fraction_component") : 0),
100 ? &getMaterialProperty<
std::vector<
Real>>(
"PorousFlow_porepressure_qp")
103 ? &getMaterialProperty<
std::vector<
std::vector<
Real>>>(
104 "dPorousFlow_porepressure_qp_dvar")
107 ? &getMaterialProperty<
Real>(
"PorousFlow_temperature_qp")
111 ? &getMaterialProperty<
std::vector<
Real>>(
"dPorousFlow_temperature_qp_dvar")
114 (_use_mobility && _has_mobility)
115 ? &getMaterialProperty<
std::vector<
Real>>(
"PorousFlow_fluid_phase_density_nodal")
117 _dfluid_density_node_dvar((_use_mobility && _has_mobility)
118 ? &getMaterialProperty<
std::vector<
std::vector<
Real>>>(
119 "dPorousFlow_fluid_phase_density_nodal_dvar")
121 _fluid_viscosity((_use_mobility && _has_mobility)
122 ? &getMaterialProperty<
std::vector<
Real>>(
"PorousFlow_viscosity_nodal")
124 _dfluid_viscosity_dvar((_use_mobility && _has_mobility)
125 ? &getMaterialProperty<
std::vector<
std::vector<
Real>>>(
126 "dPorousFlow_viscosity_nodal_dvar")
128 _relative_permeability(
129 ((_use_mobility && _has_mobility) ||
130 (_use_relative_permeability && _has_relative_permeability))
131 ? &getMaterialProperty<
std::vector<
Real>>(
"PorousFlow_relative_permeability_nodal")
133 _drelative_permeability_dvar(((_use_mobility && _has_mobility) ||
134 (_use_relative_permeability && _has_relative_permeability))
135 ? &getMaterialProperty<
std::vector<
std::vector<
Real>>>(
136 "dPorousFlow_relative_permeability_nodal_dvar")
139 (_use_mass_fraction && _has_mass_fraction)
140 ? &getMaterialProperty<
std::vector<
std::vector<
Real>>>(
"PorousFlow_mass_frac_nodal")
142 _dmass_fractions_dvar((_use_mass_fraction && _has_mass_fraction)
143 ? &getMaterialProperty<
std::vector<
std::vector<
std::vector<
Real>>>>(
144 "dPorousFlow_mass_frac_nodal_dvar")
146 _enthalpy(_has_enthalpy ? &getMaterialPropertyByName<
std::vector<
Real>>(
147 "PorousFlow_fluid_phase_enthalpy_nodal")
149 _denthalpy_dvar(_has_enthalpy ? &getMaterialPropertyByName<
std::vector<
std::vector<
Real>>>(
150 "dPorousFlow_fluid_phase_enthalpy_nodal_dvar")
152 _internal_energy(_has_internal_energy ? &getMaterialPropertyByName<
std::vector<
Real>>(
153 "PorousFlow_fluid_phase_internal_energy_nodal")
155 _dinternal_energy_dvar(_has_internal_energy
156 ? &getMaterialPropertyByName<
std::vector<
std::vector<
Real>>>(
157 "dPorousFlow_fluid_phase_internal_energy_nodal_dvar")
159 _multiplying_var(coupledValue(
"multiplying_var"))
166 "The Dictator proclaims that the maximum phase index in this simulation is ",
168 " whereas you have used ",
170 ". Remember that indexing starts at 0. You must try harder.");
174 "mass_fraction_component",
175 "The Dictator proclaims that the maximum fluid component index in this simulation is ",
177 " whereas you have used ",
179 ". Remember that indexing starts at 0. Please be assured that the Dictator has noted your " 183 mooseError(
"PorousFlowLineSink: You have specified function_of=porepressure, but you do not " 184 "have a quadpoint porepressure material");
187 mooseError(
"PorousFlowLineSink: You have specified function_of=temperature, but you do not " 188 "have a quadpoint temperature material");
191 mooseError(
"PorousFlowLineSink: You have specified a fluid component, but do not have a nodal " 192 "mass-fraction material");
195 mooseError(
"PorousFlowLineSink: You have set use_relative_permeability=true, but do not have a " 196 "nodal relative permeability material");
199 mooseError(
"PorousFlowLineSink: You have set use_mobility=true, but do not have nodal density, " 200 "relative permeability or viscosity material");
203 mooseError(
"PorousFlowLineSink: You have set use_enthalpy=true, but do not have a nodal " 204 "enthalpy material");
207 mooseError(
"PorousFlowLineSink: You have set use_internal_energy=true, but do not have a nodal " 208 "internal-energy material");
213 for (
unsigned int i = 0; i < coupled_vars.size(); i++)
239 outflow *= (*_relative_permeability)[
_i][
_ph];
242 outflow *= (*_relative_permeability)[
_i][
_ph] * (*_fluid_density_node)[
_i][
_ph] /
243 (*_fluid_viscosity)[
_i][
_ph];
246 outflow *= (*_mass_fractions)[
_i][
_ph][
_sp];
249 outflow *= (*_enthalpy)[
_i][
_ph];
252 outflow *= (*_internal_energy)[
_i][
_ph];
283 if (outflow == 0.0 && outflowp == 0.0)
291 const Real relperm_prime = (
_i !=
_j ? 0.0 : (*_drelative_permeability_dvar)[
_i][
_ph][pvar]);
292 outflowp = (*_relative_permeability)[
_i][
_ph] * outflowp + relperm_prime * outflow;
293 outflow *= (*_relative_permeability)[
_i][
_ph];
298 const Real mob = (*_relative_permeability)[
_i][
_ph] * (*_fluid_density_node)[
_i][
_ph] /
299 (*_fluid_viscosity)[
_i][
_ph];
300 const Real mob_prime =
303 : (*_drelative_permeability_dvar)[
_i][
_ph][pvar] * (*_fluid_density_node)[
_i][
_ph] /
304 (*_fluid_viscosity)[
_i][
_ph] +
305 (*_relative_permeability)[
_i][
_ph] *
306 (*_dfluid_density_node_dvar)[
_i][
_ph][pvar] / (*_fluid_viscosity)[
_i][
_ph] -
307 (*_relative_permeability)[
_i][
_ph] * (*_fluid_density_node)[
_i][
_ph] *
308 (*_dfluid_viscosity_dvar)[
_i][
_ph][pvar] /
309 Utility::pow<2>((*_fluid_viscosity)[
_i][
_ph]));
310 outflowp = mob * outflowp + mob_prime * outflow;
316 const Real mass_fractions_prime =
317 (
_i !=
_j ? 0.0 : (*_dmass_fractions_dvar)[
_i][
_ph][
_sp][pvar]);
318 outflowp = (*_mass_fractions)[
_i][
_ph][
_sp] * outflowp + mass_fractions_prime * outflow;
319 outflow *= (*_mass_fractions)[
_i][
_ph][
_sp];
324 const Real enthalpy_prime = (
_i !=
_j ? 0.0 : (*_denthalpy_dvar)[
_i][
_ph][pvar]);
325 outflowp = (*_enthalpy)[
_i][
_ph] * outflowp + enthalpy_prime * outflow;
326 outflow *= (*_enthalpy)[
_i][
_ph];
331 const Real internal_energy_prime = (
_i !=
_j ? 0.0 : (*_dinternal_energy_dvar)[
_i][
_ph][pvar]);
332 outflowp = (*_internal_energy)[
_i][
_ph] * outflowp + internal_energy_prime * outflow;
virtual void addPoints() override
Add Dirac Points to the line sink.
const bool _has_internal_energy
Whether an internal-energy material exists (for error checking)
void add(Real contrib)
Adds contrib to _total.
const bool _use_enthalpy
Whether the flux will be multiplied by the enthalpy.
const unsigned int _ph
The phase number.
bool notPorousFlowVariable(unsigned int moose_var_num) const
Returns true if moose_var_num is not a porous flow variabe.
const PorousFlowDictator & _dictator
PorousFlowDictator UserObject.
const bool _has_enthalpy
Whether an enthalpy material exists (for error checking)
static InputParameters validParams()
const bool _has_temperature
Whether a quadpoint temperature material exists (for error checking)
const bool _has_relative_permeability
Whether a relative permeability material exists (for error checking)
unsigned int number() const
Approximates a borehole by a sequence of Dirac Points.
unsigned int numComponents() const
The number of fluid components.
const bool _use_relative_permeability
Whether the flux will be multiplied by the relative permeability.
unsigned currentPointCachedID()
virtual Real computeQpResidual() override
static const std::string temperature
void zero()
Sets _total = 0.
const bool _has_porepressure
Whether a quadpoint porepressure material exists (for error checking)
virtual Real computeQpJacobian() override
const MaterialProperty< std::vector< Real > > *const _dtemperature_dvar
d(quadpoint temperature)/d(PorousFlow variable)
const MaterialProperty< std::vector< std::vector< Real > > > *const _dpp_dvar
d(quadpoint pore pressure in each phase)/d(PorousFlow variable)
const bool _has_mobility
Whether enough materials exist to form the mobility (for error checking)
virtual Real computeQpBaseOutflow(unsigned current_dirac_ptid) const =0
Returns the flux from the line sink (before modification by mobility, etc). Derived classes should ov...
Real ptqp() const
If _p_or_t==0, then returns the quadpoint porepressure, else returns the quadpoint temperature...
MooseVariableField< T > & _var
void paramError(const std::string ¶m, Args... args) const
unsigned int numPhases() const
The number of fluid phases.
Sums into _total This is used, for instance, to record the total mass flowing into a borehole...
static InputParameters validParams()
Creates a new PorousFlowLineGeometry This reads the file containing the lines of the form weight x y ...
const MaterialProperty< std::vector< Real > > *const _pp
Quadpoint pore pressure in each phase.
virtual Real computeQpOffDiagJacobian(unsigned int jvar) override
PorTchoice
whether the flux is a function of pressure or temperature
const std::vector< MooseVariableFieldBase *> & getCoupledMooseVars() const
PorousFlowSumQuantity & _total_outflow_mass
This is used to hold the total fluid flowing into the line sink for each time step.
const bool _use_mass_fraction
Whether the flux will be multiplied by the mass fraction.
void addMooseVariableDependency(MooseVariableFieldBase *var)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
This holds maps between the nonlinear variables used in a PorousFlow simulation and the variable numb...
virtual void addPoints() override
Add Dirac Points to the borehole.
static const std::string pressure
const bool _use_internal_energy
Whether the flux will be multiplied by the internal-energy.
void mooseError(Args &&... args) const
PorousFlowLineSink(const InputParameters ¶meters)
const bool _has_mass_fraction
Whether a mass_fraction material exists (for error checking)
unsigned int porousFlowVariableNum(unsigned int moose_var_num) const
The PorousFlow variable number.
const VariableValue & _multiplying_var
mass flux is multiplied by this variable evaluated at quadpoints
const unsigned int _sp
The component number (only used if _use_mass_fraction==true)
enum PorousFlowLineSink::PorTchoice _p_or_t
Real jac(unsigned int jvar)
Jacobian contribution for the derivative wrt the variable jvar.
virtual void computeQpBaseOutflowJacobian(unsigned jvar, unsigned current_dirac_ptid, Real &outflow, Real &outflowp) const =0
Calculates the BaseOutflow as well as its derivative wrt jvar. Derived classes should override this...
const bool _use_mobility
Whether the flux will be multiplied by the mobility.
void ErrorVector unsigned int
const MaterialProperty< Real > *const _temperature
Quadpoint temperature.
Real dptqp(unsigned pvar) const
If _p_or_t==0, then returns d(quadpoint porepressure)/d(PorousFlow variable), else returns d(quadpoin...