Source code for lumos.functions

""" Simple mathematical calculations that are used throughout Lumos """

import numpy as np

[docs]def Rx(theta, x, y, z): """ Rotates points :math:`(x, y, z)` about x-axis by angle :math:`\\theta`. :param theta: :type theta: :class:`np.ndarray` or float :param x: :type x: :class:`np.ndarray` or float :param y: :type y: :class:`np.ndarray` or float :param z: :type z: :class:`np.ndarray` or float :return: Rotated points :math:`(x^{\\prime}, y^{\\prime}, z^{\\prime})` """ xp = x yp = np.cos(theta) * y - np.sin(theta) * z zp = np.sin(theta) * y + np.cos(theta) * z return xp, yp, zp
[docs]def Ry(theta, x, y, z): """ Rotates points :math:`(x, y, z)` about y-axis by angle :math:`\\theta`. :param theta: :type theta: :class:`np.ndarray` or float :param x: :type x: :class:`np.ndarray` or float :param y: :type y: :class:`np.ndarray` or float :param z: :type z: :class:`np.ndarray` or float :return: Rotated points :math:`(x^{\\prime}, y^{\\prime}, z^{\\prime})` """ xp = np.cos(theta) * x + np.sin(theta) * z yp = y zp = -np.sin(theta) * x + np.cos(theta) * z return xp, yp, zp
[docs]def Rz(theta, x, y, z): """ Rotates points :math:`(x, y, z)` about z-axis by angle :math:`\\theta`. :param theta: :type theta: :class:`np.ndarray` or float :param x: :type x: :class:`np.ndarray` or float :param y: :type y: :class:`np.ndarray` or float :param z: :type z: :class:`np.ndarray` or float :return: Rotated points :math:`(x^{\\prime}, y^{\\prime}, z^{\\prime})` """ xp = np.cos(theta) * x - np.sin(theta) * y yp = np.sin(theta) * x + np.cos(theta) * y zp = z return xp, yp, zp
[docs]def det_2(a11, a12, a21, a22): """ Calculates determinate of 2x2 matrix. Matrix components can be of type :class:`np.ndarray` or float. Returns :math:`\\det \\begin{pmatrix} a_{11} & a_{12} \\\\ a_{21} & a_{22}\\end{pmatrix}` """ return a11 * a22 - a21 * a12
[docs]def det_3(a11, a12, a13, a21, a22, a23, a31, a32, a33): """ Calculates determinate of 3x3 matrix. Matrix components can be of type :class:`np.ndarray` or float. Returns :math:`\\det \\begin{pmatrix} a_{11} & a_{12} & a_{13} \\\\ a_{21} & a_{22} & a_{23} \\\\ a_{31} & a_{32} & a_{33} \\end{pmatrix}` """ return a11 * det_2(a22, a23, a32, a33) - a12 * det_2(a21, a23, a31, a33) + a13 * det_2(a21, a22, a31, a32)
[docs]def inv_3(a11, a12, a13, a21, a22, a23, a31, a32, a33): """ Calculates inverse of 3x3 matrix. Matrix components can be of type :class:`np.ndarray` or float. Returns :math:`\\begin{pmatrix} a_{11} & a_{12} & a_{13} \\\\ a_{21} & a_{22} & a_{23} \\\\ a_{31} & a_{32} & a_{33} \\end{pmatrix}^{-1}` """ c = 1 / det_3(a11, a12, a13, a21, a22, a23, a31, a32, a33) I11, I12, I13 = c * det_2(a22, a23, a32, a33), c * det_2(a13, a12, a33, a32), c * det_2(a12, a13, a22, a23) I21, I22, I23 = c * det_2(a23, a21, a33, a31), c * det_2(a11, a13, a31, a33), c * det_2(a13, a11, a23, a21) I31, I32, I33 = c * det_2(a21, a22, a31, a32), c * det_2(a12, a11, a32, a31), c * det_2(a11, a12, a21, a22) return I11, I12, I13, \ I21, I22, I23, \ I31, I32, I33