28 #include "Fastor/Fastor.h"
33 namespace ContinuumMechanics::TensorUtility {
34 namespace TensorExponential {
37 template <
typename T,
size_t tensorSize >
39 const Fastor::Tensor< T, tensorSize, tensorSize >& theTensor,
42 double alternativeTolerance )
44 using TensorNN = Fastor::Tensor< T, tensorSize, tensorSize >;
46 TensorNN theExponential;
55 theExponential += theTensor;
57 TensorNN tensorPower = theTensor;
61 for ( n = 2; n < maxIterations; ++n ) {
63 tensorPower = tensorPower % theTensor;
64 const TensorNN series = 1. / facN * tensorPower;
65 theExponential += series;
68 Fastor::Tensor< double, tensorSize, tensorSize > series_real;
69 for (
size_t i = 0;
i < tensorSize;
i++ ) {
70 for (
size_t j = 0;
j < tensorSize;
j++ ) {
74 norm = Fastor::norm( series_real );
76 if ( norm <= tolerance )
80 if ( n == maxIterations && norm > alternativeTolerance ) {
84 return theExponential;
87 template <
typename T, std::
size_t tensorSize >
93 namespace FirstOrderDerived {
94 template <
typename T,
size_t tensorSize >
96 const Fastor::Tensor< T, tensorSize, tensorSize >& theTensor,
101 using Tensor = Fastor::Tensor< T, tensorSize, tensorSize >;
104 std::vector< Tensor > tensorPowers;
115 tensorPowers.push_back( theTensor );
118 for ( n = 2; n < maxIterations; ++n ) {
120 const Tensor tensorPower = tensorPowers.back() % theTensor;
121 const Tensor series = 1. / facN * tensorPower;
124 tensorPowers.push_back( tensorPower );
126 if ( Fastor::norm( series ) <= tolerance )
134 Fastor::Tensor< T, tensorSize, tensorSize, tensorSize, tensorSize > innerSeries;
135 Fastor::Tensor< T, tensorSize, tensorSize, tensorSize, tensorSize > outerSeries;
137 for ( n = 1; n <=
N; ++n ) {
139 for (
int m = 1;
m <= n; ++
m ) {
140 innerSeries += Fastor::outer( tensorPowers[
m - 1], tensorPowers[n -
m] );
143 outerSeries += 1. / facN * innerSeries;