Source code for gyroid.symmetry

# -*- coding: utf-8 -*-
"""
gyroid.symmetry
===============

:copyright: (c) 2012 by Yi-Xin Liu
:license: BSD, see LICENSE for more details.

"""

import numpy as np
from numpy.linalg import inv

from .common import EPS,BRAVAIS,CARTESIAN

__all__ = ["Symmetry"]

[docs]class Symmetry(object): """ A representation of a symmetry element in a group. The basis type of a symmetry element should be either 'Cartesian' or 'Bravais'. A symmetry element contains a point group matrix and a translation vector. """ def __init__(self,dim,basis_type,shape_matrix,R=None,t=None): """ *dim can be 1, 2 and 3 *basis_type should be "Bravais" or "Cartesian" *shape_matrix is a shape matrix in Real space *R the point group symmetry matrix *t the translational symmetry vector. For __eq__ functioning correct, it must lie in the first unit cell. """ self.dim = dim self.type = basis_type self.shape = shape_matrix if R is not None and np.size(R) == dim*dim: self.R = R else: raise ValueError("Dimensian and R not match") if t is not None and np.size(t) == dim: self.t = shape_matrix.shift(t,basis_type) else: raise ValueError("Dimensian and t not match")
[docs] def inverse(self): iR = inv(self.R) it = -1.0 * np.dot(iR,self.t) it = self.shape.shift(it,self.type) return Symmetry(self.dim,self.type,self.shape,iR,it)
def __mul__(self,rhs): if self.dim != rhs.dim or self.type != rhs.type: raise ValueError("Incompatible symmetries for multiplication.") R = np.dot(self.R,rhs.R) t = np.dot(self.R,rhs.t) + self.t t = self.shape.shift(t,self.type) return Symmetry(self.dim,self.type,self.shape,R,t) def __eq__(self,rhs): if self.dim != rhs.dim: return False if self.type != rhs.type: return False if np.any(np.abs(self.R - rhs.R) > EPS): return False if np.any(np.abs(self.t - rhs.t) > EPS): return False return True