From a031a008e606607f492c518fafee09c94361b8eb Mon Sep 17 00:00:00 2001 From: Anna Wellmann <a.wellmann@tu-braunschweig.de> Date: Thu, 28 Sep 2023 12:11:42 +0000 Subject: [PATCH] Test function for rotation --- src/basics/tests/testUtilities.h | 27 ++ src/basics/tests/testUtilitiesTest.cpp | 13 + .../CoordinateTransformation.h | 36 +- .../CoordinateTransformationTest.h | 363 +++++++++++++++--- 4 files changed, 354 insertions(+), 85 deletions(-) create mode 100644 src/basics/tests/testUtilitiesTest.cpp diff --git a/src/basics/tests/testUtilities.h b/src/basics/tests/testUtilities.h index ed7f88d1b..3de25bbf4 100644 --- a/src/basics/tests/testUtilities.h +++ b/src/basics/tests/testUtilities.h @@ -2,6 +2,7 @@ #define TESTUTILITIES_H #include <gmock/gmock.h> +#include <basics/DataTypes.h> inline auto RealEq = [](auto value) { #ifdef VF_DOUBLE_ACCURACY @@ -19,9 +20,35 @@ inline auto RealNear = [](auto value, auto max_abs_error) { #endif }; +namespace +{ +__inline__ bool isEqualWithAccuracy(real number, real expected, real accuracy) +{ + return number > (expected - accuracy) && number < (expected + accuracy); +} +} // namespace + namespace testingVF { +MATCHER_P2(RealNearForContainer, expectedContainer, accuracy, "") +{ + if (arg.size() != expectedContainer.size()) { + std::cout << "The checked container does not have the same size as the expected container.\n" << std::endl; + return false; + } + + for (int i = 0; i < arg.size(); i++) { + if (!isEqualWithAccuracy(arg[i], expectedContainer[i], accuracy)) { + std::cout << "First mismatching element at index " << i << ": The actual element " << std::to_string(arg[i]) + << " is not near the expected element " << std::to_string(expectedContainer[i]) + << " (difference = " << std::to_string(expectedContainer[i] - arg[i]) << ").\n"; + return false; + } + } + return true; +} + __inline__ void captureStdOut() { testing::internal::CaptureStdout(); diff --git a/src/basics/tests/testUtilitiesTest.cpp b/src/basics/tests/testUtilitiesTest.cpp new file mode 100644 index 000000000..b6f103869 --- /dev/null +++ b/src/basics/tests/testUtilitiesTest.cpp @@ -0,0 +1,13 @@ +#include "testUtilities.h" + +TEST(isEqualWithAccuracy, test) +{ + const real accuracy = 1.0; + const real expected = 0.0; + + EXPECT_TRUE(isEqualWithAccuracy( 0.0, expected, accuracy)); + EXPECT_TRUE(isEqualWithAccuracy( 0.999999, expected, accuracy)); + EXPECT_TRUE(isEqualWithAccuracy( -0.999999, expected, accuracy)); + EXPECT_FALSE(isEqualWithAccuracy( 1.000001, expected, accuracy)); + EXPECT_FALSE(isEqualWithAccuracy( -1.000001, expected, accuracy)); +} diff --git a/src/gpu/VirtualFluids_GPU/LBM/GPUHelperFunctions/CoordinateTransformation.h b/src/gpu/VirtualFluids_GPU/LBM/GPUHelperFunctions/CoordinateTransformation.h index b6785fb28..727864752 100644 --- a/src/gpu/VirtualFluids_GPU/LBM/GPUHelperFunctions/CoordinateTransformation.h +++ b/src/gpu/VirtualFluids_GPU/LBM/GPUHelperFunctions/CoordinateTransformation.h @@ -30,7 +30,7 @@ __inline__ __host__ __device__ void rotateDataFromRotatingToGlobal(real &datumX, datumZ = datumZTemp; } -__inline__ __device__ void transformRotatingToGlobal(real &globalX, real &globalY, real &globalZ, real localX, real localY, +__inline__ __host__ __device__ void transformRotatingToGlobal(real &globalX, real &globalY, real &globalZ, real localX, real localY, real localZ, real centerCoordX, real centerCoordY, real centerCoordZ, real angleX, real angleY, real angleZ) { @@ -38,20 +38,7 @@ __inline__ __device__ void transformRotatingToGlobal(real &globalX, real &global globalY = localY; globalZ = localZ; - // rotate - if (angleX != 0) { - // rotate in x - globalY = localY * cos(angleX) - localZ * sin(angleX); - globalZ = localY * sin(angleX) + localZ * cos(angleX); - } else if (angleY != 0) { - // rotate in y - globalX = localX * cos(angleY) + localZ * sin(angleY); - globalZ = -localX * sin(angleY) + localZ * cos(angleY); - } else if (angleZ != 0) { - // rotate in z - globalX = localX * cos(angleZ) - localY * sin(angleZ); - globalY = localX * sin(angleZ) + localY * cos(angleZ); - } + rotateDataFromRotatingToGlobal(globalX, globalY, globalZ, angleX, angleY, angleZ); // translate globalX += centerCoordX; @@ -60,7 +47,7 @@ __inline__ __device__ void transformRotatingToGlobal(real &globalX, real &global } -__inline__ __device__ void rotateDataFromGlobalToRotating(real &datumX, real &datumY, real &datumZ, real angleX, +__inline__ __host__ __device__ void rotateDataFromGlobalToRotating(real &datumX, real &datumY, real &datumZ, real angleX, real angleY, real angleZ) { real datumXTemp = datumX; @@ -83,7 +70,7 @@ __inline__ __device__ void rotateDataFromGlobalToRotating(real &datumX, real &da datumZ = datumZTemp; } -__inline__ __device__ void transformGlobalToRotating(real &rotatingX, real &rotatingY, real &rotatingZ, real globalX, +__inline__ __host__ __device__ void transformGlobalToRotating(real &rotatingX, real &rotatingY, real &rotatingZ, real globalX, real globalY, real globalZ, real centerCoordX, real centerCoordY, real centerCoordZ, real angleX, real angleY, real angleZ) { @@ -97,20 +84,7 @@ __inline__ __device__ void transformGlobalToRotating(real &rotatingX, real &rota rotatingY = globalY; rotatingZ = globalZ; - // rotate - if (angleX != 0) { - // rotate in x - rotatingY = globalY * cos(angleX) + globalZ * sin(angleX); - rotatingZ = -globalY * sin(angleX) + globalZ * cos(angleX); - } else if (angleY != 0) { - // rotate in y - rotatingX = globalX * cos(angleY) - globalZ * sin(angleY); - rotatingZ = globalX * sin(angleY) + globalZ * cos(angleY); - } else if (angleZ != 0) { - // rotate in z - rotatingX = globalX * cos(angleZ) + globalY * sin(angleZ); - rotatingY = -globalX * sin(angleZ) + globalY * cos(angleZ); - } + rotateDataFromGlobalToRotating(rotatingX, rotatingY, rotatingZ, angleX, angleY, angleZ); } #endif \ No newline at end of file diff --git a/src/gpu/VirtualFluids_GPU/LBM/GPUHelperFunctions/CoordinateTransformationTest.h b/src/gpu/VirtualFluids_GPU/LBM/GPUHelperFunctions/CoordinateTransformationTest.h index af2b06bf0..351643546 100644 --- a/src/gpu/VirtualFluids_GPU/LBM/GPUHelperFunctions/CoordinateTransformationTest.h +++ b/src/gpu/VirtualFluids_GPU/LBM/GPUHelperFunctions/CoordinateTransformationTest.h @@ -2,54 +2,7 @@ #include "CoordinateTransformation.h" #include "tests/testUtilities.h" -bool isEqualWithAccuracy(real number, real expected, real accuracy) -{ - if (number > (expected - accuracy) && number < (expected + accuracy)) return true; - return false; -} - -MATCHER_P2(RealNearForContainer, containerExpected, accuracy, "") -{ - if (arg.size() != containerExpected.size()) { - std::cout << "The checked container does not have the same size as the expected container.\n" << std::endl; - return false; - } - - for (int i = 0; i < arg.size(); i++) { - if (!isEqualWithAccuracy(arg[i], containerExpected[i], accuracy)) { - std::cout << "First mismatching element at index " << i << ": The actual element " << std::to_string(arg[i]) - << " is not near the expected element " << std::to_string(containerExpected[i]) << ".\n"; - return false; - } - } - return true; -} - -MATCHER_P2(NearForContainer, containerExpected, matcher, "") -{ - if (arg.size() != containerExpected.size()) { - std::cout << "The checked container does not have the same size as the expected container.\n" << std::endl; - return false; - } - - for (int i = 0; i < arg.size(); i++) { - testing::ExplainMatchResult(matcher, arg[i], result_listener); - } - return true; -} - - -TEST(isEqualWithAccuracy, test) -{ - const real accuracy = 1.0; - const real expected = 0.0; - - EXPECT_TRUE(isEqualWithAccuracy( 0.0, expected, accuracy)); - EXPECT_TRUE(isEqualWithAccuracy( 0.999999, expected, accuracy)); - EXPECT_TRUE(isEqualWithAccuracy( -0.999999, expected, accuracy)); - EXPECT_FALSE(isEqualWithAccuracy( 1.000001, expected, accuracy)); - EXPECT_FALSE(isEqualWithAccuracy( -1.000001, expected, accuracy)); -} +using namespace testingVF; class CoordinateTransformationTest : public testing::Test { @@ -57,8 +10,9 @@ protected: real datumX = 1.; real datumY = 2.; real datumZ = 3.; - std::array<real, 3> data = { 1., 2., 3. }; + std::array<real, 3> data = { datumX, datumY, datumZ }; std::array<real, 3> dataBeforeTransformation = data; + std::array<real, 3> centerCoordinates = {0.0, 0.0, 0.0}; }; TEST_F(CoordinateTransformationTest, rotatingToGlobal_zeroRotationAndTranslation) @@ -66,36 +20,337 @@ TEST_F(CoordinateTransformationTest, rotatingToGlobal_zeroRotationAndTranslation const std::array<real, 3> angles = { 0.0, 0.0, 0.0 }; rotateDataFromRotatingToGlobal(data[0], data[1], data[2], angles[0], angles[1], angles[2]); EXPECT_THAT(data, testing::Eq(dataBeforeTransformation)); -} + transformRotatingToGlobal(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, testing::Eq(dataBeforeTransformation)); +} -TEST_F(CoordinateTransformationTest, rotatingToGlobal_twoPiRotation) +TEST_F(CoordinateTransformationTest, rotatingToGlobal_twoPiRotationX) { const std::array<real, 3> angles = { c2Pi, 0.0, 0.0 }; rotateDataFromRotatingToGlobal(data[0], data[1], data[2], angles[0], angles[1], angles[2]); EXPECT_THAT(data, RealNearForContainer(dataBeforeTransformation, 1e-6)); + + transformRotatingToGlobal(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(dataBeforeTransformation, 1e-6)); } -TEST_F(CoordinateTransformationTest, rotatingToGlobal_piRotation) +TEST_F(CoordinateTransformationTest, rotatingToGlobal_piRotationX) { const std::array<real, 3> angles = { cPi, 0.0, 0.0 }; rotateDataFromRotatingToGlobal(data[0], data[1], data[2], angles[0], angles[1], angles[2]); const std::array<real, 3> expected = { datumX, -datumY, -datumZ }; EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); + + transformRotatingToGlobal(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); } -TEST_F(CoordinateTransformationTest, rotatingToGlobal_piHalfRotation) +TEST_F(CoordinateTransformationTest, rotatingToGlobal_piHalfRotationX) { const std::array<real, 3> angles = { real(0.5 * cPi), 0.0, 0.0 }; rotateDataFromRotatingToGlobal(data[0], data[1], data[2], angles[0], angles[1], angles[2]); const std::array<real, 3> expected = { datumX, -datumZ, datumY }; EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); + + transformRotatingToGlobal(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); } -TEST_F(CoordinateTransformationTest, rotatingToGlobal_minusPiHalfRotation) +TEST_F(CoordinateTransformationTest, rotatingToGlobal_minusPiHalfRotationX) { const std::array<real, 3> angles = { real(-0.5 * cPi), 0.0, 0.0 }; rotateDataFromRotatingToGlobal(data[0], data[1], data[2], angles[0], angles[1], angles[2]); const std::array<real, 3> expected = { datumX, datumZ, -datumY }; EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); + + transformRotatingToGlobal(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6));} + +TEST_F(CoordinateTransformationTest, rotatingToGlobal_twoPiRotationY) +{ + const std::array<real, 3> angles = { 0.0, c2Pi, 0.0 }; + rotateDataFromRotatingToGlobal(data[0], data[1], data[2], angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(dataBeforeTransformation, 1e-6)); + + transformRotatingToGlobal(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(dataBeforeTransformation, 1e-6)); +} + +TEST_F(CoordinateTransformationTest, rotatingToGlobal_piRotationY) +{ + const std::array<real, 3> angles = { 0.0, cPi, 0.0 }; + rotateDataFromRotatingToGlobal(data[0], data[1], data[2], angles[0], angles[1], angles[2]); + const std::array<real, 3> expected = { -datumX, datumY, -datumZ }; + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); + + transformRotatingToGlobal(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6));} + +TEST_F(CoordinateTransformationTest, rotatingToGlobal_piHalfRotationY) +{ + const std::array<real, 3> angles = { 0.0, real(0.5 * cPi), 0.0 }; + rotateDataFromRotatingToGlobal(data[0], data[1], data[2], angles[0], angles[1], angles[2]); + const std::array<real, 3> expected = { datumZ, datumY, -datumX }; + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); + + transformRotatingToGlobal(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); +} + +TEST_F(CoordinateTransformationTest, rotatingToGlobal_minusPiHalfRotationY) +{ + const std::array<real, 3> angles = { 0.0, real(-0.5 * cPi), 0.0 }; + rotateDataFromRotatingToGlobal(data[0], data[1], data[2], angles[0], angles[1], angles[2]); + const std::array<real, 3> expected = { -datumZ, datumY, datumX }; + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); + + transformRotatingToGlobal(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); +} + +TEST_F(CoordinateTransformationTest, rotatingToGlobal_twoPiRotationZ) +{ + const std::array<real, 3> angles = { 0.0, 0.0, c2Pi}; + rotateDataFromRotatingToGlobal(data[0], data[1], data[2], angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(dataBeforeTransformation, 1e-6)); + + + transformRotatingToGlobal(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(dataBeforeTransformation, 1e-6)); +} + +TEST_F(CoordinateTransformationTest, rotatingToGlobal_piRotationZ) +{ + const std::array<real, 3> angles = { 0.0, 0.0, cPi }; + rotateDataFromRotatingToGlobal(data[0], data[1], data[2], angles[0], angles[1], angles[2]); + const std::array<real, 3> expected = { -datumX, -datumY, datumZ }; + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); + + transformRotatingToGlobal(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); +} + +TEST_F(CoordinateTransformationTest, rotatingToGlobal_piHalfRotationZ) +{ + const std::array<real, 3> angles = { 0.0, 0.0, real(0.5 * cPi)}; + rotateDataFromRotatingToGlobal(data[0], data[1], data[2], angles[0], angles[1], angles[2]); + const std::array<real, 3> expected = { -datumY, datumX, datumZ }; + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); + + transformRotatingToGlobal(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); +} + +TEST_F(CoordinateTransformationTest, rotatingToGlobal_minusPiHalfRotationZ) +{ + const std::array<real, 3> angles = { 0.0, 0.0, real(-0.5 * cPi)}; + rotateDataFromRotatingToGlobal(data[0], data[1], data[2], angles[0], angles[1], angles[2]); + const std::array<real, 3> expected = { datumY, -datumX, datumZ }; + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); + + transformRotatingToGlobal(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); +} + + + + + + + + + + +//////////////////////////////////////////////////////////////////////////////// +// global to rotating + +TEST_F(CoordinateTransformationTest, globalToRotating_zeroRotationAndTranslation) +{ + const std::array<real, 3> angles = { 0.0, 0.0, 0.0 }; + rotateDataFromGlobalToRotating(data[0], data[1], data[2], angles[0], angles[1], angles[2]); + EXPECT_THAT(data, testing::Eq(dataBeforeTransformation)); + + transformGlobalToRotating(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, testing::Eq(dataBeforeTransformation)); +} + +TEST_F(CoordinateTransformationTest, globalToRotating_twoPiRotationX) +{ + const std::array<real, 3> angles = { c2Pi, 0.0, 0.0 }; + rotateDataFromGlobalToRotating(data[0], data[1], data[2], angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(dataBeforeTransformation, 1e-6)); + + transformGlobalToRotating(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(dataBeforeTransformation, 1e-6)); +} + +TEST_F(CoordinateTransformationTest, globalToRotating_piRotationX) +{ + const std::array<real, 3> angles = { cPi, 0.0, 0.0 }; + rotateDataFromGlobalToRotating(data[0], data[1], data[2], angles[0], angles[1], angles[2]); + const std::array<real, 3> expected = { datumX, -datumY, -datumZ }; + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); + + transformGlobalToRotating(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); +} + +TEST_F(CoordinateTransformationTest, globalToRotating_piHalfRotationX) +{ + const std::array<real, 3> angles = { real(0.5 * cPi), 0.0, 0.0 }; + rotateDataFromGlobalToRotating(data[0], data[1], data[2], angles[0], angles[1], angles[2]); + const std::array<real, 3> expected = { datumX, datumZ, -datumY }; + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); + + transformGlobalToRotating(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); +} + +TEST_F(CoordinateTransformationTest, globalToRotating_minusPiHalfRotationX) +{ + const std::array<real, 3> angles = { real(-0.5 * cPi), 0.0, 0.0 }; + rotateDataFromGlobalToRotating(data[0], data[1], data[2], angles[0], angles[1], angles[2]); + const std::array<real, 3> expected = { datumX, -datumZ, datumY }; + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); + + transformGlobalToRotating(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6));} + +TEST_F(CoordinateTransformationTest, globalToRotating_twoPiRotationY) +{ + const std::array<real, 3> angles = { 0.0, c2Pi, 0.0 }; + rotateDataFromGlobalToRotating(data[0], data[1], data[2], angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(dataBeforeTransformation, 1e-6)); + + transformGlobalToRotating(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(dataBeforeTransformation, 1e-6)); +} + +TEST_F(CoordinateTransformationTest, globalToRotating_piRotationY) +{ + const std::array<real, 3> angles = { 0.0, cPi, 0.0 }; + rotateDataFromGlobalToRotating(data[0], data[1], data[2], angles[0], angles[1], angles[2]); + const std::array<real, 3> expected = { -datumX, datumY, -datumZ }; + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); + + transformGlobalToRotating(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6));} + +TEST_F(CoordinateTransformationTest, globalToRotating_piHalfRotationY) +{ + const std::array<real, 3> angles = { 0.0, real(0.5 * cPi), 0.0 }; + rotateDataFromGlobalToRotating(data[0], data[1], data[2], angles[0], angles[1], angles[2]); + const std::array<real, 3> expected = { -datumZ, datumY, datumX }; + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); + + transformGlobalToRotating(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); +} + +TEST_F(CoordinateTransformationTest, globalToRotating_minusPiHalfRotationY) +{ + const std::array<real, 3> angles = { 0.0, real(-0.5 * cPi), 0.0 }; + rotateDataFromGlobalToRotating(data[0], data[1], data[2], angles[0], angles[1], angles[2]); + const std::array<real, 3> expected = { datumZ, datumY, -datumX }; + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); + + transformGlobalToRotating(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); +} + +TEST_F(CoordinateTransformationTest, globalToRotating_twoPiRotationZ) +{ + const std::array<real, 3> angles = { 0.0, 0.0, c2Pi}; + rotateDataFromGlobalToRotating(data[0], data[1], data[2], angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(dataBeforeTransformation, 1e-6)); + + + transformGlobalToRotating(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(dataBeforeTransformation, 1e-6)); +} + +TEST_F(CoordinateTransformationTest, globalToRotating_piRotationZ) +{ + const std::array<real, 3> angles = { 0.0, 0.0, cPi }; + rotateDataFromGlobalToRotating(data[0], data[1], data[2], angles[0], angles[1], angles[2]); + const std::array<real, 3> expected = { -datumX, -datumY, datumZ }; + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); + + transformGlobalToRotating(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); +} + +TEST_F(CoordinateTransformationTest, globalToRotating_piHalfRotationZ) +{ + const std::array<real, 3> angles = { 0.0, 0.0, real(0.5 * cPi)}; + rotateDataFromGlobalToRotating(data[0], data[1], data[2], angles[0], angles[1], angles[2]); + const std::array<real, 3> expected = { datumY, -datumX, datumZ }; + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); + + transformGlobalToRotating(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); +} + +TEST_F(CoordinateTransformationTest, globalToRotating_minusPiHalfRotationZ) +{ + const std::array<real, 3> angles = { 0.0, 0.0, real(-0.5 * cPi)}; + rotateDataFromGlobalToRotating(data[0], data[1], data[2], angles[0], angles[1], angles[2]); + const std::array<real, 3> expected = { -datumY, datumX, datumZ }; + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); + + transformGlobalToRotating(data[0], data[1], data[2], dataBeforeTransformation[0], dataBeforeTransformation[1], + dataBeforeTransformation[2], centerCoordinates[0], centerCoordinates[1], centerCoordinates[2], + angles[0], angles[1], angles[2]); + EXPECT_THAT(data, RealNearForContainer(expected, 1e-6)); } -- GitLab