Skip to content

Cubic symmetry

Cubic symmetry is invariance under the octahedral group : the 48 isometries of a cube. It is the class of a cubic crystal, of a cubic array of inclusions, and of any body whose shape is left invariant by those isometries — a supersphere, for instance.

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 the six-dimensional space of minor-symmetric second-order-pair tensors splits into three inequivalent irreducible representations, each of multiplicity one:

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 , , . is the spherical projector of the isotropic class; and are what the isotropic class merges into the single deviatoric projector,   .

That last identity is the whole relationship between the two classes. An isotropic tensor is the cubic one with  , about every cube — which is why 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 and arg_cubic reads them back; the type stores the projector coefficients, following TensISO's rather than the engineering constants, because that is what makes the algebra below literal. The matrix in the canonical frame is 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   blocks commute only exceptionally, and The Walpole basis, where a product of two   tensors lands in  . Here every irreducible representation appears once, so any two cubic tensors about the same cube commute, and the class is a genuine commutative subalgebra.

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 ; permuting those of a cubic one changes nothing. Binary operations therefore accept any two frames describing the same cube, tested as " is a signed permutation matrix" — nine comparisons, rather than enumerating 24 rotations.

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 average projects onto , and reads off the coefficients directly:

the weights and being the dimensions of and . It is exact, not a fit: is already isotropic and the rest is its trace spread over the five remaining dimensions. isotropify uses this rather than expanding 81 components.

What the average discards is measured by cubic_anisotropy, the Zener-type ratio

exactly zero when  , which is exactly when the tensor is isotropic. It is precisely the third constant that a two-constant approximation of a cubic tensor throws away.

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 but the orientation of the cube, which is an ordinary rotation: the objective is smooth in the Euler angles, exactly as for the other two classes. The group leaves one trace, and it is harmless — the minimum is 24-fold degenerate, and all 24 frames describe the same tensor with the same coefficients.

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 against   for the true one. So the search starts from the angular grid alone, and a rotated cubic tensor handed over as a bare array cannot be recognized without it: best_sym_tens needs optimize_angles = true, or the frame.