DAMASK_EICMD/python/damask/tensor.py

130 lines
2.9 KiB
Python
Raw Normal View History

"""
2021-04-24 18:17:52 +05:30
Tensor mathematics.
2021-04-24 18:17:52 +05:30
All routines operate on numpy.ndarrays of shape (...,3,3).
"""
import numpy as _np
def deviatoric(T: _np.ndarray) -> _np.ndarray:
2020-11-19 19:08:54 +05:30
"""
Calculate deviatoric part of a tensor.
Parameters
----------
2021-12-06 12:08:40 +05:30
T : numpy.ndarray, shape (...,3,3)
2020-11-19 19:08:54 +05:30
Tensor of which the deviatoric part is computed.
Returns
-------
2021-12-06 12:08:40 +05:30
T' : numpy.ndarray, shape (...,3,3)
2020-11-19 19:08:54 +05:30
Deviatoric part of T.
"""
return T - spherical(T,tensor=True)
def eigenvalues(T_sym: _np.ndarray) -> _np.ndarray:
"""
Eigenvalues, i.e. principal components, of a symmetric tensor.
Parameters
----------
2021-12-06 12:08:40 +05:30
T_sym : numpy.ndarray, shape (...,3,3)
Symmetric tensor of which the eigenvalues are computed.
Returns
-------
2021-12-06 12:08:40 +05:30
lambda : numpy.ndarray, shape (...,3)
Eigenvalues of T_sym sorted in ascending order, each repeated
according to its multiplicity.
"""
return _np.linalg.eigvalsh(symmetric(T_sym))
def eigenvectors(T_sym: _np.ndarray,
RHS: bool = False) -> _np.ndarray:
"""
Eigenvectors of a symmetric tensor.
Parameters
----------
2021-12-06 12:08:40 +05:30
T_sym : numpy.ndarray, shape (...,3,3)
Symmetric tensor of which the eigenvectors are computed.
RHS: bool, optional
Enforce right-handed coordinate system. Defaults to False.
Returns
-------
2021-12-06 12:08:40 +05:30
x : numpy.ndarray, shape (...,3,3)
Eigenvectors of T_sym sorted in ascending order of their
associated eigenvalues.
"""
_,v = _np.linalg.eigh(symmetric(T_sym))
if RHS: v[_np.linalg.det(v) < 0.0,:,2] *= -1.0
return v
2020-11-19 18:35:59 +05:30
def spherical(T: _np.ndarray,
tensor: bool = True) -> _np.ndarray:
2020-11-19 19:08:54 +05:30
"""
Calculate spherical part of a tensor.
Parameters
----------
2021-12-06 12:08:40 +05:30
T : numpy.ndarray, shape (...,3,3)
2020-11-19 19:08:54 +05:30
Tensor of which the spherical part is computed.
tensor : bool, optional
Map spherical part onto identity tensor. Defaults to True.
Returns
-------
2021-12-06 12:08:40 +05:30
p : numpy.ndarray, shape (...,3,3)
2020-11-19 19:08:54 +05:30
unless tensor == False: shape (...,)
Spherical part of tensor T. p is an isotropic tensor.
"""
sph = _np.trace(T,axis2=-2,axis1=-1)/3.0
return _np.einsum('...jk,...',_np.eye(3),sph) if tensor else sph
def symmetric(T: _np.ndarray) -> _np.ndarray:
2020-11-19 18:35:59 +05:30
"""
Symmetrize tensor.
Parameters
----------
2021-12-06 12:08:40 +05:30
T : numpy.ndarray, shape (...,3,3)
2020-11-19 18:35:59 +05:30
Tensor of which the symmetrized values are computed.
Returns
-------
2021-12-06 12:08:40 +05:30
T_sym : numpy.ndarray, shape (...,3,3)
2020-11-19 18:35:59 +05:30
Symmetrized tensor T.
"""
return (T+transpose(T))*0.5
def transpose(T: _np.ndarray) -> _np.ndarray:
2020-11-19 18:35:59 +05:30
"""
Transpose tensor.
Parameters
----------
2021-12-06 12:08:40 +05:30
T : numpy.ndarray, shape (...,3,3)
2020-11-19 18:35:59 +05:30
Tensor of which the transpose is computed.
Returns
-------
2021-12-06 12:08:40 +05:30
T.T : numpy.ndarray, shape (...,3,3)
2020-11-19 18:35:59 +05:30
Transpose of tensor T.
"""
return _np.swapaxes(T,axis2=-2,axis1=-1)