https://mooseframework.inl.gov
Loading...
Searching...
No Matches
PorousFlow1PhaseMD_Gaussian.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
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
16{
18 params.addRequiredCoupledVar("mass_density",
19 "Variable that represents log(mass-density) of the single phase");
21 "al",
22 "al>0",
23 "For this class, the capillary function is assumed to be saturation = "
24 "exp(-(al*porepressure)^2) for porepressure<0.");
26 "density_P0", "density_P0>0", "The density of the fluid phase at zero porepressure");
28 "bulk_modulus", "bulk_modulus>0", "The constant bulk modulus of the fluid phase");
29 params.addClassDescription("This Material is used for the single-phase situation where "
30 "log(mass-density) is the primary variable. calculates the 1 "
31 "porepressure and the 1 saturation in a 1-phase situation, "
32 "and derivatives of these with respect to the PorousFlowVariables. A "
33 "gaussian capillary function is assumed");
34 return params;
35}
36
38 : PorousFlowVariableBase(parameters),
39
40 _al(getParam<Real>("al")),
41 _al2(std::pow(_al, 2)),
42 _logdens0(std::log(getParam<Real>("density_P0"))),
43 _bulk(getParam<Real>("bulk_modulus")),
44 _recip_bulk(1.0 / _al / _bulk),
45 _recip_bulk2(std::pow(_recip_bulk, 2)),
46
47 _md_var(_nodal_material ? coupledDofValues("mass_density") : coupledValue("mass_density")),
48 _gradmd_qp_var(coupledGradient("mass_density")),
49 _md_varnum(coupled("mass_density")),
50 _pvar(_dictator.isPorousFlowVariable(_md_varnum) ? _dictator.porousFlowVariableNum(_md_varnum)
51 : 0)
52{
53 if (_num_phases != 1)
54 mooseError("The Dictator proclaims that the number of phases is ",
55 _dictator.numPhases(),
56 " whereas PorousFlow1PhaseMD_Gaussian can only be used for 1-phase simulations. Be "
57 "aware that the Dictator has noted your mistake.");
58}
59
60void
66
67void
69{
70 // size stuff correctly and prepare the derivative matrices with zeroes
72
73 buildPS();
74
75 if (!_nodal_material)
76 {
77 if (_md_var[_qp] >= _logdens0)
78 {
79 (*_gradp_qp)[_qp][0] = _gradmd_qp_var[_qp] * _bulk;
80 (*_grads_qp)[_qp][0] = 0.0;
81 }
82 else
83 {
84 (*_gradp_qp)[_qp][0] =
85 _gradmd_qp_var[_qp] / (_recip_bulk - 2.0 * _al * _porepressure[_qp][0]) / _al;
86 (*_grads_qp)[_qp][0] =
87 -2.0 * _al2 * _porepressure[_qp][0] * _saturation[_qp][0] * (*_gradp_qp)[_qp][0];
88 }
89 }
90
91 if (_dictator.notPorousFlowVariable(_md_varnum))
92 return;
93
94 if (_md_var[_qp] >= _logdens0)
95 {
96 // fully saturated at the node or quadpoint
97 (*_dporepressure_dvar)[_qp][0][_pvar] = _bulk;
98 (*_dsaturation_dvar)[_qp][0][_pvar] = 0.0;
99 }
100 else
101 {
102 const Real pp = _porepressure[_qp][0];
103 (*_dporepressure_dvar)[_qp][0][_pvar] = 1.0 / (_recip_bulk - 2.0 * _al * pp) / _al;
104 const Real sat = _saturation[_qp][0];
105 (*_dsaturation_dvar)[_qp][0][_pvar] =
106 -2.0 * _al2 * pp * sat * (*_dporepressure_dvar)[_qp][0][_pvar];
107 }
108
109 if (!_nodal_material)
110 {
111 if (_md_var[_qp] >= _logdens0)
112 {
113 // fully saturated at the quadpoint
114 (*_dgradp_qp_dgradv)[_qp][0][_pvar] = _bulk;
115 (*_dgradp_qp_dv)[_qp][0][_pvar] = 0.0;
116 (*_dgrads_qp_dgradv)[_qp][0][_pvar] = 0.0;
117 (*_dgrads_qp_dv)[_qp][0][_pvar] = 0.0;
118 }
119 else
120 {
121 const Real pp = _porepressure[_qp][0];
122 (*_dgradp_qp_dgradv)[_qp][0][_pvar] = 1.0 / (_recip_bulk - 2.0 * _al * pp) / _al;
123 (*_dgradp_qp_dv)[_qp][0][_pvar] = _gradmd_qp_var[_qp] * 2.0 * _al *
124 (*_dporepressure_dvar)[_qp][0][_pvar] /
125 std::pow(_recip_bulk - 2.0 * _al * pp, 2.0) / _al;
126 const Real sat = _saturation[_qp][0];
127 (*_dgrads_qp_dgradv)[_qp][0][_pvar] =
128 -2.0 * _al2 * pp * sat * (*_dgradp_qp_dgradv)[_qp][0][_pvar];
129 (*_dgrads_qp_dv)[_qp][0][_pvar] =
130 -2.0 * _al2 * (*_dporepressure_dvar)[_qp][0][_pvar] * sat * (*_gradp_qp)[_qp][0];
131 (*_dgrads_qp_dv)[_qp][0][_pvar] +=
132 -2.0 * _al2 * pp * (*_dsaturation_dvar)[_qp][0][_pvar] * (*_gradp_qp)[_qp][0];
133 (*_dgrads_qp_dv)[_qp][0][_pvar] += -2.0 * _al2 * pp * sat * (*_dgradp_qp_dv)[_qp][0][_pvar];
134 }
135 }
136}
137
138void
140{
141 if (_md_var[_qp] >= _logdens0)
142 {
143 // full saturation
144 _porepressure[_qp][0] = (_md_var[_qp] - _logdens0) * _bulk;
145 _saturation[_qp][0] = 1.0;
146 }
147 else
148 {
149 // v = logdens0 + p/bulk - (al p)^2
150 // 0 = (v-logdens0) - p/bulk + (al p)^2
151 // 2 al p = (1/al/bulk) +/- sqrt((1/al/bulk)^2 - 4(v-logdens0)) (the "minus" sign is chosen)
152 // s = exp(-(al*p)^2)
153 _porepressure[_qp][0] =
154 (_recip_bulk - std::sqrt(_recip_bulk2 + 4.0 * (_logdens0 - _md_var[_qp]))) / (2.0 * _al);
155 _saturation[_qp][0] = std::exp(-std::pow(_al * _porepressure[_qp][0], 2.0));
156 }
157}
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
void mooseError(Args &&... args)
registerMooseObject("PorousFlowApp", PorousFlow1PhaseMD_Gaussian)
void addRequiredRangeCheckedParam(const std::string &name, const std::string &parsed_function, const std::string &doc_string)
void addRequiredCoupledVar(const std::string &name, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
Material designed to calculate fluid-phase porepressure and saturation for the single-phase situation...
virtual void initQpStatefulProperties() override
const Real _al
Gaussian parameter: saturation = exp(-(al*p)^2)
const VariableValue & _md_var
Nodal or quadpoint value of mass-density of the fluid phase.
const VariableGradient & _gradmd_qp_var
Gradient(_mass-density at quadpoints)
const unsigned int _md_varnum
Moose variable number of the mass-density.
PorousFlow1PhaseMD_Gaussian(const InputParameters &parameters)
virtual void computeQpProperties() override
const unsigned int _pvar
PorousFlow variable number of the mass-density.
const Real _bulk
Fluid density = _dens0*exp(P/_bulk)
const Real _logdens0
Fluid density = _dens0*exp(P/_bulk)
Base class for thermophysical variable materials, which assemble materials for primary variables such...
virtual void computeQpProperties() override
const unsigned int _num_phases
Number of phases.
GenericMaterialProperty< std::vector< Real >, is_ad > & _porepressure
Computed nodal or quadpoint values of porepressure of the phases.
static InputParameters validParams()
virtual void initQpStatefulProperties() override
GenericMaterialProperty< std::vector< Real >, is_ad > & _saturation
Computed nodal or qp saturation of the phases.