From 6a37e06a8c2a40c25e9805d3ba79e133d05bd6f5 Mon Sep 17 00:00:00 2001
From: labourasse <labourassee@gmail.com>
Date: Mon, 18 Nov 2024 17:59:36 +0100
Subject: [PATCH] add exponential function and test

---
 src/algebra/EigenvalueSolver.cpp  | 11 +++++++++++
 src/algebra/EigenvalueSolver.hpp  |  2 ++
 src/scheme/HyperplasticSolver.cpp |  9 ++++++---
 tests/test_EigenvalueSolver.cpp   | 14 +++++++++++++-
 4 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/src/algebra/EigenvalueSolver.cpp b/src/algebra/EigenvalueSolver.cpp
index 41e4bf4aa..efaaa19a2 100644
--- a/src/algebra/EigenvalueSolver.cpp
+++ b/src/algebra/EigenvalueSolver.cpp
@@ -516,4 +516,15 @@ EigenvalueSolver::_findLastRoots(Polynomial<2> P, const double epsilon) const
   return roots;
 }
 
+void
+EigenvalueSolver::computeExpForTinyMatrix(const TinyMatrix<3>& A, TinyMatrix<3>& expA)
+{
+  auto [eigenvalues, eigenvectors] = findEigen(A);
+  TinyMatrix<3> D                  = zero;
+  for (size_t i = 0; i < 3; ++i) {
+    D(i, i) = std::exp(eigenvalues[i]);
+  }
+  expA = eigenvectors * D * transpose(eigenvectors);
+}
+
 EigenvalueSolver::EigenvalueSolver() {}
diff --git a/src/algebra/EigenvalueSolver.hpp b/src/algebra/EigenvalueSolver.hpp
index 6c01068e0..728cacdfa 100644
--- a/src/algebra/EigenvalueSolver.hpp
+++ b/src/algebra/EigenvalueSolver.hpp
@@ -100,6 +100,8 @@ class EigenvalueSolver
 
   TinyVector<2> _findLastRoots(Polynomial<2> P, const double epsilon) const;
 
+  void computeExpForTinyMatrix(const TinyMatrix<3>& A, TinyMatrix<3>& expA);
+
   EigenvalueSolver();
   ~EigenvalueSolver() = default;
 };
diff --git a/src/scheme/HyperplasticSolver.cpp b/src/scheme/HyperplasticSolver.cpp
index e3f06ca9c..9e8a27278 100644
--- a/src/scheme/HyperplasticSolver.cpp
+++ b/src/scheme/HyperplasticSolver.cpp
@@ -203,9 +203,12 @@ class HyperplasticSolverHandler::HyperplasticSolver final : public HyperplasticS
   double
   _compute_chi(const R3x3 S, const double yield) const
   {
-    const R3x3 Id                     = identity;
-    const R3x3 Sd                     = S - 1. / 3 * trace(S) * Id;
-    auto [eigenvalues2, eigenmatrix2] = EigenvalueSolver{}.findEigen(TestB);
+    const R3x3 Id = identity;
+    const R3x3 Sd = S - 1. / 3 * trace(S) * Id;
+    //    auto [eigenvalues2, eigenmatrix2] = EigenvalueSolver{}.findEigen(TestB);
+    R3x3 B;
+    EigenvalueSolver{}.computeExpForTinyMatrix(TestA2, B);
+    std::cout << B << "\n";
     exit(0);
     double chi         = 0;
     const double normS = frobeniusNorm(Sd);
diff --git a/tests/test_EigenvalueSolver.cpp b/tests/test_EigenvalueSolver.cpp
index 5efaa921b..d2316d884 100644
--- a/tests/test_EigenvalueSolver.cpp
+++ b/tests/test_EigenvalueSolver.cpp
@@ -166,6 +166,8 @@ TEST_CASE("EigenvalueSolver", "[algebra]")
       TinyMatrix<3> TestD{1e10, 0, 0, 0, 1, 0, 0, 0, 1};
       TinyMatrix<3> TestE{3e-10, 2e-10, 4e-10, 2e-10, 0, 2e-10, 4e-10, 2e-10, 3e-10};
 
+      TinyMatrix<3> expA2;
+
       auto [eigenvalues, eigenmatrix] = EigenvalueSolver{}.findEigen(TestA);
       TinyMatrix<3> Diag              = zero;
       for (size_t i = 0; i < 3; ++i) {
@@ -177,7 +179,6 @@ TEST_CASE("EigenvalueSolver", "[algebra]")
           REQUIRE((B(i, j) - TestA(i, j)) / frobeniusNorm(TestA) == Catch::Approx(0).margin(1E-8));
         }
       }
-
       auto [eigenvalues2, eigenmatrix2] = EigenvalueSolver{}.findEigen(TestA2);
       Diag                              = zero;
       for (size_t i = 0; i < 3; ++i) {
@@ -189,6 +190,17 @@ TEST_CASE("EigenvalueSolver", "[algebra]")
           REQUIRE((B(i, j) - TestA2(i, j)) / frobeniusNorm(TestA2) == Catch::Approx(0).margin(1E-8));
         }
       }
+      EigenvalueSolver{}.computeExpForTinyMatrix(TestA2, expA2);
+      for (size_t i = 0; i < 3; ++i) {
+        Diag(i, i) = std::exp(eigenvalues2[i]);
+      }
+      B = eigenmatrix2 * Diag * transpose(eigenmatrix2);
+
+      for (size_t i = 0; i < 3; ++i) {
+        for (size_t j = 0; j < 3; ++j) {
+          REQUIRE(expA2(i, j) - B(i, j) == Catch::Approx(0).margin(1E-12));
+        }
+      }
 
       auto [eigenvalues3, eigenmatrix3] = EigenvalueSolver{}.findEigen(TestB);
       Diag                              = zero;
-- 
GitLab