Skip to content

Commit f4f6bb1

Browse files
Optimized Force
Optimized the bh kernel: removed divisions
1 parent 6d262e6 commit f4f6bb1

1 file changed

Lines changed: 12 additions & 8 deletions

File tree

src/gravity/octree.h

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -101,21 +101,25 @@ inline void bhForce(Octree* node, Particle& p, real theta, real dt)
101101
real dy = node->cy - p.y;
102102
real dz = node->cz - p.z;
103103

104-
real dist = sqrt(dx*dx + dy*dy + dz*dz) + 1e-6;
104+
real r2 = dx*dx + dy*dy + dz*dz + real(1e-6);
105105

106-
// Barnes–Hut acceptance criterion
106+
// Barnes–Hut acceptance
107+
real dist = sqrt(r2);
107108
if (node->leaf || (node->size / dist) < theta) {
108-
real inv = 1.0 / (dist * dist * dist);
109-
real f = node->m * inv * dt;
109+
110+
// division-free inverse distance cubed
111+
real invDist = rsqrt(r2);
112+
real invDist3 = invDist * invDist * invDist;
113+
114+
real f = node->m * invDist3 * dt;
115+
110116
p.vx += dx * f;
111117
p.vy += dy * f;
112118
p.vz += dz * f;
113119
return;
114120
}
115121

116-
// Otherwise recurse into children
117-
for (int i = 0; i < 8; i++) {
122+
for (int i = 0; i < 8; i++)
118123
if (node->child[i])
119124
bhForce(node->child[i], p, theta, dt);
120-
}
121-
}
125+
}

0 commit comments

Comments
 (0)