Skip to content

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
julia
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:

ParametrizationRoleStored coefficients
TensTI{2, T, 2}2nd-order TIdata = (a, b), n::NTuple{3}
TensTI{4, T, 5}4th-order TI, major-symmetricdata = (ℓ₁,ℓ₂,ℓ₃,ℓ₅,ℓ₆), n
TensTI{4, T, 6}4th-order TI, generaldata = (ℓ₁,…,ℓ₆), n
  • Order 2 (N=2): 𝐀 = a·nT + b·nₙ where nₙ = n⊗n, nT = 𝟏 − nₙ. a is the transverse coefficient, b the axial one. When a = b, the tensor is isotropic and equivalent to TensISO{2,3,T}(a).

  • Order 4: stored in the Walpole basis {W₁,…,W₆}, with W₁ = 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 under N=5. Synthetic notation: L ≡ ([[ℓ₁,ℓ₃],[ℓ₄,ℓ₂]], ℓ₅, ℓ₆).

See also tens_TI, tens_TI_eng, tens_TI_Hoenig.

TensND.TensOrtho Type
julia
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₁₂₁₂:

julia
= 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:

julia
[[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
julia
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
julia
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
julia
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
julia
tens_W1(n)  TensTI{4, T, 6}   (W₁ = nₙnₙ, coeffs (1,0,0,0,0,0))
TensND.tens_W2 Function
julia
tens_W2(n)  TensTI{4, T, 6}   (W₂ = (nTnT)/2, coeffs (0,1,0,0,0,0))
TensND.tens_W3 Function
julia
tens_W3(n)  TensTI{4, T, 6}   (W₃ = (nₙnT)/√2, coeffs (0,0,1,0,0,0))
TensND.tens_W4 Function
julia
tens_W4(n)  TensTI{4, T, 6}   (W₄ = (nTnₙ)/√2, coeffs (0,0,0,1,0,0))
TensND.tens_W5 Function
julia
tens_W5(n)  TensTI{4, T, 6}   (W₅ = nTˢnT  (nTnT)/2, coeffs (0,0,0,0,1,0))
TensND.tens_W6 Function
julia
tens_W6(n)  TensTI{4, T, 6}   (W₆ = nTˢnₙ + nₙˢnT, coeffs (0,0,0,0,0,1))
TensND.tens_W7 Function
julia
tens_W7(n)  TensTI{4, T, 8}   (m=1 antisymmetric generator)
TensND.tens_W8 Function
julia
tens_W8(n)  TensTI{4, T, 8}   (m=2 antisymmetric generator)
TensND.get_ℓ Function
julia
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
julia
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
julia
axis(t::TensTI)

Return the symmetry axis of a transversely isotropic tensor.

TensND.frame Function
julia
frame(t::TensOrtho)

Return the material frame of an orthotropic tensor.

TensND.reference Function
julia
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
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
true

See also axis, frame, symmetry.

TensND.symmetry Function
julia
symmetry(t) -> Symbol

Return 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
julia> symmetry(TensISO{3}(2.0, 3.0))
:ISO

julia> symmetry(tens_TI(10., 3., 2.5, 12., 2., [0., 0., 1.]))
:TI

See also reference, is_ISO, is_TI, is_ORTHO, best_sym_tens.

TensND.fromISO Function
julia
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
julia
KM_material(t::TensOrtho)

Returns the 6×6 Kelvin-Mandel matrix in the material frame (block-diagonal).

julia
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
julia
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
julia
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₁₁₁₁ = (ℓ₂ + ℓ₅)/2

  • C₁₁₂₂ = (ℓ₂ − ℓ₅)/2

  • C₁₁₃₃ = ℓ₃/√2

  • C₂₃₂₃ = ℓ₆/2

See also arg_TI_eng.

TensND.tens_TI_eng Function
julia
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
julia
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
julia
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/E

  • S₁₁₂₂ = −ν₁/E

  • S₁₁₃₃ = −ν₂/E

  • S₃₃₃₃ = 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
julia
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
julia
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

julia
C₁₁ = C₂₂ = C₃₃ =+ 2β) / 3
C₁₂ = C₁₃ = C₂₃ = β)  / 3
C₄₄ = C₅₅ = C₆₆ = β / 2

This is the obvious promotion for operations that combine TensISO{4} with a TensOrtho, e.g. TensISO + TensOrtho → TensOrtho.

Examples

julia
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
julia
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):

julia
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.