www.mooseframework.org
PorousFlowPermeabilityExponential.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 
13 
14 template <>
15 InputParameters
17 {
18  InputParameters params = validParams<PorousFlowPermeabilityBase>();
19  MooseEnum poroperm_function("log_k ln_k exp_k", "exp_k");
20  params.addParam<MooseEnum>("poroperm_function",
21  poroperm_function,
22  "Form of the function relating porosity and permeability. The options "
23  "are: log_k (log k = A phi + B); ln_k (ln k = A phi + B); exp_k (k = "
24  "B exp(A phi)); where k is permeability, phi is porosity, A and B are "
25  "empirical constants.");
26  params.addParam<RealTensorValue>("k_anisotropy",
27  "A tensor to multiply the calculated scalar "
28  "permeability, in order to obtain anisotropy if "
29  "required. Defaults to isotropic permeability "
30  "if not specified.");
31  params.addRequiredParam<Real>("A", "Empirical constant; see poroperm_function.");
32  params.addRequiredParam<Real>("B", "Empirical constant; see poroperm_function.");
33  params.addClassDescription(
34  "This Material calculates the permeability tensor from an exponential function of porosity: "
35  "k = k_ijk * BB exp(AA phi), where k_ijk is a tensor providing the anisotropy, phi is "
36  "porosity, and AA and BB are empirical constants. The user can provide input for the "
37  "function expressed in ln k, log k or exponential forms (see poroperm_function).");
38  return params;
39 }
40 
42  const InputParameters & parameters)
43  : PorousFlowPermeabilityBase(parameters),
44  _A(getParam<Real>("A")),
45  _B(getParam<Real>("B")),
46  _k_anisotropy(parameters.isParamValid("k_anisotropy")
47  ? getParam<RealTensorValue>("k_anisotropy")
48  : RealTensorValue(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0)),
49  _porosity_qp(getMaterialProperty<Real>("PorousFlow_porosity_qp")),
50  _dporosity_qp_dvar(getMaterialProperty<std::vector<Real>>("dPorousFlow_porosity_qp_dvar")),
51  _dporosity_qp_dgradvar(
52  getMaterialProperty<std::vector<RealGradient>>("dPorousFlow_porosity_qp_dgradvar")),
53  _poroperm_function(getParam<MooseEnum>("poroperm_function").getEnum<PoropermFunction>())
54 {
55  switch (_poroperm_function)
56  {
58  _AA = _A * std::log(10.0);
59  _BB = std::pow(10.0, _B);
60  break;
61 
63  _AA = _A;
64  _BB = std::exp(_B);
65  break;
66 
68  _AA = _A;
69  _BB = _B;
70  break;
71  }
72 
73  // Make sure that derivatives are included in the Jacobian calculations
74  _dictator.usePermDerivs(true);
75 }
76 
77 void
79 {
80  _permeability_qp[_qp] = _k_anisotropy * _BB * std::exp(_porosity_qp[_qp] * _AA);
81 
82  _dpermeability_qp_dvar[_qp].resize(_num_var, RealTensorValue());
83  for (unsigned int v = 0; v < _num_var; ++v)
85 
86  _dpermeability_qp_dgradvar[_qp].resize(LIBMESH_DIM);
87  for (unsigned i = 0; i < LIBMESH_DIM; ++i)
88  {
89  _dpermeability_qp_dgradvar[_qp][i].resize(_num_var, RealTensorValue());
90  for (unsigned int v = 0; v < _num_var; ++v)
91  _dpermeability_qp_dgradvar[_qp][i][v] =
92  _AA * _permeability_qp[_qp] * _dporosity_qp_dgradvar[_qp][v](i);
93  }
94 }
PorousFlowPermeabilityExponential::PoropermFunction::log_k
PorousFlowPermeabilityExponential::_B
const Real _B
Empirical constant B.
Definition: PorousFlowPermeabilityExponential.h:44
PorousFlowPermeabilityExponential::PoropermFunction
PoropermFunction
Name of porosity-permeability relationship.
Definition: PorousFlowPermeabilityExponential.h:59
PorousFlowPermeabilityBase
Base class Material designed to provide the permeability tensor.
Definition: PorousFlowPermeabilityBase.h:22
PorousFlowPermeabilityExponential
Material designed to provide the permeability tensor which is calculated from porosity using the equa...
Definition: PorousFlowPermeabilityExponential.h:32
PorousFlowPermeabilityBase::_dpermeability_qp_dvar
MaterialProperty< std::vector< RealTensorValue > > & _dpermeability_qp_dvar
d(quadpoint permeability)/d(PorousFlow variable)
Definition: PorousFlowPermeabilityBase.h:32
pow
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
Definition: ExpressionBuilder.h:673
libMesh::RealGradient
VectorValue< Real > RealGradient
Definition: GrainForceAndTorqueInterface.h:17
validParams< PorousFlowPermeabilityExponential >
InputParameters validParams< PorousFlowPermeabilityExponential >()
Definition: PorousFlowPermeabilityExponential.C:16
PorousFlowPermeabilityExponential::_AA
Real _AA
Empirical constant AA in k = k_ijk * BB * exp(AA * phi)
Definition: PorousFlowPermeabilityExponential.h:62
PorousFlowPermeabilityExponential::_A
const Real _A
Empirical constant A.
Definition: PorousFlowPermeabilityExponential.h:41
PorousFlowPermeabilityExponential::_k_anisotropy
const RealTensorValue _k_anisotropy
Tensor multiplier k_ijk in k = k_ijk * A * phi^n / (1 - phi)^m.
Definition: PorousFlowPermeabilityExponential.h:47
PorousFlowPermeabilityExponential.h
PorousFlowPermeabilityExponential::computeQpProperties
void computeQpProperties() override
Definition: PorousFlowPermeabilityExponential.C:78
PorousFlowPermeabilityBase::_permeability_qp
MaterialProperty< RealTensorValue > & _permeability_qp
Quadpoint permeability.
Definition: PorousFlowPermeabilityBase.h:29
validParams< PorousFlowPermeabilityBase >
InputParameters validParams< PorousFlowPermeabilityBase >()
Definition: PorousFlowPermeabilityBase.C:14
PorousFlowPermeabilityExponential::PoropermFunction::ln_k
PorousFlowPermeabilityExponential::PorousFlowPermeabilityExponential
PorousFlowPermeabilityExponential(const InputParameters &parameters)
Definition: PorousFlowPermeabilityExponential.C:41
PorousFlowPermeabilityExponential::PoropermFunction::exp_k
PorousFlowMaterialVectorBase::_num_var
const unsigned int _num_var
Number of PorousFlow variables.
Definition: PorousFlowMaterialVectorBase.h:36
PorousFlowPermeabilityBase::_dpermeability_qp_dgradvar
MaterialProperty< std::vector< std::vector< RealTensorValue > > > & _dpermeability_qp_dgradvar
d(quadpoint permeability)/d(grad(PorousFlow variable))
Definition: PorousFlowPermeabilityBase.h:35
PorousFlowPermeabilityExponential::_dporosity_qp_dvar
const MaterialProperty< std::vector< Real > > & _dporosity_qp_dvar
d(quadpoint porosity)/d(PorousFlow variable)
Definition: PorousFlowPermeabilityExponential.h:53
PorousFlowPermeabilityExponential::_BB
Real _BB
Empirical constant BB in k = k_ijk * BB * exp(AA * phi)
Definition: PorousFlowPermeabilityExponential.h:65
PorousFlowPermeabilityExponential::_poroperm_function
enum PorousFlowPermeabilityExponential::PoropermFunction _poroperm_function
registerMooseObject
registerMooseObject("PorousFlowApp", PorousFlowPermeabilityExponential)
PorousFlowPermeabilityExponential::_porosity_qp
const MaterialProperty< Real > & _porosity_qp
Quadpoint porosity.
Definition: PorousFlowPermeabilityExponential.h:50
PorousFlowPermeabilityExponential::_dporosity_qp_dgradvar
const MaterialProperty< std::vector< RealGradient > > & _dporosity_qp_dgradvar
d(quadpoint porosity)/d(grad(PorousFlow variable))
Definition: PorousFlowPermeabilityExponential.h:56