From cb909adf60aa10d4b3532f3786e9cabeda3e5c6a Mon Sep 17 00:00:00 2001
From: "armindamon.riess" <armindamon.riess@uzh.ch>
Date: Wed, 30 Nov 2022 14:26:34 +0100
Subject: [PATCH] greatly increased speed of force calculation

---
 lib/nBodySim.cpp | 39 ++++++++++++++++++++++++++++++++++++++-
 1 file changed, 38 insertions(+), 1 deletion(-)

diff --git a/lib/nBodySim.cpp b/lib/nBodySim.cpp
index b2eca9d..adb2980 100644
--- a/lib/nBodySim.cpp
+++ b/lib/nBodySim.cpp
@@ -61,7 +61,43 @@ void nBodySim::runSimulation(double dt, unsigned nSteps) {
         updatePositions(dt);
     }
 }
-
+///*
+void nBodySim::calculateForces() {
+    #pragma omp parallel for
+    for (unsigned i=0; i < 3*nParticles_; ++i) {
+        forces_[i] = 0.0;
+    }
+    // loop over each pair of particles and calculate the force between them
+    #pragma omp parallel for
+    for (unsigned i = 0; i < nParticles_; i++) {
+        for (unsigned j = i+1; j < nParticles_; j++) {
+            // calculate distance between particles
+            double dx = positions_[3*j]   - positions_[3*i];
+            double dy = positions_[3*j+1] - positions_[3*i+1];
+            double dz = positions_[3*j+2] - positions_[3*i+2];
+            double r2 = dx*dx + dy*dy + dz*dz;
+            double r = std::sqrt(r2);
+            dx /= r;
+            dy /= r;
+            dz /= r;
+            // calculate force
+            double mi = masses_[i];
+            double mj = masses_[j];
+            double s = softening_[i];
+            double fx = mi*mj * dx / (r2 + s*s);
+            double fy = mi*mj * dy / (r2 + s*s);
+            double fz = mi*mj * dz / (r2 + s*s);
+            forces_[3*i]   += fx;
+            forces_[3*i+1] += fy;
+            forces_[3*i+2] += fz;
+            forces_[3*j]   -= fx;
+            forces_[3*j+1] -= fy;
+            forces_[3*j+2] -= fz;
+        }
+    }
+}
+//*/
+/*
 void nBodySim::calculateForces() {
     #pragma omp parallel for
     for (unsigned i=0; i < 3*nParticles_; ++i) {
@@ -91,6 +127,7 @@ void nBodySim::calculateForces() {
         }
     }
 }
+*/
 
 void nBodySim::updatePositions(double dt) {
     #pragma omp parallel for
-- 
GitLab