1+ @doc raw """
2+ SaintVenantKirchhoff
3+
4+ Saint-Venant-Kirchhoff constitutive model that can be specified when using a
5+ [`CMaterial`](@ref) and [`BACMaterial`](@ref).
6+
7+ The strain energy density ``\P si`` is given by
8+ ```math
9+ \P si = \f rac{1}{2} \l ambda \, \m athrm{tr}(\b oldsymbol{E})^2 + \m u \, \m athrm{tr}(\b oldsymbol{E} \c dot \b oldsymbol{E}) \; ,
10+ ```
11+ with the first and second Lamé parameters ``\l ambda`` and ``\m u``, and the Green-Lagrange
12+ strain tensor
13+ ```math
14+ \b oldsymbol{E} = \f rac{1}{2} \l eft( \b oldsymbol{F}^{\t op} \b oldsymbol{F} - \b oldsymbol{I}
15+ \r ight) \; .
16+ ```
17+
18+ The first Piola-Kirchhoff stress ``\b oldsymbol{P}`` is given by
19+ ```math
20+ \b egin{aligned}
21+ \b oldsymbol{S} &= \l ambda \, \m athrm{tr}(\b oldsymbol{E}) \, \b oldsymbol{I}
22+ + 2 \m u \b oldsymbol{E} \; , \\
23+ \b oldsymbol{P} &= \b oldsymbol{F} \, \b oldsymbol{S} \; ,
24+ \e nd{aligned}
25+ ```
26+ with the deformation gradient ``\b oldsymbol{F}`` and the second Piola-Kirchhoff stress
27+ ``\b oldsymbol{S}``.
28+
29+ !!! note
30+ This model is equivalent to the [`LinearElastic`](@ref) model, both using the same
31+ strain energy density function.
32+ """
33+ struct SaintVenantKirchhoff <: AbstractConstitutiveModel end
34+
35+ function first_piola_kirchhoff (:: SaintVenantKirchhoff , storage:: AbstractStorage ,
36+ params:: AbstractPointParameters , F:: SMatrix{3,3,T,9} ) where T
37+ E = 0.5 .* (F' * F - I)
38+ S = params. λ * tr (E) * I + 2 * params. μ * E
39+ P = F * S
40+ return P
41+ end
42+
43+ function strain_energy_density (:: SaintVenantKirchhoff , storage:: AbstractStorage ,
44+ params:: AbstractPointParameters , F:: SMatrix{3,3,T,9} ) where T
45+ E = 0.5 .* (F' * F - I)
46+ Ψ = 0.5 * params. λ * tr (E)^ 2 + params. μ * tr (E * E)
47+ return Ψ
48+ end
49+
150@doc raw """
251 LinearElastic
352
453Linear elastic constitutive model that can be specified when using a [`CMaterial`](@ref) and
554[`BACMaterial`](@ref).
6- The first Piola-Kirchhoff stress ``\b oldsymbol{P}`` is given by
55+
56+ The strain energy density ``\P si`` is given by
757```math
8- \b oldsymbol{P} = \m athbb{C} : \b oldsymbol{E} \; ,
58+ \P si = \f rac{1}{2} \l ambda \, \m athrm{tr}( \ b oldsymbol{E})^2 + \m u \, \m athrm{tr}( \b oldsymbol{E} \c dot \b oldsymbol{E}) \; ,
959```
10- with the elastic stiffness tensor ``\m athbb{C} `` and the Green-Lagrange strain tensor
11- ``\b oldsymbol{E}`` with
60+ with the first and second Lamé parameters ``\l ambda `` and `` \m u``, and the Green-Lagrange
61+ strain tensor ``\b oldsymbol{E}``
1262```math
1363\b oldsymbol{E} = \f rac{1}{2} \l eft( \b oldsymbol{F}^{\t op} \b oldsymbol{F} - \b oldsymbol{I}
1464 \r ight) \; .
1565```
66+
67+ The first Piola-Kirchhoff stress ``\b oldsymbol{P}`` is given by
68+ ```math
69+ \b egin{aligned}
70+ \b oldsymbol{S} &= \m athbb{C} : \b oldsymbol{E} \; , \\
71+ \b oldsymbol{P} &= \b oldsymbol{F} \, \b oldsymbol{S} \; ,
72+ \e nd{aligned}
73+ ```
74+ with the deformation gradient ``\b oldsymbol{F}``, the elastic stiffness tensor ``\m athbb{C}``,
75+ and the second Piola-Kirchhoff stress ``\b oldsymbol{S}``.
76+
77+ !!! note
78+ This model is equivalent to the Saint-Venant-Kirchhoff model, but uses a
79+ different implementation based on the elastic stiffness tensor.
1680"""
1781struct LinearElastic <: AbstractConstitutiveModel end
1882
@@ -21,13 +85,25 @@ function first_piola_kirchhoff(::LinearElastic, storage::AbstractStorage,
2185 E = 0.5 .* (F' * F - I)
2286 Evoigt = SVector {6,Float64} (E[1 ,1 ], E[2 ,2 ], E[3 ,3 ], 2 * E[2 ,3 ], 2 * E[3 ,1 ], 2 * E[1 ,2 ])
2387 Cvoigt = get_hooke_matrix_voigt (params. nu, params. λ, params. μ)
24- Pvoigt = Cvoigt * Evoigt
25- P = SMatrix {3,3,Float64,9} (Pvoigt[1 ], Pvoigt[6 ], Pvoigt[5 ],
26- Pvoigt[6 ], Pvoigt[2 ], Pvoigt[4 ],
27- Pvoigt[5 ], Pvoigt[4 ], Pvoigt[3 ])
88+ Svoigt = Cvoigt * Evoigt
89+ # Convert second Piola-Kirchhoff stress from Voigt to tensor form
90+ S = SMatrix {3,3,Float64,9} (Svoigt[1 ], Svoigt[6 ], Svoigt[5 ],
91+ Svoigt[6 ], Svoigt[2 ], Svoigt[4 ],
92+ Svoigt[5 ], Svoigt[4 ], Svoigt[3 ])
93+ # First Piola-Kirchhoff stress: P = F * S
94+ P = F * S
2895 return P
2996end
3097
98+ function strain_energy_density (:: LinearElastic , storage:: AbstractStorage ,
99+ params:: AbstractPointParameters , F:: SMatrix{3,3,T,9} ) where T
100+ E = 0.5 .* (F' * F - I)
101+ # For energy density, use the standard form: Ψ = 0.5 * λ * tr(E)^2 + μ * tr(E*E)
102+ # This is equivalent to the Saint-Venant-Kirchhoff model
103+ Ψ = 0.5 * params. λ * tr (E)^ 2 + params. μ * tr (E * E)
104+ return Ψ
105+ end
106+
31107function get_hooke_matrix_voigt (nu, λ, μ)
32108 a = (1 - nu) * λ / nu
33109 Cvoigt = SMatrix {6,6,Float64,36} (
@@ -56,12 +132,21 @@ function get_hooke_matrix(nu, λ, μ)
56132 return C
57133end
58134
59-
60135@doc raw """
61136 NeoHooke
62137
63- Neo-Hookean constitutive model that can be specified when using a [`CMaterial`](@ref) and
64- [`BACMaterial`](@ref).
138+ Compressible Neo-Hookean hyperelastic constitutive model that can be specified when using
139+ a [`CMaterial`](@ref) and [`BACMaterial`](@ref).
140+
141+ The strain energy density ``\P si`` is given by
142+ ```math
143+ \P si = \f rac{1}{2} \m u \l eft( I_1 - 3 \r ight) - \m u \l og(J) + \f rac{1}{2} \l ambda \l og(J)^2 \; ,
144+ ```
145+ with the first invariant ``I_1 = \m athrm{tr}(\b oldsymbol{C})`` of the right Cauchy-Green
146+ deformation tensor ``\b oldsymbol{C} = \b oldsymbol{F}^{\t op} \b oldsymbol{F}``, the Jacobian
147+ ``J = \m athrm{det}(\b oldsymbol{F})``, and the first and second Lamé parameters ``\l ambda``
148+ and ``\m u``.
149+
65150The first Piola-Kirchhoff stress ``\b oldsymbol{P}`` is given by
66151```math
67152\b egin{aligned}
@@ -71,10 +156,13 @@ The first Piola-Kirchhoff stress ``\boldsymbol{P}`` is given by
71156\b oldsymbol{P} &= \b oldsymbol{F} \, \b oldsymbol{S} \; ,
72157\e nd{aligned}
73158```
74- with the deformation gradient ``\b oldsymbol{F}``, the right Cauchy-Green deformation tensor
75- ``\b oldsymbol{C}``, the Jacobian ``J = \m athrm{det}(\b oldsymbol{F})``, the second
76- Piola-Kirchhoff stress ``\b oldsymbol{S}``, and the first and second Lamé parameters
77- ``\l ambda`` and ``\m u``.
159+ with the deformation gradient ``\b oldsymbol{F}`` and the second Piola-Kirchhoff stress
160+ ``\b oldsymbol{S}``.
161+
162+ # Reference
163+ Treloar, L. R. G. (1943). "The elasticity of a network of long-chain molecules—II."
164+ *Transactions of the Faraday Society*, 39, 241–246.
165+ DOI: [10.1039/TF9433900241](https://doi.org/10.1039/TF9433900241)
78166"""
79167struct NeoHooke <: AbstractConstitutiveModel end
80168
@@ -87,33 +175,62 @@ function first_piola_kirchhoff(::NeoHooke, storage::AbstractStorage,
87175 return P
88176end
89177
178+ function strain_energy_density (:: NeoHooke , storage:: AbstractStorage ,
179+ params:: AbstractPointParameters , F:: SMatrix{3,3,T,9} ) where T
180+ J = det (F)
181+ C = F' * F
182+ I₁ = tr (C)
183+ Ψ = 0.5 * params. μ * (I₁ - 3 ) - params. μ * log (J) + 0.5 * params. λ * log (J)^ 2
184+ return Ψ
185+ end
186+
90187@doc raw """
91- MooneyRivlin
188+ NeoHookePenalty
189+
190+ Compressible Neo-Hookean hyperelastic model with a penalty-type volumetric formulation,
191+ suitable for modeling rubber-like and biological materials. Can be specified when using a
192+ [`CMaterial`](@ref) and [`BACMaterial`](@ref).
193+
194+ The strain energy density ``\P si`` is given by
195+ ```math
196+ \P si = \f rac{1}{2} G \l eft( \b ar{I}_1 - 3 \r ight) + \f rac{K}{8} \l eft( J^2 + J^{-2} - 2 \r ight) \; ,
197+ ```
198+ with the modified first invariant ``\b ar{I}_1 = I_1 J^{-2/3}`` where
199+ ``I_1 = \m athrm{tr}(\b oldsymbol{C})`` is the first invariant of the right Cauchy-Green
200+ deformation tensor ``\b oldsymbol{C} = \b oldsymbol{F}^{\t op} \b oldsymbol{F}``, the Jacobian
201+ ``J = \m athrm{det}(\b oldsymbol{F})``, the shear modulus ``G``, and the bulk modulus ``K``.
92202
93- Mooney-Rivlin constitutive model that can be specified when using a [`CMaterial`](@ref) and
94- [`BACMaterial`](@ref).
95203The first Piola-Kirchhoff stress ``\b oldsymbol{P}`` is given by
96204```math
97205\b egin{aligned}
98206\b oldsymbol{C} &= \b oldsymbol{F}^{\t op} \b oldsymbol{F} \; , \\
99207\b oldsymbol{S} &= G \l eft( \b oldsymbol{I} - \f rac{1}{3} \m athrm{tr}(\b oldsymbol{C})
100- \b oldsymbol{C}^{-1} \r ight) \c dot J^{-\f rac{2}{3}}
208+ \b oldsymbol{C}^{-1} \r ight) J^{-\f rac{2}{3}}
101209 + \f rac{K}{4} \l eft( J^2 - J^{-2} \r ight) \b oldsymbol{C}^{-1} \; , \\
102210\b oldsymbol{P} &= \b oldsymbol{F} \, \b oldsymbol{S} \; ,
103211\e nd{aligned}
104212```
105- with the deformation gradient ``\b oldsymbol{F}``, the right Cauchy-Green deformation tensor
106- ``\b oldsymbol{C}``, the Jacobian ``J = \m athrm{det}(\b oldsymbol{F})``, the second
107- Piola-Kirchhoff stress ``\b oldsymbol{S}``, the shear modulus ``G``, and the
108- bulk modulus ``K``.
213+ with the deformation gradient ``\b oldsymbol{F}`` and the second Piola-Kirchhoff stress
214+ ``\b oldsymbol{S}``.
215+
216+ !!! note "Penalty-type volumetric formulation"
217+ This model uses a penalty-type volumetric term ``\P si_{\m athrm{vol}} = \f rac{K}{8}(J^2 + J^{-2} - 2)``,
218+ which is computationally efficient and widely used in commercial finite element codes
219+ for nearly-incompressible materials. The term penalizes volume changes from the
220+ reference configuration (``J = 1``).
221+
222+ This differs from other volumetric formulations such as:
223+ - Standard Neo-Hookean (logarithmic): ``\P si_{\m athrm{vol}} = -\m u \l n J + \f rac{\l ambda}{2}\l n^2 J``
224+ - Simo-Miehe (polyconvex): ``\P si_{\m athrm{vol}} = \f rac{K}{4}(J^2 - 1 - 2\l n J)``
109225
110226# Error handling
111- If the Jacobian ``J`` is smaller than the machine precision `eps()` or a `NaN`, the first
112- Piola-Kirchhoff stress tensor is defined as ``\b oldsymbol{P} = \b oldsymbol{0}``.
227+ If the Jacobian ``J`` is smaller than the machine precision `eps()` or a `NaN`, the strain
228+ energy density and first Piola-Kirchhoff stress tensor are defined as zero:
229+ ``\P si = 0`` and ``\b oldsymbol{P} = \b oldsymbol{0}``.
113230"""
114- struct MooneyRivlin <: AbstractConstitutiveModel end
231+ struct NeoHookePenalty <: AbstractConstitutiveModel end
115232
116- function first_piola_kirchhoff (:: MooneyRivlin , storage:: AbstractStorage ,
233+ function first_piola_kirchhoff (:: NeoHookePenalty , storage:: AbstractStorage ,
117234 params:: AbstractPointParameters , F:: SMatrix{3,3,T,9} ) where T
118235 J = det (F)
119236 J < eps () && return zero (SMatrix{3 ,3 ,T,9 })
@@ -126,31 +243,13 @@ function first_piola_kirchhoff(::MooneyRivlin, storage::AbstractStorage,
126243 return P
127244end
128245
129- @doc raw """
130- SaintVenantKirchhoff
131-
132- Saint-Venant-Kirchhoff constitutive model that can be specified when using a
133- [`CMaterial`](@ref) and [`BACMaterial`](@ref).
134- The first Piola-Kirchhoff stress ``\b oldsymbol{P}`` is given by
135- ```math
136- \b egin{aligned}
137- \b oldsymbol{E} &= \f rac{1}{2} \l eft( \b oldsymbol{F}^{\t op} \b oldsymbol{F} - \b oldsymbol{I}
138- \r ight) \; , \\
139- \b oldsymbol{S} &= \l ambda \, \m athrm{tr}(\b oldsymbol{E}) \, \b oldsymbol{I}
140- + 2 \m u \b oldsymbol{E} \; , \\
141- \b oldsymbol{P} &= \b oldsymbol{F} \, \b oldsymbol{S} \; ,
142- \e nd{aligned}
143- ```
144- with the deformation gradient ``\b oldsymbol{F}``, the Green-Lagrange strain tensor
145- ``\b oldsymbol{E}``, the second Piola-Kirchhoff stress ``\b oldsymbol{S}``, and the first and
146- second Lamé parameters ``\l ambda`` and ``\m u``.
147- """
148- struct SaintVenantKirchhoff <: AbstractConstitutiveModel end
149-
150- function first_piola_kirchhoff (:: SaintVenantKirchhoff , storage:: AbstractStorage ,
246+ function strain_energy_density (:: NeoHookePenalty , storage:: AbstractStorage ,
151247 params:: AbstractPointParameters , F:: SMatrix{3,3,T,9} ) where T
152- E = 0.5 .* (F' * F - I)
153- S = params. λ * tr (E) * I + 2 * params. μ * E
154- P = F * S
155- return P
248+ J = det (F)
249+ J < eps () && return zero (T)
250+ isnan (J) && return zero (T)
251+ C = F' * F
252+ I₁ = tr (C)
253+ Ψ = 0.5 * params. G * (I₁ * J^ (- 2 / 3 ) - 3 ) + params. K / 8 * (J^ 2 + J^ (- 2 ) - 2 )
254+ return Ψ
156255end
0 commit comments