Cubic symmetry
Cubic symmetry is invariance under the octahedral group
TensND gives it a dedicated storage type (TensCubic, src/tens_cubic.jl): three constants plus a cube frame, against nine for orthotropy and 21 for a general minor- and major-symmetric tensor.
It sits between the two classes it borrows from, and it is worth saying which half comes from where. Its algebra is the isotropic one; its geometry is the orthotropic one.
Three constants, and why exactly three
Under
Schur's lemma then says the commutant — the tensors that commute with every element of the group, which is exactly the tensors invariant under it — is spanned by the three orthogonal projectors onto those subspaces. Hence three constants, no more and no fewer:
In Kelvin–Mandel form and in the cube frame, with
which are mutually orthogonal, idempotent, sum to the identity, and have traces
That last identity is the whole relationship between the two classes. An isotropic tensor is the cubic one with iso_to_cubic needs no frame argument beyond the one it is told to use, and why the promotion is exact.
The matrix in the cube frame
tens_cubic builds one from arg_cubic reads them back; the type stores the projector coefficients, following TensISO's KM and the one above is KM_material, related by the same orthogonal congruence as for orthotropy.
The algebra is componentwise — and the class is closed under it
Because the three projectors are orthogonal and idempotent, every operation is a coefficient-wise operation:
Two consequences follow that neither of the neighboring classes enjoys.
The product of two cubic tensors is cubic. Contrast Orthotropy, where the product leaves the class because two symmetric
Major symmetry is automatic. The three projectors are symmetric, so any combination of them is. A tensor with the minor symmetries and cubic symmetry is therefore major-symmetric whether or not it was built to be — which matters in practice: a strain localization tensor has no major symmetry in general and recovers it as soon as the morphology is cube-symmetric.
The frame, and the one place cubic differs from orthotropy
Like TensOrtho and unlike TensISO, a cubic tensor is only cubic relative to something: its cube axes. The type therefore carries an orthonormal frame.
But the three projectors are invariant under the whole octahedral group, so two frames related by a signed permutation of the axes describe the same tensor with the same coefficients. Permuting the axes of an orthotropic tensor permutes
At order two, cubic is isotropic
The octahedral group leaves no second-order tensor invariant but a multiple of the identity, so there is no TensCubic at order 2 and proj_tens(Val(:CUBIC), ::AbstractArray{T,2}, frame) returns the isotropic projection.
This is not a technicality. It is why a cube-symmetric pore has a single scalar resistivity contribution while its compliance contribution needs three constants — and therefore why a conduction computation on such a morphology carries no anisotropy signal at all, whatever the shape does in elasticity.
The rotational average, in closed form
The exact
the weights isotropify uses this rather than expanding 81 components.
What the average discards is measured by cubic_anisotropy, the Zener-type ratio
exactly zero when
Where the class sits
Every arrow is an exact re-expression. Note what is not drawn: there is no arrow between TensCubic and TensTI{4}. The two classes are incomparable — their intersection is the isotropic class and neither contains the other — so a sum of the two is generally fully anisotropic, and TensND falls through to the unstructured route rather than pretending otherwise.
Pushing an arbitrary tensor down the chain is approximation, and is the subject of Projection onto a symmetry class; best_fit_cubic is the entry point at a fixed cube frame, proj_tens(Val(:CUBIC), A) optimizes the orientation as it does for a TI axis or an orthotropic frame, and both report how much was discarded.
That the orientation can be optimized deserves a word, because the group is discrete and the conclusion is the opposite of what that suggests. What is optimized is not an element of
There is, however, one place where this class is genuinely less well served than its neighbors, and it is a property of the symmetry rather than of the implementation. The transversely isotropic and orthotropic searches each start from an eigenstructure candidate, exact whenever the tensor really has the symmetry sought. Cubic symmetry admits none, because
every second-order contraction of a cubic tensor is isotropic. No eigenframe can therefore say where the cube points — the cube axes are a genuinely fourth-order feature. Handing the orthotropic candidate a cubic tensor returns an arbitrary frame, measured at a relative residual of best_sym_tens needs optimize_angles = true, or the frame.