From 06a9cb0d130f1e52bf21eda6f18e52abd09f372c Mon Sep 17 00:00:00 2001
From: Oliver Sander <oliver.sander@tu-dresden.de>
Date: Fri, 25 Feb 2022 10:44:03 +0100
Subject: [PATCH] Enable unit testing for the RigidBodyMotion<3> class

This involves fixing the secondDerivativeOfDistanceSquaredWRTSecondArgument
method: Previously it returned a FieldMatrix, but the test requires
a SymmetricMatrix.
---
 dune/gfe/rigidbodymotion.hh | 20 ++++++++++++--------
 test/targetspacetest.cc     |  3 ++-
 2 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/dune/gfe/rigidbodymotion.hh b/dune/gfe/rigidbodymotion.hh
index b4541e3e..85e24ae3 100644
--- a/dune/gfe/rigidbodymotion.hh
+++ b/dune/gfe/rigidbodymotion.hh
@@ -145,22 +145,26 @@ public:
     }
 
     /** \brief Compute the Hessian of the squared distance function keeping the first argument fixed */
-    static Dune::FieldMatrix<T,embeddedDim,embeddedDim> secondDerivativeOfDistanceSquaredWRTSecondArgument(const RigidBodyMotion<ctype,N> & p, const RigidBodyMotion<ctype,N> & q)
+    static Dune::SymmetricMatrix<T,embeddedDim> secondDerivativeOfDistanceSquaredWRTSecondArgument(const RigidBodyMotion<ctype,N> & p, const RigidBodyMotion<ctype,N> & q)
     {
-        Dune::FieldMatrix<T,embeddedDim,embeddedDim> result(0);
+        Dune::SymmetricMatrix<T,embeddedDim> result;
 
         // The linear part
-        Dune::FieldMatrix<T,N,N> linearPart = RealTuple<T,N>::secondDerivativeOfDistanceSquaredWRTSecondArgument(p.r,q.r);
+        Dune::SymmetricMatrix<T,N> linearPart = RealTuple<T,N>::secondDerivativeOfDistanceSquaredWRTSecondArgument(p.r,q.r);
         for (int i=0; i<N; i++)
-            for (int j=0; j<N; j++)
-                result[i][j] = linearPart[i][j];
+            for (int j=0; j<=i; j++)
+                result(i,j) = linearPart(i,j);
 
         // The rotation part
-        Dune::FieldMatrix<T,Rotation<T,N>::embeddedDim,Rotation<T,N>::embeddedDim> rotationPart
+        Dune::SymmetricMatrix<T,Rotation<T,N>::embeddedDim> rotationPart
                 = Rotation<ctype,N>::secondDerivativeOfDistanceSquaredWRTSecondArgument(p.q,q.q);
         for (int i=0; i<Rotation<T,N>::embeddedDim; i++)
-            for (int j=0; j<Rotation<T,N>::embeddedDim; j++)
-                result[N+i][N+j] = rotationPart[i][j];
+        {
+            for (int j=0; j<N; j++)
+                result(N+i,j) = 0;
+            for (int j=0; j<=i; j++)
+                result(N+i,N+j) = rotationPart(i,j);
+        }
 
         return result;
     }
diff --git a/test/targetspacetest.cc b/test/targetspacetest.cc
index f83a6243..61c92a08 100644
--- a/test/targetspacetest.cc
+++ b/test/targetspacetest.cc
@@ -380,7 +380,8 @@ int main() try
 
 //     test<Rotation<double,3> >();
 //
-//     test<RigidBodyMotion<double,3> >();
+    // Test the RigidBodyMotion class
+    test<RigidBodyMotion<double,3> >();
 //
 //     test<HyperbolicHalfspacePoint<double,2> >();
 
-- 
GitLab