www.mooseframework.org
PorousFlowPorosityHMBiotModulus.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 #include "libmesh/utility.h"
12 
14 
17 {
19  params.set<bool>("mechanical") = true;
20  params.set<bool>("fluid") = true;
21  params.addRequiredRangeCheckedParam<Real>("constant_biot_modulus",
22  "constant_biot_modulus>0",
23  "Biot modulus, which is constant for this Material");
25  "constant_fluid_bulk_modulus",
26  "constant_fluid_bulk_modulus>0",
27  "Fluid bulk modulus, which is constant for this Material");
28  params.addClassDescription(
29  "This Material calculates the porosity for hydro-mechanical simulations, assuming that the "
30  "Biot modulus and the fluid bulk modulus are both constant. This is useful for comparing "
31  "with solutions from poroelasticity theory, but is less accurate than PorousFlowPorosity");
32  return params;
33 }
34 
36  : PorousFlowPorosity(parameters),
37  _porosity_old(_nodal_material ? getMaterialPropertyOld<Real>("PorousFlow_porosity_nodal")
38  : getMaterialPropertyOld<Real>("PorousFlow_porosity_qp")),
39  _biot_modulus(getParam<Real>("constant_biot_modulus")),
40  _fluid_bulk_modulus(getParam<Real>("constant_fluid_bulk_modulus")),
41  _pf_old(_nodal_material
42  ? getMaterialPropertyOld<Real>("PorousFlow_effective_fluid_pressure_nodal")
43  : getMaterialPropertyOld<Real>("PorousFlow_effective_fluid_pressure_qp")),
44  _vol_strain_qp_old(getMaterialPropertyOld<Real>("PorousFlow_total_volumetric_strain_qp")),
45  _vol_strain_rate_qp(getMaterialProperty<Real>("PorousFlow_volumetric_strain_rate_qp")),
46  _dvol_strain_rate_qp_dvar(getMaterialProperty<std::vector<RealGradient>>(
47  "dPorousFlow_volumetric_strain_rate_qp_dvar"))
48 {
49 }
50 
51 void
53 {
54  // Note that in the following _strain[_qp] is evaluated at q quadpoint
55  // So _porosity_nodal[_qp], which should be the nodal value of porosity
56  // actually uses the strain at a quadpoint. This
57  // is OK for LINEAR elements, as strain is constant over the element anyway.
58 
59  const unsigned qp_to_use =
60  (_nodal_material && (_bnd || _strain_at_nearest_qp) ? nearestQP(_qp) : _qp);
61 
62  const Real denom = (1.0 + _vol_strain_rate_qp[qp_to_use] * _dt + _vol_strain_qp_old[qp_to_use]);
63  const Real s_p = _porosity_old[_qp] * (1 + _vol_strain_qp_old[qp_to_use]);
64  _porosity[_qp] = (s_p * std::exp(-((*_pf)[_qp] - _pf_old[_qp]) / _fluid_bulk_modulus) +
65  ((*_pf)[_qp] - _pf_old[_qp]) / _biot_modulus +
66  _biot * ((*_vol_strain_qp)[qp_to_use] - _vol_strain_qp_old[qp_to_use])) /
67  denom;
68 
69  (*_dporosity_dvar)[_qp].resize(_num_var);
70  for (unsigned int v = 0; v < _num_var; ++v)
71  (*_dporosity_dvar)[_qp][v] =
72  (*_dpf_dvar)[_qp][v] *
73  (-s_p * std::exp(-((*_pf)[_qp] - _pf_old[_qp]) / _fluid_bulk_modulus) /
75  1.0 / _biot_modulus) /
76  denom;
77 
78  (*_dporosity_dgradvar)[_qp].resize(_num_var);
79  for (unsigned int v = 0; v < _num_var; ++v)
80  (*_dporosity_dgradvar)[_qp][v] =
81  _biot * (*_dvol_strain_qp_dvar)[qp_to_use][v] / denom -
82  _porosity[_qp] / denom * _dvol_strain_rate_qp_dvar[qp_to_use][v] * _dt;
83 }
const MaterialProperty< Real > & _porosity_old
Old value of porosity.
void addRequiredRangeCheckedParam(const std::string &name, const std::string &parsed_function, const std::string &doc_string)
PorousFlowPorosityHMBiotModulus(const InputParameters &parameters)
const Real _biot
Biot coefficient.
registerMooseObject("PorousFlowApp", PorousFlowPorosityHMBiotModulus)
const MaterialProperty< Real > & _pf_old
Old value of effective fluid pressure.
MaterialProperty< std::vector< RealGradient > > *const _dporosity_dgradvar
d(porosity)/d(grad PorousFlow variable)
const bool _strain_at_nearest_qp
When calculating nodal porosity, use the strain at the nearest quadpoint to the node.
T & set(const std::string &name, bool quiet_mode=false)
const Real _fluid_bulk_modulus
Constant fluid bulk modulus.
const MaterialProperty< Real > *const _pf
Effective porepressure at the quadpoints or nodes.
const MaterialProperty< Real > & _vol_strain_qp_old
Old value of total volumetric strain.
const MaterialProperty< std::vector< RealGradient > > & _dvol_strain_rate_qp_dvar
d(volumetric strain rate)/d(PorousFlow variable)
This Matrial evolves porosity so that the PorousFlow equations match the standard equations of poroel...
const unsigned int _num_var
Number of PorousFlow variables.
const MaterialProperty< Real > & _vol_strain_rate_qp
Volumetric strain rate.
MaterialProperty< std::vector< Real > > *const _dporosity_dvar
d(porosity)/d(PorousFlow variable)
GenericMaterialProperty< Real, is_ad > & _porosity
Computed porosity at the nodes or quadpoints.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static const std::string v
Definition: NS.h:82
Material designed to provide the porosity in PorousFlow simulations chemistry + biot + (phi0 - refere...
void addClassDescription(const std::string &doc_string)
const Real _biot_modulus
Constant biot modulus.
const MaterialProperty< Real > *const _vol_strain_qp
Strain (first const means we never want to dereference and change the value, second means we&#39;ll alway...
static InputParameters validParams()