Remplacement des 'powf(a, 2)' par 'a*a'.
[GPU.git] / WCudaMSE / Student_Cuda_Image / src / cpp / core / 03_Newton / moo / device / math / NewtonMath.h
index 3c76170..e9b0dd8 100755 (executable)
@@ -1,7 +1,6 @@
 #ifndef NEWTON_MATH_H_\r
 #define NEWTON_MATH_H_\r
 \r
-#include <cmath>\r
 #include <float.h>\r
 #include <stdio.h>\r
 \r
@@ -15,55 +14,13 @@ class NewtonMath
             C // (-1/2 -sqrt(3)/2)\r
         };\r
 \r
-        /*\r
-         * Renvoie la valeur (x1, x2) de l'itération suivante (i+1).\r
-         */\r
-        __device__\r
-        static void nextX(float x1, float x2, float& x1_next, float& x2_next)\r
-            {\r
-            float f_x1 = powf(x1, 3.0) - 3.0 * x1 * powf(x2, 2.0) - 1.0;\r
-            float f_x2 = powf(x2, 3.0) - 3.0 * powf(x1, 2.0) * x2;\r
-\r
-            // La matrice est représentée comme cela :\r
-            // a b\r
-            // c d\r
-            float jacobienne_f_x_a = 3.0 * powf(x1, 2.0) - 3.0 * powf(x2, 2.0);\r
-            float jacobienne_f_x_b = -6.0 * x1 * x2;\r
-            float jacobienne_f_x_c = -6.0 * x1 * x2;\r
-            float jacobienne_f_x_d = -3.0 * powf(x1, 2.0) + 3.0 * powf(x2, 2.0);\r
-\r
-            float det_inverse_jacobienne = 1.0 / (jacobienne_f_x_a * jacobienne_f_x_d - jacobienne_f_x_b * jacobienne_f_x_c);\r
-            float jacobienne_f_x_a_inverse = jacobienne_f_x_d * det_inverse_jacobienne;\r
-            float jacobienne_f_x_b_inverse = -jacobienne_f_x_b * det_inverse_jacobienne;\r
-            float jacobienne_f_x_c_inverse = -jacobienne_f_x_c * det_inverse_jacobienne;\r
-            float jacobienne_f_x_d_inverse = jacobienne_f_x_a * det_inverse_jacobienne;\r
-\r
-            x1_next = x1 - (jacobienne_f_x_a_inverse * f_x1 + jacobienne_f_x_b_inverse * f_x2);\r
-            x2_next = x2 - (jacobienne_f_x_c_inverse * f_x1 + jacobienne_f_x_d_inverse * f_x2);\r
-            }\r
-\r
-        /*\r
-         * Renvoie la distance entre deux vecteurs a et b.\r
-         */\r
-        __device__\r
-        static float distance_carre(float a1, float a2, float b1, float b2)\r
-            {\r
-            return powf(a1 - b1, 2.0) + powf(a2 - b2, 2.0);\r
-            }\r
-\r
-        __device__\r
-        static float distance(float a1, float a2, float b1, float b2)\r
-            {\r
-            return (powf(a1 - b1, 2.0) + powf(a2 - b2, 2.0)) / (powf(b1, 2.0) + powf(b2, 2.0));\r
-            }\r
-\r
     public:\r
         /*\r
          * n est le nombre d'iteration.\r
          */\r
        __device__\r
-       NewtonMath(int n = 1000)\r
-           : n(n)\r
+       NewtonMath(int n, float epsilon)\r
+           : n(n), epsilon(epsilon)\r
            {\r
            }\r
 \r
@@ -80,7 +37,7 @@ class NewtonMath
             const float C1 = -1.0 / 2.0;\r
             const float C2 = -sqrt(3.0) / 2.0;\r
 \r
-            const float epsilon = 0.001;\r
+            //const float epsilon = 0.1;\r
 \r
             float nearest_current_solution_distance = FLT_MAX;\r
            Solution nearest_current_solution = A;\r
@@ -107,7 +64,18 @@ class NewtonMath
                     nearest_current_solution_distance = distance_to_C;\r
                     }\r
 \r
-                if (nearest_current_solution_distance < epsilon)\r
+                /*if (Indice2D::tid() == 0)\r
+                    {\r
+                    printf("nearest_current_solution_distance: %f\n", nearest_current_solution_distance);\r
+                    }*/\r
+\r
+                    /*printf("x1: %f, x2: %f\n", x1, x2);\r
+                    printf("d to a: %f\n", distance_to_A);\r
+                    printf("d to a: %f\n", distance_to_B);\r
+                    printf("d to a: %f\n", distance_to_C);\r
+                    }*/\r
+\r
+                if (nearest_current_solution_distance < this->epsilon)\r
                     break;\r
 \r
                 nextX(x1, x2, x1, x2);\r
@@ -137,7 +105,56 @@ class NewtonMath
            }\r
 \r
     private:\r
+\r
+        /*\r
+         * Renvoie la valeur (x1, x2) de l'itération suivante (i+1).\r
+         */\r
+        __device__\r
+        static void nextX(float x1, float x2, float& x1_next, float& x2_next)\r
+            {\r
+            float f_x1 = x1 * x1 * x2 - 3.0 * x1 * x2 * x2 - 1.0;\r
+            float f_x2 = x2 * x2 * x2 - 3.0 * x1 * x1 * x2;\r
+\r
+            // La matrice est représentée comme cela :\r
+            // a b\r
+            // c d\r
+            float jacobienne_f_x_a = 3.0 * x1 * x1 - 3.0 * x2 * x2;\r
+            float jacobienne_f_x_b = -6.0 * x1 * x2;\r
+            float jacobienne_f_x_c = -6.0 * x1 * x2;\r
+            float jacobienne_f_x_d = -3.0 * x1 * x1 + 3.0 * x2 * x2;\r
+\r
+            float det_inverse_jacobienne = 1.0 / (jacobienne_f_x_a * jacobienne_f_x_d - jacobienne_f_x_b * jacobienne_f_x_c);\r
+            float jacobienne_f_x_a_inverse = jacobienne_f_x_d * det_inverse_jacobienne;\r
+            float jacobienne_f_x_b_inverse = -jacobienne_f_x_b * det_inverse_jacobienne;\r
+            float jacobienne_f_x_c_inverse = -jacobienne_f_x_c * det_inverse_jacobienne;\r
+            float jacobienne_f_x_d_inverse = jacobienne_f_x_a * det_inverse_jacobienne;\r
+\r
+            x1_next = x1 - (jacobienne_f_x_a_inverse * f_x1 + jacobienne_f_x_b_inverse * f_x2);\r
+            x2_next = x2 - (jacobienne_f_x_c_inverse * f_x1 + jacobienne_f_x_d_inverse * f_x2);\r
+            }\r
+\r
+        /*\r
+         * Renvoie la distance entre deux vecteurs a et b.\r
+         */\r
+        __device__\r
+        static float distance_carre(float a1, float a2, float b1, float b2)\r
+            {\r
+            const float delta1 = a1 - b1;\r
+            const float delta2 = a2 - b2;\r
+            return delta1 * delta1 + delta2 * delta2;\r
+            }\r
+\r
+        __device__\r
+        static float distance(float a1, float a2, float b1, float b2)\r
+            {\r
+            const float delta1 = a1 - b1;\r
+            const float delta2 = a2 - b2;\r
+\r
+            return (delta1 * delta1 + delta2 * delta2) / (b1 * b1 + b2 * b2);\r
+            }\r
+\r
        int n;\r
+       float epsilon;\r
     };\r
 \r
 #endif\r