23 "Gravitational acceleration vector downwards (m/s^2)");
24 params.
addParam<
bool>(
"multiply_by_density",
26 "If true, then this Kernel is the fluid mass flux. If false, then this " 27 "Kernel is the fluid volume flux (which is common in poro-mechanics)");
29 "PorousFlowDictator",
"The UserObject that holds the list of PorousFlow variable names");
31 "Darcy flux suitable for models involving a fully-saturated, single phase, single component " 32 "fluid. No upwinding is used. Templated on is_ad: the AD version requires no hand-coded " 41 _multiply_by_density(this->template getParam<bool>(
"multiply_by_density")),
42 _permeability(this->template getGenericMaterialProperty<
RealTensorValue, is_ad>(
43 "PorousFlow_permeability_qp")),
44 _dpermeability_dvar(is_ad ? nullptr
46 "dPorousFlow_permeability_qp_dvar")),
47 _dpermeability_dgradvar(
50 "dPorousFlow_permeability_qp_dgradvar")),
51 _density(this->template getGenericMaterialProperty<
std::vector<
Real>, is_ad>(
52 "PorousFlow_fluid_phase_density_qp")),
53 _ddensity_dvar(is_ad ? nullptr
54 : &this->template getMaterialProperty<
std::vector<
std::vector<
Real>>>(
55 "dPorousFlow_fluid_phase_density_qp_dvar")),
56 _viscosity(this->template getGenericMaterialProperty<
std::vector<
Real>, is_ad>(
57 "PorousFlow_viscosity_qp")),
58 _dviscosity_dvar(is_ad ? nullptr
59 : &this->template getMaterialProperty<
std::vector<
std::vector<
Real>>>(
60 "dPorousFlow_viscosity_qp_dvar")),
61 _pp(this->template getGenericMaterialProperty<
std::vector<
Real>, is_ad>(
62 "PorousFlow_porepressure_qp")),
63 _grad_p(this->template getGenericMaterialProperty<
std::vector<
RealGradient>, is_ad>(
64 "PorousFlow_grad_porepressure_qp")),
65 _dgrad_p_dgrad_var(is_ad ? nullptr
66 : &this->template getMaterialProperty<
std::vector<
std::vector<
Real>>>(
67 "dPorousFlow_grad_porepressure_qp_dgradvar")),
71 "dPorousFlow_grad_porepressure_qp_dvar")),
74 _perm_derivs(_dictator.usePermDerivs())
78 "PorousFlowFullySaturatedDarcyBase should not be used for multi-phase scenarios as it " 79 "does no upwinding and does not include relative-permeability effects");
86 const unsigned ph = 0;
87 const auto mob = mobility();
88 const auto flow = _permeability[_qp] * (_grad_p[_qp][ph] - _density[_qp][ph] * _gravity);
89 return _grad_test[_i][_qp] * mob * flow;
97 return computeQpOffDiagJacobian(_var.number());
101 template <
bool is_ad>
105 if constexpr (!is_ad)
107 if (_dictator.notPorousFlowVariable(jvar))
110 const unsigned ph = 0;
111 const unsigned pvar = _dictator.porousFlowVariableNum(jvar);
113 const Real mob = mobility();
114 const Real dmob = dmobility(pvar) * _phi[_j][_qp];
117 _permeability[_qp] * (_grad_p[_qp][ph] - _density[_qp][ph] * _gravity);
120 _permeability[_qp] * (_grad_phi[_j][_qp] * (*_dgrad_p_dgrad_var)[_qp][ph][pvar] -
121 _phi[_j][_qp] * (*_ddensity_dvar)[_qp][ph][pvar] * _gravity);
122 dflow += _permeability[_qp] * ((*_dgrad_p_dvar)[_qp][ph][pvar] * _phi[_j][_qp]);
126 dflow += (*_dpermeability_dvar)[_qp][pvar] * _phi[_j][_qp] *
127 (_grad_p[_qp][ph] - _density[_qp][ph] * _gravity);
129 dflow += (*_dpermeability_dgradvar)[_qp][i][pvar] * _grad_phi[_j][_qp](i) *
130 (_grad_p[_qp][ph] - _density[_qp][ph] * _gravity);
133 return _grad_test[_i][_qp] * (dmob * flow + mob * dflow);
140 template <
bool is_ad>
144 const unsigned ph = 0;
146 if (_multiply_by_density)
147 mob *= _density[_qp][ph];
151 template <
bool is_ad>
155 if constexpr (!is_ad)
157 const unsigned ph = 0;
158 Real dmob = -(*_dviscosity_dvar)[_qp][ph][pvar] /
std::pow(_viscosity[_qp][ph], 2);
159 if (_multiply_by_density)
160 dmob = _density[_qp][ph] * dmob + (*_ddensity_dvar)[_qp][ph][pvar] / _viscosity[_qp][ph];
Moose::GenericType< Real, is_ad > GenericReal
registerMooseObject("PorousFlowApp", PorousFlowFullySaturatedDarcyBase)
static InputParameters validParams()
virtual Real dmobility(unsigned int pvar) const
d(mobility)/d(PorousFlow variable pvar) – only used on the non-AD path
static constexpr std::size_t dim
virtual GenericReal< is_ad > computeQpResidual() override
TensorValue< Real > RealTensorValue
virtual GenericReal< is_ad > mobility() const
Fluid mobility = (density *) 1/viscosity. Virtual so DarcyFlow can multiply by mass frac...
void libmesh_ignore(const Args &...)
virtual Real computeQpOffDiagJacobian(unsigned int jvar) override
static InputParameters validParams()
unsigned int numPhases() const
The number of fluid phases.
Darcy advective flux for a fully-saturated, single-phase, single-component fluid. ...
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...
IntRange< T > make_range(T beg, T end)
void mooseError(Args &&... args) const
virtual Real computeQpJacobian() override
const PorousFlowDictator & _dictator
PorousFlowDictator UserObject.
PorousFlowFullySaturatedDarcyBaseTempl(const InputParameters ¶meters)
MooseUnits pow(const MooseUnits &, int)