Source code for halotools.mock_observables.tensor_calculations.tensor_derived_quantities
"""
"""
from __future__ import absolute_import, division, print_function, unicode_literals
import numpy as np
__all__ = (
'principal_axes_from_inertia_tensors', 'sphericity_from_inertia_tensors',
'triaxility_from_inertia_tensors')
[docs]
def principal_axes_from_inertia_tensors(inertia_tensors):
r""" Calculate the principal eigenvector of each of the input inertia tensors.
Parameters
----------
inertia_tensors : ndarray
Numpy array of shape (npts, 3, 3) storing a collection of 3x3 symmetric
positive-definite matrices
Returns
-------
principal_axes : ndarray
Numpy array of shape (npts, 3) storing a collection of 3d principal eigenvectors
eigenvalues : ndarray
Numpy array of shape (npts, ) storing the eigenvalue of each principal eigenvector
Notes
-----
The function `~halotools.mock_observables.inertia_tensor_per_object`
calculates the inertia tensors :math:`\mathcal{I}_{\rm i}` for a collection of
points inside a 3d mass distribution.
"""
evals, evecs = np.linalg.eigh(inertia_tensors)
return evecs[:, :, 2], evals[:, 2]
[docs]
def sphericity_from_inertia_tensors(inertia_tensors):
r""" Calculate the sphericity :math:`\mathcal{S}_{\rm i}`
of each of the :math:`i=1,\dots,N_{\rm points}`
mass distributions defined by the input inertia tensors :math:`\mathcal{I}_{\rm i}`.
Sphericity :math:`0 < \mathcal{S} <= 1` is defined in terms of
the eigenvalues of the inertia tensor :math:`\mathcal{I}`,
denoted by :math:`\lambda_{a}, \lambda_{b}, \lambda_{c}`,
from largest to smallest:
.. math::
\mathcal{S}\equiv\lambda_{c}/\lambda_{a}
Parameters
----------
inertia_tensors : ndarray
Numpy array of shape (npts, 3, 3) storing a collection of 3x3 symmetric
positive-definite matrices
Returns
-------
sphericity : ndarray
Numpy array of shape (npts, ) storing the sphericity of each inertia tensor
Notes
-----
The function `~halotools.mock_observables.inertia_tensor_per_object`
calculates the inertia tensors :math:`\mathcal{I}_{\rm i}` for a collection of
points inside a 3d mass distribution.
"""
evals, evecs = np.linalg.eigh(inertia_tensors)
third_evals = evals[:, 0]
first_evals = evals[:, 2]
sphericity = third_evals/first_evals
return sphericity
[docs]
def triaxility_from_inertia_tensors(inertia_tensors):
r""" Calculate the triaxility :math:`\mathcal{T}_{\rm i}`
of each of the :math:`i=1,\dots,N_{\rm points}`
mass distributions defined by the input inertia tensors :math:`\mathcal{I}_{\rm i}`.
Triaxility :math:`\mathcal{T}` is defined in terms of
the eigenvalues of the inertia tensor :math:`\mathcal{I}`,
denoted by :math:`\lambda_{a}, \lambda_{b}, \lambda_{c}`,
from largest to smallest:
.. math::
\mathcal{T}\equiv\frac{\lambda_{a}^{2}-\lambda_{b}^{2}}{\lambda_{a}^{2}-\lambda_{c}^{2}}
Parameters
----------
inertia_tensors : ndarray
Numpy array of shape (npts, 3, 3) storing a collection of 3x3 symmetric
positive-definite matrices
Returns
-------
triaxility : ndarray
Numpy array of shape (npts, ) storing the triaxility of each inertia tensor
Notes
-----
The function `~halotools.mock_observables.inertia_tensor_per_object`
calculates the inertia tensors :math:`\mathcal{I}_{\rm i}` for a collection of
points inside a 3d mass distribution.
"""
evals, evecs = np.linalg.eigh(inertia_tensors)
third_evals = evals[:, 0]
second_evals = evals[:, 1]
first_evals = evals[:, 2]
triaxility = (first_evals**2 - second_evals**2)/(first_evals**2 - third_evals**2)
return triaxility