# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies.
# SPDX-FileContributor: Martin Lemay
import numpy as np
import numpy.typing as npt
__doc__ = """
GeosUtils module defines usefull methods to process GEOS outputs according to
GEOS conventions.
"""
[docs]
def getAttributeMatrixFromVector( attrArray: npt.NDArray[ np.float64 ], ) -> npt.NDArray[ np.float64 ]:
r"""Get the matrix of attribute values from the vector.
Matrix to vector conversion is the following:
* if input vector size is 3:
.. math::
(v1, v2, v3) => \begin{bmatrix}
v0 & 0 & 0 \\
0 & v1 & 0 \\
0 & 0 & v2
\end{bmatrix}
* if input vector size is 6:
.. math::
(v1, v2, v3, v4, v5, v6) => \begin{bmatrix}
v1 & v6 & v5 \\
v6 & v2 & v4 \\
v5 & v4 & v3
\end{bmatrix}
.. WARNING:: Input vector must be of size 3 or 6.
Args:
attrArray (npt.NDArray[np.float64]): Vector of attribute values.
Returns:
npt.NDArray[np.float64]: matrix of attribute values
"""
assert attrArray.size > 2, ( "Vectorial attribute must contains at least " + "3 components." )
# diagonal terms
matrix: npt.NDArray[ np.float64 ] = np.diagflat( attrArray[ :3 ] )
# shear stress components
if attrArray.size == 6:
matrix[ 0, 1 ] = attrArray[ 5 ]
matrix[ 1, 0 ] = attrArray[ 5 ]
matrix[ 0, 2 ] = attrArray[ 4 ]
matrix[ 2, 0 ] = attrArray[ 4 ]
matrix[ 1, 2 ] = attrArray[ 3 ]
matrix[ 2, 1 ] = attrArray[ 3 ]
return matrix
[docs]
def getAttributeVectorFromMatrix( attrMatrix: npt.NDArray[ np.float64 ], size: int ) -> npt.NDArray[ np.float64 ]:
r"""Get the vector of attribute values from the matrix.
Matrix to vector conversion is the following:
* 3x3 diagonal matrix:
.. math::
\begin{bmatrix}
M00 & 0 & 0 \\
0 & M11 & 0 \\
0 & 0 & M22
\end{bmatrix}
=> (M00, M11, M22)
* otherwise:
.. math::
\begin{bmatrix}
M00 & M01 & M02 \\
M01 & M11 & M12 \\
M02 & M12 & M22
\end{bmatrix}
=> (M00, M11, M22, M12, M02, M01)
Args:
attrMatrix (npt.NDArray[np.float64]): Matrix of attribute values.
size (int): Size of the final vector.
Returns:
npt.NDArray[np.float64]: vector of attribute values
"""
attrArray: npt.NDArray[ np.float64 ] = np.full( size, np.nan )
# diagonal terms
attrArray[ :3 ] = np.diag( attrMatrix )
# shear stress components
if attrArray.size == 6:
attrArray[ 3 ] = attrMatrix[ 1, 2 ]
attrArray[ 4 ] = attrMatrix[ 0, 2 ]
attrArray[ 5 ] = attrMatrix[ 0, 1 ]
return attrArray