From 7a1b47609cb303946184e55b21fb48f069363e17 Mon Sep 17 00:00:00 2001
From: Dmitri Naumov <dmitri.naumov@ufz.de>
Date: Mon, 29 Jan 2018 18:05:57 +0100
Subject: [PATCH] [MaL] Move all Kelvin vector code in single place.

---
 .../KelvinVector-impl.h                       | 13 ++---
 .../SolidModels => MathLib}/KelvinVector.cpp  | 29 ++++++++--
 .../SolidModels => MathLib}/KelvinVector.h    | 54 +++++++++++++++++--
 ProcessLib/Deformation/BMatrixPolicy.h        | 40 --------------
 Tests/MaterialLib/KelvinVector.cpp            | 26 +--------
 5 files changed, 84 insertions(+), 78 deletions(-)
 rename {MaterialLib/SolidModels => MathLib}/KelvinVector-impl.h (92%)
 rename {MaterialLib/SolidModels => MathLib}/KelvinVector.cpp (71%)
 rename {MaterialLib/SolidModels => MathLib}/KelvinVector.h (65%)

diff --git a/MaterialLib/SolidModels/KelvinVector-impl.h b/MathLib/KelvinVector-impl.h
similarity index 92%
rename from MaterialLib/SolidModels/KelvinVector-impl.h
rename to MathLib/KelvinVector-impl.h
index b3224907f67..8916fba496c 100644
--- a/MaterialLib/SolidModels/KelvinVector-impl.h
+++ b/MathLib/KelvinVector-impl.h
@@ -7,9 +7,9 @@
  *
  */
 
-namespace MaterialLib
+namespace MathLib
 {
-namespace SolidModels
+namespace KelvinVector
 {
 template <int KelvinVectorSize>
 double Invariants<KelvinVectorSize>::equivalentStress(
@@ -99,8 +99,9 @@ Eigen::Matrix<double, KelvinVectorSize, KelvinVectorSize> const
         detail::initSphericalProjection<KelvinVectorSize>();
 
 template <int KelvinVectorSize>
-const Eigen::Matrix<double, KelvinVectorSize, 1> Invariants<
-    KelvinVectorSize>::identity2 = detail::initIdentity2<KelvinVectorSize>();
+const Eigen::Matrix<double, KelvinVectorSize, 1>
+    Invariants<KelvinVectorSize>::identity2 =
+        detail::initIdentity2<KelvinVectorSize>();
 
-}  // namespace SolidModels
-}  // namespace MaterialLib
+}  // namespace KelvinVector
+}  // namespace MathLib
diff --git a/MaterialLib/SolidModels/KelvinVector.cpp b/MathLib/KelvinVector.cpp
similarity index 71%
rename from MaterialLib/SolidModels/KelvinVector.cpp
rename to MathLib/KelvinVector.cpp
index a471da88756..6490719e5d7 100644
--- a/MaterialLib/SolidModels/KelvinVector.cpp
+++ b/MathLib/KelvinVector.cpp
@@ -9,9 +9,9 @@
 
 #include "KelvinVector.h"
 
-namespace MaterialLib
+namespace MathLib
 {
-namespace SolidModels
+namespace KelvinVector
 {
 template <>
 double Invariants<6>::determinant(Eigen::Matrix<double, 6, 1> const& v)
@@ -57,5 +57,26 @@ Eigen::Matrix<double, 6, 1, Eigen::ColMajor, 6, 1> inverse(
     return inv / Invariants<6>::determinant(v);
 }
 
-}  // namespace SolidModels
-}  // namespace MaterialLib
+template <>
+Eigen::Matrix<double, 3, 3> kelvinToTensor(
+    Eigen::Matrix<double, 4, 1, Eigen::ColMajor> const& v)
+{
+    Eigen::Matrix<double, 3, 3> m;
+    m << v[0], v[3] / std::sqrt(2.), 0, v[3] / std::sqrt(2.), v[1], 0, 0, 0,
+        v[2];
+    return m;
+}
+
+template <>
+Eigen::Matrix<double, 3, 3> kelvinToTensor(
+    Eigen::Matrix<double, 6, 1, Eigen::ColMajor> const& v)
+{
+    Eigen::Matrix<double, 3, 3> m;
+    m << v[0], v[3] / std::sqrt(2.), v[5] / std::sqrt(2.), v[3] / std::sqrt(2.),
+        v[1], v[4] / std::sqrt(2.), v[5] / std::sqrt(2.), v[4] / std::sqrt(2.),
+        v[2];
+    return m;
+}
+
+}  // namespace KelvinVector
+}  // namespace MathLib
diff --git a/MaterialLib/SolidModels/KelvinVector.h b/MathLib/KelvinVector.h
similarity index 65%
rename from MaterialLib/SolidModels/KelvinVector.h
rename to MathLib/KelvinVector.h
index 08db1aa1ab4..ac7bf3b21b3 100644
--- a/MaterialLib/SolidModels/KelvinVector.h
+++ b/MathLib/KelvinVector.h
@@ -10,13 +10,53 @@
 
 #include <Eigen/Dense>
 
-namespace MaterialLib
+namespace MathLib
 {
 /// The invariants and the Kelving mapping are explained in detail in the
 /// article "On Advantages of the Kelvin Mapping in Finite Element
 /// Implementations of Deformation Processes" \cite Nagel2016.
-namespace SolidModels
+namespace KelvinVector
 {
+/// Kelvin vector dimensions for given displacement dimension.
+template <int DisplacementDim>
+struct KelvinVectorDimensions;
+
+template <>
+struct KelvinVectorDimensions<2>
+{
+    static int const value = 4;
+};
+
+template <>
+struct KelvinVectorDimensions<3>
+{
+    static int const value = 6;
+};
+
+//
+// Kelvin vector and matrix templates for given displacement dimension.
+//
+
+/// Kelvin vector type for given displacement dimension.
+/// \note The Eigen vector is always a fixed size vector in contrast to a shape
+/// matrix policy types like BMatrixPolicyType::KelvinVectorType.
+template <int DisplacementDim>
+using KelvinVectorType =
+    Eigen::Matrix<double,
+                  KelvinVectorDimensions<DisplacementDim>::value,
+                  1,
+                  Eigen::ColMajor>;
+
+/// Kelvin matrix type for given displacement dimension.
+/// \note The Eigen matrix is always a fixed size vector in contrast to a shape
+/// matrix policy types like BMatrixPolicyType::KelvinMatrixType.
+template <int DisplacementDim>
+using KelvinMatrixType =
+    Eigen::Matrix<double,
+                  KelvinVectorDimensions<DisplacementDim>::value,
+                  KelvinVectorDimensions<DisplacementDim>::value,
+                  Eigen::RowMajor>;
+
 /// Invariants used in mechanics, based on Kelvin representation of the vectors
 /// and matrices.
 /// The invariants are computed at process creation time.
@@ -75,7 +115,13 @@ inverse(Eigen::Matrix<double,
                       KelvinVectorSize,
                       1> const& v);
 
-}  // namespace SolidModels
-}  // namespace MaterialLib
+/// Conversion of a Kelvin vector to a 3x3 matrix
+/// Only implementations for KelvinVectorSize 4 and 6 are provided.
+template <int KelvinVectorSize>
+Eigen::Matrix<double, 3, 3> kelvinToTensor(
+    Eigen::Matrix<double, KelvinVectorSize, 1, Eigen::ColMajor> const& v);
+
+}  // namespace KelvinVector
+}  // namespace MathLib
 
 #include "KelvinVector-impl.h"
diff --git a/ProcessLib/Deformation/BMatrixPolicy.h b/ProcessLib/Deformation/BMatrixPolicy.h
index 3a958250d2f..b887ad1af65 100644
--- a/ProcessLib/Deformation/BMatrixPolicy.h
+++ b/ProcessLib/Deformation/BMatrixPolicy.h
@@ -13,46 +13,6 @@
 
 namespace ProcessLib
 {
-/// Kelvin vector dimensions for given displacement dimension.
-template <int DisplacementDim>
-struct KelvinVectorDimensions;
-
-template <>
-struct KelvinVectorDimensions<2>
-{
-    static int const value = 4;
-};
-
-template <>
-struct KelvinVectorDimensions<3>
-{
-    static int const value = 6;
-};
-
-//
-// Kelvin vector and matrix templates for given displacement dimension.
-//
-
-/// \todo Maybe better to move the KelvinVector/MatrixType into
-/// MaterialLib/SolidModels/KelvinVector.h.
-
-/// Kelvin vector type for given displacement dimension.
-/// \note The Eigen vector is always a fixed size vector in contrast to the
-/// BMatrixPolicyType::KelvinVectorType.
-template <int DisplacementDim>
-using KelvinVectorType =
-    Eigen::Matrix<double, KelvinVectorDimensions<DisplacementDim>::value, 1,
-                  Eigen::ColMajor>;
-
-/// Kelvin matrix type for given displacement dimension.
-/// \note The Eigen matrix is always a fixed size matrix in contrast to the
-/// BMatrixPolicyType::KelvinMatrixType.
-template <int DisplacementDim>
-using KelvinMatrixType =
-    Eigen::Matrix<double, KelvinVectorDimensions<DisplacementDim>::value,
-                  KelvinVectorDimensions<DisplacementDim>::value,
-                  Eigen::RowMajor>;
-
 /// An implementation of B-Matrix policy using same matrix and vector types
 /// (fixed size or dynamic) as in the ShapeMatrixPolicyType.
 template <typename ShapeFunction, unsigned DisplacementDim>
diff --git a/Tests/MaterialLib/KelvinVector.cpp b/Tests/MaterialLib/KelvinVector.cpp
index 2c0bf4032d3..815bbc78764 100644
--- a/Tests/MaterialLib/KelvinVector.cpp
+++ b/Tests/MaterialLib/KelvinVector.cpp
@@ -8,38 +8,16 @@
 
 #include <gtest/gtest.h>
 
-#include "MaterialLib/SolidModels/KelvinVector.h"
+#include "MathLib/KelvinVector.h"
 
 #include "Tests/AutoCheckTools.h"
 
-using namespace MaterialLib::SolidModels;
+using namespace MathLib::KelvinVector;
 namespace ac = autocheck;
 
 template <int Size>
 using KelvinVector = Eigen::Matrix<double, Size, 1, Eigen::ColMajor, Size, 1>;
 
-template <int Size>
-Eigen::Matrix<double, 3, 3> kelvinToTensor(KelvinVector<Size> const& v);
-
-template <>
-Eigen::Matrix<double, 3, 3> kelvinToTensor(KelvinVector<4> const& v)
-{
-    Eigen::Matrix<double, 3, 3> m;
-    m << v[0], v[3] / std::sqrt(2.), 0, v[3] / std::sqrt(2.), v[1], 0, 0, 0,
-        v[2];
-    return m;
-}
-
-template <>
-Eigen::Matrix<double, 3, 3> kelvinToTensor(KelvinVector<6> const& v)
-{
-    Eigen::Matrix<double, 3, 3> m;
-    m << v[0], v[3] / std::sqrt(2.), v[5] / std::sqrt(2.), v[3] / std::sqrt(2.),
-        v[1], v[4] / std::sqrt(2.), v[5] / std::sqrt(2.), v[4] / std::sqrt(2.),
-        v[2];
-    return m;
-}
-
 template <int Size>
 KelvinVector<Size> tensorToKelvin(Eigen::Matrix<double, 3, 3> const& m);
 
-- 
GitLab