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