Source code for nanotools.data.kpoint

# -*- coding: utf-8 -*-
"""This module defines the ``Kpoint`` class."""

import numpy as np
from nanotools.cell import bra2avec
from nanotools.utils import is_row_vector


[docs] def defaultSymmetryKPoints(crystalStructure, avecStd): """Returns a linear BZ sampling given the crystal structure and lattice vectors. Args: crystalStructure (string): Name of the Bravais lattice. avecStd (2D array): (3 x 3) array of row-vectors corresponding to the lattice vectors in the standard ordering (AFLOW). Returns: symmetryKPoints (list of strings): Path of high-symmetry k-point labels. Remarks: Lei Liu, HZWTech 2015-10 Vincent Michaud-Rioux 2020-06-23 """ avecStd = avecStd.transpose() # here primitiveCellVectors = [a1 a2 a3] epsilon = 1e-3 if crystalStructure.lower() in ["cubic", "cub", "simplecubic", "sc", "cp"]: # 1: ucv = pcv = [[1 0 0]', [0 1 0]', [0 0 1]'] # symmetryKPoints = [["G","X","M","G","R","X"],["M","R"]] symmetryKPoints = [["G", "X", "M", "G", "R", "X"], ["M", "R"]] # ["G", "X", "M", "G", "R", "X"] ["M", "R"] elif crystalStructure.lower() in ["facecenteredcubic", "fcc", "cf"]: # 2: pcv = [[0 1./2. 1./2.]', [1./2., 0, 1./2.]', [1./2. 1./2. 0]'] # ucv = [[1 0 0]', [0 1 0]', [0 0 1]'] # symmetryKPoints = ["U","X","G","X","W","K","G","L","U","W","L","K"] symmetryKPoints = [ ["G", "X", "W", "K", "G", "L", "U", "W", "L", "K"], ["U", "X"], ] # ["G","X","W","K","G","L","U","W","L","K"] ["U","X"] elif crystalStructure.lower() in ["bodycenteredcubic", "bcc", "ci"]: # 3: pcv = [[-1./2. 1./2. 1./2.]', [1./2., -1./2., 1./2.]', [1./2. 1./2. -1./2.]'] # ucv = [[1 0 0]', [0 1 0]', [0 0 1]'] # symmetryKPoints = [["G","H","N","G","P","H"] ["P","N"]] symmetryKPoints = [["G", "H", "N", "G", "P", "H"], ["P", "N"]] # ["G","H","N","G","P","H"] ["P","N"] elif crystalStructure.lower() in ["tetragonal", "tet", "tp"]: # 4: ucv = pcv = [[1 0 0]', [0 1 0]', [0 0 5]'] # symmetryKPoints = [["G", "X", "M", "G", "Z", "R", "A", "Z"] ["X", "R", "G", "A", "M"]] symmetryKPoints = [ ["G", "X", "M", "G", "Z", "R", "A", "Z"], ["X", "R"], ["M", "A"], ] # ["G", "X", "M", "G", "Z", "R", "A", "Z"] ["X", "R"] ["M", "A"] elif crystalStructure.lower() in ["bodycenteredtetragonal", "bct", "ti"]: # 5: pcv = [[-1./2. 1./2. 5/2]', [1./2., -1./2., 5/2]', [1./2. 1./2. -5/2]'] # ucv = [[1 0 0]', [0 1 0]', [0 0 5]'] pcv4bcc = np.array( [ [-1.0 / 2.0, 1.0 / 2.0, 1.0 / 2.0], [1.0 / 2.0, -1.0 / 2.0, 1.0 / 2.0], [1.0 / 2.0, 1.0 / 2.0, -1.0 / 2.0], ] ).transpose() ucv4bcc = np.eye(3) pcv = avecStd ucv = np.matmul(pcv, np.linalg.solve(pcv4bcc, ucv4bcc)) if np.linalg.norm(ucv[:, 2]) < np.linalg.norm(ucv[:, 0]): type = "1" else: type = "2" if type == "1": # symmetryKPoints = ["X", "P", "G", "X", "M", "G", "Z", "P", "N", "Z1", "M"] symmetryKPoints = [ ["G", "X", "M", "G", "Z", "P", "N", "Z1", "M"], ["X", "P"], ] # ["G", "X", "M", "G", "Z", "P", "N", "Z1", "M"] ["X", "P"] elif type == "2": # symmetryKPoints = ["X", "P", "G", "X", "Y", "S", "G", "Z", "S1", "N", "P", "Y1", "Z"] symmetryKPoints = [ ["G", "X", "Y", "S", "G", "Z", "S1", "N", "P", "Y1", "Z"], ["X", "P"], ] # ["G", "X", "Y", "S", "G", "Z", "S1", "N", "P", "Y1", "Z"], ["X", "P"] elif crystalStructure.lower() in ["orthorhombic", "orc", "op"]: # 6: ucv = pcv = [[1 0 0]', [0 2 0]', [0 0 3]'] # symmetryKPoints = ["G","X","U","R","X","S","R","T","S","Y","T","Z","Y","G","Z","U","G"] symmetryKPoints = [ ["G", "X", "S", "Y", "G", "Z", "U", "R", "T", "Z"], ["Y", "T"], ["U", "X"], ["S", "R"], ] # ["G", "X", "S", "Y", "G", "Z", "U", "R", "T", "Z"], ["Y", "T"], ["U", "X"], ["S", "R"] elif crystalStructure.lower() in ["facecenteredorthorhombic", "orcf", "of"]: # 7: pcv = [[0 2/2 3/2]', [1./2., 0, 3/2]', [1./2. 2/2 0]'] # ucv = [[1 0 0]', [0 2 0]', [0 0 3]'] pcv4fcc = np.array( [ [0, 1.0 / 2.0, 1.0 / 2.0], [1.0 / 2.0, 0, 1.0 / 2.0], [1.0 / 2.0, 1.0 / 2.0, 0], ] ).transpose() ucv4fcc = np.eye(3) pcv = avecStd ucv = np.matmul(pcv, np.linalg.solve(pcv4fcc, ucv4fcc)) a = np.linalg.norm(ucv[:, 0]) b = np.linalg.norm(ucv[:, 1]) c = np.linalg.norm(ucv[:, 2]) d = (1.0 / b**2 + 1.0 / c**2 - 1.0 / a**2) * max([a**2, b**2, c**2]) if d < -epsilon: type = "1" elif d > epsilon: type = "2" else: type = "3" if type == "1": # symmetryKPoints = [["G", "Y", "T", "Z", "G", "X", "A1", "Y"], ["T", "X1", "G", "L"], ["X", "A", "Z"]] symmetryKPoints = [ ["G", "Y", "T", "Z", "G", "X", "A1", "Y"], ["T", "X1"], ["X", "A", "Z"], ["L", "G"], ] # ["G", "Y", "T", "Z", "G", "X", "A1", "Y"], ["T", "X1"], ["X", "A", "Z"], ["L", "G"] elif type == "2": # symmetryKPoints = [["G", "Y", "C", "D", "X", "G", "Z", "D1", "H", "C"], ["X", "H1", "G", "C1", "Z"], ["L", "G", "H", "Y"]] symmetryKPoints = [ ["G", "Y", "C", "D", "X", "G", "Z", "D1", "H", "C"], ["C1", "Z"], ["X", "H1"], ["H", "Y"], ["L", "G"], ] # ["G", "Y", "C", "D", "X", "G", "Z", "D1", "H", "C"], ["C1", "Z"], ["X", "H1"], ["H", "Y"], ["L", "G"] elif type == "3": # symmetryKPoints = [["L", "G", "Y", "T", "Z", "G", "X", "A1", "Y"], ["X", "A", "Z"]] symmetryKPoints = [ ["G", "Y", "T", "Z", "G", "X", "A1", "Y"], ["X", "A", "Z"], ["L", "G"], ] # ["G", "Y", "T", "Z", "G", "X", "A1", "Y"], ["X", "A", "Z"], ["L", "G"] elif crystalStructure.lower() in ["bodycenteredorthorhombic", "orci", "oi"]: # 8: pcv = [[-1./2. 2/2 3/2]', [1./2., -2/2, 3/2]', [1./2. 2/2 -3/2]'] # ucv = [[1 0 0]', [0 2 0]', [0 0 3]'] # symmetryKPoints = [["G", "X", "L", "T", "W", "R", "X1", "Z", "G", "Y", "S", "W"], ["Y", "L1", "G", "Y1", "Z"]] symmetryKPoints = [ ["G", "X", "L", "T", "W", "R", "X1", "Z", "G", "Y", "S", "W"], ["L1", "Y"], ["Y1", "Z"], ] # ["G", "X", "L", "T", "W", "R", "X1", "Z", "G", "Y", "S", "W"], ["L1", "Y"], ["Y1", "Z"] elif crystalStructure.lower() in ["ccenteredorthorhombic", "orcc", "os"]: # 9: pcv = [[1./2. -2/2 0]', [1./2., 2/2, 0]', [0 0 3]'] # ucv = [[1 0 0]', [0 2 0]', [0 0 3]'] # symmetryKPoints = ["Z","T","G","X","S","R","A","Z","G","Y","X1","A1","T","Y"] symmetryKPoints = [ ["G", "X", "S", "R", "A", "Z", "G", "Y", "X1", "A1", "T", "Y"], ["Z", "T"], ] # ["G", "X", "S", "R", "A", "Z", "G", "Y", "X1", "A1", "T", "Y"], ["Z", "T"] elif crystalStructure.lower() in ["hexagonal", "hex", "hcp", "hp"]: # 10: ucv = pcv = [[1./2. -sqrt(3)/2 0]', [1./2., sqrt(3)/2, 0]', [0 0 3]'] # symmetryKPoints = [["G", "M", "K", "G", "A", "L", "H", "A"], ["M", "L", "G", "K", "H"]] symmetryKPoints = [ ["G", "M", "K", "G", "A", "L", "H", "A"], ["L", "M"], ["K", "H"], ] # ["G", "M", "K", "G", "A", "L", "H", "A"], ["L", "M"], ["K", "H"] elif crystalStructure.lower() in ["rhombohedral", "rhl", "hr"]: # 11: ucv = pcv = [[cos(pi/5) -sin(pi/5) 0]', [cos(pi/5) sin(pi/5), 0]', # [cos(2*pi/5)/cos(pi/5), 0, sqrt(1-(cos(2*pi/5)/cos(pi/5))**2)]'] if np.dot(avecStd[:, 2], avecStd[:, 0]) > 0: type = "1" else: type = "2" if type == "1": # symmetryKPoints = [["L","P","G","L","B1","G","B","Z","G","X"],["Q","F","P1","Z"]] symmetryKPoints = [ ["G", "L", "B1"], ["B", "Z", "G", "X"], ["Q", "F", "P1", "Z"], ["L", "P"], ] # ["G", "L", "B1"], ["B", "Z", "G", "X"], ["Q", "F", "P1", "Z"], ["L", "P"] elif type == "2": # symmetryKPoints = ["G", "P", "Z", "Q", "G", "F", "P1", "Q1", "L", "Z"] symmetryKPoints = [["G", "P", "Z", "Q", "G", "F", "P1", "Q1", "L", "Z"]] # ["G", "P", "Z", "Q", "G", "F", "P1", "Q1", "L", "Z"] elif crystalStructure.lower() in ["monoclinic", "mcl", "mp"]: # 12: ucv = pcv = [[1 0 0]', [0 2 0]', [0, 3*cos(pi/5), 3*sin(pi/5)]'] # symmetryKPoints = ["Y","D","G","Y","H","G","E","M1","A","X","H1","G","M","D","Z"] symmetryKPoints = [ ["G", "Y", "H", "C", "E", "M1", "A", "X", "G", "Z", "D", "M"], ["Z", "A"], ["D", "Y"], ["X", "H1"], ] # ["G", "Y", "H", "G", "E", "M1", "A", "X", "H1"], ["M", "D", "Z"], ["Y", "D"] elif crystalStructure.lower() in ["ccenteredmonoclinic", "mclc", "ms"]: # 13: pcv = [[1./2. 2/2 0]', [-1./2. 2/2 0]', [0, 3*cos(pi/5), 3*sin(pi/5)]'] # ucv = [[1 0 0]', [0 2 0]', [0, 3*cos(pi/5), 3*sin(pi/5)]'] pcv = avecStd a = np.linalg.norm(pcv[:, 0] - pcv[:, 1]) b = np.linalg.norm(pcv[:, 0] + pcv[:, 1]) c = np.linalg.norm(pcv[:, 2]) kpcv = np.linalg.inv(pcv).transpose() kgamma = ( np.dot(kpcv[:, 0], kpcv[:, 1]) / np.linalg.norm(kpcv[:, 0]) / np.linalg.norm(kpcv[:, 1]) ) if kgamma < -epsilon: type = "1" elif abs(kgamma) < epsilon: type = "2" else: cosalpha = np.dot(pcv[:, 0] + pcv[:, 1], pcv[:, 2]) / b / c sin2alpha = 1.0 - cosalpha**2 d = b * cosalpha / c + (b**2 * sin2alpha / a**2) - 1.0 if d < -epsilon: type = "3" elif abs(d) < epsilon: type = "4" else: type = "5" if type == "1": # symmetryKPoints = [["M","G","Y","F","L","I","G","I1","Z","F1","G","X1","Y"],["X", "G", "N"]] symmetryKPoints = [ ["G", "Y", "F", "L", "I"], ["I1", "Z", "G", "X"], ["X1", "Y"], ["M", "G", "N"], ["Z", "F1"], ] # ["G","Y", "F", "L", "I"], ["I1", "Z", "F1"], ["Y", "X1"], ["X", "G", "N"], ["M", "G"] elif type == "2": # symmetryKPoints = ["N","G","Y","F","L","I","G","I1","Z","F1","G","M"] symmetryKPoints = [ ["G", "Y", "F", "L", "I"], ["I1", "Z", "F1"], ["N", "G", "M"], ] # ["G", "Y", "F", "L", "I"], ["I1", "Z", "F1"], ["N", "G", "M"] elif type == "3": # symmetryKPoints = ["M","G","Y","F","H","Z","I","F1","G","H1","Y1","X","G","N"] symmetryKPoints = [ ["G", "Y", "F", "H", "Z", "I", "X", "G", "Z"], ["M", "G", "N"], ["X", "Y1", "H1"], ["I", "F1"], ] # ["G", "Y", "F", "H", "Z", "I", "F1"], ["H1", "Y1", "X", "G", "N"], ["M", "G"] elif type == "4": # symmetryKPoints = ["M","G","Y","F","H","Z","I","G","H1","Y1","X","G","N"] symmetryKPoints = [ ["G", "Y", "F", "H", "Z", "I"], ["H1", "Y1", "X", "G", "N"], ["M", "G"], ] # ["G", "Y", "F", "H", "Z", "I"], ["H1", "Y1", "X", "G", "N"], ["M", "G"] elif type == "5": # symmetryKPoints = ["M","G","Y","F","L","I","G","I1","Z","H","F1","G","H1","Y1","X","G","N"] symmetryKPoints = [ ["G", "Y", "F", "L", "I"], ["I1", "Z", "G", "X", "Y1", "H1"], ["H", "F1"], ["F2", "X"], ["M", "G", "N"], ["H", "Z"], ] # ["G", "Y", "F", "L", "I"], ["I1", "Z", "H", "F1"], ["H1", "Y1", "X", "G", "N"], ["M", "G"] elif crystalStructure.lower() in ["triclinic", "tri", "ap"]: # 14: ucv = pcv = [[1 0 0]', [2*cos(pi/3), 2*sin(pi/3), 0]', [3*cos(pi/4), # 3/sin(pi/3)*(cos(pi/5)-cos(pi/4)*cos(pi/3)), # 3/sin(pi/3)*sqrt(1-(cos(pi/5))**2-(cos(pi/4))**2-(cos(pi/3))**2 # + 2*cos(pi/5)*cos(pi/4)*cos(pi/3))]'] : [1 2 3], [pi/5,pi/4,pi/3] kpcv = np.linalg.inv(avecStd).transpose() a = np.linalg.norm(kpcv[:, 0]) b = np.linalg.norm(kpcv[:, 1]) c = np.linalg.norm(kpcv[:, 2]) kalpha = np.dot(kpcv[:, 1], kpcv[:, 2]) / b / c kbeta = np.dot(kpcv[:, 2], kpcv[:, 0]) / c / a kgamma = np.dot(kpcv[:, 0], kpcv[:, 1]) / a / b if kalpha < 0: if kgamma < -epsilon: type = "1a" else: type = "2a" else: if kgamma > epsilon: type = "1b" else: type = "2b" if type in ["1a", "2a", "1b", "2b"]: symmetryKPoints = [ ["X", "G", "Y"], ["L", "G", "Z"], ["N", "G", "M"], ["R", "G"], ] # ["X", "G", "Y"], ["L", "G", "Z"], ["N", "G", "M"], ["R", "G"] elif type == "0D": # 0D: isolate : [10 10 10] symmetryKPoints = ["G"] elif type == "1D": # 1D: along z direction. c << a,b : [10 10 1] symmetryKPoints = ["G", "X"] elif crystalStructure.lower() in ["square2d", "squ2d"]: # 2D1: along x-y plane. c >> a,b # [[1 0 0]', [0, 1, 0]', [0 0 10]'] : [1 1 10] # analog: Tetragonal symmetryKPoints = ["G", "X", "M", "G"] elif crystalStructure.lower() in ["rectangular2d", "rectangle2d", "rec2d"]: # 2D2: along x-y plane. c >> a,b # [[1 0 0]', [0, 2, 0]', [0 0 10]'] : [1 1 10] # analog: Orthorhombic symmetryKPoints = ["G", "X", "S", "Y", "G", "S"] elif crystalStructure.lower() in ["hexagonal2d", "hexagon2d", "hex2d"]: # 2D3: along x-y plane. c >> a,b # [[1./2. -sqrt(3)/2 0]', [1./2., sqrt(3)/2, 0]', [0 0 10]'] : [1 1 10] # analog: Hexagonal symmetryKPoints = ["G", "M", "K", "G"] elif crystalStructure.lower() in [ "rhombic2d", "rhombus2d", "centeredrectangular2d", "rho2d", ]: # 2D4: along x-y plane. c >> a,b # [[1./2. -2/2 0]', [1./2., 2/2, 0]', [0 0 10]'] : [1 2 10] # analog: CCenteredOrthorhombic # pcv = [[1./2. -2/2 0]', [1./2., 2/2, 0]', [0 0 10]'] # ucv = [[1 0 0]', [0 2 0]', [0 0 10]'] symmetryKPoints = ["S", "G", "X", "S", "X1", "Y", "G", "X1"] elif crystalStructure.lower() in ["oblique2d", "obl2d"]: # 2D5: along x-y plane. c >> a,b # [[2 0 0]', [3*cos(pi/5), 3*sin(pi/5), 0]', [0 0 10]'] : [2 3 10] # analog: "Monoclinic" symmetryKPoints = ["H", "G", "Y", "H", "C", "G", "X", "H1", "G", "Y1", "H2"] else: raise Exception("Crystal structure not recognized.") return symmetryKPoints
[docs] def kValue2kSymbol(crystalStructure, primitiveCellVectors, kValue): """This function finds a high-symmetry k-point label from reduced coordinates. Args: crystalStructure (string): Name of the Bravais lattice. primitiveCellVectors (2D array): (3 x 3) array of row-vectors corresponding to the lattice vectors). kValue (1D array): High-symmetry k-point fractional coordinates. Returns: kSymbol (string): High-symmetry k-point label. """ if isinstance(kValue, list): return [ kValue2kSymbol(crystalStructure, primitiveCellVectors, k) for k in kValue ] if isinstance(kValue, str): return kValue kptDict = kSymbol_2_kValue_dict(crystalStructure, primitiveCellVectors) kSymbol = "!" for i in kptDict.keys(): if np.allclose(kValue, kptDict[i], rtol=1.0e-5, atol=1.0e-5): kSymbol = i break return kSymbol
[docs] def kSymbol2kValue(crystalStructure, primitiveCellVectors, kSymbol): """This function is to convert a high-symmetry k-point label to reduced coordinates. This function is to convert a conventional symbol for a high symmetrical point in k space into its corresponding coordinate value, where the unit of the value is the three reciprocal primitive cell vectors. Please note that each symbol actually represents a set of infinitely many equivalent points and the output coordinates is just for one of them. Args: crystalStructure (string): Name of the Bravais lattice. primitiveCellVectors (2D array): 3 x 3 array of row-vectors corresponding to the lattice vectors). kSymbol (string): High-symmetry k-point label. Returns: kValue (1D array): High-symmetry k-point fractional coordinates. """ if is_row_vector(kSymbol): return np.array(kSymbol) if isinstance(kSymbol, list): return [ kSymbol2kValue(crystalStructure, primitiveCellVectors, k) for k in kSymbol ] if not isinstance(kSymbol, str): return np.array(kSymbol) kptDict = kSymbol_2_kValue_dict(crystalStructure, primitiveCellVectors) if kSymbol not in kptDict.keys(): raise Exception( "Unknown symbol " + kSymbol + " for Bravais lattice " + crystalStructure + "." ) return np.array(kptDict[kSymbol])
[docs] def kSymbol_2_kValue_dict(crystalStructure, primitiveCellVectors): """This function returns a dictionary of the high-symmetry k-point labels of a given crystal structure in reduced coordinates. This is simply the convention for labeling points of high symmetry in the Brillouin zone. It"s origin is: Bouckaert, Smoluchowski, and Wigner, "Theory of Brillouin Zones and Symmetry Properties of Wave Functions in Crystals," Phys. Rev. 50, p. 58 (1936). The guide to all the details of this is John C. Slater, "Symmetry and Energy Bands in Crystals" (reprinted by Dover in 1972). It has all the 3-d crystal structures and, I suspect, 2-d as well. These labels may make some sense in the context of group theory (or perhaps in Hungarian), but they are commonly regarded as an arbitrary but common convention. It is also called `critical point <http://en.wikipedia.org/wiki/Brillouin_zone>`_. Args: crystalStructure (string): Name of the Bravais lattice. primitiveCellVectors (2D array): 3 x 3 array of row-vectors corresponding to the lattice vectors). Returns: kptDict (dict): High-symmetry k-points in fractional coordinates. Remark: Lei Liu, HZWTech 2015-10 Vincent Michaud-Rioux 2020-06-23 """ primitiveCellVectors = ( primitiveCellVectors.transpose() ) # here primitiveCellVectors = [a1 a2 a3] kptDict = {} epsilon = 1e-3 if crystalStructure.lower() in ["cubic", "cub", "simplecubic", "sc", "cp"]: # 1: ucv = pcv = [[1 0., 0]',[0., 1 0]',[0., 0., 1]'] kSymbols = ["G", "X", "M", "R"] kptDict[kSymbols[0]] = [0.0, 0.0, 0.0] # Gamma: Center of the Brillouin zone kptDict[kSymbols[1]] = [0.0, 0.5, 0.0] # X: Center of a face kptDict[kSymbols[2]] = [0.5, 0.5, 0.0] # M: Center of an edge kptDict[kSymbols[3]] = [0.5, 0.5, 0.5] # R: Corner point elif crystalStructure.lower() in ["facecenteredcubic", "fcc", "cf"]: # 2: pcv = [[0., .5, .5]',[.5,0,.5]',[.5, .5, 0]'] # ucv = [[1 0., 0]',[0., 1 0]',[0., 0., 1]'] kSymbols = ["G", "K", "L", "U", "W", "X"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] # Gamma: Center of the Brillouin zone kptDict[kSymbols[1]] = [ 3 / 8, 3 / 8, 3 / 4, ] # K: Middle of an edge joining two hexagonal faces kptDict[kSymbols[2]] = [0.5, 0.5, 0.5] # L: Center of a hexagonal face kptDict[kSymbols[3]] = [ 5 / 8, 1 / 4, 5 / 8, ] # U: Middle of an edge joining a hexagonal and a square face kptDict[kSymbols[4]] = [0.5, 1 / 4, 3 / 4] # W : Corner point kptDict[kSymbols[5]] = [0.5, 0.0, 0.5] # X: Center of a square face elif crystalStructure.lower() in ["bodycenteredcubic", "bcc", "ci"]: # 3: pcv = [[-.5, .5, .5]',[.5,-.5,.5]',[.5, .5, -.5]'] # ucv = [[1 0., 0]',[0., 1 0]',[0., 0., 1]'] kSymbols = ["G", "H", "P", "N"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] # Gamma: Center of the Brillouin zone kptDict[kSymbols[1]] = [0.5, -0.5, 0.5] # H: Corner point joining four edges kptDict[kSymbols[2]] = [ 1 / 4, 1 / 4, 1 / 4, ] # P: Corner point joining three edges kptDict[kSymbols[3]] = [0.0, 0.0, 0.5] # N: Center of a face elif crystalStructure.lower() in ["tetragonal", "tet", "tp"]: # 4: ucv = pcv = [[1 0., 0]',[0., 1 0]',[0., 0., 5]'] kSymbols = ["G", "A", "M", "R", "X", "Z"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] # Gamma: Center of the Brillouin zone kptDict[kSymbols[1]] = [0.5, 0.5, 0.5] kptDict[kSymbols[2]] = [0.5, 0.5, 0] kptDict[kSymbols[3]] = [0.0, 0.5, 0.5] kptDict[kSymbols[4]] = [0.0, 0.5, 0] kptDict[kSymbols[5]] = [0.0, 0.0, 0.5] elif crystalStructure.lower() in ["bodycenteredtetragonal", "bct", "ti"]: # 5: pcv = [[-.5, .5, 5/2]',[.5,-.5,5/2]',[.5, .5, -5/2]'] # ucv = [[1 0., 0]',[0., 1 0]',[0., 0., 5]'] pcv4bcc = np.array( [[-0.5, 0.5, 0.5], [0.5, -0.5, 0.5], [0.5, 0.5, -0.5]] ).transpose() ucv4bcc = np.eye(3) pcv = primitiveCellVectors ucv = np.matmul(pcv, np.linalg.solve(pcv4bcc, ucv4bcc)) if np.linalg.norm(ucv[:, 2]) < np.linalg.norm(ucv[:, 0]): type = "1" else: type = "2" if type == "1": a = np.linalg.norm(ucv[:, 0]) c = np.linalg.norm(ucv[:, 2]) eta = (1 + c**2 / a**2) / 4 kSymbols = ["G", "M", "N", "P", "X", "Z", "Z1"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [-0.5, 0.5, 0.5] kptDict[kSymbols[2]] = [0.0, 0.5, 0] kptDict[kSymbols[3]] = [1 / 4, 1 / 4, 1 / 4] kptDict[kSymbols[4]] = [0.0, 0.0, 0.5] kptDict[kSymbols[5]] = [eta, eta, -eta] kptDict[kSymbols[6]] = [-eta, 1 - eta, eta] elif type == "2": a = np.linalg.norm(ucv[:, 0]) c = np.linalg.norm(ucv[:, 2]) eta = (1.0 + a**2 / c**2) / 4.0 zeta = a**2 / c**2 / 2.0 kSymbols = ["G", "N", "P", "X", "Z", "S", "S1", "Y", "Y1"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [0.0, 0.5, 0] kptDict[kSymbols[2]] = [1 / 4, 1 / 4, 1 / 4] kptDict[kSymbols[3]] = [0.0, 0.0, 0.5] kptDict[kSymbols[4]] = [0.5, 0.5, -0.5] kptDict[kSymbols[5]] = [-eta, eta, eta] kptDict[kSymbols[6]] = [eta, 1 - eta, -eta] kptDict[kSymbols[7]] = [-zeta, zeta, 0.5] kptDict[kSymbols[8]] = [0.5, 0.5, -zeta] elif crystalStructure.lower() in ["orthorhombic", "orc", "op"]: # 6: ucv = pcv = [[1 0., 0]',[0., 2 0]',[0., 0., 3]'] kSymbols = ["G", "R", "S", "T", "U", "X", "Y", "Z"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [0.5, 0.5, 0.5] kptDict[kSymbols[2]] = [0.5, 0.5, 0] kptDict[kSymbols[3]] = [0.0, 0.5, 0.5] kptDict[kSymbols[4]] = [0.5, 0.0, 0.5] kptDict[kSymbols[5]] = [0.5, 0.0, 0] kptDict[kSymbols[6]] = [0.0, 0.5, 0] kptDict[kSymbols[7]] = [0.0, 0.0, 0.5] elif crystalStructure.lower() in ["facecenteredorthorhombic", "orcf", "of"]: # 7: pcv = [[0., 2/2 3/2]',[.5,0,3/2]',[.5, 2/2 0]'] # ucv = [[1 0., 0]',[0., 2 0]',[0., 0., 3]'] pcv4fcc = np.array([[0.0, 0.5, 0.5], [0.5, 0, 0.5], [0.5, 0.5, 0]]).transpose() ucv4fcc = np.eye(3) pcv = primitiveCellVectors ucv = np.matmul(pcv, np.linalg.solve(pcv4fcc, ucv4fcc)) a = np.linalg.norm(ucv[:, 0]) b = np.linalg.norm(ucv[:, 1]) c = np.linalg.norm(ucv[:, 2]) d = (1 / b**2 + 1 / c**2 - 1 / a**2) * max([a**2, b**2, c**2]) if d < -epsilon: type = "1" elif d > epsilon: type = "2" else: type = "3" if type in ["1", "3"]: eta = (1.0 + a**2 / b**2 + a**2 / c**2) / 4.0 zeta = (1.0 + a**2 / b**2 - a**2 / c**2) / 4.0 kSymbols = ["G", "L", "T", "Y", "Z", "A", "A1", "X", "X1"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [0.5, 0.5, 0.5] kptDict[kSymbols[2]] = [1, 0.5, 0.5] kptDict[kSymbols[3]] = [0.5, 0.0, 0.5] kptDict[kSymbols[4]] = [0.5, 0.5, 0] kptDict[kSymbols[5]] = [0.5, 0.5 + zeta, zeta] kptDict[kSymbols[6]] = [0.5, 0.5 - zeta, 1 - zeta] kptDict[kSymbols[7]] = [0.0, eta, eta] kptDict[kSymbols[8]] = [1, 1 - eta, 1 - eta] elif type == "2": eta = (1 + a**2 / b**2 - a**2 / c**2) / 4 delta = (1 + b**2 / a**2 - b**2 / c**2) / 4 phi = (1 + c**2 / b**2 - c**2 / a**2) / 4 kSymbols = ["G", "L", "X", "Y", "Z", "C", "C1", "D", "D1", "H", "H1"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [0.5, 0.5, 0.5] kptDict[kSymbols[2]] = [0.0, 0.5, 0.5] kptDict[kSymbols[3]] = [0.5, 0.0, 0.5] kptDict[kSymbols[4]] = [0.5, 0.5, 0] kptDict[kSymbols[5]] = [0.5, 0.5 - eta, 1 - eta] kptDict[kSymbols[6]] = [0.5, 0.5 + eta, eta] kptDict[kSymbols[7]] = [0.5 - delta, 0.5, 1 - delta] kptDict[kSymbols[8]] = [0.5 + delta, 0.5, delta] kptDict[kSymbols[9]] = [1 - phi, 0.5 - phi, 0.5] kptDict[kSymbols[10]] = [phi, 0.5 + phi, 0.5] elif crystalStructure.lower() in ["bodycenteredorthorhombic", "orci", "oi"]: # 8: pcv = [[-.5, 2/2 3/2]',[.5,-2/2,3/2]',[.5, 2/2 -3/2]'] # ucv = [[1 0., 0]',[0., 2 0]',[0., 0., 3]'] pcv4bcc = np.array( [[-0.5, 0.5, 0.5], [0.5, -0.5, 0.5], [0.5, 0.5, -0.5]] ).transpose() ucv4bcc = np.eye(3) pcv = primitiveCellVectors ucv = np.matmul(pcv, np.linalg.solve(pcv4bcc, ucv4bcc)) a = np.linalg.norm(ucv[:, 0]) b = np.linalg.norm(ucv[:, 1]) c = np.linalg.norm(ucv[:, 2]) zeta = (1 + a**2 / c**2) / 4 eta = (1 + b**2 / c**2) / 4 delta = (b**2 - a**2) / (4 * c**2) mu = (a**2 + b**2) / (4 * c**2) kSymbols = ["G", "R", "S", "T", "W", "Z", "L", "L1", "L2", "X", "X1", "Y", "Y1"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [0.0, 0.5, 0] kptDict[kSymbols[2]] = [0.5, 0.0, 0] kptDict[kSymbols[3]] = [0.0, 0.0, 0.5] kptDict[kSymbols[4]] = [1 / 4, 1 / 4, 1 / 4] kptDict[kSymbols[5]] = [0.5, 0.5, -0.5] kptDict[kSymbols[6]] = [-mu, mu, 0.5 - delta] kptDict[kSymbols[7]] = [mu, -mu, 0.5 + delta] kptDict[kSymbols[8]] = [0.5 - delta, 0.5 + delta, -mu] kptDict[kSymbols[9]] = [-zeta, zeta, zeta] kptDict[kSymbols[10]] = [zeta, 1 - zeta, -zeta] kptDict[kSymbols[11]] = [eta, -eta, eta] kptDict[kSymbols[12]] = [1 - eta, eta, -eta] elif crystalStructure.lower() in ["ccenteredorthorhombic", "orcc", "os"]: # 9: pcv = [[.5, -2/2 0]',[.5,2/2,0]',[0., 0., 3]'] # ucv = [[1 0., 0]',[0., 2 0]',[0., 0., 3]'] pcv = primitiveCellVectors a = np.linalg.norm(pcv[:, 0] + pcv[:, 1]) b = np.linalg.norm(pcv[:, 0] - pcv[:, 1]) zeta = (1 + a**2 / b**2) / 4 kSymbols = ["G", "R", "S", "T", "Y", "Z", "A", "A1", "X", "X1"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [0.0, 0.5, 0.5] kptDict[kSymbols[2]] = [0.0, 0.5, 0] kptDict[kSymbols[3]] = [-0.5, 0.5, 0.5] kptDict[kSymbols[4]] = [-0.5, 0.5, 0] kptDict[kSymbols[5]] = [0.0, 0.0, 0.5] kptDict[kSymbols[6]] = [zeta, zeta, 0.5] kptDict[kSymbols[7]] = [-zeta, 1 - zeta, 0.5] kptDict[kSymbols[8]] = [zeta, zeta, 0] kptDict[kSymbols[9]] = [-zeta, 1 - zeta, 0] elif crystalStructure.lower() in ["hexagonal", "hex", "hcp", "hp"]: # 10: ucv = pcv = [[.5, -sqrt(3)/2 0]',[.5,sqrt(3)/2,0]',[0., 0., 3]'] kSymbols = ["G", "A", "H", "K", "L", "M"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [0.0, 0.0, 0.5] kptDict[kSymbols[2]] = [1 / 3, 1 / 3, 0.5] kptDict[kSymbols[3]] = [1 / 3, 1 / 3, 0] kptDict[kSymbols[4]] = [0.5, 0.0, 0.5] kptDict[kSymbols[5]] = [0.5, 0.0, 0] elif crystalStructure.lower() in ["rhombohedral", "rhl", "hr"]: # 11: ucv = pcv = [[cos(pi/5) -sin(pi/5) 0]',[cos(pi/5) sin(pi/5),0]', # [cos(2*pi/5)/cos(pi/5),0,sqrt(1-(cos(2*pi/5)/cos(pi/5))**2)]'] pcv = primitiveCellVectors cosalpha = ( np.dot(pcv[:, 2], pcv[:, 0]) / np.linalg.norm(pcv[:, 0]) / np.linalg.norm(pcv[:, 2]) ) if cosalpha > 0: type = "1" else: type = "2" if type == "1": eta = (1 + 4 * cosalpha) / (2 + 4 * cosalpha) nu = 3 / 4 - eta / 2 kSymbols = ["G", "F", "L", "L1", "Z", "B", "B1", "P", "P1", "P2", "Q", "X"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [0.5, 0.5, 0] kptDict[kSymbols[2]] = [0.5, 0.0, 0] kptDict[kSymbols[3]] = [0.0, 0.0, -0.5] kptDict[kSymbols[4]] = [0.5, 0.5, 0.5] kptDict[kSymbols[5]] = [eta, 0.5, 1 - eta] kptDict[kSymbols[6]] = [0.5, 1 - eta, eta - 1] kptDict[kSymbols[7]] = [eta, nu, nu] kptDict[kSymbols[8]] = [1 - nu, 1 - nu, 1 - eta] kptDict[kSymbols[9]] = [nu, nu, eta - 1] kptDict[kSymbols[10]] = [1 - nu, nu, 0] kptDict[kSymbols[11]] = [nu, 0.0, -nu] elif type == "2": eta = (0.5) * (1 + cosalpha) / (1 - cosalpha) nu = 3 / 4 - eta / 2 kSymbols = ["G", "F", "L", "Z", "P", "P1", "Q", "Q1"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [0.5, -0.5, 0] kptDict[kSymbols[2]] = [0.5, 0.0, 0] kptDict[kSymbols[3]] = [0.5, -0.5, 0.5] kptDict[kSymbols[4]] = [1 - nu, -nu, 1 - nu] kptDict[kSymbols[5]] = [nu, nu - 1, nu - 1] kptDict[kSymbols[6]] = [eta, eta, eta] kptDict[kSymbols[7]] = [1 - eta, -eta, -eta] elif crystalStructure.lower() in ["monoclinic", "mcl", "mp"]: # 12: ucv = pcv = [[1 0., 0]',[0., 2 0]',[0,3*cos(pi/5),3*sin(pi/5)]'] pcv = primitiveCellVectors b = np.linalg.norm(pcv[:, 1]) c = np.linalg.norm(pcv[:, 2]) cosalpha = np.dot(pcv[:, 1], pcv[:, 2]) / b / c sin2alpha = 1 - cosalpha**2 eta = (1 - b * cosalpha / c) / (2 * sin2alpha) nu = 0.5 - eta * c * cosalpha / b kSymbols = [ "G", "A", "C", "D", "D1", "E", "X", "Y", "Y1", "Z", "H", "H1", "H2", "M", "M1", "M2", ] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [0.5, 0.5, 0] kptDict[kSymbols[2]] = [0.0, 0.5, 0.5] kptDict[kSymbols[3]] = [0.5, 0.0, 0.5] kptDict[kSymbols[4]] = [0.5, 0.0, -0.5] kptDict[kSymbols[5]] = [0.5, 0.5, 0.5] kptDict[kSymbols[6]] = [0.0, 0.5, 0] kptDict[kSymbols[7]] = [0.0, 0.0, 0.5] kptDict[kSymbols[8]] = [0.0, 0.0, -0.5] kptDict[kSymbols[9]] = [0.5, 0.0, 0] kptDict[kSymbols[10]] = [0.0, eta, 1 - nu] kptDict[kSymbols[11]] = [0.0, 1 - eta, nu] kptDict[kSymbols[12]] = [0.0, eta, -nu] kptDict[kSymbols[13]] = [0.5, eta, 1 - nu] kptDict[kSymbols[14]] = [0.5, 1 - eta, nu] kptDict[kSymbols[15]] = [0.5, eta, -nu] elif crystalStructure.lower() in ["ccenteredmonoclinic", "mclc", "ms"]: # 13: pcv = [[.5, 2/2 0]',[-.5, 2/2 0]',[0,3*cos(pi/5),3*sin(pi/5)]'] # ucv = [[1 0., 0]',[0., 2 0]',[0,3*cos(pi/5),3*sin(pi/5)]'] pcv = primitiveCellVectors a = np.linalg.norm(pcv[:, 0] - pcv[:, 1]) b = np.linalg.norm(pcv[:, 0] + pcv[:, 1]) c = np.linalg.norm(pcv[:, 2]) kpcv = np.linalg.inv(pcv).transpose() kgamma = ( np.dot(kpcv[:, 0], kpcv[:, 1]) / np.linalg.norm(kpcv[:, 0]) / np.linalg.norm(kpcv[:, 1]) ) if kgamma < -epsilon: type = "1" elif abs(kgamma) < epsilon: type = "2" else: cosalpha = np.dot(pcv[:, 0] + pcv[:, 1], pcv[:, 2]) / b / c sin2alpha = 1 - cosalpha**2 d = b * cosalpha / c + b**2 * sin2alpha / a**2 - 1 if d < -epsilon: type = "3" elif abs(d) < epsilon: type = "4" else: type = "5" if type in ["1", "2"]: cosalpha = np.dot(pcv[:, 0] + pcv[:, 1], pcv[:, 2]) / b / c sin2alpha = 1 - cosalpha**2 zeta = (2 - b * cosalpha / c) / (4 * sin2alpha) eta = 0.5 + 2 * zeta * c * cosalpha / b psi = 3 / 4 - a**2 / (4 * b**2 * sin2alpha) phi = psi + (3 / 4 - psi) * b * cosalpha / c kSymbols = [ "G", "N", "N1", "L", "M", "Y", "Y1", "Z", "F", "F1", "F2", "F3", "I", "I1", "X", "X1", "X2", ] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [0.5, 0.0, 0] kptDict[kSymbols[2]] = [0.0, -0.5, 0] kptDict[kSymbols[3]] = [0.5, 0.5, 0.5] kptDict[kSymbols[4]] = [0.5, 0.0, 0.5] kptDict[kSymbols[5]] = [0.5, 0.5, 0] kptDict[kSymbols[6]] = [-0.5, -0.5, 0] kptDict[kSymbols[7]] = [0.0, 0.0, 0.5] kptDict[kSymbols[8]] = [1 - zeta, 1 - zeta, 1 - eta] kptDict[kSymbols[9]] = [zeta, zeta, eta] kptDict[kSymbols[10]] = [-zeta, -zeta, 1 - eta] kptDict[kSymbols[11]] = [1 - zeta, -zeta, 1 - eta] kptDict[kSymbols[12]] = [phi, 1 - phi, 0.5] kptDict[kSymbols[13]] = [1 - phi, phi - 1, 0.5] kptDict[kSymbols[14]] = [1 - psi, psi - 1, 0] kptDict[kSymbols[15]] = [psi, 1 - psi, 0] kptDict[kSymbols[16]] = [psi - 1, -psi, 0] elif type in ["3", "4"]: cosalpha = np.dot(pcv[:, 0] + pcv[:, 1], pcv[:, 2]) / b / c sin2alpha = 1 - cosalpha**2 mu = (1 + b**2 / a**2) / 4 delta = b * c * cosalpha / (2 * a**2) zeta = mu - 1 / 4 + (1 - b * cosalpha / c) / (4 * sin2alpha) eta = 0.5 + 2 * zeta * c * cosalpha / b phi = 1 + zeta - 2 * mu psi = eta - 2 * delta kSymbols = [ "G", "I", "M", "N", "N1", "X", "Z", "F", "F1", "F2", "H", "H1", "H2", "Y", "Y1", "Y2", "Y3", ] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [0.5, -0.5, 0.5] kptDict[kSymbols[2]] = [0.5, 0.0, 0.5] kptDict[kSymbols[3]] = [0.5, 0.0, 0] kptDict[kSymbols[4]] = [0.0, -0.5, 0] kptDict[kSymbols[5]] = [0.5, -0.5, 0] kptDict[kSymbols[6]] = [0.0, 0.0, 0.5] kptDict[kSymbols[7]] = [1 - phi, 1 - phi, 1 - psi] kptDict[kSymbols[8]] = [phi, phi - 1, psi] kptDict[kSymbols[9]] = [1 - phi, -phi, 1 - psi] kptDict[kSymbols[10]] = [zeta, zeta, eta] kptDict[kSymbols[11]] = [1 - zeta, -zeta, 1 - eta] kptDict[kSymbols[12]] = [-zeta, -zeta, 1 - eta] kptDict[kSymbols[13]] = [mu, mu, delta] kptDict[kSymbols[14]] = [1 - mu, -mu, -delta] kptDict[kSymbols[15]] = [-mu, -mu, -delta] kptDict[kSymbols[16]] = [mu, mu - 1, delta] elif type == "5": cosalpha = np.dot(pcv[:, 0] + pcv[:, 1], pcv[:, 2]) / b / c sin2alpha = 1 - cosalpha**2 zeta = (b**2 / a**2 + (1 - b * cosalpha / c) / sin2alpha) / 4 eta = 0.5 + 2 * zeta * c * cosalpha / b mu = eta / 2 + b**2 / (4 * a**2) - b * c * cosalpha / (2 * a**2) nu = 2 * mu - zeta omega = (4 * nu - 1 - b**2 * sin2alpha / a**2) * c / (2 * b * cosalpha) delta = zeta * c * cosalpha / b + omega / 2 - 1 / 4 rho = 1 - zeta * a**2 / b**2 kSymbols = [ "G", "L", "M", "N", "N1", "X", "Z", "F", "F1", "F2", "H", "H1", "H2", "I", "I1", "Y", "Y1", "Y2", "Y3", ] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [0.5, 0.5, 0.5] kptDict[kSymbols[2]] = [0.5, 0.0, 0.5] kptDict[kSymbols[3]] = [0.5, 0.0, 0] kptDict[kSymbols[4]] = [0.0, -0.5, 0] kptDict[kSymbols[5]] = [0.5, -0.5, 0] kptDict[kSymbols[6]] = [0.0, 0.0, 0.5] kptDict[kSymbols[7]] = [nu, nu, omega] kptDict[kSymbols[8]] = [1 - nu, 1 - nu, 1 - omega] kptDict[kSymbols[9]] = [nu, nu - 1, omega] kptDict[kSymbols[10]] = [zeta, zeta, eta] kptDict[kSymbols[11]] = [1 - zeta, -zeta, 1 - eta] kptDict[kSymbols[12]] = [-zeta, -zeta, 1 - eta] kptDict[kSymbols[13]] = [rho, 1 - rho, 0.5] kptDict[kSymbols[14]] = [1 - rho, rho - 1, 0.5] kptDict[kSymbols[15]] = [mu, mu, delta] kptDict[kSymbols[16]] = [1 - mu, -mu, -delta] kptDict[kSymbols[17]] = [-mu, -mu, -delta] kptDict[kSymbols[18]] = [mu, mu - 1, delta] elif crystalStructure.lower() in ["triclinic", "tri", "ap"]: # 14: ucv = pcv = [[1 0., 0]',[2*cos(pi/3),2*sin(pi/3),0]',[3*cos(pi/4), # 3/sin(pi/3)*(cos(pi/5)-cos(pi/4)*cos(pi/3)), # 3/sin(pi/3)*sqrt(1-(cos(pi/5))**2-(cos(pi/4))**2-(cos(pi/3))**2 # + 2*cos(pi/5)*cos(pi/4)*cos(pi/3))]'] :: [1 2 3],[pi/5,pi/4,pi/3] kpcv = np.linalg.inv(primitiveCellVectors).transpose() a = np.linalg.norm(kpcv[:, 0]) b = np.linalg.norm(kpcv[:, 1]) c = np.linalg.norm(kpcv[:, 2]) kalpha = np.dot(kpcv[:, 1], kpcv[:, 2]) / b / c # kbeta = np.dot(kpcv[:,2],kpcv[:,0])/c/a kgamma = np.dot(kpcv[:, 0], kpcv[:, 1]) / a / b if kalpha < 0: if kgamma < -epsilon: type = "1a" else: type = "2a" else: if kgamma > epsilon: type = "1b" else: type = "2b" if type in ["1a", "2a"]: kSymbols = ["G", "L", "M", "N", "R", "X", "Y", "Z"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [0.5, 0.5, 0] kptDict[kSymbols[2]] = [0.0, 0.5, 0.5] kptDict[kSymbols[3]] = [0.5, 0.0, 0.5] kptDict[kSymbols[4]] = [0.5, 0.5, 0.5] kptDict[kSymbols[5]] = [0.5, 0.0, 0] kptDict[kSymbols[6]] = [0.0, 0.5, 0] kptDict[kSymbols[7]] = [0.0, 0.0, 0.5] elif type in ["1b", "2b"]: kSymbols = ["G", "L", "M", "N", "R", "X", "Y", "Z"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [0.5, -0.5, 0] kptDict[kSymbols[2]] = [0.0, 0.0, 0.5] kptDict[kSymbols[3]] = [-0.5, -0.5, 0.5] kptDict[kSymbols[4]] = [0.0, -0.5, 0.5] kptDict[kSymbols[5]] = [0.0, -0.5, 0] kptDict[kSymbols[6]] = [0.5, 0.0, 0] kptDict[kSymbols[7]] = [-0.5, 0.0, 0.5] elif crystalStructure == "0D": # 0D: isolate :: [10., 10., 10] kSymbols = ["G"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] elif crystalStructure == "1D": # 1D: along z direction. c << a,b :: [10., 10., 1] kSymbols = ["G", "X"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [0.0, 0.0, 0.5] elif crystalStructure.lower() in ["square2d", "squ2d"]: # 2D1: along x-y plane. c >> a,b # [[1 0., 0]',[0,1,0]',[0., 0., 10]'] :: [1 1 10] # analog: Tetragonal kSymbols = ["G", "X", "M"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [0.0, 0.5, 0] kptDict[kSymbols[2]] = [0.5, 0.5, 0] elif crystalStructure.lower() in ["rectangular2d", "rectangle2d", "rec2d"]: # 2D2: along x-y plane. c >> a,b # [[1 0., 0]',[0,2,0]',[0., 0., 10]'] :: [1 1 10] # analog: Orthorhombic kSymbols = ["G", "X", "Y", "S"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [0.5, 0.0, 0] kptDict[kSymbols[2]] = [0.0, 0.5, 0] kptDict[kSymbols[3]] = [0.5, 0.5, 0] elif crystalStructure.lower() in ["hexagonal2d", "hexagon2d", "hex2d"]: # 2D3: along x-y plane. c >> a,b # [[.5, -sqrt(3)/2 0]',[.5,sqrt(3)/2,0]',[0., 0., 10]'] :: [1 1 10] # analog: Hexagonal kSymbols = ["G", "M", "K"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [0.5, 0.0, 0] kptDict[kSymbols[2]] = [1 / 3, 1 / 3, 0] elif crystalStructure.lower() in [ "rhombic2d", "rhombus2d", "centeredrectangular2d", "rho2d", ]: # 2D4: along x-y plane. c >> a,b # [[.5, -2/2 0]',[.5,2/2,0]',[0., 0., 10]'] :: [1 2 10] # analog: CCenteredOrthorhombic # pcv = [[.5, -2/2 0]',[.5,2/2,0]',[0., 0., 10]'] # ucv = [[1 0., 0]',[0., 2 0]',[0., 0., 10]'] pcv = primitiveCellVectors a = np.linalg.norm(pcv[:, 0] + pcv[:, 1]) b = np.linalg.norm(pcv[:, 0] - pcv[:, 1]) zeta = (1 + a**2 / b**2) / 4 kSymbols = ["G", "S", "Y", "X", "X1"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [0.0, 0.5, 0] kptDict[kSymbols[2]] = [-0.5, 0.5, 0] kptDict[kSymbols[3]] = [zeta, zeta, 0] kptDict[kSymbols[4]] = [-zeta, 1 - zeta, 0] elif crystalStructure.lower() in ["oblique2d", "obl2d"]: # 2D5: along x-y plane. c >> a,b # [[2 0., 0]',[3*cos(pi/5),3*sin(pi/5),0]',[0., 0., 10]'] :: [2 3 10] # analog: "Monoclinic" pcv = primitiveCellVectors b = np.linalg.norm(pcv[:, 0]) c = np.linalg.norm(pcv[:, 1]) cosalpha = np.dot(pcv[:, 0], pcv[:, 1]) / b / c sin2alpha = 1 - cosalpha**2 eta = (1 - b * cosalpha / c) / (2 * sin2alpha) nu = 0.5 - eta * c * cosalpha / b kSymbols = ["G", "C", "X", "Y", "Y1", "H", "H1", "H2"] kptDict[kSymbols[0]] = [0.0, 0.0, 0] kptDict[kSymbols[1]] = [0.5, 0.5, 0] kptDict[kSymbols[2]] = [0.5, 0.0, 0] kptDict[kSymbols[3]] = [0.0, 0.5, 0] kptDict[kSymbols[4]] = [0.0, -0.5, 0] kptDict[kSymbols[5]] = [eta, 1 - nu, 0] kptDict[kSymbols[6]] = [1 - eta, nu, 0] kptDict[kSymbols[7]] = [eta, -nu, 0] else: raise Exception("Unknown crystal structure " + crystalStructure + ".") return kptDict
########### # testing # ########### def print_kvalues(crystalStructure, avec, kSymbols): for i in range(0, len(kSymbols)): kval = kSymbol2kValue(crystalStructure, avec, kSymbols[i]) print( "%6s %6s %f %f %f" % (crystalStructure, kSymbols[i], kval[0], kval[1], kval[2]) ) def print_all_bra2avec(): perm = [[0, 1, 2], [0, 2, 1], [1, 0, 2], [1, 2, 0], [2, 0, 1], [2, 1, 0]] crystalStructure = "CUB" avec = bra2avec("CUB") kSymbols = ["G", "X", "M", "R"] print_kvalues(crystalStructure, avec, kSymbols) # print('%s' % 'CUB') # print('%f %f %f' % (avec[0,0],avec[0,1],avec[0,2])) # print('%f %f %f' % (avec[1,0],avec[1,1],avec[1,2])) # print('%f %f %f' % (avec[2,0],avec[2,1],avec[2,2])) crystalStructure = "FCC" avec = bra2avec("FCC") kSymbols = ["G", "K", "L", "U", "W", "X"] print_kvalues(crystalStructure, avec, kSymbols) # print('%s' % 'FCC') # print('%f %f %f' % (avec[0,0],avec[0,1],avec[0,2])) # print('%f %f %f' % (avec[1,0],avec[1,1],avec[1,2])) # print('%f %f %f' % (avec[2,0],avec[2,1],avec[2,2])) crystalStructure = "BCC" avec = bra2avec("BCC") kSymbols = ["G", "H", "P", "N"] print_kvalues(crystalStructure, avec, kSymbols) # print('%s' % 'BCC') # print('%f %f %f' % (avec[0,0],avec[0,1],avec[0,2])) # print('%f %f %f' % (avec[1,0],avec[1,1],avec[1,2])) # print('%f %f %f' % (avec[2,0],avec[2,1],avec[2,2])) crystalStructure = "TET" avec = bra2avec("TET1") kSymbols = ["G", "A", "M", "R", "X", "Z"] print_kvalues(crystalStructure, avec, kSymbols) # print('%s' % 'TET1') # print('%f %f %f' % (avec[0,0],avec[0,1],avec[0,2])) # print('%f %f %f' % (avec[1,0],avec[1,1],avec[1,2])) # print('%f %f %f' % (avec[2,0],avec[2,1],avec[2,2])) crystalStructure = "TET" avec = bra2avec("TET2") kSymbols = ["G", "A", "M", "R", "X", "Z"] print_kvalues(crystalStructure, avec, kSymbols) # print('%s' % 'TET2') # print('%f %f %f' % (avec[0,0],avec[0,1],avec[0,2])) # print('%f %f %f' % (avec[1,0],avec[1,1],avec[1,2])) # print('%f %f %f' % (avec[2,0],avec[2,1],avec[2,2])) crystalStructure = "BCT" avec = bra2avec("BCT1") kSymbols = ["G", "M", "N", "P", "X", "Z", "Z1"] print_kvalues(crystalStructure, avec, kSymbols) # print('%s' % 'BCT1') # print('%f %f %f' % (avec[0,0],avec[0,1],avec[0,2])) # print('%f %f %f' % (avec[1,0],avec[1,1],avec[1,2])) # print('%f %f %f' % (avec[2,0],avec[2,1],avec[2,2])) crystalStructure = "BCT" avec = bra2avec("BCT2") kSymbols = ["G", "N", "P", "X", "Z", "S", "S1", "Y", "Y1"] print_kvalues(crystalStructure, avec, kSymbols) # print('%s' % 'BCT2') # print('%f %f %f' % (avec[0,0],avec[0,1],avec[0,2])) # print('%f %f %f' % (avec[1,0],avec[1,1],avec[1,2])) # print('%f %f %f' % (avec[2,0],avec[2,1],avec[2,2])) crystalStructure = "ORC" avec = bra2avec("ORC") kSymbols = ["G", "R", "S", "T", "U", "X", "Y", "Z"] print_kvalues(crystalStructure, avec, kSymbols) # print('%s' % 'ORC') # print('%f %f %f' % (avec[0,0],avec[0,1],avec[0,2])) # print('%f %f %f' % (avec[1,0],avec[1,1],avec[1,2])) # print('%f %f %f' % (avec[2,0],avec[2,1],avec[2,2])) crystalStructure = "ORCF" avec = bra2avec("ORCF1") kSymbols = ["G", "L", "T", "Y", "Z", "A", "A1", "X", "X1"] print_kvalues(crystalStructure, avec, kSymbols) # print('%s' % 'ORCF1') # print('%f %f %f' % (avec[0,0],avec[0,1],avec[0,2])) # print('%f %f %f' % (avec[1,0],avec[1,1],avec[1,2])) # print('%f %f %f' % (avec[2,0],avec[2,1],avec[2,2])) crystalStructure = "ORCF" avec = bra2avec("ORCF2") kSymbols = ["G", "L", "X", "Y", "Z", "C", "C1", "D", "D1", "H", "H1"] print_kvalues(crystalStructure, avec, kSymbols) # print('%s' % 'ORCF2') # print('%f %f %f' % (avec[0,0],avec[0,1],avec[0,2])) # print('%f %f %f' % (avec[1,0],avec[1,1],avec[1,2])) # print('%f %f %f' % (avec[2,0],avec[2,1],avec[2,2])) crystalStructure = "ORCF" avec = bra2avec("ORCF3") kSymbols = ["G", "L", "T", "Y", "Z", "A", "A1", "X", "X1"] print_kvalues(crystalStructure, avec, kSymbols) # print('%s' % 'ORCF3') # print('%f %f %f' % (avec[0,0],avec[0,1],avec[0,2])) # print('%f %f %f' % (avec[1,0],avec[1,1],avec[1,2])) # print('%f %f %f' % (avec[2,0],avec[2,1],avec[2,2])) crystalStructure = "ORCI" avec = bra2avec("ORCI") kSymbols = ["G", "R", "S", "T", "W", "Z", "L", "L1", "L2", "X", "X1", "Y", "Y1"] print_kvalues(crystalStructure, avec, kSymbols) # print('%s' % 'ORCI') # print('%f %f %f' % (avec[0,0],avec[0,1],avec[0,2])) # print('%f %f %f' % (avec[1,0],avec[1,1],avec[1,2])) # print('%f %f %f' % (avec[2,0],avec[2,1],avec[2,2])) crystalStructure = "ORCC" avec = bra2avec("ORCC") kSymbols = ["G", "R", "S", "T", "Y", "Z", "A", "A1", "X", "X1"] print_kvalues(crystalStructure, avec, kSymbols) # print('%s' % 'ORCC') # print('%f %f %f' % (avec[0,0],avec[0,1],avec[0,2])) # print('%f %f %f' % (avec[1,0],avec[1,1],avec[1,2])) # print('%f %f %f' % (avec[2,0],avec[2,1],avec[2,2])) crystalStructure = "HEX" avec = bra2avec("HEX1") kSymbols = ["G", "A", "H", "K", "L", "M"] print_kvalues(crystalStructure, avec, kSymbols) # print('%s' % 'HEX1') # print('%f %f %f' % (avec[0,0],avec[0,1],avec[0,2])) # print('%f %f %f' % (avec[1,0],avec[1,1],avec[1,2])) # print('%f %f %f' % (avec[2,0],avec[2,1],avec[2,2])) crystalStructure = "HEX" avec = bra2avec("HEX2") kSymbols = ["G", "A", "H", "K", "L", "M"] print_kvalues(crystalStructure, avec, kSymbols) # print('%s' % 'HEX2') # print('%f %f %f' % (avec[0,0],avec[0,1],avec[0,2])) # print('%f %f %f' % (avec[1,0],avec[1,1],avec[1,2])) # print('%f %f %f' % (avec[2,0],avec[2,1],avec[2,2])) crystalStructure = "RHL" avec = bra2avec("RHL1") kSymbols = ["G", "F", "L", "L1", "Z", "B", "B1", "P", "P1", "P2", "Q", "X"] print_kvalues(crystalStructure, avec, kSymbols) # print('%s' % 'RHL1') # print('%f %f %f' % (avec[0,0],avec[0,1],avec[0,2])) # print('%f %f %f' % (avec[1,0],avec[1,1],avec[1,2])) # print('%f %f %f' % (avec[2,0],avec[2,1],avec[2,2])) crystalStructure = "RHL" avec = bra2avec("RHL2") kSymbols = ["G", "F", "L", "Z", "P", "P1", "Q", "Q1"] print_kvalues(crystalStructure, avec, kSymbols) # print('%s' % 'RHL2') # print('%f %f %f' % (avec[0,0],avec[0,1],avec[0,2])) # print('%f %f %f' % (avec[1,0],avec[1,1],avec[1,2])) # print('%f %f %f' % (avec[2,0],avec[2,1],avec[2,2])) crystalStructure = "MCL" avec = bra2avec("MCL") kSymbols = [ "G", "A", "C", "D", "D1", "E", "X", "Y", "Y1", "Z", "H", "H1", "H2", "M", "M1", "M2", ] print_kvalues(crystalStructure, avec, kSymbols) # print('%s' % 'MCL') # print('%f %f %f' % (avec[0,0],avec[0,1],avec[0,2])) # print('%f %f %f' % (avec[1,0],avec[1,1],avec[1,2])) # print('%f %f %f' % (avec[2,0],avec[2,1],avec[2,2])) crystalStructure = "MCLC" avec = bra2avec("MCLC1") kSymbols = [ "G", "N", "N1", "L", "M", "Y", "Y1", "Z", "F", "F1", "F2", "F3", "I", "I1", "X", "X1", "X2", ] print_kvalues(crystalStructure, avec, kSymbols) # print('%s' % 'MCLC1') # print('%f %f %f' % (avec[0,0],avec[0,1],avec[0,2])) # print('%f %f %f' % (avec[1,0],avec[1,1],avec[1,2])) # print('%f %f %f' % (avec[2,0],avec[2,1],avec[2,2])) crystalStructure = "MCLC" avec = bra2avec("MCLC3") kSymbols = [ "G", "I", "M", "N", "N1", "X", "Z", "F", "F1", "F2", "H", "H1", "H2", "Y", "Y1", "Y2", "Y3", ] print_kvalues(crystalStructure, avec, kSymbols) # print('%s' % 'MCLC3') # print('%f %f %f' % (avec[0,0],avec[0,1],avec[0,2])) # print('%f %f %f' % (avec[1,0],avec[1,1],avec[1,2])) # print('%f %f %f' % (avec[2,0],avec[2,1],avec[2,2])) crystalStructure = "MCLC" avec = bra2avec("MCLC5") kSymbols = [ "G", "L", "M", "N", "N1", "X", "Z", "F", "F1", "F2", "H", "H1", "H2", "I", "I1", "Y", "Y1", "Y2", "Y3", ] print_kvalues(crystalStructure, avec, kSymbols) # print('%s' % 'MCLC5') # print('%f %f %f' % (avec[0,0],avec[0,1],avec[0,2])) # print('%f %f %f' % (avec[1,0],avec[1,1],avec[1,2])) # print('%f %f %f' % (avec[2,0],avec[2,1],avec[2,2]))