From 90666ac2f9d8329df57d438ff7930d5b3f76f7b7 Mon Sep 17 00:00:00 2001 From: Oliver Sander <sander@igpm.rwth-aachen.de> Date: Tue, 16 Oct 2007 14:29:33 +0000 Subject: [PATCH] second derivatives of exp [[Imported from SVN: r1699]] --- src/quaternion.hh | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/quaternion.hh b/src/quaternion.hh index 0353d95c..c2e01410 100644 --- a/src/quaternion.hh +++ b/src/quaternion.hh @@ -109,6 +109,45 @@ public: return result; } + static void DDexp(const Dune::FieldVector<T,3>& v, + Dune::array<Dune::FieldMatrix<T,3,3>, 4>& result) { + + T norm = v.two_norm(); + if (norm==0) { + + for (int m=0; m<4; m++) + result[m] = 0; + + for (int i=0; i<3; i++) + result[3][i][i] = -0.25; + + + } else { + + for (int i=0; i<3; i++) { + + for (int j=0; j<3; j++) { + + for (int m=0; m<3; m++) { + + result[m][i][j] = -0.25*v[i]*v[j]*v[m]*norm*norm*norm*std::sin(norm/2) + + 0.5 / (norm*norm) * ((i==j)*v[m] + (j==m)*v[i] + (i==m)*v[j] - 3*v[i]*v[j]*v[m]/(norm*norm)) + * (std::cos(norm/2) - sincHalf(norm)); + + + } + + result[3][i][j] = -0.25/(norm*norm) + * ( 0.5*std::cos(norm/2)*v[i]*v[j] + std::sin(norm/2) * ((i==j)*norm - v[i]*v[j]/norm)); + + } + + } + + } + + } + /** \brief The inverse of the exponential map */ static Dune::FieldVector<T,3> expInv(const Quaternion<T>& q) { // Compute v = exp^{-1} q -- GitLab