Symmetry Operators

A group is made of elements that satisfy certain relations and the 4 postulates which are:

  • Closure: \(A,B\in G \rightarrow A\cdot B=C\in G\)

  • Associativity \((A\cdot B)\cdot C = A\cdot (B \cdot C)\)

  • Identity element \(A\cdot \hat{1} = \hat{1} \cdot A = A\)

  • Inverse element \(A\cdot A^{-1} = A^{-1} \cdot A = \hat{1}\)

Relations for the P4 (#75) space group are:

P4_relations.png

Let’s check these relations using the symmetry operators listed by GENPOS

P4_symops.png

import numpy as np

o1 = np.eye(3,3)
o2 = np.diag([-1,-1,1])
o4p = np.array([[0,-1,0],[1,0,0],[0,0,1]])
o4m = np.array([[0,1,0],[-1,0,0],[0,0,1]])

for op in [o1,o2,o4p,o4m]:
    print(op,"\n","-"*30)
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]] 
 ------------------------------
[[-1  0  0]
 [ 0 -1  0]
 [ 0  0  1]] 
 ------------------------------
[[ 0 -1  0]
 [ 1  0  0]
 [ 0  0  1]] 
 ------------------------------
[[ 0  1  0]
 [-1  0  0]
 [ 0  0  1]] 
 ------------------------------

\(4^+\otimes4^- \stackrel{?}{=} 1\)

np.alltrue(np.dot(o4p,o4m) == o1)
True

\(4^+\otimes2 \stackrel{?}{=} 4^-\)

np.alltrue(np.dot(o4p,o2) == o4m)
True

\(4^+\otimes4^+ \stackrel{?}{=} 2\)

np.alltrue(np.dot(o4p,o4p) == o2)
True

\(4^-\otimes4^- \stackrel{?}{=} 2\)

np.alltrue(np.dot(o4m,o4m) == o2)
True

\(\left({4^+}\right)^3 \stackrel{?}{=} 4^-\)

np.alltrue(np.linalg.matrix_power(o4p,3) == o4m)
True

So, they hold. But we could satisfy the same relations, using different definitions for the operators, like:

\[\begin{split}\begin{align*}4^+ &\equiv i\\ 4^- &\equiv -i\\ 2 &\equiv -1 \\ 1 &\equiv 1\end{align*}\end{split}\]

Let’s label these new operators as r:

r4p = 1j
r4m = -1j
r2 = -1
r1 = 1
print(np.alltrue(np.dot(r4p,r4m) == r1))
print(np.alltrue(np.dot(r4p,r2) == r4m))
print(np.alltrue(np.dot(r4p,r4p) == r2))
print(np.alltrue(np.dot(r4m,r4m) == r2))
print(np.alltrue(r4p**3 == r4m))
True
True
True
True
True

As long as the relations (and the 4 postulates) hold, one can choose any representation set for the operators, even the trivial “let’s set all equal to 1!”

s4p = s4m = s2 = s1 = 1

print(np.alltrue(np.dot(s4p,s4m) == s1))
print(np.alltrue(np.dot(s4p,s2) == s4m))
print(np.alltrue(np.dot(s4p,s4p) == s2))
print(np.alltrue(np.dot(s4m,s4m) == s2))
print(np.alltrue(s4p**3 == s4m))
True
True
True
True
True

Matrix Represantation

Matrix-Column Pair \((W,w)\)

In general, a symmetry operator \((W,w)\) consists of two parts:

  • Rotation, reflection, inversion (\(W\))

  • Translation (\(w\))

The rotation/reflection/inversion operations are represented in 3D by \(3\times3\) matrix, and the translation operations are represented by a \(3\times1\) vector. In matrix notation:

\[\begin{split}W = \begin{pmatrix}W_{11}&W_{12}&W_{13}\\W_{21}&W_{22}&W_{23}\\W_{31}&W_{32}&W_{33}\end{pmatrix},\quad w = \begin{pmatrix}w_1\\w_2\\w_3\end{pmatrix}\end{split}\]

They operate on a position \(\vec x = \begin{pmatrix}x_1\\x_2\\x_3\end{pmatrix}\) as:

\[\begin{split}\begin{align*}x_1' &= W_{11}x_1+W_{12}x_2+W_{13}x_3+w_1\\ x_2' &= W_{21}x_1+W_{22}x_2+W_{33}x_3+w_2\\ x_3' &= W_{31}x_1+W_{32}x_2+W_{33}x_3+w_3\end{align*}\end{split}\]

or:

\[\begin{split}\begin{pmatrix}x_1'\\x_2'\\x_3'\end{pmatrix}=\begin{pmatrix}W_{11}&W_{12}&W_{13}\\W_{21}&W_{22}&W_{23}\\W_{31}&W_{32}&W_{33}\end{pmatrix}\begin{pmatrix}x_1\\x_2\\x_3\end{pmatrix} + \begin{pmatrix}w_1\\w_2\\w_3\end{pmatrix}\end{split}\]

or, equivalently:

\[x' = Wx+w = (W,w)x\]

and the inverse of an operator is given as:

\[(W,w)^{-1} = (W^{-1},-W^{-1}w)\]

Augmented Matrix Form

For practical purposes, instead of first applying the rotation/reflection/inversion part and then the translation part, we can join these two operations into one operation via the so called “augmented matrix” form:

\[\begin{split}\mathcal{W}=\begin{pmatrix} & & &\vdots&\\ &W&&\vdots&w\\ & & &\vdots&\\ \dots&\dots&\dots&\vdots&\dots\\ 0&0&0&\vdots&1\end{pmatrix}\end{split}\]

where we also denote the positions as a \(4\times 1\) vector:

\[\begin{split}\mathcal{x} = \begin{pmatrix} x_1\\x_2\\x_3\\\dots\\1\end{pmatrix}\end{split}\]

This way, the transformed coordinate is obtained via a simple multiplication:

\[\mathcal{x}' = \mathcal{W} \mathcal{x}\]

and the inverse of an operator is evaluated simply as: \(\mathcal W^{-1}\)

Example: Applying symmetry operator on a site

Apply the \(4^+(0,0,1/4)\) operator on \(x_1=(0.1,0.2,0.3)\) to derive \(x_2\). Then apply the inverse of this operator to \(x_2\) to reach back \(x_1\).

via (W,w) notation:

W = np.array([[0,-1,0],[1,0,0],[0,0,1]])
w = np.array([[0],[0],[1/4]])
x_1 = np.array([[0.1],[0.2],[0.3]])

x_2 = np.dot(W,x_1) + w

print(x_2)
[[-0.2 ]
 [ 0.1 ]
 [ 0.55]]
W_inv = np.linalg.inv(W)
w_inv = np.dot(-W_inv,w)

x_3 = np.dot(W_inv,x_2) + w_inv

print(np.all(np.isclose(x_1,x_3)))
True

via the augmented matrix notation:

W_a = np.zeros((4,4))
W_a[0:3,0:3] = W
W_a[0:3,3] = w.reshape(3)
W_a[3,3] = 1
print(W_a)
[[ 0.   -1.    0.    0.  ]
 [ 1.    0.    0.    0.  ]
 [ 0.    0.    1.    0.25]
 [ 0.    0.    0.    1.  ]]
x_1a = np.array(([[0.1],[0.2],[0.3],[1]]))
x_2a = np.dot(W_a,x_1a)
print(x_2a)
[[-0.2 ]
 [ 0.1 ]
 [ 0.55]
 [ 1.  ]]
W_inv_a = np.linalg.inv(W_a)
x_3a = np.dot(W_inv_a,x_2a)

print(np.all(np.isclose(x_1a,x_3a)))
True

xyz Notation

A symmetry operator in matrix form can be read row-wise with each of its rows interpreted as a combination of x, y and z, with the translation appended as a sum. Consider the \(4_1\) operator, represented in matrix form as:

\[\begin{split}\begin{pmatrix}0&-1&0&\vdots&0\\ 1&0&0&\vdots&0\\ 0&0&1&\vdots&\tfrac{1}{4} \end{pmatrix}\end{split}\]

where the \(3\times3\) is the rotation/reflection/inversion part and the rightmost \(3\times1\) column is the translation part. The \(3\times3\) part is interpreted such that the first column is associated with \(x\), the second with \(y\) and the third with \(z\). The first row in our case (\([0 -1 0]\)) is then read as \(-y\), the second as \(x\) and the third as \(z\). Without the translational part we have: \(-y,x,z\) and appending the translation \((0,0,\tfrac{1}{4})\) yields the correct representation in the xyz notation: \(-y,x,z+\tfrac{1}{4}\).

For a more complex case, consider the \(\{2_{010}|0 0 \tfrac{1}{2}\}\) operator of the P6/mcc (#192) space group:

\[\begin{split}\begin{pmatrix}-1&0&0&\vdots&0\\ -1&1&0&\vdots&0\\ 0&0&-1&\vdots&\tfrac{1}{2} \end{pmatrix}\end{split}\]

which is written in the xyz notation as: \(-x,-x+y,-z+\tfrac{1}{2}\)

Constructing the matrix representation of an operation

As each point in space has 3 components related to the 3 base vectors and thus can be written as the sum of each basis vector multiplied by a scalar, considering the effect of a symmetry operator on a point can be handled as the effect of the operator on each one of the base vectors. Thus, to write a symmetry operator in matrix representation, it is sufficient to analyze its effect on the \((1,0,0),(0,1,0),(0,0,1)\) base vectors.

Caution

Base vectors aren’t necessarily perpendicular to each other in general.

Consider a 4-fold (90°) rotation along the z-axis (ccw) in a Cartesian coordinate system: In order to construct the matrix representation, it is sufficient to investigate how each point at the edge of the base vectors are affected:

\[\begin{split}\begin{pmatrix}1\\0\\0\end{pmatrix} \rightarrow \begin{pmatrix}0\\1\\0\end{pmatrix},\quad\begin{pmatrix}0\\1\\0\end{pmatrix} \rightarrow \begin{pmatrix}-1\\0\\0\end{pmatrix},\quad\begin{pmatrix}0\\0\\1\end{pmatrix} \rightarrow \begin{pmatrix}0\\0\\1\end{pmatrix}\end{split}\]

Arranging and writing the resulting points next to each other, we thus derive the matrix representation:

\[\begin{split}4^+ = \begin{pmatrix}0 &-1 & 0 \\1 &0& 1\\0 &0& 1\end{pmatrix}\end{split}\]

Next, consider the \(m_{010}\) reflection operator (for a Cartesian system): it operates as a mirror reflecting the y-component, so:

\[\begin{split}\begin{pmatrix}1\\0\\0\end{pmatrix} \rightarrow \begin{pmatrix}1\\0\\0\end{pmatrix},\quad\begin{pmatrix}0\\1\\0\end{pmatrix} \rightarrow \begin{pmatrix}0\\-1\\0\end{pmatrix},\quad\begin{pmatrix}0\\0\\1\end{pmatrix} \rightarrow \begin{pmatrix}0\\0\\1\end{pmatrix}\end{split}\]
\[\begin{split}m_{010} = \begin{pmatrix}1 &0 & 0 \\0 &-1& 0\\0 &0& 1\end{pmatrix}\end{split}\]

The reasoning

This approach works because as any point is represented as: \(A=\alpha \hat a + \beta \hat b + \gamma \hat c\) where \((\alpha,\beta,\gamma)\) are scalars and \((\hat a,\hat b,\hat c)\) are the base vectors, an operator \(\hat O\) acting on this point:

\[\begin{split}\begin{align}\hat O A &= \hat O \left(\alpha \hat a + \beta \hat b + \gamma \hat c\right)\\ &=\hat O \left[\alpha \begin{pmatrix}1\\0\\0\end{pmatrix} + \beta \begin{pmatrix}0\\1\\0\end{pmatrix} + \gamma \begin{pmatrix}0\\0\\1\end{pmatrix}\right]\\ &= \alpha \hat O\begin{pmatrix}1\\0\\0\end{pmatrix} + \beta \hat O\begin{pmatrix}0\\1\\0\end{pmatrix} + \gamma \hat O\begin{pmatrix}0\\0\\1\end{pmatrix} \end{align}\end{split}\]

which justifies the reasoning behind our construction of the matrix representation of the symmetry operators by focusing on their effects on the base vectors themselves.