Source code for asaplib.io.io_cell

"""
Functions for converting between different simulation cell formats
"""

import math

import numpy as np


[docs]def pbcdist(q1, q2, h, ih): s = np.dot(ih, q1 - q2) for i in range(3): s[i] -= round(s[i]) return np.dot(h, s)
[docs]def h2abc(h): """Returns a description of the cell in terms of the length of the lattice vectors and the angles between them in radians. Takes the representation of the system box in terms of an upper triangular matrix of column vectors, and returns the representation in terms of the lattice vector lengths and the angles between them in radians. Args: h: Cell matrix in upper triangular column vector form. Returns: A list containing the lattice vector lengths and the angles between them. """ a = float(h[0, 0]) b = math.sqrt(h[0, 1] ** 2 + h[1, 1] ** 2) c = math.sqrt(h[0, 2] ** 2 + h[1, 2] ** 2 + h[2, 2] ** 2) gamma = math.acos(h[0, 1] / b) beta = math.acos(h[0, 2] / c) alpha = math.acos(np.dot(h[:, 1], h[:, 2]) / (b * c)) return a, b, c, alpha, beta, gamma
[docs]def genh2abc(h): """ Returns a description of the cell in terms of the length of the lattice vectors and the angles between them in radians. Takes the representation of the system box in terms of a full matrix of row vectors, and returns the representation in terms of the lattice vector lengths and the angles between them in radians. Args: h: Cell matrix in upper triangular column vector form. Returns: A list containing the lattice vector lengths and the angles between them. """ a = math.sqrt(np.dot(h[0], h[0])) b = math.sqrt(np.dot(h[1], h[1])) c = math.sqrt(np.dot(h[2], h[2])) gamma = math.acos(np.dot(h[0], h[1]) / (a * b)) beta = math.acos(np.dot(h[0], h[2]) / (a * c)) alpha = math.acos(np.dot(h[2], h[1]) / (b * c)) return a, b, c, alpha, beta, gamma
[docs]def h2abc_deg(h): """Returns a description of the cell in terms of the length of the lattice vectors and the angles between them in degrees. Takes the representation of the system box in terms of an upper triangular matrix of column vectors, and returns the representation in terms of the lattice vector lengths and the angles between them in degrees. Args: h: Cell matrix in upper triangular column vector form. Returns: A list containing the lattice vector lengths and the angles between them in degrees. """ (a, b, c, alpha, beta, gamma) = h2abc(h) return a, b, c, alpha * 180 / math.pi, beta * 180 / math.pi, gamma * 180 / math.pi
[docs]def abc2h(a, b, c, alpha, beta, gamma): """Returns a lattice vector matrix given a description in terms of the lattice vector lengths and the angles in between. Args: a: First cell vector length. b: Second cell vector length. c: Third cell vector length. alpha: Angle between sides b and c in radians. beta: Angle between sides a and c in radians. gamma: Angle between sides b and a in radians. Returns: An array giving the lattice vector matrix in upper triangular form. """ h = np.zeros((3, 3), float) h[0, 0] = a h[0, 1] = b * math.cos(gamma) h[0, 2] = c * math.cos(beta) h[1, 1] = b * math.sin(gamma) h[1, 2] = (b * c * math.cos(alpha) - h[0, 1] * h[0, 2]) / h[1, 1] h[2, 2] = math.sqrt(c ** 2 - h[0, 2] ** 2 - h[1, 2] ** 2) return h