19 params.
addParam<
bool>(
"strain_at_nearest_qp",
21 "When calculating nodal porosity that depends on strain, use the strain at "
22 "the nearest quadpoint. This adds a small extra computational burden, and "
23 "is not necessary for simulations involving only linear lagrange elements. "
24 " If you set this to true, you will also want to set the same parameter to "
25 "true for related Kernels and Materials");
26 params.
addParam<
bool>(
"ensure_positive",
28 "Modify the usual exponential relationships that "
29 "governs porosity so that porosity is always "
33 "Minimum allowed value of the porosity: if the computed porosity is less than this value, "
34 "porosity is set to this value instead. The default of zero means porosity is never "
35 "negative. The ensure_positive transform only acts for decay > 0, so chemistry-driven "
36 "(precipitation) porosity would otherwise become negative once pore space is filled by "
37 "mineral; a small positive value may be preferable in that case.");
38 params.
addClassDescription(
"Base class Material for porosity that is computed via an exponential "
39 "relationship with coupled variables (strain, porepressure, "
40 "temperature, chemistry)");
48 _strain_at_nearest_qp(this->template getParam<bool>(
"strain_at_nearest_qp")),
49 _ensure_positive(this->template getParam<bool>(
"ensure_positive"))
63 mooseAssert(
a >
b,
"PorousFlowPorosityExponentialBase a must be larger than b");
66 if (decay <= 0.0 || !_ensure_positive)
67 _porosity[_qp] =
a + (
b -
a) * exp(decay);
72 _porosity[_qp] =
a + (
b -
a) * exp(
c * (1.0 - expx));
75 if (_porosity[_qp] < _porosity_min)
76 _porosity[_qp] = _porosity_min;
93 if (decay <= 0.0 || !_ensure_positive)
95 exp_term = exp(decay);
96 _porosity[_qp] =
a + (
b -
a) * exp_term;
104 exp_term = exp(
c * (1.0 - expx));
105 _porosity[_qp] =
a + (
b -
a) * exp_term;
108 if constexpr (!is_ad)
113 if (decay <= 0.0 || !_ensure_positive)
114 deriv = _porosity[_qp] -
a;
117 const Real
c = log(
a / (
a -
b));
118 const Real expx = exp(-decay /
c);
119 deriv = (_porosity[_qp] -
a) * expx;
122 (*_dporosity_dvar)[_qp].resize(_num_var);
123 (*_dporosity_dgradvar)[_qp].resize(_num_var);
124 for (
unsigned int v = 0;
v < _num_var; ++
v)
126 (*_dporosity_dvar)[_qp][
v] = ddecayQp_dvar(
v) * deriv;
127 (*_dporosity_dgradvar)[_qp][
v] = ddecayQp_dgradvar(
v) * deriv;
129 const Real da = datNegInfinityQp(
v);
130 const Real
db = datZeroQp(
v);
131 (*_dporosity_dvar)[_qp][
v] += da * (1 - exp_term) +
db * exp_term;
133 if (!(decay <= 0.0 || !_ensure_positive))
135 const Real
c = log(
a / (
a -
b));
136 const Real expx = exp(-decay /
c);
137 const Real dc = (
a -
b) * (da *
b /
a -
db) / Utility::pow<2>(
a);
138 (*_dporosity_dvar)[_qp][
v] += (
b -
a) * exp_term * dc * (1 - expx - expx /
c);
const GeochemicalDatabaseReader db("database/moose_testdb.json", true, true, false)
Moose::GenericType< Real, is_ad > GenericReal
Base class Material designed to provide the porosity.
static InputParameters validParams()
Base class Material designed to provide the porosity.
virtual void initQpStatefulProperties() override
PorousFlowPorosityExponentialBaseTempl(const InputParameters ¶meters)
static InputParameters validParams()
virtual void computeQpProperties() override