2 prototypes ensureNamespace: #benchmark &delegate: True.
4 benchmark define: #NBodySystem &slots: {
8 benchmark define: #Body &slots: {
9 #x. #y. #z. #vx. #vy. #vz. #mass.
12 n@(benchmark NBodySystem traits) new
15 s bodies := {Body sun. Body jupiter. Body saturn. Body uranus. Body neptune}.
16 px := py := pz := 0.0.
19 px += body vx * body mass.
20 py += body vy * body mass.
21 pz += body vz * body mass].
22 s bodies first offsetMomentum: px y: py z: pz.
26 n@(benchmark NBodySystem traits) advance: dt@(Float traits)
27 [| dx dy dz distance mag |
28 0 below: n bodies size do:
30 i + 1 below: n bodies size do:
32 dx := (n bodies at: i) x - (n bodies at: j) x.
33 dy := (n bodies at: i) y - (n bodies at: j) y.
34 dz := (n bodies at: i) z - (n bodies at: j) z.
36 distance := ((dx * dx) + (dy * dy) + (dz * dz)) sqrt.
37 mag := dt / (distance * distance * distance).
39 (n bodies at: i) vx := (n bodies at: i) vx - (dx * (n bodies at: j) mass * mag).
40 (n bodies at: i) vy := (n bodies at: i) vy - (dy * (n bodies at: j) mass * mag).
41 (n bodies at: i) vz := (n bodies at: i) vz - (dz * (n bodies at: j) mass * mag).
43 (n bodies at: j) vx := (n bodies at: j) vx + (dx * (n bodies at: i) mass * mag).
44 (n bodies at: j) vy := (n bodies at: j) vy + (dy * (n bodies at: i) mass * mag).
45 (n bodies at: j) vz := (n bodies at: j) vz + (dz * (n bodies at: i) mass * mag).
47 0 below: n bodies size do:
49 (n bodies at: i) x := (n bodies at: i) x + (dt * (n bodies at: i) vx).
50 (n bodies at: i) y := (n bodies at: i) y + (dt * (n bodies at: i) vy).
51 (n bodies at: i) z := (n bodies at: i) z + (dt * (n bodies at: i) vz)].
54 n@(benchmark NBodySystem traits) energy
55 [| dx dy dz distance e b |
60 e += (0.5 * (b at: i) mass *
61 (((b at: i) vx * (b at: i) vx) +
62 ((b at: i) vy * (b at: i) vy) +
63 ((b at: i) vz * (b at: i) vz))).
64 i + 1 below: b size do:
66 dx := (b at: i) x - (b at: j) x.
67 dy := (b at: i) y - (b at: j) y.
68 dz := (b at: i) z - (b at: j) z.
69 distance := ((dx * dx) + (dy * dy) + (dz * dz)) sqrt.
70 e -= (b at: i) mass * (b at: j) mass / distance]].
74 _@(benchmark Body) daysPerYear
84 b@(benchmark Body) solarMass
89 b@(benchmark Body) sun
98 mass := b solarMass. ]
101 b@(benchmark Body) jupiter
104 x := 4.84143144246472090e0.
105 y := -1.16032004402742839e0.
106 z := -1.03622044471123109e-1.
107 vx := 1.66007664274403694e-3 * b daysPerYear.
108 vy := 7.69901118419740425e-3 * b daysPerYear.
109 vz := -6.90460016972063023e-5 * b daysPerYear.
110 mass := 9.54791938424326609e-4 * b solarMass. ]
113 b@(benchmark Body) saturn
116 x := 8.34336671824457987e0.
117 y := 4.12479856412430479e0.
118 z := -4.03523417114321381e-1.
119 vx := -2.76742510726862411e-3 * b daysPerYear.
120 vy := 4.99852801234917238e-3 * b daysPerYear.
121 vz := 2.30417297573763929e-5 * b daysPerYear.
122 mass := 2.85885980666130812e-4 * b solarMass. ]
125 b@(benchmark Body) uranus
128 x := 1.28943695621391310e1.
129 y := -1.51111514016986312e1.
130 z := -2.23307578892655734e-1.
131 vx := 2.96460137564761618e-3 * b daysPerYear.
132 vy := 2.37847173959480950e-3 * b daysPerYear.
133 vz := -2.96589568540237556e-5 * b daysPerYear.
134 mass := 4.36624404335156298e-5 * b solarMass. ]
137 b@(benchmark Body) neptune
140 x := 1.53796971148509165e1.
141 y := -2.59193146099879641e1.
142 z := 1.79258772950371181e-1.
143 vx := 2.68067772490389322e-3 * b daysPerYear.
144 vy := 1.62824170038242295e-3 * b daysPerYear.
145 vz := -9.51592254519715870e-5 * b daysPerYear.
146 mass := 5.15138902046611451e-5 * b solarMass. ]
149 b@(benchmark Body) offsetMomentum: px@(Float traits) y: py@(Float traits) z: pz@(Float traits)
153 vx := px negated / m.
154 vy := py negated / m.
155 vz := pz negated / m. ]
158 n@(Integer traits) nbodies
160 bodies := benchmark NBodySystem new.
161 n timesRepeat: [bodies advance: 0.01].
165 n@(Integer traits) nbody
167 inform: '%s', 0 nbodies.
168 inform: '%s', n nbodies.