https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
17template <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");
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
37template <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)
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
82template <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
92template <bool is_ad>
93Real
95{
96 if constexpr (!is_ad)
97 return computeQpOffDiagJacobian(_var.number());
98 return 0.0;
99}
100
101template <bool is_ad>
102Real
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
140template <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
151template <bool is_ad>
152Real
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)
static InputParameters validParams()
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
void mooseError(Args &&... args) const
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.
Darcy advective flux for a fully-saturated, single-phase, single-component fluid.
virtual Real computeQpOffDiagJacobian(unsigned int jvar) override
virtual GenericReal< is_ad > computeQpResidual() override
const PorousFlowDictator & _dictator
PorousFlowDictator UserObject.
virtual GenericReal< is_ad > mobility() const
Fluid mobility = (density *) 1/viscosity. Virtual so DarcyFlow can multiply by mass frac.
virtual Real dmobility(unsigned int pvar) const
d(mobility)/d(PorousFlow variable pvar) – only used on the non-AD path
PorousFlowFullySaturatedDarcyBaseTempl(const InputParameters &parameters)
static constexpr std::size_t dim