Finite strain¶
Constitutive theory¶
For finite strain poromechanics, by writing Clausius-Duhem inequality (dissipation inequality) we can derive constitutive equations for solid and fluid phases as [ICR24] (see also (61) and discussion thereof)
where \(\bm{S}^\rs_{E(\rs)}\) is effective second Piola-Kirchoff stress tensor, \(\psi^\rs\) is strain energy per unit mass for the solid skeleton which is defined in previous sections for neo-Hookean model.
Helmholtz free energy per unit mass for fluid phase \(\psi^\rf\) is given by
which using second equation of (299), we arrive at constitutive equation for the real mass density of the pore fluid as
where \(\rho^{\fR}_0, p_{\rf,0}\) are the initial real mass density and pore fluid pressure at time \(t = 0\).
The total stress for the mixture for neo-Hookean model (83) (dropping now \((\cdot)_\rs\) subscripts where appropriate) is
and using (25) we can write symmetric Kirchhoff stress tensor as
Weak enforcement of solid incompressibility via strain-energy potential¶
For larger deformations, it is possible in the numerical sense to compute \(J \leq \phi^{\rm{s}}_0\), which violates the solid incompressibility assumption (refer to (46)). [EE99] attempted to rectify this by modifying the neo-Hookean potential
to
Then, the initial solid skeleton effective stress is
such that the solid skeleton effective stress in the current configuration is
Deriving \(\diff\bm\tau_E^\rs\) for the [EE99] model
Since this model is an extension of the standard neo-Hookean model, we will use (98) for the updated volumetric potential \(V(J)\) such that
Thus, from (98) we have
From (113) it then follows that
such that we may substitute this into
Deformation-dependent porosity functions¶
Recall generalized Darcy’s law from (47):
where
In addition to Kozeny-Carman (48), another suitable function was developed for soft tissues by [LMR81]:
However, both the Kozeny-Carman and [LMR81] functional forms do not strictly satisfy the solid incompressibility constraint, which mandates a bound on the Jacobian of deformation: \(\phi^\rs_0 < J < \infty\). This in turn mandates the behavior of \(\mathcal{F}(\phi^\rf)\):
in other words, for vanishing porosity we should obtain a solid-like material and for full porosity (fully expanded solid) the solid-fluid interactions should be negligible beyond the viscous drag forces induced by \(\varkappa_\circ/\mu_\rf\).
As such, [Eip98] proposed a deformation dependent permeability that respects the restriction of materially incompressible solid constituent:
for \(\kappa > 0\), however, such a function is ill-suited for rapidly expanding materials (see A comparison, adapted from Markert2005, of different deformation-dependent hydraulic conductivities for \kappa = 3.0 (a) showing the instability of the Kozeny-Carman relation for high compression of the drained mixutre (solid skeleton) and (b) a zoomed-in version of (a) showing the inadequacy of the Eipper1998 model for high expansion of the drained mixture (solid skeleton).). In light of this, [Mar05] proposed
such that

Fig. 6 A comparison, adapted from [Mar05], of different deformation-dependent hydraulic conductivities for \(\kappa = 3.0\) (a) showing the instability of the Kozeny-Carman relation for high compression of the drained mixutre (solid skeleton) and (b) a zoomed-in version of (a) showing the inadequacy of the [Eip98] model for high expansion of the drained mixture (solid skeleton).¶
Isentropic ideal gas pore fluid¶
So far, we have assumed an exponential model for the barotropic pore fluid model where \(\bulk_\rf\) denoted an isentropic bulk modulus. When the pore fluid is an ideal gas, then at larger pore fluid pressures such a model is ill-suited for describing the pore fluid (gas) deformation when compared to the Hugoniot in the absence of solid-fluid coupling (see figure below where compression is defined as \(1 - J_\rf\)). A more appropriate constitutive model is that of an isentropic ideal gas:
where the ratio of specific heats \(\Gamma := c_p/c_v\) and \(c_p\) and \(c_v\) are constant specific heats of the pore fluid at constant pressure and constant volume, respectively. For example, for air \(\Gamma = 1.4\).
Click to show code
import numpy as np
import pandas as pd
import altair as alt
# Constants
p0 = 101.325e3
G = 1.4
Keta = G * p0
Ktheta = p0
# Generate data
J = np.linspace(1, 0.3, 50)
df = pd.DataFrame({
'J': J,
'1_minus_J': 1 - J,
'Hugoniot ideal gas': p0 * ((G + 1) - (G - 1) * J) / ((G + 1) * J - (G - 1)),
'isentropic ideal gas': p0 * (J ** (-G)),
'isothermal ideal gas': p0 / J,
'isentropic exp.': p0 - Keta * np.log(J),
'isothermal exp.': p0 - Ktheta * np.log(J)
})
# Convert to kPa and offset
for col in df.columns[2:]:
df[col] = df[col] * 1e-3 - 101.325
# Melt to long format for Altair
df_long = df.melt(id_vars=['1_minus_J'], value_vars=df.columns[2:],
var_name='curve', value_name='p')
# Filter out out-of-bounds points (Altair doesn't always clip)
df_long = df_long[(df_long['p'] >= 0) & (df_long['p'] <= 200)]
# Add dash style
df_long['dash'] = df_long['curve'].apply(
lambda x: 'dashed' if x == 'isentropic ideal gas' else 'solid'
)
# Plot
alt.Chart(df_long).mark_line(clip=True).encode(
x=alt.X('p:Q', title='Overpressure [kPa]', scale=alt.Scale(domain=[0, 200])),
y=alt.Y('1_minus_J:Q', title='Pore fluid compression', scale=alt.Scale(domain=[0.0, 0.65])),
color=alt.Color('curve:N', title='Model'),
strokeDash=alt.StrokeDash('dash:N', legend=None)
)
This of course alters the balance of mass of the pore fluid since the material time derivative of the pore fluid real mass density is now
where the change from the exponential barotropic model is \(\Gamma p_\rf\) in place of \(\bulk_\rf\). Thus the balance of mass of the mixture may be written in the current configuration as
Strong and weak formulations¶
To derive the strong form for finite strain poromechanics, we use the balance of momentum of the mixture (54)\(_1\) (under the assumption that \(\ddot{\bm{u}} = \bm{0}\)) and balance of mass of the mixture (44) as
where we have dropped subscript \((\cdot)_\rs\) by convention, \(\bm N\) and \(\bm n\) are the unit normal vectors on the face in initial and current configurations, \(_X\) and \(_x\) in \(\nabla_X, \nabla_x\) indicate that the gradient are calculated with respect to the initial/current configurations. Multiplying the strong form (314) by test functions \((\bm{v}, q)\) and integrate by parts, we can obtain the weak form for finite strain hyperporoelasticity as: find \((\bm{u}, p_\rf) \in \mathcal{V} \times \mathcal{Q} \subset H^1 \left( \Omega_0 \right) \times H^1 \left( \Omega_0 \right)\) such that
where we have used the push forward (103) to write the first equation with respect to \(_x\) and \(\bm \tau\), and replaced \(\dot{\bm w} = -\varkappa \nabla_x p_\rf\) by assuming \(\ddot{\bm u} = \bm{0}\) and \(\bm f^\rf = \bm{0}\) in (49), the latter of which implies that \(\bm{g} = \bm{0}\). The definition for \(\bm{\tau}\) for the standard neo-Hookean model for the drained mixture (solid skeleton) response is given in (303).
For the isentropic ideal gas model (Isentropic ideal gas pore fluid), we have for the strong form
and for the weak form
Linearization¶
As explained in Linearization: initial configuration, we need the Jacobian form of the (315) which is: find \((\diff \bm{u}, \diff p_\rf) \in \mathcal{V} \times \mathcal{Q}\) such that
where
with given \(\diff \bm{\tau}_E^\rs -\bm{\tau}_E^\rs(\nabla_x \diff\bm{u})^T\) in (111) for example with the standard neo-Hookean model and
where \(\mathcal{F}(\phi^\rf)\) is defined, for example, in (48).
For the isentropic ideal gas model (Isentropic ideal gas pore fluid), the mixture mass balance terms are different from the exponential model such that the following term is used in place of \(L\) above:
Generic weak formulation¶
For overview on generic weak form implementation for the poromechanics model, see Generic weak formulation. Here we define
Note that, technically speaking, \(\bm f_0\) needs to be linearized under the assmption of \(\bm{g} \neq \bm{0}\) (and by extension \(\bm{f}^\rf \neq \bm{0}\)) in the case of evolving volume fractions and/or compressible pore fluid. However, at this time, we continue to assume the body force acting on the mixture to be zero.
For dynamic example acceleration is not zero and we use the PETSc Timestepper (TS) object to manage timestepping. Specifically, Ratel uses the Generalized-Alpha method for second order systems (TSALPHA2
) to solve the second order system of equations. More information on the PETSc TSALPHA2
time stepper can be found in the PETSc documentation TS.
We add
to the first and second equations of (315), such that
and the jacobian is
such that,
where using (301) we have
Note that unlike linear case where the porosity and density are constant, in finite strain we have assumed that the real mass density of the pore fluid is a function of pore fluid pressure (real mass density of solid is assumed constant, see (45)). Therefore, we use the mixture density in the current configuration \(\rho^b\) in residual and jacobian to account for its variation with respect to pore fluid pressure.
For the isentropic ideal gas model (Isentropic ideal gas pore fluid), the mixture mass balance terms are different from the exponential model such that the following
is added to the second equation of (317), such that
and the jacobian is
such that
where using (312) we have
Pore fluid pressure stabilization¶
For stabilizing equal order elements, we follow the approach of [TZ06], which is based on the method of [BPitkaranta84]. The stabilization term acts like an opposing pore fluid pressure flux in the weak formulation of the balance of mass of the mixture (e.g., assuming exponential model for barotropic pore fluid, but extensible to any pore fluid constitutive model), such that
where the stabilization term is shown in red (and may also be enabled for dynamic cases). While [TZ06] have been able to relate the pressure stabilization parameter \(\alpha^\text{stab}\) (units m\(^3\)-s\(^2\)/kg) to material geometry and simulation time-step, such an approach would be difficult to derive for compressible pore fluid and large deformations. Therefore, we choose \(\alpha^\text{stab}\) on an ad-hoc basis. For incompressible pore fluid (i.e., \(\bulk_\rf \sim \) GPa), choosing larger values \(\mathcal{O}(10^{-6})\) tends to provide decent stability as compared to smaller values. For more compressible pore fluid (i.e., lower \(\bulk_\rf \sim\) kPa) choosing smaller values \(\mathcal{O}(10^{-10})\) tends to provide decent stability as compared to larger values.
For generic weak formulation, two additional terms are present for \(\bm{g}_1\) and \(\diff\bm{g}_1\), such that
Note that pressure stabilization can be added to unequal order elements as well. In [IRC23] it was shown that under conditions of 1-D uniaxial strain, pressure stabilization improved computational performance for Hermite cubic-Lagrange linear displacement-pressure elements.
Command-line interface¶
To enable the finite strain, neo-Hookean-based poromechanics model, use the model option -model poromechanics-neo-hookean
and set the material parameters listed in Finite strain poromechanics model options. Any parameter without a default option is required.
Option |
Description |
Default Value |
---|---|---|
|
Required to enable the finite strain poromechanics model. |
|
|
First Lame parameter for drained mixture (solid skeleton), \(\lambda_d >= 0\) |
|
|
Shear modulus for drained mixture (solid skeleton), \(\mu_d >= 0\) |
|
|
Bulk modulus for drained mixture (solid skeleton), \(\bulk_d >= 0\) |
|
|
Bulk modulus for solid, \(\bulk_\rs >= 0\) |
|
|
Bulk modulus for pore fluid, \(\bulk_\rf >= 0\) |
|
|
Real solid mass density, \(\rho^\sR_0 > 0\) |
|
|
Real pore fluid mass density, \(\rho^\fR_0 > 0\) |
|
|
Porosity, \(0 < \phi^\rf < 1\) |
|
|
Pore fluid viscosity, \(\mu_\rf >= 0\) |
|
|
Intrinsic permeability, \(\varkappa_{0} >= 0\) |
|
|
Pore fluid pressure stabilization, \(\alpha^\text{stab} > 0\) |
|
|
Hyperbolic porosity model exponent, \(\kappa >= 0\) |
|
|
Ideal gas ratio of specific heats, \(\Gamma > 0\) |
|
|
Initial pore fluid pressure (required \(> 0\) when \(\Gamma > 0\)) |
|
Note that when -pf_0
is set to a non-zero value, we also require the user supply a non-zero initial condition and the pressure boundary condition on the traction load face(s) (if applicable), e.g.,
ic:
non_zero: 0., pf_0
bc:
pressure: [facenumber]
pressure_[facenumber]: pf_0
pressure_[facenumber]_times: 0.
where pf_0
will be replaced by a [real]
value corresponding to the -pf_0
option.
An example using the finite strain poromechanics model can be run via
$ ./bin/ratel-dynamic -options_file examples/ymls/ex03-dynamic-poromechanics-neo-hookean-current-pstab-pcfieldsplit-lu.yml