Add transpose operation to Matrix3x3
authorKevin Boyd <kevin.boyd@uconn.edu>
Mon, 22 Jul 2019 19:34:17 +0000 (15:34 -0400)
committerChristian Blau <cblau@gwdg.de>
Thu, 25 Jul 2019 08:15:06 +0000 (10:15 +0200)
refs #2976

Change-Id: I8f0ce04b18be1e8b119de02cb6b52b3314cd67eb

src/gromacs/math/matrix.h
src/gromacs/math/tests/matrix.cpp

index 665fbe77abcccac18fd771adebc86f7009c54287..b84c84b59cbbe2bfd1fedbec79dd5331aead382a 100644 (file)
@@ -80,6 +80,15 @@ constexpr real trace(Matrix3x3ConstSpan matrixView)
 {
     return matrixView(0, 0) + matrixView(1, 1) + matrixView(2, 2);
 }
+
+//! Calculate the transpose of a 3x3 matrix, from its view
+static Matrix3x3 transpose(Matrix3x3ConstSpan matrixView)
+{
+
+    return Matrix3x3({matrixView(0, 0), matrixView(1, 0), matrixView(2, 0),
+                      matrixView(0, 1), matrixView(1, 1), matrixView(2, 1),
+                      matrixView(0, 2), matrixView(1, 2), matrixView(2, 2)});
+}
 } // namespace gmx
 
 #endif
index 0d75840872e5f00708c04575d308478616e80e3d..92fb5c00a2ed2c61c08cbe6767d9aac71144c01a 100644 (file)
@@ -168,6 +168,40 @@ TEST_F(MatrixTest, traceWorks)
     EXPECT_EQ(trace(mat), 3.75);
 }
 
+TEST_F(MatrixTest, transposeWorks)
+{
+    const Matrix3x3 asymmetricMat = {{1, 2, 3,
+                                      4, 5, 6,
+                                      7, 8, 9}};
+
+    const Matrix3x3 transposedAsymmetricMat = transpose(asymmetricMat);
+    EXPECT_EQ(asymmetricMat(0, 0), transposedAsymmetricMat(0, 0));
+    EXPECT_EQ(asymmetricMat(0, 1), transposedAsymmetricMat(1, 0));
+    EXPECT_EQ(asymmetricMat(0, 2), transposedAsymmetricMat(2, 0));
+    EXPECT_EQ(asymmetricMat(1, 0), transposedAsymmetricMat(0, 1));
+    EXPECT_EQ(asymmetricMat(1, 1), transposedAsymmetricMat(1, 1));
+    EXPECT_EQ(asymmetricMat(1, 2), transposedAsymmetricMat(2, 1));
+    EXPECT_EQ(asymmetricMat(2, 0), transposedAsymmetricMat(0, 2));
+    EXPECT_EQ(asymmetricMat(2, 1), transposedAsymmetricMat(1, 2));
+    EXPECT_EQ(asymmetricMat(2, 2), transposedAsymmetricMat(2, 2));
+
+}
+
+TEST_F(MatrixTest, transposeOfSymmetricMatrix)
+{
+    const Matrix3x3 symmetricMat = {{ 1, 2, 3,
+                                      2, 5, 6,
+                                      3, 6, 9}};
+    const Matrix3x3 transposedSymmetricMat = transpose(symmetricMat);
+    for (int i = 0; i < 3; i++)
+    {
+        for (int j = 0; j < 3; j++)
+        {
+            EXPECT_EQ(symmetricMat(i, j), transposedSymmetricMat(i, j));
+        }
+    }
+}
+
 } // namespace
 
 } // namespace test