From 3f017c75fc5ef1d1c506ae69c29f814017669cd5 Mon Sep 17 00:00:00 2001
From: Dmitri Naumov <dmitri.naumov@ufz.de>
Date: Sun, 13 Oct 2019 16:19:23 +0200
Subject: [PATCH] [PaL] Explicitly instantiate rotate*() templates.

Moving the code into cpp.
---
 ParameterLib/CoordinateSystem.cpp | 35 +++++++++++++++++++++++++++++++
 ParameterLib/CoordinateSystem.h   | 22 ++-----------------
 2 files changed, 37 insertions(+), 20 deletions(-)

diff --git a/ParameterLib/CoordinateSystem.cpp b/ParameterLib/CoordinateSystem.cpp
index 3e16da75c72..9258f98ce36 100644
--- a/ParameterLib/CoordinateSystem.cpp
+++ b/ParameterLib/CoordinateSystem.cpp
@@ -116,4 +116,39 @@ Eigen::Matrix<double, 3, 3> CoordinateSystem::transformation<3>(
 #endif  // NDEBUG
     return t;
 }
+
+template <int Dimension>
+Eigen::Matrix<double, Dimension, Dimension> CoordinateSystem::rotateTensor(
+    std::vector<double> const& values, SpatialPosition const& pos) const
+{
+    assert(values.size() == Dimension * Dimension ||
+           "Input vector has wrong dimension; expected 4 or 9 entries.");
+    auto const tensor =
+        Eigen::Map<Eigen::Matrix<double, Dimension, Dimension> const>(
+            values.data(), Dimension, Dimension);
+    auto const R = transformation<Dimension>(pos);
+    return R * tensor * R.transpose();
+}
+
+template <int Dimension>
+Eigen::Matrix<double, Dimension, Dimension>
+CoordinateSystem::rotateDiagonalTensor(std::vector<double> const& values,
+                                       SpatialPosition const& pos) const
+{
+    assert(values.size() == Dimension ||
+           "Input vector has wrong dimension; expected 2 or 3 entries.");
+    auto const tensor = Eigen::Map<Eigen::Matrix<double, Dimension, 1> const>(
+        values.data(), Dimension, 1);
+    auto const R = transformation<Dimension>(pos);
+    return R * tensor.asDiagonal() * R.transpose();
+}
+
+template Eigen::Matrix<double, 2, 2> CoordinateSystem::rotateTensor<2>(
+    std::vector<double> const& values, SpatialPosition const& pos) const;
+template Eigen::Matrix<double, 3, 3> CoordinateSystem::rotateTensor<3>(
+    std::vector<double> const& values, SpatialPosition const& pos) const;
+template Eigen::Matrix<double, 2, 2> CoordinateSystem::rotateDiagonalTensor<2>(
+    std::vector<double> const& values, SpatialPosition const& pos) const;
+template Eigen::Matrix<double, 3, 3> CoordinateSystem::rotateDiagonalTensor<3>(
+    std::vector<double> const& values, SpatialPosition const& pos) const;
 }  // namespace ParameterLib
diff --git a/ParameterLib/CoordinateSystem.h b/ParameterLib/CoordinateSystem.h
index 91fe860b9bb..0e18f44f71b 100644
--- a/ParameterLib/CoordinateSystem.h
+++ b/ParameterLib/CoordinateSystem.h
@@ -37,29 +37,11 @@ struct CoordinateSystem final
 
     template <int Dimension>
     Eigen::Matrix<double, Dimension, Dimension> rotateTensor(
-        std::vector<double> const& values, SpatialPosition const& pos) const
-    {
-        assert(values.size() == Dimension * Dimension ||
-               "Input vector has wrong dimension; expected 4 or 9 entries.");
-        auto const tensor =
-            Eigen::Map<Eigen::Matrix<double, Dimension, Dimension> const>(
-                values.data(), Dimension, Dimension);
-        auto const R = transformation<Dimension>(pos);
-        return R * tensor * R.transpose();
-    }
+        std::vector<double> const& values, SpatialPosition const& pos) const;
 
     template <int Dimension>
     Eigen::Matrix<double, Dimension, Dimension> rotateDiagonalTensor(
-        std::vector<double> const& values, SpatialPosition const& pos) const
-    {
-        assert(values.size() == Dimension ||
-               "Input vector has wrong dimension; expected 2 or 3 entries.");
-        auto const tensor =
-            Eigen::Map<Eigen::Matrix<double, Dimension, 1> const>(values.data(),
-                                                                  Dimension, 1);
-        auto const R = transformation<Dimension>(pos);
-        return R * tensor.asDiagonal() * R.transpose();
-    }
+        std::vector<double> const& values, SpatialPosition const& pos) const;
 
 private:
     std::array<Parameter<double> const*, 3> _base;
-- 
GitLab