Skip to content

Acoustic and Hill tensors

From the stiffness and a direction , the acoustic tensor     controls wave propagation and, through its inverse, the Green operator

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: [13], [8].

julia
using TensND
using LinearAlgebra
using SymPy

Setting up

The direction is taken as the position vector of a spherical chart, so that   up to its norm and the angular dependence is explicit.

julia
Cartesian = coorsys_cartesian(symbols("x y z", real = true))
𝐞₁, 𝐞₂, 𝐞₃ = unitvec(Cartesian)

Spherical = coorsys_spherical((symbols("θ ϕ", real = true)..., symbols("ξ", positive = true)))
θ, ϕ, ξ = getcoords(Spherical)
𝐞ᶿ, 𝐞ᵠ, 𝐞ʳ = unitvec(Spherical)

𝕀, 𝕁, 𝕂 = iso_projectors(Val(3), Val(Sym))
𝟏 = tens_Id2(Val(3), Val(Sym))
𝛏 = getOM(Spherical)

The isotropic case

With   :

julia
λ = symbols("λ", real = true)
μ = symbols("μ", positive = true)
= 3λ * 𝕁 + 2μ * 𝕀

𝐊 = 𝛏  𝛏

The acoustic tensor is transversely isotropic about : one longitudinal eigenvalue and a doubly degenerate transverse one.

julia
tsimplify(𝐊)

The Green operator and the Hill-type kernel:

julia
= 𝛏 ˢ 𝐊^(-1) ˢ 𝛏
𝚲 = tsimplify(ℂ  ℂ)

It must reproduce the closed form

julia
𝚲₂ = tsimplify(
    λ^2 /+ 2μ) * 𝟏  𝟏
        + 2λ * μ /+ 2μ) * (𝟏  𝐞ʳ  𝐞ʳ + 𝐞ʳ  𝐞ʳ  𝟏)
        + 4μ * (𝐞ʳ ˢ 𝟏 ˢ 𝐞ʳ -+ μ) /+ 2μ) * 𝐞ʳ  𝐞ʳ  𝐞ʳ  𝐞ʳ)
)

pprint(tsimplify(𝚲 - 𝚲₂), Spherical)
0

Identically zero.

The transversely isotropic case

The same three lines, with a stiffness built by tens_TI 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, tens_TI, tens_TI_eng, tens_TI_Hoenig — so the local definitions are gone.

julia
C₁₁₁₁, C₁₁₂₂, C₁₁₃₃, C₃₃₃₃, C₂₃₂₃ = symbols("C₁₁₁₁ C₁₁₂₂ C₁₁₃₃ C₃₃₃₃ C₂₃₂₃", positive = true)
n = 𝐞₃
ℂᵗⁱ = tens_TI(C₁₁₁₁, C₁₁₂₂, C₁₁₃₃, C₃₃₃₃, C₂₃₂₃, [Sym(0), Sym(0), Sym(1)])

typeof(ℂᵗⁱ), get_ℓ(ℂᵗⁱ)
(TensTI{4, Sym{PyCall.PyObject}, 5}, (C₃₃₃₃, C₁₁₁₁ + C₁₁₂₂, sqrt(2)*C₁₁₃₃, sqrt(2)*C₁₁₃₃, C₁₁₁₁ - C₁₁₂₂, 2*C₂₃₂₃))

The acoustic tensor along the symmetry axis. Taking   makes it diagonal, with the longitudinal modulus and the doubly degenerate shear modulus :

julia
𝐊ᵃˣ = tsimplify(𝐞₃  ℂᵗⁱ  𝐞₃)
get_array(𝐊ᵃˣ)

In the isotropy plane,  , the three eigenvalues are all distinct — the anisotropy is fully visible:

julia
𝐊ᵗ = tsimplify(𝐞₁  ℂᵗⁱ  𝐞₁)
get_array(𝐊ᵗ)

The two coincide only when the material is isotropic. Substituting the isotropic relations    ,   ,  :

julia
iso_subs = Dict(
    C₁₁₁₁ => λ + 2μ, C₃₃₃₃ => λ + 2μ,
    C₁₁₂₂ => λ, C₁₁₃₃ => λ, C₂₃₂₃ => μ,
)
(tsimplify(subs.(get_array(𝐊ᵃˣ), iso_subs...)), tsimplify(subs.(get_array(𝐊ᵗ), iso_subs...)))
(Sym{PyCall.PyObject}[μ 0 0; 0 μ 0; 0 0 λ + 2*μ], Sym{PyCall.PyObject}[λ + 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 follows:

julia
ℾᵗⁱ = 𝐞₃ ˢ inv(𝐊ᵃˣ) ˢ 𝐞₃
𝚲ᵗⁱ = tsimplify(ℂᵗⁱ  ℾᵗⁱ  ℂᵗⁱ)

get_array(𝚲ᵗⁱ)[3, 3, 3, 3]

    

The component is itself: along the symmetry axis the Green operator exactly undoes the stiffness, as it must for a longitudinal wave.

Checking against the isotropic limit

Substituting the isotropic moduli into the TI result must reproduce the isotropic evaluated at  :

julia
Λᵗⁱ_iso = tsimplify(subs.(get_array(𝚲ᵗⁱ), iso_subs...))
Λ_iso_axis = tsimplify(subs.(get_array(𝚲₂), θ => Sym(0), ϕ => Sym(0)))

tsimplify(Λᵗⁱ_iso - Λ_iso_axis)

Zero: the transversely isotropic construction degenerates correctly.


This page was generated using Literate.jl.