www.mooseframework.org
PorousFlowFullySaturatedDarcyBase.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 
15 
18 {
20  params.addRequiredParam<RealVectorValue>("gravity",
21  "Gravitational acceleration vector downwards (m/s^2)");
22  params.addParam<bool>("multiply_by_density",
23  true,
24  "If true, then this Kernel is the fluid mass "
25  "flux. If false, then this Kernel is the "
26  "fluid volume flux (which is common in "
27  "poro-mechanics)");
28  params.addRequiredParam<UserObjectName>(
29  "PorousFlowDictator", "The UserObject that holds the list of PorousFlow variable names");
30  params.addClassDescription("Darcy flux suitable for models involving a fully-saturated, single "
31  "phase, single component fluid. No upwinding is used");
32  return params;
33 }
34 
36  const InputParameters & parameters)
37  : Kernel(parameters),
38  _multiply_by_density(getParam<bool>("multiply_by_density")),
39  _permeability(getMaterialProperty<RealTensorValue>("PorousFlow_permeability_qp")),
40  _dpermeability_dvar(
41  getMaterialProperty<std::vector<RealTensorValue>>("dPorousFlow_permeability_qp_dvar")),
42  _dpermeability_dgradvar(getMaterialProperty<std::vector<std::vector<RealTensorValue>>>(
43  "dPorousFlow_permeability_qp_dgradvar")),
44  _density(getMaterialProperty<std::vector<Real>>("PorousFlow_fluid_phase_density_qp")),
45  _ddensity_dvar(getMaterialProperty<std::vector<std::vector<Real>>>(
46  "dPorousFlow_fluid_phase_density_qp_dvar")),
47  _viscosity(getMaterialProperty<std::vector<Real>>("PorousFlow_viscosity_qp")),
48  _dviscosity_dvar(
49  getMaterialProperty<std::vector<std::vector<Real>>>("dPorousFlow_viscosity_qp_dvar")),
50  _pp(getMaterialProperty<std::vector<Real>>("PorousFlow_porepressure_qp")),
51  _grad_p(getMaterialProperty<std::vector<RealGradient>>("PorousFlow_grad_porepressure_qp")),
52  _dgrad_p_dgrad_var(getMaterialProperty<std::vector<std::vector<Real>>>(
53  "dPorousFlow_grad_porepressure_qp_dgradvar")),
54  _dgrad_p_dvar(getMaterialProperty<std::vector<std::vector<RealGradient>>>(
55  "dPorousFlow_grad_porepressure_qp_dvar")),
56  _dictator(getUserObject<PorousFlowDictator>("PorousFlowDictator")),
57  _gravity(getParam<RealVectorValue>("gravity")),
58  _perm_derivs(_dictator.usePermDerivs())
59 {
60  if (_dictator.numPhases() != 1)
61  mooseError("PorousFlowFullySaturatedDarcyBase should not be used for multi-phase scenarios as "
62  "it does no upwinding and does not include relative-permeability effects");
63 }
64 
65 Real
67 {
68  const unsigned ph = 0;
69  const Real mob = mobility();
70  const RealVectorValue flow =
71  _permeability[_qp] * (_grad_p[_qp][ph] - _density[_qp][ph] * _gravity);
72  return _grad_test[_i][_qp] * mob * flow;
73 }
74 
75 Real
77 {
79 }
80 
81 Real
83 {
85  return 0.0;
86 
87  const unsigned ph = 0;
88  const unsigned pvar = _dictator.porousFlowVariableNum(jvar);
89 
90  const Real mob = mobility();
91  const Real dmob = dmobility(pvar) * _phi[_j][_qp];
92 
93  const RealVectorValue flow =
94  _permeability[_qp] * (_grad_p[_qp][ph] - _density[_qp][ph] * _gravity);
95 
96  RealVectorValue dflow =
98  _phi[_j][_qp] * _ddensity_dvar[_qp][ph][pvar] * _gravity);
99  dflow += _permeability[_qp] * (_dgrad_p_dvar[_qp][ph][pvar] * _phi[_j][_qp]);
100 
101  if (_perm_derivs)
102  {
103  dflow += _dpermeability_dvar[_qp][pvar] * _phi[_j][_qp] *
104  (_grad_p[_qp][ph] - _density[_qp][ph] * _gravity);
105  for (const auto i : make_range(Moose::dim))
106  dflow += _dpermeability_dgradvar[_qp][i][pvar] * _grad_phi[_j][_qp](i) *
107  (_grad_p[_qp][ph] - _density[_qp][ph] * _gravity);
108  }
109 
110  return _grad_test[_i][_qp] * (dmob * flow + mob * dflow);
111 }
112 
113 Real
115 {
116  const unsigned ph = 0;
117  Real mob = 1.0 / _viscosity[_qp][ph];
119  mob *= _density[_qp][ph];
120  return mob;
121 }
122 
123 Real
125 {
126  const unsigned ph = 0;
127  Real dmob = -_dviscosity_dvar[_qp][ph][pvar] / std::pow(_viscosity[_qp][ph], 2);
129  dmob = _density[_qp][ph] * dmob + _ddensity_dvar[_qp][ph][pvar] / _viscosity[_qp][ph];
130  return dmob;
131 }
const MaterialProperty< std::vector< std::vector< RealTensorValue > > > & _dpermeability_dgradvar
d(permeabiity)/d(grad(PorousFlow variable))
static InputParameters validParams()
bool notPorousFlowVariable(unsigned int moose_var_num) const
Returns true if moose_var_num is not a porous flow variabe.
MooseVariable & _var
registerMooseObject("PorousFlowApp", PorousFlowFullySaturatedDarcyBase)
virtual Real dmobility(unsigned pvar) const
The derivative of the mobility with respect to the PorousFlow variable pvar.
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
const MaterialProperty< RealTensorValue > & _permeability
Permeability of porous material.
const bool _perm_derivs
Flag to check whether permeabiity derivatives are non-zero.
unsigned int number() const
const VariablePhiGradient & _grad_phi
const MaterialProperty< std::vector< std::vector< RealGradient > > > & _dgrad_p_dvar
Derivative of Grad porepressure in each phase wrt PorousFlow variables.
const RealVectorValue _gravity
Gravity pointing downwards.
static constexpr std::size_t dim
const MaterialProperty< std::vector< std::vector< Real > > > & _ddensity_dvar
Derivative of the fluid density for each phase wrt PorousFlow variables (at the qp) ...
PorousFlowFullySaturatedDarcyBase(const InputParameters &parameters)
const MaterialProperty< std::vector< RealGradient > > & _grad_p
Gradient of the pore pressure in each phase.
const MaterialProperty< std::vector< Real > > & _viscosity
Viscosity of the fluid at the qp.
void addRequiredParam(const std::string &name, const std::string &doc_string)
const MaterialProperty< std::vector< std::vector< Real > > > & _dviscosity_dvar
Derivative of the fluid viscosity wrt PorousFlow variables.
const bool _multiply_by_density
If true then the mobility contains the fluid density, otherwise it doesn&#39;t.
TensorValue< Real > RealTensorValue
unsigned int _i
virtual Real computeQpOffDiagJacobian(unsigned int jvar) override
const MaterialProperty< std::vector< RealTensorValue > > & _dpermeability_dvar
d(permeabiity)/d(PorousFlow variable)
unsigned int numPhases() const
The number of fluid phases.
unsigned int _j
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...
Darcy advective flux for a fully-saturated, single phase, single component fluid. ...
const VariableTestGradient & _grad_test
IntRange< T > make_range(T beg, T end)
void mooseError(Args &&... args) const
void addClassDescription(const std::string &doc_string)
const MaterialProperty< std::vector< std::vector< Real > > > & _dgrad_p_dgrad_var
Derivative of Grad porepressure in each phase wrt grad(PorousFlow variables)
unsigned int porousFlowVariableNum(unsigned int moose_var_num) const
The PorousFlow variable number.
virtual Real mobility() const
The mobility of the fluid = density / viscosity.
const VariablePhiValue & _phi
const PorousFlowDictator & _dictator
PorousFlowDictator UserObject.
MooseUnits pow(const MooseUnits &, int)
unsigned int _qp
const MaterialProperty< std::vector< Real > > & _density
Fluid density for each phase (at the qp)