Skip to content

Cubic symmetry ​

Compact storage for cubic tensors: three constants and a cube frame. Theory: Cubic symmetry; usage: Structured tensors.

The class is the one place in this package where the algebra is closed: the double contraction of two cubic tensors about the same cube is cubic, and every cubic tensor is automatically major-symmetric. Both follow from the three irreducible representations of the octahedral group appearing with multiplicity one.

TensND.TensCubic Type
julia
TensCubic{T, B<:OrthonormalBasis{3}} <: AbstractTens{4,3,T}

Cubic 4th-order tensor with cube axes frame and three independent coefficients (α, β, γ) on the three orthogonal projectors of the octahedral group:

where, in Kelvin-Mandel form and in the cube frame,

They are mutually orthogonal, idempotent, and sum to the identity, with traces 1, 2, 3. The Kelvin-Mandel matrix in the cube frame is therefore

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₄₄]]

with α = C₁₁ + 2C₁₂ = 3K, β = C₁₁ - C₁₂, γ = 2C₄₄. Use cubic_from_constants to build one from (C₁₁, C₁₂, C₄₄) and cubic_constants to read them back.

The isotropic class is the case β = γ: TensISO{3}(α, β) is α𝕁 + β(𝔼 + 𝕋), since 𝕂 = 𝔼 + 𝕋. What a two-constant approximation of a cubic tensor discards is measured by cubic_anisotropy.

ParametrizationRoleInvariance groupStored coefficients
TensCubic{T, B}4th-order cubicOₕdata = (α, β, γ), frame::B

One shape only, so the type carries neither order nor length: at order 2 a cubic tensor is isotropic (a TensISO{2}), and the product of two cubic tensors on a cube is cubic and major-symmetric, so there is no general shape (Oₕ and its rotation group O have the same invariants at even order). The inverse stays cubic, and a cubic tensor is its own transpose.

As for TensOrtho, the frame's element type B is a free type parameter independent of the data eltype T: differentiating with respect to the constants does not require a Dual-typed geometric frame.

Examples

julia
julia> C = cubic_from_constants(10.0, 4.0, 2.0, CanonicalBasis{3,Float64}());

julia> cubic_constants(C)
(10.0, 4.0, 2.0)

julia> cubic_constants(inv(C) ⊡ C)          # the identity, exactly
(1.0, 0.0, 0.5)

See also cubic_from_constants, cubic_constants, cubic_anisotropy, iso_to_cubic, cubic_to_ortho.

TensND.cubic_from_constants Function
julia
cubic_from_constants(C₁₁, C₁₂, C₄₄, frame) -> TensCubic

Cubic tensor from the three elastic constants, C₄₄ = C₂₃₂₃:

C₁₁ = C₁₂ + 2C₄₄ gives back an isotropic tensor — the identity worth remembering, since the departure from it is what cubic_anisotropy measures.

TensND.cubic_constants Function
julia
cubic_constants(t::TensCubic) -> (C₁₁, C₁₂, C₄₄)

The three elastic constants, the inverse of cubic_from_constants.

TensND.cubic_anisotropy Function
julia
cubic_anisotropy(t::TensCubic) -> Real

    : a Zener-type measure of how far a cubic tensor departs from an isotropic one.

Exactly zero when β = γ, which is exactly when the tensor is isotropic. It is precisely the quantity a two-constant approximation of a cubic tensor throws away.

TensND.iso_to_cubic Function
julia
iso_to_cubic(A::TensISO{4,3,T}, frame::OrthonormalBasis{3}) → TensCubic{T}

Convert an isotropic 4th-order tensor α𝕁 + β𝕂 into a TensCubic on frame.

Exact and frame-independent: 𝕂 = 𝔼 + 𝕋, so the cubic coefficients are simply (α, β, β) — and they are the same whatever frame is chosen, which is the formal statement that an isotropic tensor is cubic about every cube.

Used by the mixed arithmetic below so that TensISO + TensCubic stays a TensCubic instead of collapsing to the unstructured route.

Examples

julia
julia> C = iso_to_cubic(TensISO{3}(18.0, 6.0), CanonicalBasis{3,Float64}());

julia> cubic_anisotropy(C)          # isotropic, so exactly zero
0.0
TensND.cubic_to_ortho Function
julia
cubic_to_ortho(A::TensCubic{T}) → TensOrtho{4,T,9}

Widen a cubic tensor to the orthotropic class on its own cube frame: C₁₁ = C₂₂ = C₃₃, C₁₂ = C₁₃ = C₂₃, C₄₄ = C₅₅ = C₆₆.

Exact — no projection, no loss. It is the embedding that makes TensCubic ± TensOrtho well defined on a shared frame.

best_fit_cubic, cubic_params_from_mandel and mandel_from_cubic_params are the projection family and live with their siblings under Projection. isotropify of a cubic tensor is an exact rotation-group average, not a fit, and is documented there too.