www.mooseframework.org
PorousFlowDispersiveFlux.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.addParam<unsigned int>(
22  "fluid_component", 0, "The index corresponding to the fluid component for this kernel");
23  params.addRequiredParam<UserObjectName>(
24  "PorousFlowDictator", "The UserObject that holds the list of PorousFlow variable names");
25  params.addRequiredParam<std::vector<Real>>(
26  "disp_long", "Vector of longitudinal dispersion coefficients for each phase");
27  params.addRequiredParam<std::vector<Real>>(
28  "disp_trans", "Vector of transverse dispersion coefficients for each phase");
29  params.addRequiredParam<RealVectorValue>("gravity",
30  "Gravitational acceleration vector downwards (m/s^2)");
31  params.addClassDescription(
32  "Dispersive and diffusive flux of the component given by fluid_component in all phases");
33  return params;
34 }
35 
36 PorousFlowDispersiveFlux::PorousFlowDispersiveFlux(const InputParameters & parameters)
37  : Kernel(parameters),
38 
39  _fluid_density_qp(getMaterialProperty<std::vector<Real>>("PorousFlow_fluid_phase_density_qp")),
40  _dfluid_density_qp_dvar(getMaterialProperty<std::vector<std::vector<Real>>>(
41  "dPorousFlow_fluid_phase_density_qp_dvar")),
42  _grad_mass_frac(getMaterialProperty<std::vector<std::vector<RealGradient>>>(
43  "PorousFlow_grad_mass_frac_qp")),
44  _dmass_frac_dvar(getMaterialProperty<std::vector<std::vector<std::vector<Real>>>>(
45  "dPorousFlow_mass_frac_qp_dvar")),
46  _porosity_qp(getMaterialProperty<Real>("PorousFlow_porosity_qp")),
47  _dporosity_qp_dvar(getMaterialProperty<std::vector<Real>>("dPorousFlow_porosity_qp_dvar")),
48  _tortuosity(getMaterialProperty<std::vector<Real>>("PorousFlow_tortuosity_qp")),
49  _dtortuosity_dvar(
50  getMaterialProperty<std::vector<std::vector<Real>>>("dPorousFlow_tortuosity_qp_dvar")),
51  _diffusion_coeff(
52  getMaterialProperty<std::vector<std::vector<Real>>>("PorousFlow_diffusion_coeff_qp")),
53  _ddiffusion_coeff_dvar(getMaterialProperty<std::vector<std::vector<std::vector<Real>>>>(
54  "dPorousFlow_diffusion_coeff_qp_dvar")),
55  _dictator(getUserObject<PorousFlowDictator>("PorousFlowDictator")),
56  _fluid_component(getParam<unsigned int>("fluid_component")),
57  _num_phases(_dictator.numPhases()),
58  _identity_tensor(RankTwoTensor::initIdentity),
59  _relative_permeability(
60  getMaterialProperty<std::vector<Real>>("PorousFlow_relative_permeability_qp")),
61  _drelative_permeability_dvar(getMaterialProperty<std::vector<std::vector<Real>>>(
62  "dPorousFlow_relative_permeability_qp_dvar")),
63  _fluid_viscosity(getMaterialProperty<std::vector<Real>>("PorousFlow_viscosity_qp")),
64  _dfluid_viscosity_dvar(
65  getMaterialProperty<std::vector<std::vector<Real>>>("dPorousFlow_viscosity_qp_dvar")),
66  _permeability(getMaterialProperty<RealTensorValue>("PorousFlow_permeability_qp")),
67  _dpermeability_dvar(
68  getMaterialProperty<std::vector<RealTensorValue>>("dPorousFlow_permeability_qp_dvar")),
69  _dpermeability_dgradvar(getMaterialProperty<std::vector<std::vector<RealTensorValue>>>(
70  "dPorousFlow_permeability_qp_dgradvar")),
71  _grad_p(getMaterialProperty<std::vector<RealGradient>>("PorousFlow_grad_porepressure_qp")),
72  _dgrad_p_dgrad_var(getMaterialProperty<std::vector<std::vector<Real>>>(
73  "dPorousFlow_grad_porepressure_qp_dgradvar")),
74  _dgrad_p_dvar(getMaterialProperty<std::vector<std::vector<RealGradient>>>(
75  "dPorousFlow_grad_porepressure_qp_dvar")),
76  _gravity(getParam<RealVectorValue>("gravity")),
77  _disp_long(getParam<std::vector<Real>>("disp_long")),
78  _disp_trans(getParam<std::vector<Real>>("disp_trans")),
79  _perm_derivs(_dictator.usePermDerivs())
80 {
81  // Check that sufficient values of the dispersion coefficients have been entered
82  if (_disp_long.size() != _num_phases)
83  paramError(
84  "disp_long",
85  "The number of longitudinal dispersion coefficients is not equal to the number of phases");
86 
87  if (_disp_trans.size() != _num_phases)
88  paramError("disp_trans",
89  "The number of transverse dispersion coefficients disp_trans in is not equal to the "
90  "number of phases");
91 }
92 
93 Real
95 {
96  RealVectorValue flux = 0.0;
97  RealVectorValue velocity;
98  Real velocity_abs;
99  RankTwoTensor v2;
100  RankTwoTensor dispersion;
101  dispersion.zero();
102  Real diffusion;
103 
104  for (unsigned int ph = 0; ph < _num_phases; ++ph)
105  {
106  // Diffusive component
107  diffusion =
108  _porosity_qp[_qp] * _tortuosity[_qp][ph] * _diffusion_coeff[_qp][ph][_fluid_component];
109 
110  // Calculate Darcy velocity
111  velocity = (_permeability[_qp] * (_grad_p[_qp][ph] - _fluid_density_qp[_qp][ph] * _gravity) *
112  _relative_permeability[_qp][ph] / _fluid_viscosity[_qp][ph]);
113  velocity_abs = std::sqrt(velocity * velocity);
114 
115  if (velocity_abs > 0.0)
116  {
117  v2.vectorOuterProduct(velocity, velocity);
118 
119  // Add longitudinal dispersion to diffusive component
120  diffusion += _disp_trans[ph] * velocity_abs;
121  dispersion = (_disp_long[ph] - _disp_trans[ph]) * v2 / velocity_abs;
122  }
123 
124  flux += _fluid_density_qp[_qp][ph] * (diffusion * _identity_tensor + dispersion) *
126  }
127  return _grad_test[_i][_qp] * flux;
128 }
129 
130 Real
132 {
133  return computeQpJac(_var.number());
134 }
135 
136 Real
138 {
139  return computeQpJac(jvar);
140 }
141 
142 Real
144 {
145  // If the variable is not a valid PorousFlow variable, set the Jacobian to 0
147  return 0.0;
148 
149  const unsigned int pvar = _dictator.porousFlowVariableNum(jvar);
150 
151  RealVectorValue velocity;
152  Real velocity_abs;
153  RankTwoTensor v2;
154  RankTwoTensor dispersion;
155  dispersion.zero();
156  Real diffusion;
157  RealVectorValue flux = 0.0;
158  RealVectorValue dflux = 0.0;
159 
160  for (unsigned int ph = 0; ph < _num_phases; ++ph)
161  {
162  // Diffusive component
163  diffusion =
164  _porosity_qp[_qp] * _tortuosity[_qp][ph] * _diffusion_coeff[_qp][ph][_fluid_component];
165 
166  // Calculate Darcy velocity
167  velocity = (_permeability[_qp] * (_grad_p[_qp][ph] - _fluid_density_qp[_qp][ph] * _gravity) *
168  _relative_permeability[_qp][ph] / _fluid_viscosity[_qp][ph]);
169  velocity_abs = std::sqrt(velocity * velocity);
170 
171  if (velocity_abs > 0.0)
172  {
173  v2.vectorOuterProduct(velocity, velocity);
174 
175  // Add longitudinal dispersion to diffusive component
176  diffusion += _disp_trans[ph] * velocity_abs;
177  dispersion = (_disp_long[ph] - _disp_trans[ph]) * v2 / velocity_abs;
178  }
179 
180  // Derivative of Darcy velocity
181  RealVectorValue dvelocity =
182  _permeability[_qp] * (_grad_phi[_j][_qp] * _dgrad_p_dgrad_var[_qp][ph][pvar] -
183  _phi[_j][_qp] * _dfluid_density_qp_dvar[_qp][ph][pvar] * _gravity);
184  dvelocity += _permeability[_qp] * (_dgrad_p_dvar[_qp][ph][pvar] * _phi[_j][_qp]);
185 
186  if (_perm_derivs)
187  {
188  dvelocity += _dpermeability_dvar[_qp][pvar] * _phi[_j][_qp] *
189  (_grad_p[_qp][ph] - _fluid_density_qp[_qp][ph] * _gravity);
190 
191  for (unsigned int i = 0; i < LIBMESH_DIM; ++i)
192  dvelocity += _dpermeability_dgradvar[_qp][i][pvar] * _grad_phi[_j][_qp](i) *
193  (_grad_p[_qp][ph] - _fluid_density_qp[_qp][ph] * _gravity);
194  }
195 
196  dvelocity = dvelocity * _relative_permeability[_qp][ph] / _fluid_viscosity[_qp][ph] +
197  (_permeability[_qp] * (_grad_p[_qp][ph] - _fluid_density_qp[_qp][ph] * _gravity)) *
198  (_drelative_permeability_dvar[_qp][ph][pvar] / _fluid_viscosity[_qp][ph] -
199  _relative_permeability[_qp][ph] * _dfluid_viscosity_dvar[_qp][ph][pvar] /
200  std::pow(_fluid_viscosity[_qp][ph], 2)) *
201  _phi[_j][_qp];
202 
203  Real dvelocity_abs = 0.0;
204  if (velocity_abs > 0.0)
205  dvelocity_abs = velocity * dvelocity / velocity_abs;
206 
207  // Derivative of diffusion term (note: dispersivity is assumed constant)
208  Real ddiffusion = _phi[_j][_qp] * _dporosity_qp_dvar[_qp][pvar] * _tortuosity[_qp][ph] *
210  ddiffusion += _phi[_j][_qp] * _porosity_qp[_qp] * _dtortuosity_dvar[_qp][ph][pvar] *
212  ddiffusion += _phi[_j][_qp] * _porosity_qp[_qp] * _tortuosity[_qp][ph] *
214  ddiffusion += _disp_trans[ph] * dvelocity_abs;
215 
216  // Derivative of dispersion term (note: dispersivity is assumed constant)
217  RankTwoTensor ddispersion;
218  ddispersion.zero();
219  if (velocity_abs > 0.0)
220  {
221  RankTwoTensor dv2a, dv2b;
222  dv2a.vectorOuterProduct(velocity, dvelocity);
223  dv2b.vectorOuterProduct(dvelocity, velocity);
224  ddispersion = (_disp_long[ph] - _disp_trans[ph]) * (dv2a + dv2b) / velocity_abs;
225  ddispersion -=
226  (_disp_long[ph] - _disp_trans[ph]) * v2 * dvelocity_abs / velocity_abs / velocity_abs;
227  }
228 
229  dflux += _phi[_j][_qp] * _dfluid_density_qp_dvar[_qp][ph][pvar] *
230  (diffusion * _identity_tensor + dispersion) *
232  dflux += _fluid_density_qp[_qp][ph] * (ddiffusion * _identity_tensor + ddispersion) *
234 
235  // NOTE: Here we assume that d(grad_mass_frac)/d(var) = d(mass_frac)/d(var) * grad_phi
236  // This is true for most PorousFlow scenarios, but not for chemical reactions
237  // where mass_frac is a nonlinear function of the primary MOOSE Variables
238  dflux += _fluid_density_qp[_qp][ph] * (diffusion * _identity_tensor + dispersion) *
239  _dmass_frac_dvar[_qp][ph][_fluid_component][pvar] * _grad_phi[_j][_qp];
240  }
241 
242  return _grad_test[_i][_qp] * dflux;
243 }
PorousFlowDispersiveFlux::computeQpJac
Real computeQpJac(unsigned int jvar) const
Derivative of the residual with respect to the PorousFLow Variable with variable number jvar.
Definition: PorousFlowDispersiveFlux.C:143
PorousFlowDispersiveFlux::_dgrad_p_dvar
const MaterialProperty< std::vector< std::vector< RealGradient > > > & _dgrad_p_dvar
Derivative of Grad porepressure in each phase wrt PorousFlow variables.
Definition: PorousFlowDispersiveFlux.h:116
PorousFlowDispersiveFlux::_tortuosity
const MaterialProperty< std::vector< Real > > & _tortuosity
Tortuosity tau_0 * tau_{alpha} for fluid phase alpha.
Definition: PorousFlowDispersiveFlux.h:65
PorousFlowDispersiveFlux::_gravity
const RealVectorValue _gravity
Gravitational acceleration.
Definition: PorousFlowDispersiveFlux.h:119
PorousFlowDispersiveFlux::_fluid_component
const unsigned int _fluid_component
Index of the fluid component that this kernel acts on.
Definition: PorousFlowDispersiveFlux.h:80
PorousFlowDispersiveFlux::_dfluid_viscosity_dvar
const MaterialProperty< std::vector< std::vector< Real > > > & _dfluid_viscosity_dvar
Derivative of viscosity wrt PorousFlow variables.
Definition: PorousFlowDispersiveFlux.h:98
PorousFlowDispersiveFlux::_fluid_density_qp
const MaterialProperty< std::vector< Real > > & _fluid_density_qp
Fluid density for each phase (at the qp)
Definition: PorousFlowDispersiveFlux.h:47
PorousFlowDispersiveFlux::_permeability
const MaterialProperty< RealTensorValue > & _permeability
Permeability of porous material.
Definition: PorousFlowDispersiveFlux.h:101
PorousFlowDispersiveFlux::_grad_mass_frac
const MaterialProperty< std::vector< std::vector< RealGradient > > > & _grad_mass_frac
Gradient of mass fraction of each component in each phase.
Definition: PorousFlowDispersiveFlux.h:53
PorousFlowDispersiveFlux::_disp_trans
const std::vector< Real > _disp_trans
Transverse dispersivity for each phase.
Definition: PorousFlowDispersiveFlux.h:125
PorousFlowDispersiveFlux::_dpermeability_dgradvar
const MaterialProperty< std::vector< std::vector< RealTensorValue > > > & _dpermeability_dgradvar
d(permeabiity)/d(grad(PorousFlow variable))
Definition: PorousFlowDispersiveFlux.h:107
PorousFlowDispersiveFlux.h
pow
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
Definition: ExpressionBuilder.h:673
libMesh::RealGradient
VectorValue< Real > RealGradient
Definition: GrainForceAndTorqueInterface.h:17
PorousFlowDispersiveFlux::_num_phases
const unsigned int _num_phases
The number of fluid phases.
Definition: PorousFlowDispersiveFlux.h:83
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
PorousFlowDispersiveFlux::_dtortuosity_dvar
const MaterialProperty< std::vector< std::vector< Real > > > & _dtortuosity_dvar
Derivative of tortuosity wrt PorousFlow variables.
Definition: PorousFlowDispersiveFlux.h:68
PorousFlowDispersiveFlux::_perm_derivs
const bool _perm_derivs
Flag to check whether permeabiity derivatives are non-zero.
Definition: PorousFlowDispersiveFlux.h:128
PorousFlowDispersiveFlux::_drelative_permeability_dvar
const MaterialProperty< std::vector< std::vector< Real > > > & _drelative_permeability_dvar
Derivative of relative permeability wrt PorousFlow variables.
Definition: PorousFlowDispersiveFlux.h:92
PorousFlowDispersiveFlux::_relative_permeability
const MaterialProperty< std::vector< Real > > & _relative_permeability
Relative permeability of each phase.
Definition: PorousFlowDispersiveFlux.h:89
PorousFlowDispersiveFlux::_dictator
const PorousFlowDictator & _dictator
PorousFlowDictator UserObject.
Definition: PorousFlowDispersiveFlux.h:77
PorousFlowDispersiveFlux::_dmass_frac_dvar
const MaterialProperty< std::vector< std::vector< std::vector< Real > > > > & _dmass_frac_dvar
Derivative of mass fraction wrt PorousFlow variables.
Definition: PorousFlowDispersiveFlux.h:56
PorousFlowDispersiveFlux::_ddiffusion_coeff_dvar
const MaterialProperty< std::vector< std::vector< std::vector< Real > > > > & _ddiffusion_coeff_dvar
Derivative of the diffusion coefficients wrt PorousFlow variables.
Definition: PorousFlowDispersiveFlux.h:74
PorousFlowDispersiveFlux::_dpermeability_dvar
const MaterialProperty< std::vector< RealTensorValue > > & _dpermeability_dvar
Derivative of permeability wrt PorousFlow variables.
Definition: PorousFlowDispersiveFlux.h:104
PorousFlowDictator::porousFlowVariableNum
unsigned int porousFlowVariableNum(unsigned int moose_var_num) const
The PorousFlow variable number.
Definition: PorousFlowDictator.C:135
PorousFlowDispersiveFlux::_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: PorousFlowDispersiveFlux.h:113
PorousFlowDictator
This holds maps between the nonlinear variables used in a PorousFlow simulation and the variable numb...
Definition: PorousFlowDictator.h:71
PorousFlowDispersiveFlux::_dfluid_density_qp_dvar
const MaterialProperty< std::vector< std::vector< Real > > > & _dfluid_density_qp_dvar
Derivative of the fluid density for each phase wrt PorousFlow variables (at the qp)
Definition: PorousFlowDispersiveFlux.h:50
PorousFlowDispersiveFlux::_fluid_viscosity
const MaterialProperty< std::vector< Real > > & _fluid_viscosity
Viscosity of each component in each phase.
Definition: PorousFlowDispersiveFlux.h:95
PorousFlowDispersiveFlux::_disp_long
const std::vector< Real > _disp_long
Longitudinal dispersivity for each phase.
Definition: PorousFlowDispersiveFlux.h:122
validParams< PorousFlowDispersiveFlux >
InputParameters validParams< PorousFlowDispersiveFlux >()
Definition: PorousFlowDispersiveFlux.C:18
registerMooseObject
registerMooseObject("PorousFlowApp", PorousFlowDispersiveFlux)
PorousFlowDispersiveFlux::_identity_tensor
const RankTwoTensor _identity_tensor
Identity tensor.
Definition: PorousFlowDispersiveFlux.h:86
PorousFlowDispersiveFlux::computeQpResidual
virtual Real computeQpResidual() override
Definition: PorousFlowDispersiveFlux.C:94
PorousFlowDispersiveFlux::_grad_p
const MaterialProperty< std::vector< RealGradient > > & _grad_p
Gradient of the pore pressure in each phase.
Definition: PorousFlowDispersiveFlux.h:110
PorousFlowDispersiveFlux::computeQpJacobian
virtual Real computeQpJacobian() override
Definition: PorousFlowDispersiveFlux.C:131
PorousFlowDispersiveFlux::PorousFlowDispersiveFlux
PorousFlowDispersiveFlux(const InputParameters &parameters)
Definition: PorousFlowDispersiveFlux.C:36
PorousFlowDispersiveFlux
Dispersive flux of component k in fluid phase alpha.
Definition: PorousFlowDispersiveFlux.h:25
PorousFlowDispersiveFlux::_porosity_qp
const MaterialProperty< Real > & _porosity_qp
Porosity at the qps.
Definition: PorousFlowDispersiveFlux.h:59
PorousFlowDispersiveFlux::_diffusion_coeff
const MaterialProperty< std::vector< std::vector< Real > > > & _diffusion_coeff
Diffusion coefficients of component k in fluid phase alpha.
Definition: PorousFlowDispersiveFlux.h:71
RankTwoTensorTempl
Definition: ACGrGrElasticDrivingForce.h:17
PorousFlowDispersiveFlux::_dporosity_qp_dvar
const MaterialProperty< std::vector< Real > > & _dporosity_qp_dvar
Derivative of porosity wrt PorousFlow variables (at the qps)
Definition: PorousFlowDispersiveFlux.h:62
PorousFlowDispersiveFlux::computeQpOffDiagJacobian
virtual Real computeQpOffDiagJacobian(unsigned int jvar) override
Definition: PorousFlowDispersiveFlux.C:137