Walpole and orthotropy
Transversely isotropic and orthotropic storage, the Walpole basis and the three TI parametrizations. Theory: The Walpole basis, The extended Walpole algebra, Orthotropy; usage: Structured tensors, Parametrizations.
TensND.TensTI Type
TensTI{order, T, N} <: AbstractTens{order, 3, T}Transversely isotropic tensor of order order (always dim=3) with symmetry axis n, parametrized like TensISO{order, dim, T, N}.
Three concrete shapes are supported:
| Parametrization | Role | Stored coefficients |
|---|---|---|
TensTI{2, T, 2} | 2nd-order TI | data = (a, b), n::NTuple{3} |
TensTI{4, T, 5} | 4th-order TI, major-symmetric | data = (ℓ₁,ℓ₂,ℓ₃,ℓ₅,ℓ₆), n |
TensTI{4, T, 6} | 4th-order TI, general | data = (ℓ₁,…,ℓ₆), n |
Order 2 (
N=2):𝐀 = a·nT + b·nₙwherenₙ = n⊗n,nT = 𝟏 − nₙ.ais the transverse coefficient,bthe axial one. Whena = b, the tensor is isotropic and equivalent toTensISO{2,3,T}(a).Order 4: stored in the Walpole basis
{W₁,…,W₆}, withW₁ = nₙ⊗nₙ,W₂ = (nT⊗nT)/2,W₃ = (nₙ⊗nT)/√2,W₄ = (nT⊗nₙ)/√2,W₅ = nT⊠ˢnT − (nT⊗nT)/2,W₆ = nT⊠ˢnₙ + nₙ⊠ˢnT. Major-symmetric tensors haveℓ₃ = ℓ₄and are stored underN=5. Synthetic notation:L ≡ ([[ℓ₁,ℓ₃],[ℓ₄,ℓ₂]], ℓ₅, ℓ₆).
See also tens_TI, tens_TI_eng, tens_TI_Hoenig.
TensND.TensOrtho Type
TensOrtho{T, B<:OrthonormalBasis{3}} <: AbstractTens{4,3,T}Orthotropic 4th-order tensor with material frame (e₁,e₂,e₃) and 9 independent elastic constants (C₁₁,C₂₂,C₃₃,C₁₂,C₁₃,C₂₃,C₄₄,C₅₅,C₆₆) where C₄₄=C₂₃₂₃, C₅₅=C₁₃₁₃, C₆₆=C₁₂₁₂:
ℂ = C₁₁P₁⊗P₁ + C₂₂P₂⊗P₂ + C₃₃P₃⊗P₃
+ C₁₂(P₁⊗P₂+P₂⊗P₁) + C₁₃(P₁⊗P₃+P₃⊗P₁) + C₂₃(P₂⊗P₃+P₃⊗P₂)
+ 2C₄₄(P₂⊠ˢP₃) + 2C₅₅(P₁⊠ˢP₃) + 2C₆₆(P₁⊠ˢP₂)with Pₘ = eₘ⊗eₘ. The Kelvin-Mandel matrix in the material frame is block-diagonal:
[[C₁₁,C₁₂,C₁₃, 0, 0, 0 ],
[C₁₂,C₂₂,C₂₃, 0, 0, 0 ],
[C₁₃,C₂₃,C₃₃, 0, 0, 0 ],
[ 0, 0, 0, 2C₄₄, 0, 0 ],
[ 0, 0, 0, 0, 2C₅₅, 0 ],
[ 0, 0, 0, 0, 0, 2C₆₆]]The frame's element type B is a free type parameter, independent of the data eltype T: differentiating w.r.t. the elastic constants (T = ForwardDiff.Dual) does not require a Dual-typed geometric frame. Keeping B as a concrete type parameter (rather than erasing it to the abstract OrthonormalBasis{3}) is what lets t.frame be inferred and stored unboxed.
TensND.Walpole Function
Walpole(n; sym::Bool = false)Legacy entry point: dispatches to walpole_basis (6-tuple, default) or walpole_basis_sym (5-tuple, sym=true). Kept for backward compatibility with older scripts; new code should prefer the dedicated functions whose return arity is deterministic from the name.
TensND.walpole_basis Function
walpole_basis(n) → (W₁, W₂, W₃, W₄, W₅, W₆)Return the six general (N=6) Walpole basis tensors for the symmetry axis n. These span the full TI 4th-order tensor space, including the non-major-symmetric components W₃ ≠ W₄.
TensND.walpole_basis_sym Function
walpole_basis_sym(n) → (W₁ˢ, W₂ˢ, W₃ˢ, W₄ˢ, W₅ˢ)Return the five major-symmetric (N=5) Walpole basis tensors for the symmetry axis n, where W₃ˢ = W₃ + W₄. Use this for building stiffness / compliance TI tensors, which are always major-symmetric.
TensND.tens_W1 Function
tens_W1(n) → TensTI{4, T, 6} (W₁ = nₙ⊗nₙ, coeffs (1,0,0,0,0,0))TensND.tens_W2 Function
tens_W2(n) → TensTI{4, T, 6} (W₂ = (nT⊗nT)/2, coeffs (0,1,0,0,0,0))TensND.tens_W3 Function
tens_W3(n) → TensTI{4, T, 6} (W₃ = (nₙ⊗nT)/√2, coeffs (0,0,1,0,0,0))TensND.tens_W4 Function
tens_W4(n) → TensTI{4, T, 6} (W₄ = (nT⊗nₙ)/√2, coeffs (0,0,0,1,0,0))TensND.tens_W5 Function
tens_W5(n) → TensTI{4, T, 6} (W₅ = nT⊠ˢnT − (nT⊗nT)/2, coeffs (0,0,0,0,1,0))TensND.tens_W6 Function
tens_W6(n) → TensTI{4, T, 6} (W₆ = nT⊠ˢnₙ + nₙ⊠ˢnT, coeffs (0,0,0,0,0,1))TensND.tens_W7 Function
tens_W7(n) → TensTI{4, T, 8} (m=1 antisymmetric generator)TensND.tens_W8 Function
tens_W8(n) → TensTI{4, T, 8} (m=2 antisymmetric generator)TensND.get_ℓ Function
get_ℓ(t::TensTI{4,T,N}) → NTuple{6,T}Always returns a 6-tuple (ℓ₁, ℓ₂, ℓ₃, ℓ₄, ℓ₅, ℓ₆) of Walpole coefficients. For N=5 (major-symmetric), ℓ₃ = ℓ₄ is stored once and duplicated on read.
TensND.get_ℓ8 Function
get_ℓ8(t::TensTI{4,T,N}) → NTuple{8,T}Always returns the 8-tuple (ℓ₁, …, ℓ₆, ℓ₇, ℓ₈) of coefficients in the full axially-invariant basis {W₁,…,W₈}. For N=5/N=6 the antisymmetric couplings ℓ₇ = ℓ₈ = 0.
TensND.axis Function
axis(t::TensTI)Return the symmetry axis of a transversely isotropic tensor.
TensND.reference Function
reference(t)Return the geometric reference that parametrises the material symmetry of t: the symmetry axis NTuple{3} for a TensTI, the material frame OrthonormalBasis{3} for a TensOrtho, and nothing for TensISO or any tensor without a structured reference.
Examples
julia> reference(tens_TI(10., 3., 2.5, 12., 2., [0., 0., 1.]))
(0.0, 0.0, 1.0)
julia> reference(TensISO{3}(2.0, 3.0)) === nothing
trueTensND.symmetry Function
symmetry(t) -> SymbolReturn the material symmetry class imposed by the container type of t: :ISO, :TI, :ORTHO, or :ANISO (default for any unstructured tensor).
This is a type-level query — it tells you what symmetry the storage guarantees, not whether the numerical components happen to satisfy a tighter symmetry. For value-level detection use best_sym_tens(t).
Examples
julia> symmetry(TensISO{3}(2.0, 3.0))
:ISO
julia> symmetry(tens_TI(10., 3., 2.5, 12., 2., [0., 0., 1.]))
:TISee also reference, is_ISO, is_TI, is_ORTHO, best_sym_tens.
TensND.fromISO Function
fromISO(A::TensISO{4,3}, n) → TensTI{4, T, 5}Convert an isotropic 4th-order tensor αJ + βK into its Walpole representation.
Formulas: ℓ₁=(α+2β)/3, ℓ₂=(2α+β)/3 (note: dim=3 → these are (3k,2μ) related), ℓ₃=ℓ₄=√2(α−β)/3, ℓ₅=ℓ₆=β. Here α = data[1] and β = data[2] in TensISO (coefficients of J and K).
TensND.KM_material Function
KM_material(t::TensOrtho)Returns the 6×6 Kelvin-Mandel matrix in the material frame (block-diagonal).
KM_material(t::TensCubic)The 6×6 Kelvin-Mandel matrix in the cube frame, where a cubic tensor has only three distinct entries.
TensND.tens_TI Function
tens_TI(C₁₁₁₁, C₁₁₂₂, C₁₁₃₃, C₃₃₃₃, C₂₃₂₃, n) → TensTI{4, T, 5}Construct a major-symmetric TI 4th-order tensor from its 5 independent components and symmetry axis n. Works for both stiffness and compliance tensors (the formula is the same).
Walpole coefficients:
ℓ₁ = C₃₃₃₃ℓ₂ = C₁₁₁₁ + C₁₁₂₂ℓ₃ = √2 C₁₁₃₃ℓ₅ = C₁₁₁₁ − C₁₁₂₂ℓ₆ = 2 C₂₃₂₃
See also arg_TI, tens_TI_eng.
TensND.arg_TI Function
arg_TI(t::TensTI{4}) → (C₁₁₁₁, C₁₁₂₂, C₁₁₃₃, C₃₃₃₃, C₂₃₂₃)Extract the 5 independent TI components from a Walpole tensor, directly from the stored coefficients (no array materialization).
Inverse of tens_TI:
C₃₃₃₃ = ℓ₁C₁₁₁₁ = (ℓ₂ + ℓ₅)/2C₁₁₂₂ = (ℓ₂ − ℓ₅)/2C₁₁₃₃ = ℓ₃/√2C₂₃₂₃ = ℓ₆/2
See also arg_TI_eng.
TensND.tens_TI_eng Function
tens_TI_eng(E₁, E₃, ν₁₂, ν₃₁, G₃₁, n) → TensTI{4, T, 5}Construct the TI compliance tensor from 5 engineering constants and symmetry axis n.
E₁: transverse Young's modulus (isotropic plane)E₃: axial Young's modulus (symmetry axis)ν₁₂: in-plane Poisson's ratioν₃₁: axial-transverse Poisson's ratio (ν₃₁/E₃ = ν₁₃/E₁)G₃₁: axial shear modulus
To obtain the stiffness tensor, invert the result: inv(tens_TI_eng(…)).
See also arg_TI_eng, tens_TI.
TensND.arg_TI_eng Function
arg_TI_eng(𝕊::TensTI{4}) → (E₁, E₃, ν₁₂, ν₃₁, G₃₁)Extract engineering constants from a TI compliance tensor.
See also tens_TI_eng, arg_TI.
TensND.tens_TI_Hoenig Function
tens_TI_Hoenig(E, ν₁, ν₂, H, Γ, n) → TensTI{4, T, 5}Construct the TI compliance tensor from 5 Hoenig parameters (Hoenig, 1978) and symmetry axis n.
E: transverse Young's modulus (= 1/S₁₁₁₁)ν₁: in-plane Poisson's ratio (= −E S₁₁₂₂)ν₂: axial-transverse Poisson's ratio (= −E S₁₁₃₃)H: axial-to-transverse modulus ratio (= 1/(E S₃₃₃₃))Γ: shear anisotropy parameter (= (1+ν₁)/(2 E S₂₃₂₃))
Compliance components:
S₁₁₁₁ = 1/ES₁₁₂₂ = −ν₁/ES₁₁₃₃ = −ν₂/ES₃₃₃₃ = 1/(E H)S₂₃₂₃ = (1+ν₁)/(2 E Γ)
To obtain the stiffness tensor, invert the result: inv(tens_TI_Hoenig(…)).
See also arg_TI_Hoenig, tens_TI_eng, tens_TI.
TensND.arg_TI_Hoenig Function
arg_TI_Hoenig(𝕊::TensTI{4}) → (E, ν₁, ν₂, H, Γ)Extract the 5 Hoenig parameters from a TI compliance tensor.
See also tens_TI_Hoenig, arg_TI_eng.
TensND.iso_to_ortho Function
iso_to_ortho(A::TensISO{4,3,T}, frame::OrthonormalBasis{3}) → TensOrtho{T}Convert an isotropic 4th-order tensor α·𝕁 + β·𝕂 into a TensOrtho stored in the given material frame. An isotropic tensor is orthotropic in any frame; the orthotropic coefficients are
C₁₁ = C₂₂ = C₃₃ = (α + 2β) / 3
C₁₂ = C₁₃ = C₂₃ = (α − β) / 3
C₄₄ = C₅₅ = C₆₆ = β / 2This is the obvious promotion for operations that combine TensISO{4} with a TensOrtho, e.g. TensISO + TensOrtho → TensOrtho.
Examples
julia> I4 = TensISO{3}(2.0, 3.0); # α=2, β=3
julia> O = iso_to_ortho(I4, CanonicalBasis{3,Float64}());
julia> O isa TensOrtho{Float64}
true
julia> get_data(O)[1], get_data(O)[4], get_data(O)[7]
(2.6666666666666665, -0.3333333333333333, 1.5)See also walpole_to_ortho, fromISO.
TensND.walpole_to_ortho Function
walpole_to_ortho(A::TensTI{4, T, 5}, frame::OrthonormalBasis{3}, axis_idx::Int) → TensOrtho{T}Convert a major-symmetric TensTI{4, T, 5} into a TensOrtho stored in the given material frame, assuming the Walpole axis A.n is aligned with axis axis_idx ∈ {1,2,3} of the frame. A TI tensor is a special case of an orthotropic tensor (with the 1–2 equivalence about the TI axis).
Mapping in the rotated material frame (TI axis = axis k):
Ctrtr = (ℓ₂ + ℓ₅) / 2 (transverse–transverse C in KM)
Cmix = (ℓ₂ − ℓ₅) / 2 (between the two transverse axes)
Cax_tr = ℓ₃ / √2 (axial ↔ transverse)
Cax = ℓ₁ (axial–axial)
Cshear_ax = ℓ₆ / 2 (shear involving the axial axis)
Cshear_tr = ℓ₅ / 2 (shear in the transverse plane)The 9 orthotropic coefficients are then permuted according to axis_idx.
Restricted to N=5 (major-symmetric Walpole): a non-major-symmetric TI (N=6) has no orthotropic counterpart in TensOrtho (which carries only 9 major-symmetric constants).
See also iso_to_ortho, _axis_on_frame_index.