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