From 1b1796f4f3b85ca8fb805ceba4bf71fdac34a9d2 Mon Sep 17 00:00:00 2001
From: Oliver Sander <sander@igpm.rwth-aachen.de>
Date: Wed, 16 Nov 2011 16:09:56 +0000
Subject: [PATCH] add support for UnitVector<4> and Rotation<3>

[[Imported from SVN: r8217]]
---
 harmonicmaps.cc | 34 ++++++++++++++++++++++++----------
 1 file changed, 24 insertions(+), 10 deletions(-)

diff --git a/harmonicmaps.cc b/harmonicmaps.cc
index d1cb80a7..70c397f3 100644
--- a/harmonicmaps.cc
+++ b/harmonicmaps.cc
@@ -6,7 +6,8 @@
 //#define HARMONIC_ENERGY_FD_GRADIENT
 
 //#define UNITVECTOR2
-#define UNITVECTOR3
+//#define UNITVECTOR3
+#define UNITVECTOR4
 //#define ROTATION2
 //#define ROTATION3
 //#define REALTUPLE1
@@ -50,6 +51,9 @@ typedef UnitVector<double,2> TargetSpace;
 #ifdef UNITVECTOR3
 typedef UnitVector<double,3> TargetSpace;
 #endif
+#ifdef UNITVECTOR4
+typedef UnitVector<double,4> TargetSpace;
+#endif
 #ifdef REALTUPLE1
 typedef RealTuple<double,1> TargetSpace;
 #endif
@@ -155,6 +159,8 @@ int main (int argc, char *argv[]) try
         FieldVector<double,1> v;
 #elif defined UNITVECTOR3
         FieldVector<double,3> v;
+#elif defined UNITVECTOR4 || defined ROTATION3
+        FieldVector<double,4> v;
 #else
         FieldVector<double,2> v;
 #endif
@@ -174,6 +180,19 @@ int main (int argc, char *argv[]) try
             v[1] = 0;
             v[2] = std::cos(pos[0]*M_PI);
 #endif
+#ifdef UNITVECTOR3
+            v[0] = 1;
+            v[1] = 0;
+            v[2] = 0;
+#endif
+#if defined UNITVECTOR4 || defined ROTATION3
+            FieldMatrix<double,3,3> rMat;
+            rotation.matrix(rMat);
+            v[0] = rMat[2][0];
+            v[1] = rMat[2][1];
+            v[2] = rMat[2][2];
+            v[3] = 0;
+#endif
 #ifdef UNITVECTOR2
             v[0] = std::sin(pos[0]*M_PI);
             v[1] = std::cos(pos[0]*M_PI);
@@ -182,22 +201,17 @@ int main (int argc, char *argv[]) try
             v[0] = pos[0]/*M_PI*/;
 #endif
         } else {
-#ifdef UNITVECTOR2
+#if defined UNITVECTOR2 || defined UNITVECTOR3 || defined UNITVECTOR4 || defined ROTATION3
+            v = 0;
             v[0] = 1;
-            v[1] = 0;
-#endif
-#ifdef UNITVECTOR3
-            v[0] = 1;
-            v[1] = 0;
-            v[2] = 0;
 #endif
 #if defined ROTATION2 || defined REALTUPLE1
             v[0] = 0.5*M_PI;
 #endif
         }            
 
-#if defined UNITVECTOR2 || defined UNITVECTOR3 || defined REALTUPLE1
-        x[idx] = v;
+#if defined UNITVECTOR2 || defined UNITVECTOR3 || defined UNITVECTOR4 || defined ROTATION3 || defined REALTUPLE1
+        x[idx] = TargetSpace(v);
 #endif
 #if defined ROTATION2 
         x[idx] = v[0];
-- 
GitLab