Source code for einsteinpy.coordinates.core

import astropy.units as u
import numpy as np

from einsteinpy.coordinates.conversion import (
    BoyerLindquistConversion,
    CartesianConversion,
    SphericalConversion,
)


[docs]class Cartesian(CartesianConversion): """ Class for Cartesian Coordinates and related transformations. """ @u.quantity_input(x=u.km, y=u.km, z=u.km) def __init__(self, x, y, z): """ Constructor. Parameters ---------- x : ~astropy.units.quantity.Quantity y : ~astropy.units.quantity.Quantity z : ~astropy.units.quantity.Qauntity """ self.x = x self.y = y self.z = z super().__init__(x.si.value, y.si.value, z.si.value) self.system = "Cartesian" self._dimension = {"x": self.x, "y": self.y, "z": self.z, "system": self.system} self._dimension_order = ("x", "y", "z") def __repr__(self): return "Cartesian x: {}, y: {}, z: {}".format(self.x, self.y, self.z) def __str__(self): return self.__repr__() def __getitem__(self, item): """ Method to return coordinates. Objects are subsctiptable with both explicit names of parameters and integer indices. Parameters ---------- item : str or int Name of the parameter or its index. If ``'system'``, Name of coordinate is returned. """ if isinstance(item, (int, np.integer)): return self._dimension[self._dimension_order[item]] return self._dimension[item]
[docs] def si_values(self): """ Function for returning values in SI units. Returns ------- ~numpy.ndarray Array containing values in SI units (m, m, m) """ element_list = [self.x.to(u.m), self.y.to(u.m), self.z.to(u.m)] return np.array([e.value for e in element_list], dtype=float)
[docs] def norm(self): """ Function for finding euclidean norm of a vector. Returns ------- ~astropy.units.quantity.Quantity Euclidean norm with units. """ return np.sqrt(self.x ** 2 + self.y ** 2 + self.z ** 2)
[docs] def dot(self, target): """ Dot product of two vectors. Parameters ---------- target: ~einsteipy.coordinates.core.Cartesian Returns ------- ~astropy.units.quantity.Quantity Dot product with units """ x = self.x * target.x y = self.y * target.y z = self.z * target.z return x + y + z
[docs] def to_spherical(self): """ Method for conversion to spherical coordinates. Returns ------- ~einsteinpy.coordinates.core.Spherical Spherical representation of the Cartesian Coordinates. """ r, theta, phi = self.convert_spherical() return Spherical(r * u.m, theta * u.rad, phi * u.rad)
[docs] @u.quantity_input(a=u.km) def to_bl(self, a): """ Method for conversion to boyer-lindquist coordinates. Parameters ---------- a : ~astropy.units.quantity.Quantity a = J/Mc , the angular momentum per unit mass of the black hole per speed of light. Returns ------- ~einsteinpy.coordinates.core.BoyerLindquist BL representation of the Cartesian Coordinates. """ r, theta, phi, a = self.convert_bl(a.si.value) return BoyerLindquist(r * u.m, theta * u.rad, phi * u.rad, a * u.m)
[docs]class Spherical(SphericalConversion): """ Class for Spherical Coordinates and related transformations. """ @u.quantity_input(r=u.km, theta=u.rad, phi=u.rad) def __init__(self, r, theta, phi): """ Constructor. Parameters ---------- r : ~astropy.units.quantity.Quantity theta : ~astropy.units.quantity.Quantity phi : ~astropy.units.quantity.Quantity """ self.r = r self.theta = theta self.phi = phi super().__init__(r.si.value, theta.si.value, phi.si.value) self.system = "Spherical" self._dimension = { "r": self.r, "theta": self.theta, "phi": self.phi, "system": self.system, } self._dimension_order = ("r", "theta", "phi") def __repr__(self): return "Spherical r: {}, theta: {}, phi: {}".format( self.r, self.theta, self.phi ) def __str__(self): return self.__repr__() def __getitem__(self, item): """ Method to return coordinates. Objects are subsctiptable with both explicit names of parameters and integer indices. Parameters ---------- item : str or int Name of the parameter or its index. If ``'system'``, Name of coordinate is returned. """ if isinstance(item, (int, np.integer)): return self._dimension[self._dimension_order[item]] return self._dimension[item]
[docs] def si_values(self): """ Function for returning values in SI units. Returns ------- ~numpy.ndarray Array containing values in SI units (m, rad, rad) """ element_list = [self.r.to(u.m), self.theta.to(u.rad), self.phi.to(u.rad)] return np.array([e.value for e in element_list], dtype=float)
[docs] def to_cartesian(self): """ Method for conversion to cartesian coordinates. Returns ------- ~einsteinpy.coordinates.core.Cartesian Cartesian representation of the Spherical Coordinates. """ x, y, z = self.convert_cartesian() return Cartesian(x * u.m, y * u.m, z * u.m)
[docs] @u.quantity_input(a=u.km) def to_bl(self, a): """ Method for conversion to boyer-lindquist coordinates. Parameters ---------- a : ~astropy.units.quantity.Quantity a = J/Mc , the angular momentum per unit mass of the black hole per speed of light. Returns ------- ~einsteinpy.coordinates.core.BoyerLindquist BL representation of the Spherical Coordinates. """ r, theta, phi, a = self.convert_bl(a.si.value) return BoyerLindquist(r * u.m, theta * u.rad, phi * u.rad, a * u.m)
[docs]class BoyerLindquist(BoyerLindquistConversion): """ Class for Spherical Coordinates and related transformations. """ @u.quantity_input(r=u.km, theta=u.rad, phi=u.rad, a=u.km) def __init__(self, r, theta, phi, a): """ Constructor. Parameters ---------- r : ~astropy.units.quantity.Quantity theta : ~astropy.units.quantity.Quantity phi : ~astropy.units.quantity.Quantity a : ~astropy.units.quantity.Quantity """ self.r = r self.theta = theta self.phi = phi self.a = a super().__init__(r.si.value, theta.si.value, phi.si.value, a=a.si.value) self.system = "BoyerLindquist" self._dimension = { "r": self.r, "theta": self.theta, "phi": self.phi, "a": self.a, "system": self.system, } self._dimension_order = ("r", "theta", "phi") def __repr__(self): return "Boyer-Lindquist r: {}, theta: {}, phi: {} | a: {}".format( self.r, self.theta, self.phi, self.a ) def __str__(self): return self.__repr__() def __getitem__(self, item): """ Method to return coordinates. Objects are subsctiptable with both explicit names of parameters and integer indices. Parameters ---------- item : str or int Name of the parameter or its index. If ``'system'``, Name of coordinate is returned. If ``'a'``, spin factor of the body, ``self.a`` is returned. """ if isinstance(item, (int, np.integer)): return self._dimension[self._dimension_order[item]] return self._dimension[item]
[docs] def si_values(self): """ Function for returning values in SI units. Returns ------- ~numpy.ndarray Array containing values in SI units (m, rad, rad) """ element_list = [self.r.to(u.m), self.theta.to(u.rad), self.phi.to(u.rad)] return np.array([e.value for e in element_list], dtype=float)
[docs] def to_cartesian(self): """ Method for conversion to cartesian coordinates. Returns ------- ~einsteinpy.coordinates.core.Cartesian Cartesian representation of the BL Coordinates. """ x, y, z = self.convert_cartesian() return Cartesian(x * u.m, y * u.m, z * u.m)
[docs] def to_spherical(self): """ Method for conversion to spherical coordinates. Returns ------- ~einsteinpy.coordinates.core.Spherical Spherical representation of the BL Coordinates. """ r, theta, phi = self.convert_spherical() return Spherical(r * u.m, theta * u.rad, phi * u.rad)