diff --git a/dune/gfe/rotation.hh b/dune/gfe/rotation.hh index 40a7591a1fd9941d81373f8013ca76ccc158e12c..baf4ad0a8246a10c62840c8ed4960dc1fdb1b583 100644 --- a/dune/gfe/rotation.hh +++ b/dune/gfe/rotation.hh @@ -91,7 +91,7 @@ public: return -2 * (a.angle_ - b.angle_); } - static Dune::FieldMatrix<double,1,1> secondDerivativeOfDistanceSquaredWRTSecondArgument(const Rotation<2,T>& a, + static Dune::FieldMatrix<T,1,1> secondDerivativeOfDistanceSquaredWRTSecondArgument(const Rotation<2,T>& a, const Rotation<2,T>& b) { return 2; } @@ -114,7 +114,7 @@ public: //private: // We store the rotation as an angle - double angle_; + T angle_; }; //! Send configuration to output stream @@ -139,8 +139,8 @@ class Rotation<3,T> : public Quaternion<T> } /** \brief Compute the derivative of arccos^2 without getting unstable for x close to 1 */ - static double derivativeOfArcCosSquared(const double& x) { - const double eps = 1e-12; + static T derivativeOfArcCosSquared(const T& x) { + const T eps = 1e-12; if (x > 1-eps) { // regular expression is unstable, use the series expansion instead return -2 + 2*(x-1)/3 - 4/15*(x-1)*(x-1) + 4/35*(x-1)*(x-1)*(x-1); } else if (x < -1+eps) { // The function is not differentiable @@ -158,7 +158,7 @@ public: static const bool globalIsometricCoordinates = true; /** \brief The type used for global coordinates */ - typedef Dune::FieldVector<double,4> CoordinateType; + typedef Dune::FieldVector<T,4> CoordinateType; /** \brief Dimension of the manifold formed by the 3d rotations */ static const int dim = 3; @@ -483,9 +483,9 @@ public: pInv.invert(); // the forth component of pInv times q - double pInvq_4 = - pInv[0]*q[0] - pInv[1]*q[1] - pInv[2]*q[2] + pInv[3]*q[3]; + T pInvq_4 = - pInv[0]*q[0] - pInv[1]*q[1] - pInv[2]*q[2] + pInv[3]*q[3]; - double arccosSquaredDer_pInvq_4 = derivativeOfArcCosSquared(pInvq_4); + T arccosSquaredDer_pInvq_4 = derivativeOfArcCosSquared(pInvq_4); EmbeddedTangentVector result; result[0] = -4 * arccosSquaredDer_pInvq_4 * pInv[0]; @@ -506,9 +506,9 @@ public: Unlike the distance itself the squared distance is differentiable at zero */ - static Dune::FieldMatrix<double,4,4> secondDerivativeOfDistanceSquaredWRTSecondArgument(const Rotation<3,T>& p, const Rotation<3,T>& q) { + static Dune::FieldMatrix<T,4,4> secondDerivativeOfDistanceSquaredWRTSecondArgument(const Rotation<3,T>& p, const Rotation<3,T>& q) { // use the functionality from the unitvector class - Dune::FieldMatrix<double,4,4> result = UnitVector<4>::secondDerivativeOfDistanceSquaredWRTSecondArgument(p.globalCoordinates(), + Dune::FieldMatrix<T,4,4> result = UnitVector<4>::secondDerivativeOfDistanceSquaredWRTSecondArgument(p.globalCoordinates(), q.globalCoordinates()); // for some reason that I don't really understand, the distance we have defined for the rotations (== Unit quaternions) // is twice the corresponding distance on the unit quaternions seen as a sphere. Hence the derivative of the @@ -521,9 +521,9 @@ public: Unlike the distance itself the squared distance is differentiable at zero */ - static Dune::FieldMatrix<double,4,4> secondDerivativeOfDistanceSquaredWRTFirstAndSecondArgument(const Rotation<3,T>& p, const Rotation<3,T>& q) { + static Dune::FieldMatrix<T,4,4> secondDerivativeOfDistanceSquaredWRTFirstAndSecondArgument(const Rotation<3,T>& p, const Rotation<3,T>& q) { // use the functionality from the unitvector class - Dune::FieldMatrix<double,4,4> result = UnitVector<4>::secondDerivativeOfDistanceSquaredWRTFirstAndSecondArgument(p.globalCoordinates(), + Dune::FieldMatrix<T,4,4> result = UnitVector<4>::secondDerivativeOfDistanceSquaredWRTFirstAndSecondArgument(p.globalCoordinates(), q.globalCoordinates()); // for some reason that I don't really understand, the distance we have defined for the rotations (== Unit quaternions) // is twice the corresponding distance on the unit quaternions seen as a sphere. Hence the derivative of the @@ -536,9 +536,9 @@ public: Unlike the distance itself the squared distance is differentiable at zero */ - static Tensor3<double,4,4,4> thirdDerivativeOfDistanceSquaredWRTSecondArgument(const Rotation<3,T>& p, const Rotation<3,T>& q) { + static Tensor3<T,4,4,4> thirdDerivativeOfDistanceSquaredWRTSecondArgument(const Rotation<3,T>& p, const Rotation<3,T>& q) { // use the functionality from the unitvector class - Tensor3<double,4,4,4> result = UnitVector<4>::thirdDerivativeOfDistanceSquaredWRTSecondArgument(p.globalCoordinates(), + Tensor3<T,4,4,4> result = UnitVector<4>::thirdDerivativeOfDistanceSquaredWRTSecondArgument(p.globalCoordinates(), q.globalCoordinates()); // for some reason that I don't really understand, the distance we have defined for the rotations (== Unit quaternions) // is twice the corresponding distance on the unit quaternions seen as a sphere. Hence the derivative of the @@ -551,9 +551,9 @@ public: Unlike the distance itself the squared distance is differentiable at zero */ - static Tensor3<double,4,4,4> thirdDerivativeOfDistanceSquaredWRTFirst1AndSecond2Argument(const Rotation<3,T>& p, const Rotation<3,T>& q) { + static Tensor3<T,4,4,4> thirdDerivativeOfDistanceSquaredWRTFirst1AndSecond2Argument(const Rotation<3,T>& p, const Rotation<3,T>& q) { // use the functionality from the unitvector class - Tensor3<double,4,4,4> result = UnitVector<4>::thirdDerivativeOfDistanceSquaredWRTFirst1AndSecond2Argument(p.globalCoordinates(), + Tensor3<T,4,4,4> result = UnitVector<4>::thirdDerivativeOfDistanceSquaredWRTFirst1AndSecond2Argument(p.globalCoordinates(), q.globalCoordinates()); // for some reason that I don't really understand, the distance we have defined for the rotations (== Unit quaternions) // is twice the corresponding distance on the unit quaternions seen as a sphere. Hence the derivative of the @@ -566,7 +566,7 @@ public: /** \brief Interpolate between two rotations */ - static Rotation<3,T> interpolate(const Rotation<3,T>& a, const Rotation<3,T>& b, double omega) { + static Rotation<3,T> interpolate(const Rotation<3,T>& a, const Rotation<3,T>& b, T omega) { // Compute difference on T_a SO(3) Dune::FieldVector<T,3> v = difference(a,b); @@ -580,13 +580,13 @@ public: \param omega must be between 0 and 1 */ static Quaternion<T> interpolateDerivative(const Rotation<3,T>& a, const Rotation<3,T>& b, - double omega) { + T omega) { Quaternion<T> result(0); // Compute difference on T_a SO(3) - Dune::FieldVector<double,3> xi = difference(a,b); + Dune::FieldVector<T,3> xi = difference(a,b); - Dune::FieldVector<double,3> v = xi; + Dune::FieldVector<T,3> v = xi; v *= omega; // ////////////////////////////////////////////////////////////// @@ -594,7 +594,7 @@ public: // the requested site is v pushed forward by Dexp. // ///////////////////////////////////////////////////////////// - Dune::FieldMatrix<double,4,3> diffExp = Dexp(v); + Dune::FieldMatrix<T,4,3> diffExp = Dexp(v); diffExp.umv(xi,result); @@ -738,8 +738,8 @@ public: This basis is of course not globally continuous. */ - Dune::FieldMatrix<double,3,4> orthonormalFrame() const { - Dune::FieldMatrix<double,3,4> result; + Dune::FieldMatrix<T,3,4> orthonormalFrame() const { + Dune::FieldMatrix<T,3,4> result; for (int i=0; i<3; i++) result[i] = B(i); return result;