Symmetry
Let \(\mathbf A^T=(\mathbf a_0,\mathbf a_1, \mathbf a_2)\), where \(\mathbf a_0\), \(\mathbf a_1\) and \(\mathbf a_2\) are the lattice vectors of the unit cell.
Note
\((\mathbf a_c)_v=\mathbf A_{cv}\) is stored in gd.cell_cv[c, v]
in units of Bohr and in atoms.cell[c, v]
in Å units.
The relation between scaled positions \(\mathbf s\) and xyz-positions \(\mathbf r\) is \(\mathbf r=\mathbf A^T\mathbf s\).
A crystal has a set of symmetry operations (symmetry.op_scc
) in
the form of matrices \(\mathbf U\) so that the lattice vectors are
transformed to \(\mathbf A'=\mathbf U\mathbf A\) and \(\mathbf r\) is
transformed to \(\mathbf r'\) as:
where \(\mathbf M=\mathbf A^T\mathbf U^T\mathbf A^{-T}\).
If we want to express \(\mathbf r'\) in terms of the original lattice vectors (\(\mathbf r'=\mathbf A^T\mathbf s'\)), we get:
Note
The \(\mathbf U\) matrices contain only the integers -1, 0 and 1. Also note, that if \(\mathbf U\) is a symmetry operation, then \(\mathbf U^{-1}\) is too.
Let \(\tilde\psi_{\mathbf k}(\mathbf r)\) be a Bloch wave function and \(\mathbf R\) any Bravais lattice vector:
Transforming \(\tilde\psi_{\mathbf k}\) with our symmetry operation, we get \(\tilde\psi'_{\mathbf k'}(\mathbf r)=\tilde\psi_{\mathbf k}(\mathbf M\mathbf r)\) and:
From this equation it is seen that \(\mathbf k'=\mathbf M^T\mathbf k\). In terms of scaled k-points \(\mathbf q\), where:
we get \(\mathbf q'=\mathbf U\mathbf q\).
Besides cystal symmetry, there is also time reversal symmetry for all systems with no magnetic field. The wavefunction for \({\mathbf k}\) and \({-\mathbf k}\) is related as:
If in addition the crystal has inversion symmetry, then the wavefunction should satisfy:
Note
Time reversal symmetry operation is not included in symmetry.op_scc
.
Details of the symmetry object
- class gpaw.symmetry.Symmetry(id_a, cell_cv, pbc_c=array([True, True, True]), tolerance=1e-07, point_group=True, time_reversal=True, symmorphic=True, allow_invert_aperiodic_axes=True)[source]
Interface class for determination of symmetry, point and space groups.
It also provides to apply symmetry operations to kpoint grids, wavefunctions and forces.
Construct symmetry object.
Parameters:
- id_a: list of int
Numbered atomic types
- cell_cv: array(3,3), float
Cartesian lattice vectors
- pbc_c: array(3), bool
Periodic boundary conditions.
- tolerance: float
Tolerance for symmetry determination.
- symmorphic: bool
Switch for the use of non-symmorphic symmetries aka: symmetries with fractional translations. Default is to use only symmorphic symmetries.
- point_group: bool
Use point-group symmetries.
- time_reversal: bool
Use time-reversal symmetry.
- tolerance: float
Relative tolerance.
Attributes:
- op_scc:
Array of rotation matrices
- ft_sc:
Array of fractional translation vectors
- a_sa:
Array of atomic indices after symmetry operation
- has_inversion:
(bool) Have inversion
- analyze(spos_ac)[source]
Determine list of symmetry operations.
First determine all symmetry operations of the cell. Then call
prune_symmetries
to remove those symmetries that are not satisfied by the atoms.It is not mandatory to call this method. If not called, only time reversal symmetry may be used.
- check_one_symmetry(spos_ac, op_cc, ft_c, a_ij)[source]
Checks whether atoms satisfy one given symmetry operation.
- reduce(bzk_kc, comm=None)[source]
Reduce k-points to irreducible part of the BZ.
Returns the irreducible k-points and the weights and other stuff.
- symmetrize_wavefunction(a_g, kibz_c, kbz_c, op_cc, time_reversal)[source]
Generate Bloch function from symmetry related function in the IBZ.
- a_g: ndarray
Array with Bloch function from the irreducible BZ.
- kibz_c: ndarray
Corresponding k-point coordinates.
- kbz_c: ndarray
K-point coordinates of the symmetry related k-point.
- op_cc: ndarray
Point group operation connecting the two k-points.
- time-reversal: bool
Time-reversal symmetry required in addition to the point group symmetry to connect the two k-points.