From 5384d470a457283e170134de1a6c3e17620bb99a Mon Sep 17 00:00:00 2001
From: berenger-bramas <berenger-bramas@2616d619-271b-44dc-8df4-d4a8f33a7222>
Date: Mon, 9 Jan 2012 08:44:40 +0000
Subject: [PATCH] Try to find FMB kernel error (compare to FMB project and real
 application).

git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/scalfmm/scalfmm/trunk@290 2616d619-271b-44dc-8df4-d4a8f33a7222
---
 Src/Core/FFmmAlgorithm.hpp |  2 +-
 Src/Fmb/FFmbKernels.hpp    | 28 +++++++++++-----------------
 Tests/testFmbAlgorithm.cpp | 17 +++++++++++------
 3 files changed, 23 insertions(+), 24 deletions(-)

diff --git a/Src/Core/FFmmAlgorithm.hpp b/Src/Core/FFmmAlgorithm.hpp
index f03447e42..8465c9cec 100644
--- a/Src/Core/FFmmAlgorithm.hpp
+++ b/Src/Core/FFmmAlgorithm.hpp
@@ -222,7 +222,7 @@ private:
         // for each leafs
         do{
             FDEBUG(computationCounterL2P.tic());
-            kernels->L2P(octreeIterator.getCurrentCell(), octreeIterator.getCurrentListTargets());
+            ///kernels->L2P(octreeIterator.getCurrentCell(), octreeIterator.getCurrentListTargets());
             FDEBUG(computationCounterL2P.tac());
             // need the current particles and neighbors particles
             const int counter = tree->getLeafsNeighborsWithIndex(neighbors, neighborsIndex, octreeIterator.getCurrentGlobalIndex(),heightMinusOne);
diff --git a/Src/Fmb/FFmbKernels.hpp b/Src/Fmb/FFmbKernels.hpp
index 2b756fcd9..c4782b6fe 100644
--- a/Src/Fmb/FFmbKernels.hpp
+++ b/Src/Fmb/FFmbKernels.hpp
@@ -40,7 +40,7 @@ class FFmbKernels : public FAbstractKernels<ParticleClass,CellClass,ContainerCla
 protected:
 
     // _GRAVITATIONAL_
-    static const int FMB_Info_eps_soft_square = 1;
+    static const int FMB_Info_eps_soft_square = 0;//1;
 
     // Can be false or not in not blas kernels
     static const int FMB_Info_up_to_P_in_M2L = true;
@@ -1294,7 +1294,7 @@ public:
 
             iterTarget.data().incForces( force_vector_tmp_x, force_vector_tmp_y, force_vector_tmp_z );
 
-            iterTarget.data().setPotential(expansion_Evaluate_local_with_Y_already_computed(local_exp));
+            iterTarget.data().incPotential(expansion_Evaluate_local_with_Y_already_computed(local_exp));
 
             /*printf("[END] fx = %e \t fy = %e \t fz = %e \n\n",
                    iterTarget.data()->getForces().getX(),iterTarget.data()->getForces().getY(),iterTarget.data()->getForces().getZ());*/
@@ -1372,10 +1372,6 @@ public:
                 iterSameBox.gotoNext();
             }
 
-            //printf("x = %e \t y = %e \t z = %e \n",iterTarget.data()->getPosition().getX(),iterTarget.data()->getPosition().getY(),iterTarget.data()->getPosition().getZ());
-            //printf("\t P2P fx = %e \t fy = %e \t fz = %e \n",iterTarget.data()->getForces().getX(),iterTarget.data()->getForces().getY(),iterTarget.data()->getForces().getZ());
-            //printf("\t potential = %e \n",iterTarget.data()->getPotential());
-
             iterTarget.data() = target;
 
             iterTarget.gotoNext();
@@ -1386,14 +1382,16 @@ public:
 
     void DIRECT_COMPUTATION_MUTUAL_SOFT(ParticleClass& target, ParticleClass& source){
 
-        FReal dx = target.getPosition().getX() - source.getPosition().getX();
-        FReal dy = target.getPosition().getY() - source.getPosition().getY();
-        FReal dz = target.getPosition().getZ() - source.getPosition().getZ();
+        FReal dx = -(target.getPosition().getX() - source.getPosition().getX());
+        FReal dy = -(target.getPosition().getY() - source.getPosition().getY());
+        FReal dz = -(target.getPosition().getZ() - source.getPosition().getZ());
 
         FReal inv_square_distance = FReal(1.0) / (dx*dx + dy*dy + dz*dz + FReal(FMB_Info_eps_soft_square));
         FReal inv_distance = FMath::Sqrt(inv_square_distance);
-        inv_distance *= target.getPhysicalValue() * source.getPhysicalValue();
+
         inv_square_distance *= inv_distance;
+        inv_square_distance *= target.getPhysicalValue() * source.getPhysicalValue();
+
 
         dx *= inv_square_distance;
         dy *= inv_square_distance;
@@ -1404,15 +1402,14 @@ public:
                 dy,
                 dz
                 );
-        target.incPotential( inv_distance );
+        target.incPotential( inv_distance  * source.getPhysicalValue() );
 
         source.incForces(
                 (-dx),
                 (-dy),
                 (-dz)
                 );
-        source.incPotential( inv_distance );
-
+        source.incPotential( inv_distance * target.getPhysicalValue() );
 
     }
 
@@ -1454,10 +1451,6 @@ public:
                 iterSameBox.gotoNext();
             }
 
-            //printf("x = %e \t y = %e \t z = %e \n",iterTarget.data()->getPosition().getX(),iterTarget.data()->getPosition().getY(),iterTarget.data()->getPosition().getZ());
-            //printf("\t P2P fx = %e \t fy = %e \t fz = %e \n",iterTarget.data()->getForces().getX(),iterTarget.data()->getForces().getY(),iterTarget.data()->getForces().getZ());
-            //printf("\t potential = %e \n",iterTarget.data()->getPotential());
-
             iterTarget.data() = target;
 
             iterTarget.gotoNext();
@@ -1474,6 +1467,7 @@ public:
 
         FReal inv_square_distance = FReal(1.0) / (dx*dx + dy*dy + dz*dz + FReal(FMB_Info_eps_soft_square));
         FReal inv_distance = FMath::Sqrt(inv_square_distance);
+
         inv_distance *= target.getPhysicalValue() * source.getPhysicalValue();
         inv_square_distance *= inv_distance;
 
diff --git a/Tests/testFmbAlgorithm.cpp b/Tests/testFmbAlgorithm.cpp
index 725f1c4c3..d7e2993fc 100644
--- a/Tests/testFmbAlgorithm.cpp
+++ b/Tests/testFmbAlgorithm.cpp
@@ -39,7 +39,7 @@ int main(int argc, char ** argv){
     typedef FOctree<ParticleClass, CellClass, ContainerClass , LeafClass >  OctreeClass;
     typedef FFmbKernels<ParticleClass, CellClass, ContainerClass >          KernelClass;
 
-    typedef FFmmAlgorithmThread<OctreeClass, ParticleClass, CellClass, ContainerClass, KernelClass, LeafClass > FmmClass;
+    typedef FFmmAlgorithm<OctreeClass, ParticleClass, CellClass, ContainerClass, KernelClass, LeafClass > FmmClass;
     ///////////////////////What we do/////////////////////////////
     std::cout << ">> This executable has to be used to test fmb algorithm.\n";
     //////////////////////////////////////////////////////////////
@@ -100,6 +100,9 @@ int main(int argc, char ** argv){
     std::cout << "Done  " << "(@Algorithm = " << counter.elapsed() << "s)." << std::endl;
 
     { // get sum forces&potential
+
+        FILE* fout = fopen("./res.temp.txt", "w");
+
         FReal potential = 0;
         F3DPosition forces;
         typename OctreeClass::Iterator octreeIterator(&tree);
@@ -110,11 +113,11 @@ int main(int argc, char ** argv){
                 potential += iter.data().getPotential() * iter.data().getPhysicalValue();
                 forces += iter.data().getForces();
 
-                //printf("x = %e y = %e z = %e \n",iter.data()->getPosition().getX(),iter.data()->getPosition().getY(),iter.data()->getPosition().getZ());
-                //printf("\t fx = %e fy = %e fz = %e \n",iter.data()->getForces().getX(),iter.data()->getForces().getY(),iter.data()->getForces().getZ());
-
-                //printf("\t\t Sum Forces ( %e , %e , %e)\n",
-                //forces.getX(),forces.getY(),forces.getZ());
+                fprintf(fout, "*** pos= (%f, %f, %f)\tv= %f\t\t\t\t\t\t\tforce= (%f, %f, %f)\t\t\t\tpotential energy=\n%f\n",
+                        iter.data().getPosition().getX(),iter.data().getPosition().getY(),iter.data().getPosition().getZ(),
+                        iter.data().getPhysicalValue(),
+                        iter.data().getForces().getX(),iter.data().getForces().getY(),iter.data().getForces().getZ(),
+                        iter.data().getPotential());
 
                 iter.gotoNext();
             }
@@ -122,6 +125,8 @@ int main(int argc, char ** argv){
 
         std::cout << "Foces Sum  x = " << forces.getX() << " y = " << forces.getY() << " z = " << forces.getZ() << std::endl;
         std::cout << "Potential = " << potential << std::endl;
+
+        fclose(fout);
     }
 
     // -----------------------------------------------------
-- 
GitLab