https://mooseframework.inl.gov
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 
60 void
62 {
64  buildPS();
65 }
66 
67 void
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 
138 void
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 }
const unsigned int _md_varnum
Moose variable number of the mass-density.
static InputParameters validParams()
virtual void computeQpProperties() override
virtual void computeQpProperties() override
void addRequiredRangeCheckedParam(const std::string &name, const std::string &parsed_function, const std::string &doc_string)
const Real _al
Gaussian parameter: saturation = exp(-(al*p)^2)
const Real _logdens0
Fluid density = _dens0*exp(P/_bulk)
const unsigned int _pvar
PorousFlow variable number of the mass-density.
Material designed to calculate fluid-phase porepressure and saturation for the single-phase situation...
void mooseError(Args &&... args)
GenericMaterialProperty< std::vector< Real >, is_ad > & _porepressure
Computed nodal or quadpoint values of porepressure of the phases.
static InputParameters validParams()
Base class for thermophysical variable materials, which assemble materials for primary variables such...
virtual void initQpStatefulProperties() override
PorousFlow1PhaseMD_Gaussian(const InputParameters &parameters)
virtual void initQpStatefulProperties() override
auto log(const T &)
const VariableValue & _md_var
Nodal or quadpoint value of mass-density of the fluid phase.
void addRequiredCoupledVar(const std::string &name, const std::string &doc_string)
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
const unsigned int _num_phases
Number of phases.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const Real _bulk
Fluid density = _dens0*exp(P/_bulk)
void addClassDescription(const std::string &doc_string)
GenericMaterialProperty< std::vector< Real >, is_ad > & _saturation
Computed nodal or qp saturation of the phases.
const VariableGradient & _gradmd_qp_var
Gradient(_mass-density at quadpoints)
registerMooseObject("PorousFlowApp", PorousFlow1PhaseMD_Gaussian)
MooseUnits pow(const MooseUnits &, int)