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),
99 _pp((_p_or_t ==
PorTchoice::pressure && _has_porepressure)
100 ? &getMaterialProperty<
std::vector<Real>>(
"PorousFlow_porepressure_qp")
102 _dpp_dvar((_p_or_t ==
PorTchoice::pressure && _has_porepressure)
103 ? &getMaterialProperty<
std::vector<
std::vector<Real>>>(
104 "dPorousFlow_porepressure_qp_dvar")
106 _temperature((_p_or_t ==
PorTchoice::temperature && _has_temperature)
107 ? &getMaterialProperty<Real>(
"PorousFlow_temperature_qp")
110 (_p_or_t ==
PorTchoice::temperature && _has_temperature)
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] /
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;
350 : (*_dtemperature_dvar)[
_qp][pvar]);
void ErrorVector unsigned int
const std::vector< MooseVariableFieldBase * > & getCoupledMooseVars() const
unsigned currentPointCachedID()
MooseVariableField< T > & _var
void paramError(const std::string ¶m, Args... args) const
void mooseError(Args &&... args) const
unsigned int number() const
void addMooseVariableDependency(MooseVariableFieldBase *var)
This holds maps between the nonlinear variables used in a PorousFlow simulation and the variable numb...
unsigned int numPhases() const
The number of fluid phases.
unsigned int numComponents() const
The number of fluid components.
unsigned int porousFlowVariableNum(unsigned int moose_var_num) const
The PorousFlow variable number.
bool notPorousFlowVariable(unsigned int moose_var_num) const
Returns true if moose_var_num is not a porous flow variabe.
Approximates a borehole by a sequence of Dirac Points.
static InputParameters validParams()
Creates a new PorousFlowLineGeometry This reads the file containing the lines of the form weight x y ...
virtual void addPoints() override
Add Dirac Points to the line sink.
Real dptqp(unsigned pvar) const
If _p_or_t==0, then returns d(quadpoint porepressure)/d(PorousFlow variable), else returns d(quadpoin...
const bool _has_temperature
Whether a quadpoint temperature material exists (for error checking)
const MaterialProperty< std::vector< Real > > *const _pp
Quadpoint pore pressure in each phase.
const PorousFlowDictator & _dictator
PorousFlowDictator UserObject.
const VariableValue & _multiplying_var
mass flux is multiplied by this variable evaluated at quadpoints
virtual Real computeQpResidual() override
PorTchoice
whether the flux is a function of pressure or temperature
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 jac(unsigned int jvar)
Jacobian contribution for the derivative wrt the variable jvar.
virtual Real computeQpOffDiagJacobian(unsigned int jvar) override
const bool _use_mobility
Whether the flux will be multiplied by the mobility.
const bool _has_porepressure
Whether a quadpoint porepressure material exists (for error checking)
const bool _has_relative_permeability
Whether a relative permeability material exists (for error checking)
enum PorousFlowLineSink::PorTchoice _p_or_t
PorousFlowSumQuantity & _total_outflow_mass
This is used to hold the total fluid flowing into the line sink for each time step.
const bool _has_mass_fraction
Whether a mass_fraction material exists (for error checking)
const MaterialProperty< std::vector< Real > > *const _fluid_viscosity
Viscosity of each component in each phase.
const bool _use_mass_fraction
Whether the flux will be multiplied by the mass fraction.
static InputParameters validParams()
PorousFlowLineSink(const InputParameters ¶meters)
const bool _has_enthalpy
Whether an enthalpy material exists (for error checking)
const MaterialProperty< std::vector< std::vector< Real > > > *const _dpp_dvar
d(quadpoint pore pressure in each phase)/d(PorousFlow variable)
virtual void addPoints() override
Add Dirac Points to the borehole.
Real ptqp() const
If _p_or_t==0, then returns the quadpoint porepressure, else returns the quadpoint temperature.
virtual Real computeQpJacobian() override
const unsigned int _sp
The component number (only used if _use_mass_fraction==true)
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 unsigned int _ph
The phase number.
const bool _use_enthalpy
Whether the flux will be multiplied by the enthalpy.
const bool _has_internal_energy
Whether an internal-energy material exists (for error checking)
const bool _use_relative_permeability
Whether the flux will be multiplied by the relative permeability.
const bool _use_internal_energy
Whether the flux will be multiplied by the internal-energy.
const bool _has_mobility
Whether enough materials exist to form the mobility (for error checking)
Sums into _total This is used, for instance, to record the total mass flowing into a borehole.
void add(Real contrib)
Adds contrib to _total.
void zero()
Sets _total = 0.