https://mooseframework.inl.gov
PorousFlowFullySaturatedDarcyBase.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 "MooseVariable.h"
13 
16 
17 template <bool is_ad>
20 {
22  params.addRequiredParam<RealVectorValue>("gravity",
23  "Gravitational acceleration vector downwards (m/s^2)");
24  params.addParam<bool>("multiply_by_density",
25  true,
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)");
28  params.addRequiredParam<UserObjectName>(
29  "PorousFlowDictator", "The UserObject that holds the list of PorousFlow variable names");
30  params.addClassDescription(
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 "
33  "Jacobian.");
34  return params;
35 }
36 
37 template <bool is_ad>
39  const InputParameters & parameters)
40  : GenericKernel<is_ad>(parameters),
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
45  : &this->template getMaterialProperty<std::vector<RealTensorValue>>(
46  "dPorousFlow_permeability_qp_dvar")),
47  _dpermeability_dgradvar(
48  is_ad ? nullptr
49  : &this->template getMaterialProperty<std::vector<std::vector<RealTensorValue>>>(
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")),
68  _dgrad_p_dvar(is_ad
69  ? nullptr
70  : &this->template getMaterialProperty<std::vector<std::vector<RealGradient>>>(
71  "dPorousFlow_grad_porepressure_qp_dvar")),
72  _dictator(this->template getUserObject<PorousFlowDictator>("PorousFlowDictator")),
73  _gravity(this->template getParam<RealVectorValue>("gravity")),
74  _perm_derivs(_dictator.usePermDerivs())
75 {
76  if (_dictator.numPhases() != 1)
77  mooseError(
78  "PorousFlowFullySaturatedDarcyBase should not be used for multi-phase scenarios as it "
79  "does no upwinding and does not include relative-permeability effects");
80 }
81 
82 template <bool is_ad>
85 {
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;
90 }
91 
92 template <bool is_ad>
93 Real
95 {
96  if constexpr (!is_ad)
97  return computeQpOffDiagJacobian(_var.number());
98  return 0.0;
99 }
100 
101 template <bool is_ad>
102 Real
104 {
105  if constexpr (!is_ad)
106  {
107  if (_dictator.notPorousFlowVariable(jvar))
108  return 0.0;
109 
110  const unsigned ph = 0;
111  const unsigned pvar = _dictator.porousFlowVariableNum(jvar);
112 
113  const Real mob = mobility();
114  const Real dmob = dmobility(pvar) * _phi[_j][_qp];
115 
116  const RealVectorValue flow =
117  _permeability[_qp] * (_grad_p[_qp][ph] - _density[_qp][ph] * _gravity);
118 
119  RealVectorValue dflow =
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]);
123 
124  if (_perm_derivs)
125  {
126  dflow += (*_dpermeability_dvar)[_qp][pvar] * _phi[_j][_qp] *
127  (_grad_p[_qp][ph] - _density[_qp][ph] * _gravity);
128  for (const auto i : make_range(Moose::dim))
129  dflow += (*_dpermeability_dgradvar)[_qp][i][pvar] * _grad_phi[_j][_qp](i) *
130  (_grad_p[_qp][ph] - _density[_qp][ph] * _gravity);
131  }
132 
133  return _grad_test[_i][_qp] * (dmob * flow + mob * dflow);
134  }
135  else
136  libmesh_ignore(jvar);
137  return 0.0;
138 }
139 
140 template <bool is_ad>
143 {
144  const unsigned ph = 0;
145  GenericReal<is_ad> mob = 1.0 / _viscosity[_qp][ph];
146  if (_multiply_by_density)
147  mob *= _density[_qp][ph];
148  return mob;
149 }
150 
151 template <bool is_ad>
152 Real
154 {
155  if constexpr (!is_ad)
156  {
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];
161  return dmob;
162  }
163  else
164  libmesh_ignore(pvar);
165  return 0.0;
166 }
167 
Moose::GenericType< Real, is_ad > GenericReal
registerMooseObject("PorousFlowApp", PorousFlowFullySaturatedDarcyBase)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
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
void addRequiredParam(const std::string &name, const std::string &doc_string)
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
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
void addClassDescription(const std::string &doc_string)
const PorousFlowDictator & _dictator
PorousFlowDictator UserObject.
PorousFlowFullySaturatedDarcyBaseTempl(const InputParameters &parameters)
MooseUnits pow(const MooseUnits &, int)