File tree Expand file tree Collapse file tree 1 file changed +34
-33
lines changed Expand file tree Collapse file tree 1 file changed +34
-33
lines changed Original file line number Diff line number Diff line change 3
3
# http://shootout.alioth.debian.org/
4
4
#
5
5
# contributed by Reini Urban
6
- debug = true
7
- #debug = false
8
6
9
7
pi = 3.141592653589793
10
8
solar_mass = 4 * pi * pi
@@ -39,6 +37,7 @@ bodies(2) = saturn
39
37
bodies(3) = uranus
40
38
bodies(4) = neptune
41
39
nbodies = bodies length
40
+ lbodies = nbodies - 1
42
41
43
42
advance = (dt):
44
43
nbodies times(i):
@@ -50,26 +49,24 @@ advance = (dt):
50
49
bivy = bi/vy
51
50
bivz = bi/vz
52
51
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):
55
54
bj = bodies(j)
56
55
dx = bix - bj/x
57
56
dy = biy - bj/y
58
57
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++.
73
70
bi/x = bix + dt * bivx
74
71
bi/y = biy + dt * bivy
75
72
bi/z = biz + dt * bivz
@@ -78,11 +75,21 @@ advance = (dt):
78
75
bi/vz = bivz
79
76
..
80
77
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
+ .
82
89
b/vx = -px / solar_mass
83
90
b/vy = -py / solar_mass
84
91
b/vz = -pz / solar_mass
85
- b .
92
+ .
86
93
87
94
energy = ():
88
95
e = 0.0
@@ -97,30 +104,24 @@ energy = ():
97
104
bimass = bi/mass
98
105
f = bivx * bivx + bivy * bivy + bivz * bivz
99
106
e += 0.5 * bimass * f
100
- i+1 to (nbodies, (j):
107
+ j = i+1
108
+ while (j < nbodies):
101
109
bj = bodies(j)
102
110
dx = bix - bj/x
103
111
dy = biy - bj/y
104
112
dz = biz - bj/z
105
113
dist = dx*dx + dy*dy + dz*dz
106
114
dist = dist sqrt
107
115
f = bimass * bj/mass
108
- e -= f / dist .)
116
+ e -= f / dist
117
+ j++.
109
118
.
110
119
e.
111
120
112
121
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.
119
123
124
+ offsetmomentum()
120
125
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).
126
127
energy() say
You can’t perform that action at this time.
0 commit comments