https://mooseframework.inl.gov
Loading...
Searching...
No Matches
PorousFlowPorosityHMBiotModulus.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#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");
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
51void
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 double v
registerMooseObject("PorousFlowApp", PorousFlowPorosityHMBiotModulus)
void addRequiredRangeCheckedParam(const std::string &name, const std::string &parsed_function, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
T & set(const std::string &name, bool quiet_mode=false)
virtual void resize(const std::size_t size) override final
const unsigned int _num_var
Number of PorousFlow variables.
MaterialProperty< std::vector< RealGradient > > *const _dporosity_dgradvar
d(porosity)/d(grad PorousFlow variable)
MaterialProperty< std::vector< Real > > *const _dporosity_dvar
d(porosity)/d(PorousFlow variable)
GenericMaterialProperty< Real, is_ad > & _porosity
Computed porosity at the nodes or quadpoints.
const bool _strain_at_nearest_qp
When calculating nodal porosity, use the strain at the nearest quadpoint to the node.
This Matrial evolves porosity so that the PorousFlow equations match the standard equations of poroel...
const Real _biot_modulus
Constant biot modulus.
PorousFlowPorosityHMBiotModulus(const InputParameters &parameters)
const MaterialProperty< Real > & _vol_strain_rate_qp
Volumetric strain rate.
const MaterialProperty< Real > & _porosity_old
Old value of porosity.
const MaterialProperty< std::vector< RealGradient > > & _dvol_strain_rate_qp_dvar
d(volumetric strain rate)/d(PorousFlow variable)
const Real _fluid_bulk_modulus
Constant fluid bulk modulus.
const MaterialProperty< Real > & _pf_old
Old value of effective fluid pressure.
const MaterialProperty< Real > & _vol_strain_qp_old
Old value of total volumetric strain.
Material designed to provide the porosity in PorousFlow simulations chemistry + biot + (phi0 - refere...
const MaterialProperty< Real > *const _vol_strain_qp
Strain (first const means we never want to dereference and change the value, second means we'll alway...
const MaterialProperty< Real > *const _pf
Effective porepressure at the quadpoints or nodes.
static InputParameters validParams()
const Real _biot
Biot coefficient.