Acoustic and Hill tensors
<!– crosslinks: written by .github/scripts/crosslinks.py from docs/crosslinks.toml; do not edit –>
See also
Theory: The Walpole basis · Transversely isotropic parametrizations · Isotropic tensors
Manual: Structured tensors · Parametrizations and conversions
Tutorials: The Walpole basis end to end · Elastic Green's functions · A two-point Green tensor between offset frames
<!– /crosslinks –>
From the stiffness
the integrand of every Hill polarization tensor and the kernel of stress-intensity-factor integrals on crack fronts.
The point of this tutorial is that the construction is written once and runs unchanged on an isotropic and on a transversely isotropic stiffness — the structured types of The Walpole basis doing the work. Background: Mura (1987), Hoenig (1978).
using TensND
using LinearAlgebra
using SymPyPythonCallSetting up
The direction
Cartesian = coorsys_cartesian(symbols("x y z", real = true))
𝐞₁, 𝐞₂, 𝐞₃ = unitvec(Cartesian)
Spherical = coorsys_spherical((symbols("θ ϕ", real = true)..., symbols("ξ", positive = true)))
θ, ϕ, ξ = get_coords(Spherical)
𝐞ᶿ, 𝐞ᵠ, 𝐞ʳ = unitvec(Spherical)
𝕀, 𝕁, 𝕂 = iso_projectors(Val(3), Val(Sym))
𝟏 = tens_Id2(Val(3), Val(Sym))
𝛏 = position_vector(Spherical)The isotropic case
With
λ = symbols("λ", real = true)
μ = symbols("μ", positive = true)
ℂ = 3λ * 𝕁 + 2μ * 𝕀
𝐊 = 𝛏 ⋅ ℂ ⋅ 𝛏The acoustic tensor is transversely isotropic about
tsimplify(𝐊)The Green operator and the Hill-type kernel:
ℾ = 𝛏 ⊗ˢ 𝐊^(-1) ⊗ˢ 𝛏
𝚲 = tsimplify(ℂ ⊡ ℾ ⊡ ℂ)It must reproduce the closed form
𝚲₂ = tsimplify(
λ^2 / (λ + 2μ) * 𝟏 ⊗ 𝟏
+ 2λ * μ / (λ + 2μ) * (𝟏 ⊗ 𝐞ʳ ⊗ 𝐞ʳ + 𝐞ʳ ⊗ 𝐞ʳ ⊗ 𝟏)
+ 4μ * (𝐞ʳ ⊗ˢ 𝟏 ⊗ˢ 𝐞ʳ - (λ + μ) / (λ + 2μ) * 𝐞ʳ ⊗ 𝐞ʳ ⊗ 𝐞ʳ ⊗ 𝐞ʳ)
)
pprint(tsimplify(𝚲 - 𝚲₂), Spherical)0Identically zero.
The transversely isotropic case
The same three lines, with a stiffness built by ti_from_constants instead. Nothing in the construction changes: ⋅, inv and ⊡ dispatch on the structured type.
This replaces a legacy hand-rolled Walpole basis
An earlier research script re-defined the Walpole tensors and the TI constructors locally. Everything it needed is now in the library — walpole_basis and ti_from_constants in its three forms — so the local definitions are gone.
C₁₁₁₁, C₁₁₂₂, C₁₁₃₃, C₃₃₃₃, C₂₃₂₃ = symbols("C₁₁₁₁ C₁₁₂₂ C₁₁₃₃ C₃₃₃₃ C₂₃₂₃", positive = true)
n = 𝐞₃
ℂᵗⁱ = ti_from_constants(C₁₁₁₁, C₁₁₂₂, C₁₁₃₃, C₃₃₃₃, C₂₃₂₃, [Sym(0), Sym(0), Sym(1)])
typeof(ℂᵗⁱ), walpole_coeffs(ℂᵗⁱ)(TensTI{4, Sym{PythonCall.Py}, 5}, (C₃₃₃₃, C₁₁₁₁ + C₁₁₂₂, sqrt(2)*C₁₁₃₃, sqrt(2)*C₁₁₃₃, C₁₁₁₁ - C₁₁₂₂, 2*C₂₃₂₃))The acoustic tensor along the symmetry axis. Taking
𝐊ᵃˣ = tsimplify(𝐞₃ ⋅ ℂᵗⁱ ⋅ 𝐞₃)
get_array(𝐊ᵃˣ)In the isotropy plane,
𝐊ᵗ = tsimplify(𝐞₁ ⋅ ℂᵗⁱ ⋅ 𝐞₁)
get_array(𝐊ᵗ)The two coincide only when the material is isotropic. Substituting the isotropic relations
iso_subs = Dict(
C₁₁₁₁ => λ + 2μ, C₃₃₃₃ => λ + 2μ,
C₁₁₂₂ => λ, C₁₁₃₃ => λ, C₂₃₂₃ => μ,
)
(tsimplify(subs.(get_array(𝐊ᵃˣ), iso_subs...)), tsimplify(subs.(get_array(𝐊ᵗ), iso_subs...)))(Sym{PythonCall.Py}[μ 0 0; 0 μ 0; 0 0 λ + 2*μ], Sym{PythonCall.Py}[λ + 2*μ 0 0; 0 μ 0; 0 0 μ])The Green operator for the TI medium
Along the symmetry axis the acoustic tensor is diagonal, so its inverse is immediate and
ℾᵗⁱ = 𝐞₃ ⊗ˢ inv(𝐊ᵃˣ) ⊗ˢ 𝐞₃
𝚲ᵗⁱ = tsimplify(ℂᵗⁱ ⊡ ℾᵗⁱ ⊡ ℂᵗⁱ)
get_array(𝚲ᵗⁱ)[3, 3, 3, 3]The
Checking against the isotropic limit
Substituting the isotropic moduli into the TI result must reproduce the isotropic
𝚲ᵗⁱ_iso = tsubs(𝚲ᵗⁱ, iso_subs...)
𝚲_axis = tsubs(𝚲₂, θ => 0, ϕ => 0)
iszero(tsimplify(𝚲ᵗⁱ_iso - 𝚲_axis))trueThe difference is the zero tensor: the transversely isotropic construction degenerates correctly.
This page was generated using Literate.jl.