Skip to content

Commit 4460c39

Browse files
author
Reini Urban
committed
examples/nbody.pn: fixed
also removed debugging code as it is used for benchmarks time bin/potion example/nbody.pn 50000000 -0.1692899033779056 -0.1692863967990446 real 24m44.758s (i.e. wrong and slow)
1 parent df8baf2 commit 4460c39

File tree

1 file changed

+34
-33
lines changed

1 file changed

+34
-33
lines changed

example/nbody.pn

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
# http://shootout.alioth.debian.org/
44
#
55
# contributed by Reini Urban
6-
debug = true
7-
#debug = false
86

97
pi = 3.141592653589793
108
solar_mass = 4 * pi * pi
@@ -39,6 +37,7 @@ bodies(2) = saturn
3937
bodies(3) = uranus
4038
bodies(4) = neptune
4139
nbodies = bodies length
40+
lbodies = nbodies - 1
4241

4342
advance = (dt):
4443
nbodies times(i):
@@ -50,26 +49,24 @@ advance = (dt):
5049
bivy = bi/vy
5150
bivz = bi/vz
5251
bimass = bi/mass
53-
i+1 to (nbodies, (j):
54-
if (debug): ("i", i, "j", j) say.
52+
j = i+1
53+
while (j < nbodies):
5554
bj = bodies(j)
5655
dx = bix - bj/x
5756
dy = biy - bj/y
5857
dz = biz - bj/z
59-
dist = dx*dx + dy*dy + dz*dz
60-
dist = dist sqrt
61-
mag = dt / (dist * dist * dist)
62-
if (debug): ("mag", mag) say.
63-
bim = bimass * mag
64-
bjm = bj/mass * mag
65-
#("bim", bim, "bjm", bjm) say
66-
bivx -= dx * bjm
67-
bivy -= dy * bjm
68-
bivz -= dz * bjm
69-
bj/vx += dx * bim
70-
bj/vy += dy * bim
71-
bj/vz += dz * bim
72-
.)
58+
dist2 = dx*dx + dy*dy + dz*dz
59+
mag = dist2 sqrt
60+
mag = dt / (mag * dist2)
61+
bm = bj/mass * mag
62+
bivx -= dx * bm
63+
bivy -= dy * bm
64+
bivz -= dz * bm
65+
bm = bimass * mag
66+
bj/vx += dx * bm
67+
bj/vy += dy * bm
68+
bj/vz += dz * bm
69+
j++.
7370
bi/x = bix + dt * bivx
7471
bi/y = biy + dt * bivy
7572
bi/z = biz + dt * bivz
@@ -78,11 +75,21 @@ advance = (dt):
7875
bi/vz = bivz
7976
..
8077

81-
offsetmomentum = (b, px, py, pz):
78+
offsetmomentum = ():
79+
px = 0.0
80+
py = 0.0
81+
pz = 0.0
82+
nbodies times(i):
83+
bi = bodies(i)
84+
bimass = bi/mass
85+
px += (bi/vx * bimass)
86+
py += (bi/vy * bimass)
87+
pz += (bi/vz * bimass)
88+
.
8289
b/vx = -px / solar_mass
8390
b/vy = -py / solar_mass
8491
b/vz = -pz / solar_mass
85-
b.
92+
.
8693

8794
energy = ():
8895
e = 0.0
@@ -97,30 +104,24 @@ energy = ():
97104
bimass = bi/mass
98105
f = bivx * bivx + bivy * bivy + bivz * bivz
99106
e += 0.5 * bimass * f
100-
i+1 to (nbodies, (j):
107+
j = i+1
108+
while (j < nbodies):
101109
bj = bodies(j)
102110
dx = bix - bj/x
103111
dy = biy - bj/y
104112
dz = biz - bj/z
105113
dist = dx*dx + dy*dy + dz*dz
106114
dist = dist sqrt
107115
f = bimass * bj/mass
108-
e -= f / dist .)
116+
e -= f / dist
117+
j++.
109118
.
110119
e.
111120

112121
n = argv(1) number
113-
if (n<1): n=50000.
114-
debug1 = false
115-
if (debug):
116-
("n", n) say
117-
debug1 = true
118-
.
122+
if (n<1): n=1000.
119123

124+
offsetmomentum()
120125
energy() say
121-
n times:
122-
advance(0.01)
123-
if (debug1): ("advance", energy()) say.
124-
debug = false
125-
.
126+
n times: advance(0.01).
126127
energy() say

0 commit comments

Comments
 (0)