Groups
All groups in Crystalline are concrete instances of the abstract supertype Crystalline.AbstractGroup{D}
, referring to a group in D
dimensions. Crystalline.AbstractGroup{D}
is itself a subtype of AbstractVector{SymOperation{D}}
. Crystalline currently supports five group types: SpaceGroup
, PointGroup
, LittleGroup
, SubperiodicGroup
, SiteGroup
, and MSpaceGroup
.
Example: space groups
The one, two, and three-dimensional space groups are accessible via spacegroup
, which takes the space group number sgnum
and dimensino D
as input (ideally, the dimension is provided as a Val{D}
for the sake of type stability) and returns a SpaceGroup{D}
structure:
using Crystalline
D = 3 # dimension
sgnum = 16 # space group number (≤2 in 1D, ≤17 in 2D, ≤230 in 3D)
sg = spacegroup(sgnum, D) # where practical, `spacegroup` should be called with a `Val{D}` dimension to ensure type stability; here we have D::Int instead for simplicity
SpaceGroup{3} ⋕16 (P222) with 4 operations:
1
2₀₀₁
2₀₁₀
2₁₀₀
By default, the returned operations are given in the conventional setting of the International Tables of Crystallography, Volume A (ITA). Conversion to a primitive basis (in the CDML setting) can be accomplished via primitivize
.
In addition to space groups, Crystalline.jl provides access to the operations of point groups (pointgroup
), little groups (littlegroups
), subperiodic groups (subperiodicgroup
; including rod, layer, and frieze groups), site symmetry groups (sitegroup
and sitegroups
), and magnetic space groups (mspacegroup
).
Multiplication tables
We can compute the multiplication table of a space group (under the previously defined notion of operator composition) using MultTable
:
MultTable(sg)
4×4 MultTable{SymOperation{3}}:
──────┬────────────────────────
│ 1 2₀₀₁ 2₀₁₀ 2₁₀₀
──────┼────────────────────────
1 │ 1 2₀₀₁ 2₀₁₀ 2₁₀₀
2₀₀₁ │ 2₀₀₁ 1 2₁₀₀ 2₀₁₀
2₀₁₀ │ 2₀₁₀ 2₁₀₀ 1 2₀₀₁
2₁₀₀ │ 2₁₀₀ 2₀₁₀ 2₀₀₁ 1
──────┴────────────────────────
Alternatively, exploiting overloading of the *
-operator, "raw" multiplication tables can be constructed via a simple outer product:
sg .* permutedims(sg) # equivalent to `reshape(kron(sg, sg), (length(sg), length(sg)))`
4×4 Matrix{SymOperation{3}}:
1 2₀₀₁ 2₀₁₀ 2₁₀₀
2₀₀₁ 1 2₁₀₀ 2₀₁₀
2₀₁₀ 2₁₀₀ 1 2₀₀₁
2₁₀₀ 2₀₁₀ 2₀₀₁ 1
Symmorphic vs. nonsymorphic space groups
To determine whether a space group is symmorphic or not, use issymmorph
taking either a SpaceGroup
, LittleGroup
, or SubperiodicGroup
(or a SpaceGroup
identified by its number and dimensionality; in this case, using tabulated look-up). To test whether a given SymOperation
is symmorphic in a given centering setting, use issymmorph(::SymOperation, ::Char)
Group generators
Generators of SpaceGroup
s, PointGroup
s, and SubperiodicGroup
s are accessible via generators
, e.g.:
ops = generators(sgnum, SpaceGroup{D})
2-element Vector{SymOperation{3}}:
2₀₀₁
2₀₁₀
To generate a group from a list of generators, we can use the generate
method. As an example, we can verify that ops
in fact returns symmetry operations identical to those in sg
:
generate(ops)
GenericGroup{3} with 4 operations:
2₀₀₁
2₀₁₀
1
2₁₀₀
Magnetic space groups
Magnetic space groups are accessible via mspacegroup
.