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
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
[[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 tens_cubic to build one from (C₁₁, C₁₂, C₄₄) and arg_cubic 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.
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> C = tens_cubic(10.0, 4.0, 2.0, CanonicalBasis{3,Float64}());
julia> arg_cubic(C)
(10.0, 4.0, 2.0)
julia> arg_cubic(inv(C) ⊡ C) # the identity, exactly
(1.0, 0.0, 0.5)See also tens_cubic, arg_cubic, cubic_anisotropy, iso_to_cubic, cubic_to_ortho.
TensND.tens_cubic Function
tens_cubic(C₁₁, C₁₂, C₄₄, frame) -> TensCubicCubic 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.arg_cubic Function
arg_cubic(t::TensCubic) -> (C₁₁, C₁₂, C₄₄)The three elastic constants, the inverse of tens_cubic.
TensND.cubic_anisotropy Function
cubic_anisotropy(t::TensCubic) -> RealExactly 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
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> C = iso_to_cubic(TensISO{3}(18.0, 6.0), CanonicalBasis{3,Float64}());
julia> cubic_anisotropy(C) # isotropic, so exactly zero
0.0TensND.cubic_to_ortho Function
cubic_to_ortho(A::TensCubic{T}) → TensOrtho{T}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_KM and KM_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.