/usr/include/ASL/num/aslFDPoroElasticity.h is in libasl-dev 0.1.7-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | /*
* Advanced Simulation Library <http://asl.org.il>
*
* Copyright 2015 Avtech Scientific <http://avtechscientific.com>
*
*
* This file is part of Advanced Simulation Library (ASL).
*
* ASL is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, version 3 of the License.
*
* ASL is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with ASL. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef ASLFDPOROELASTICITY_H
#define ASLFDPOROELASTICITY_H
#include "aslNumMethod.h"
#include "acl/aclMath/aclVectorOfElementsDef.h"
#include "aslFDElasticity.h"
#include "utilities/aslUValue.h"
namespace asl
{
/// Numerical method which computes homogenious isotropic poro-elasticity equation
/**
\ingroup Elasticity
\ingroup NumMethods
The classic poroelastic equations were originally developed by Biot (1941)
to represent biphasic soil consolidation. The equations can be written
in the following form:
\f[ (K+\mu/3)\nabla_j \nabla_k u_k+ \mu \Delta u_j - a \nabla_j p = - (\rho_s-\rho_f)g_j \f]
\f[ a\nabla_i\dot u_i+ \frac{1}{S} \dot p = \nabla_i k \nabla_i p, \f]
where
- \f$\vec u\f$ is the displacement vector,
- \f$ p \f$ the interstitial pressure,
- \f$ a \f$ the ratio of fluid volume extracted to volume change of the tissue under compression,
- \f$\rho_s\f$ the solid fraction density,
- \f$\rho_f\f$ the fluid density,
- \f$\vec g \f$ the gravitational vector,
- \f$ 1/S \f$ the amount of fluid which can be forced into the tissue under constant volume,
- \f$ k \f$ the hydraulic conductivity,
- \f$K\f$ is the bulk modulus,
- \f$\mu\f$ is the shear modulus,.
In order to solve the first equation we will introduce a fictisionus time \f$ \tau \f$:
\f[ \partial_\tau u = (K+\mu/3)\nabla_j \nabla_k u_k+ \mu \Delta u_j - a \nabla_j p + (\rho_s-\rho_f)g_j \f]
\f[ a\partial_t\nabla_i u_i+ \frac{1}{S} \partial_t p = \nabla_i k \nabla_i p, \f]
This implementation is aided to improove stability for incompressible materials.
Let us reformulate the first eqation by the following way:
\f[ \partial_\tau u = \mu \Delta u_j - \nabla_j \tilde p - a\nabla_j p + (\rho_s-\rho_f)g_j, \f]
\f[ \tilde p = -(K+\mu/3) \nabla_k u_k. \f]
then the second eqation will turn to:
\f[ \partial_t p = \frac{aS}{K+\mu/3}\partial_t\tilde p + S\nabla_i k \nabla_i p, \f]
The equation for \f$\tilde p\f$ leads to an instability for low values of the Poisson ration (for nearly incompressible materials).
Therefore the last equation we would like to replace by a relaxation one:
\f[ \partial_\tau \tilde p = - w\left( (K+\mu/3)\nabla_k u_k + \tilde p\right), \f]
where \f$ w \f$ is a relaxation parameter.
Let's return to single time variable. Two time steps are related as follows
\f$ \delta_t = N \delta_\tau \f$. Than \f$ \partial_\tau = N\partial_t \f$.
The resulting set of equations is:
\f[ \partial_\tau u = \mu \Delta u_j - \nabla_j \tilde p - a\nabla_j p + (\rho_s-\rho_f)g_j, \f]
\f[ \partial_\tau \tilde p = - w\left( (K+\mu/3)\nabla_k u_k + \tilde p\right), \f]
\f[ \partial_\tau p = \frac{aS}{K+\mu/3}\partial_\tau\tilde p + \frac{Sk}{N}\Delta p, \f]
*/
class FDPoroElasticity: public ElasticityCommonA
{
private:
Data pressureData;
Data pressureInternalData;
Data pressureLiquidData;
Data pressureLiquidInternalData;
Param hydraulicCondactivity;
Param compresibility;
Param nSubsteps;
public:
FDPoroElasticity();
/**
\param d is a displacement field
\param pl is a pressure of liquid field
\param bM is the bulk modulus
\param sM is the shear modulus
\param k is hydraulic conductivity
\param vT is a vector template
*/
FDPoroElasticity(Data d, Data pl, Param bM,
Param sM, Param k,
const VectorTemplate* vT);
~FDPoroElasticity();
virtual void init();
virtual void execute();
inline Data getPressureData() const;
inline Data getLiquidPressureData() const;
/// defaul value 10
void setNSubsteps(unsigned int n);
};
typedef std::shared_ptr<FDPoroElasticity> SPFDPoroElasticity;
/**
\param d is a displacement field
\param pl is a pressure of liquid field
\param bM is the bulk modulus
\param sM is the shear modulus
\param k is hydraulic conductivity
\param vT is a vector template
*/
SPFDPoroElasticity generateFDPoroElasticity(SPDataWithGhostNodesACLData d,
SPDataWithGhostNodesACLData pl,
double bM,
double sM,
double k,
const VectorTemplate* vT);
/**
\param d is a displacement field
\param pl is a pressure of liquid field
\param bM is the bulk modulus
\param sM is the shear modulus
\param k is hydraulic conductivity
\param vT is a vector template
*/
template <typename T>
SPFDPoroElasticity generateFDPoroElasticity(SPDataWithGhostNodesACLData d,
SPDataWithGhostNodesACLData pl,
UValue<T> bM,
UValue<T> sM,
UValue<T> k,
const VectorTemplate* vT);
//-------------------------IMPLEMENTATION------------------------
inline ElasticityCommonA::Data FDPoroElasticity::getPressureData() const
{
return pressureData;
}
inline ElasticityCommonA::Data FDPoroElasticity::getLiquidPressureData() const
{
return pressureLiquidData;
}
} // asl
#endif // ASLFDELASTICITY_H
|