From 82593c052d8a0d927bbde40bf317118343c5aace Mon Sep 17 00:00:00 2001
From: Oliver Sander <sander@igpm.rwth-aachen.de>
Date: Fri, 14 Jan 2011 10:14:55 +0000
Subject: [PATCH] implement exp for a quaternion tangent vector

[[Imported from SVN: r6741]]
---
 dune/gfe/rotation.hh | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/dune/gfe/rotation.hh b/dune/gfe/rotation.hh
index d30bd9e2..1e03ce2e 100644
--- a/dune/gfe/rotation.hh
+++ b/dune/gfe/rotation.hh
@@ -230,9 +230,29 @@ public:
         return p.mult(corr);
     }
 
-    /** \brief The exponential map from a given point $p \in SO(3)$. */
+    /** \brief The exponential map from a given point $p \in SO(3)$.
+     
+        There may be a more direct way to implement this
+        
+        \param v A tangent vector in quaternion coordinates
+     */
     static Rotation<3,T> exp(const Rotation<3,T>& p, const EmbeddedTangentVector& v) {
-        DUNE_THROW(Dune::NotImplemented, "exp... EmbeddedTangentVector");
+        
+        // The vector v as a quaternion
+        Quaternion<T> vQuat(v);
+        
+        // left multiplication by the inverse base point yields a tangent vector at the identity
+        Quaternion<T> vAtIdentity = p.inverse().mult(vQuat);
+        assert( std::fabs(vAtIdentity[3] < 1e-8) );
+
+        // vAtIdentity as a skew matrix
+        TangentVector vMatrix;
+        vMatrix[0] = 2*vAtIdentity[0];
+        vMatrix[1] = 2*vAtIdentity[1];
+        vMatrix[2] = 2*vAtIdentity[2];
+        
+        // The actual exponential map
+        return exp(p, vMatrix);
     }
 
     static Dune::FieldMatrix<T,4,3> Dexp(const Dune::FieldVector<T,3>& v) {
-- 
GitLab