https://mooseframework.inl.gov
PorousFlowFullySaturatedMassTimeDerivative.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 
12 #include "MooseVariable.h"
13 
15 
18 {
20  MooseEnum coupling_type("Hydro ThermoHydro HydroMechanical ThermoHydroMechanical", "Hydro");
21  params.addParam<MooseEnum>("coupling_type",
22  coupling_type,
23  "The type of simulation. For simulations involving Mechanical "
24  "deformations, you will need to supply the correct Biot coefficient. "
25  "For simulations involving Thermal flows, you will need an associated "
26  "ConstantThermalExpansionCoefficient Material");
27  params.addRangeCheckedParam<Real>(
28  "biot_coefficient", 1.0, "biot_coefficient>=0 & biot_coefficient<=1", "Biot coefficient");
29  params.addParam<bool>("multiply_by_density",
30  true,
31  "If true, then this Kernel is the time derivative of the fluid "
32  "mass. If false, then this Kernel is the derivative of the "
33  "fluid volume (which is common in poro-mechanics)");
34  params.addRequiredParam<UserObjectName>(
35  "PorousFlowDictator", "The UserObject that holds the list of PorousFlow variable names.");
36  params.addClassDescription("Fully-saturated version of the single-component, single-phase fluid "
37  "mass derivative wrt time");
38  return params;
39 }
40 
42  const InputParameters & parameters)
43  : TimeKernel(parameters),
44  _dictator(getUserObject<PorousFlowDictator>("PorousFlowDictator")),
45  _var_is_porflow_var(_dictator.isPorousFlowVariable(_var.number())),
46  _multiply_by_density(getParam<bool>("multiply_by_density")),
47  _coupling_type(getParam<MooseEnum>("coupling_type").getEnum<CouplingTypeEnum>()),
48  _includes_thermal(_coupling_type == CouplingTypeEnum::ThermoHydro ||
49  _coupling_type == CouplingTypeEnum::ThermoHydroMechanical),
50  _includes_mechanical(_coupling_type == CouplingTypeEnum::HydroMechanical ||
51  _coupling_type == CouplingTypeEnum::ThermoHydroMechanical),
52  _biot_coefficient(getParam<Real>("biot_coefficient")),
53  _biot_modulus(getMaterialProperty<Real>("PorousFlow_constant_biot_modulus_qp")),
54  _thermal_coeff(_includes_thermal ? &getMaterialProperty<Real>(
55  "PorousFlow_constant_thermal_expansion_coefficient_qp")
56  : nullptr),
57  _fluid_density(_multiply_by_density ? &getMaterialProperty<std::vector<Real>>(
58  "PorousFlow_fluid_phase_density_qp")
59  : nullptr),
60  _dfluid_density_dvar(_multiply_by_density
61  ? &getMaterialProperty<std::vector<std::vector<Real>>>(
62  "dPorousFlow_fluid_phase_density_qp_dvar")
63  : nullptr),
64  _pp(getMaterialProperty<std::vector<Real>>("PorousFlow_porepressure_qp")),
65  _pp_old(getMaterialPropertyOld<std::vector<Real>>("PorousFlow_porepressure_qp")),
66  _dpp_dvar(
67  getMaterialProperty<std::vector<std::vector<Real>>>("dPorousFlow_porepressure_qp_dvar")),
68  _temperature(_includes_thermal ? &getMaterialProperty<Real>("PorousFlow_temperature_qp")
69  : nullptr),
70  _temperature_old(_includes_thermal ? &getMaterialPropertyOld<Real>("PorousFlow_temperature_qp")
71  : nullptr),
72  _dtemperature_dvar(_includes_thermal ? &getMaterialProperty<std::vector<Real>>(
73  "dPorousFlow_temperature_qp_dvar")
74  : nullptr),
75  _strain_rate(_includes_mechanical
76  ? &getMaterialProperty<Real>("PorousFlow_volumetric_strain_rate_qp")
77  : nullptr),
78  _dstrain_rate_dvar(_includes_mechanical ? &getMaterialProperty<std::vector<RealGradient>>(
79  "dPorousFlow_volumetric_strain_rate_qp_dvar")
80  : nullptr)
81 {
82  if (_dictator.numComponents() != 1 || _dictator.numPhases() != 1)
83  mooseError("PorousFlowFullySaturatedMassTimeDerivative is only applicable to single-phase, "
84  "single-component fluid-flow problems. The Dictator proclaims that you have more "
85  "than one phase or more than one fluid component. The Dictator does not take such "
86  "mistakes lightly");
87 }
88 
89 Real
91 {
92  const unsigned phase = 0;
93  Real volume = (_pp[_qp][phase] - _pp_old[_qp][phase]) / _dt / _biot_modulus[_qp];
95  volume -= (*_thermal_coeff)[_qp] * ((*_temperature)[_qp] - (*_temperature_old)[_qp]) / _dt;
97  volume += _biot_coefficient * (*_strain_rate)[_qp];
99  return _test[_i][_qp] * (*_fluid_density)[_qp][phase] * volume;
100  return _test[_i][_qp] * volume;
101 }
102 
103 Real
105 {
106  // If the variable is not a PorousFlow variable (very unusual), the diag Jacobian terms are 0
107  if (!_var_is_porflow_var)
108  return 0.0;
110 }
111 
112 Real
114 {
115  // If the variable is not a PorousFlow variable, the OffDiag Jacobian terms are 0
117  return 0.0;
119 }
120 
121 Real
123 {
124  const unsigned phase = 0;
125  Real volume = (_pp[_qp][phase] - _pp_old[_qp][phase]) / _dt / _biot_modulus[_qp];
126  Real dvolume = _dpp_dvar[_qp][phase][pvar] / _dt / _biot_modulus[_qp] * _phi[_j][_qp];
127  if (_includes_thermal)
128  {
129  volume -= (*_thermal_coeff)[_qp] * ((*_temperature)[_qp] - (*_temperature_old)[_qp]) / _dt;
130  dvolume -= (*_thermal_coeff)[_qp] * (*_dtemperature_dvar)[_qp][pvar] / _dt * _phi[_j][_qp];
131  }
133  {
134  volume += _biot_coefficient * (*_strain_rate)[_qp];
135  dvolume += _biot_coefficient * (*_dstrain_rate_dvar)[_qp][pvar] * _grad_phi[_j][_qp];
136  }
138  return _test[_i][_qp] * ((*_fluid_density)[_qp][phase] * dvolume +
139  (*_dfluid_density_dvar)[_qp][phase][pvar] * _phi[_j][_qp] * volume);
140  return _test[_i][_qp] * dvolume;
141 }
const bool _var_is_porflow_var
Whether the Variable for this Kernel is a PorousFlow variable.
const MaterialProperty< std::vector< Real > > & _pp
Quadpoint pore pressure in each phase.
bool notPorousFlowVariable(unsigned int moose_var_num) const
Returns true if moose_var_num is not a porous flow variabe.
MooseVariable & _var
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
unsigned int number() const
const MaterialProperty< Real > & _biot_modulus
Constant Biot modulus.
const bool _includes_thermal
Whether thermal contributions should be added to the residual.
const VariablePhiGradient & _grad_phi
unsigned int numComponents() const
The number of fluid components.
Real & _dt
const bool _includes_mechanical
Whether mechanical contributions should be added to the residual.
void addRequiredParam(const std::string &name, const std::string &doc_string)
Time derivative of fluid mass suitable for fully-saturated, single-phase, single-component simulation...
registerMooseObject("PorousFlowApp", PorousFlowFullySaturatedMassTimeDerivative)
const VariableTestValue & _test
Real computeQpJac(unsigned int pvar)
Jacobian contribution for the PorousFlow variable pvar.
unsigned int _i
unsigned int numPhases() const
The number of fluid phases.
Real volume(const MeshBase &mesh, unsigned int dim=libMesh::invalid_uint)
const MaterialProperty< std::vector< std::vector< Real > > > & _dpp_dvar
Derivative of porepressure in each phase wrt the PorousFlow variables.
unsigned int _j
const PorousFlowDictator & _dictator
PorousFlowDictator UserObject.
const Real _biot_coefficient
Biot coefficient (used in simulations involving Mechanical deformations)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
This holds maps between the nonlinear variables used in a PorousFlow simulation and the variable numb...
const bool _multiply_by_density
If true then the Kernel is the time derivative of the fluid mass, otherwise it is the derivative of t...
CouplingTypeEnum
Determines whether mechanical and/or thermal contributions should be added to the residual...
void mooseError(Args &&... args) const
void addClassDescription(const std::string &doc_string)
unsigned int porousFlowVariableNum(unsigned int moose_var_num) const
The PorousFlow variable number.
void addRangeCheckedParam(const std::string &name, const T &value, const std::string &parsed_function, const std::string &doc_string)
PorousFlowFullySaturatedMassTimeDerivative(const InputParameters &parameters)
const MaterialProperty< std::vector< Real > > & _pp_old
Old value of quadpoint pore pressure in each phase.
const VariablePhiValue & _phi
static InputParameters validParams()
unsigned int _qp