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