Source code for gyroid.space_group

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

"""

import numpy as np
from numpy.linalg import inv

from .symmetry import Symmetry

__all__ = ["symmetry_generator1",
           "symmetry_generator2",
           "symmetry_generator3"
          ]

[docs]def symmetry_generator1(ITA_number,b,h): ''' Output 1D space point group symmetry generators. There are **2** 1D space groups. Currently, all 1D space groups are supported:: [1, 2] :param ITA_number: 1 for P1, 2 for P-1 :type ITA_number: integer :param b: basis type :type b: string :param h: the shape of a unit cell :type h: :class:`Shape` :returns: the minimun number of symmetries which can be further expanded to the full set of point group symmetries :rtype: a list of :class:`Symmetry` objects ''' I = np.eye(1) t0 = np.zeros(1) sI = Symmetry(1,b,h,I,t0) if ITA_number == 1: return [sI] elif ITA_number == 2: return [sI, Symmetry(1,b,h,-1.0*I,t0) ] else: raise ValueError('ITA number is not 1D.')
[docs]def symmetry_generator2(ITA_number,b,h): ''' Output 2D space point group symmetry generators. There are **17** 2D space groups. Currently, Only following 2D space groups are supported:: [1,2,3,4,5,6,17] :param ITA_number: a sequential number as given in the International Tables for Crystallography, Vol. A, allowed range `[1,17]` :type ITA_number: integer :param b: basis type :type b: string :param h: the shape of a unit cell :type h: :class:`Shape` :returns: the minimun number of symmetries which can be further expande to the full set of point group symmetries :rtype: a list of :class:`Symmetry` objects ''' I = np.eye(2) t0 = np.zeros(2) sI = Symmetry(2,b,h,I,t0) # q = 1/4, r = 3/4, s= 1/2, o = 1/8 # Rotation R200 = np.array([[-1., 0.], [ 0.,-1.]]) R20y = np.array([[-1.,0.], [ 0.,1.]]) R300 = np.array([[0.,-1.], [1.,-1.]]) Rmxx = np.array([[ 0.,-1.], [-1., 0.]]) Rmx0 = np.array([[1., 0.], [0.,-1.]]) # Translation t0s = np.array([.0,.5]) ts0 = np.array([.5,.0]) tss = np.array([.5,.5]) if ITA_number == 1: # P1, Oblique return [sI] if ITA_number == 2: # P2, Oblique return [sI, Symmetry(2,b,h,R200,t0) ] if ITA_number == 3: # Pm, Rectangular return [sI, Symmetry(2,b,h,R20y,t0) ] if ITA_number == 4: # Pg, Rectangular return [sI, Symmetry(2,b,h,R20y,t0s) ] if ITA_number == 5: # cm, Rectangular return [sI, Symmetry(2,b,h,R20y,t0), Symmetry(2,b,h,I,tss) ] if ITA_number == 6: # P2mm, Rectangular return [sI, Symmetry(2,b,h,R20y,t0), Symmetry(2,b,h,R200,t0) ] if ITA_number == 17: # "P6mm 2D", Hexagonal return [sI, Symmetry(2,b,h,R300,t0), Symmetry(2,b,h,R200,t0), Symmetry(2,b,h,Rmxx,t0) ] raise ValueError('ITA number not supported.')
[docs]def symmetry_generator3(ITA_number,b,h): ''' Output 3D space point group symmetry generators. There are **230** 3D space groups. The symmetry generators can be found at http://cryst.ehu.es/cryst/get_gen.html. Currently, the supported 3D space groups are:: [183, 229, 230] :param ITA_number: a sequential number as given in the International Tables for Crystallography, Vol. A, allowed range `[1,17]` :type ITA_number: integer :param b: basis type :type b: string :param h: the shape of a unit cell :type h: :class:`Shape` :returns: the minimun number of symmetries which can be further expande to the full set of point group symmetries :rtype: a list of :class:`Symmetry` ''' I = np.eye(3) t0 = np.zeros(3) sI = Symmetry(3,b,h,I,t0) # q = 1/4, r = 3/4, s= 1/2, o = 1/8 # Rotation R300z = np.array([[0.,-1.,0.], [1.,-1.,0.], [0., 0.,1.]]) R200z = np.array([[-1., 0.,0.], [ 0.,-1.,0.], [ 0., 0.,1.]]) R20y0 = np.array([[-1.,0., 0.], [ 0.,1., 0.], [ 0.,0.,-1.]]) Rmxxz = np.array([[ 0.,-1.,0.], [-1., 0.,0.], [ 0., 0.,1.]]) R2q0z = np.array([[-1., 0.,0.], [ 0.,-1.,0.], [ 0., 0.,1.]]) R20yq = np.array([[-1.,0., 0.], [ 0.,1., 0.], [ 0.,0.,-1.]]) R3xxx = np.array([[0.,0.,1.], [1.,0.,0.], [0.,1.,0.]]) R2xxo = np.array([[0.,1., 0.], [1.,0., 0.], [0.,0.,-1.]]) R2xx0 = np.array([[0.,1., 0.], [1.,0., 0.], [0.,0.,-1.]]) R1000 = np.array([[-1., 0., 0.], [ 0.,-1., 0.], [ 0., 0.,-1.]]) # Translation Ts0s = np.array([.5,.0,.5]) T0ss = np.array([.0,.5,.5]) Trqq = np.array([.75,.25,.25]) Tsss = np.array([.5,.5,.5]) if ITA_number == 183: # "P6mm 3D", Hexagonal return [sI, Symmetry(3,b,h,R300z,t0), Symmetry(3,b,h,R200z,t0), Symmetry(3,b,h,Rmxxz,t0) ] if ITA_number == 229: # "Im-3m 3D", Cubic return [sI, Symmetry(3,b,h,R200z,t0), Symmetry(3,b,h,R20y0,t0), Symmetry(3,b,h,R3xxx,t0), Symmetry(3,b,h,R2xx0,t0), Symmetry(3,b,h,R1000,t0), Symmetry(3,b,h,I,Tsss) ] if ITA_number == 230: # "Ia-3d 3D", Cubic return [sI, Symmetry(3,b,h,R2q0z,Ts0s), Symmetry(3,b,h,R20yq,T0ss), Symmetry(3,b,h,R3xxx,t0), Symmetry(3,b,h,R2xxo,Trqq), Symmetry(3,b,h,R1000,t0), Symmetry(3,b,h,I,Tsss) ] else: raise ValueError('ITA number not supported.')

Related Topics