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: 0.0. py: 0.0. pz: 0.0.
17 s bodies do: [| :body |
18 px: px + (body vx * body mass).
19 py: py + (body vy * body mass).
20 pz: 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: [| :i |
29 i + 1 below: n bodies size do: [| :j |
30 dx: (n bodies at: i) x - (n bodies at: j) x.
31 dy: (n bodies at: i) y - (n bodies at: j) y.
32 dz: (n bodies at: i) z - (n bodies at: j) z.
34 distance: ((dx * dx) + (dy * dy) + (dz * dz)) sqrt.
35 mag: dt / (distance * distance * distance).
37 (n bodies at: i) vx: (n bodies at: i) vx - (dx * (n bodies at: j) mass * mag).
38 (n bodies at: i) vy: (n bodies at: i) vy - (dy * (n bodies at: j) mass * mag).
39 (n bodies at: i) vz: (n bodies at: i) vz - (dz * (n bodies at: j) mass * mag).
41 (n bodies at: j) vx: (n bodies at: j) vx + (dx * (n bodies at: i) mass * mag).
42 (n bodies at: j) vy: (n bodies at: j) vy + (dy * (n bodies at: i) mass * mag).
43 (n bodies at: j) vz: (n bodies at: j) vz + (dz * (n bodies at: i) mass * mag).
46 0 below: n bodies size do: [| :i |
47 (n bodies at: i) x: (n bodies at: i) x + (dt * (n bodies at: i) vx).
48 (n bodies at: i) y: (n bodies at: i) y + (dt * (n bodies at: i) vy).
49 (n bodies at: i) z: (n bodies at: i) z + (dt * (n bodies at: i) vz).
53 n@(benchmark NBodySystem traits) energy
54 [| dx dy dz distance e b |
57 0 below: b size do: [| :i |
58 e: e + (0.5 * (b at: i) mass *
59 (((b at: i) vx * (b at: i) vx) +
60 ((b at: i) vy * (b at: i) vy) +
61 ((b at: i) vz * (b at: i) vz))).
62 i + 1 below: b size do: [| :j |
63 dx: (b at: i) x - (b at: j) x.
64 dy: (b at: i) y - (b at: j) y.
65 dz: (b at: i) z - (b at: j) z.
66 distance: ((dx * dx) + (dy * dy) + (dz * dz)) sqrt.
67 e: e - ((b at: i) mass * (b at: j) mass / distance).
73 _@(benchmark Body) daysPerYear
83 b@(benchmark Body) solarMass
88 b@(benchmark Body) sun
100 b@(benchmark Body) jupiter
103 x: 4.84143144246472090e0.
104 y: -1.16032004402742839e0.
105 z: -1.03622044471123109e-1.
106 vx: 1.66007664274403694e-3 * b daysPerYear.
107 vy: 7.69901118419740425e-3 * b daysPerYear.
108 vz: -6.90460016972063023e-5 * b daysPerYear.
109 mass: 9.54791938424326609e-4 * b solarMass.]
112 b@(benchmark Body) saturn
115 x: 8.34336671824457987e0.
116 y: 4.12479856412430479e0.
117 z: -4.03523417114321381e-1.
118 vx: -2.76742510726862411e-3 * b daysPerYear.
119 vy: 4.99852801234917238e-3 * b daysPerYear.
120 vz: 2.30417297573763929e-5 * b daysPerYear.
121 mass: 2.85885980666130812e-4 * b solarMass.]
124 b@(benchmark Body) uranus
127 x: 1.28943695621391310e1.
128 y: -1.51111514016986312e1.
129 z: -2.23307578892655734e-1.
130 vx: 2.96460137564761618e-3 * b daysPerYear.
131 vy: 2.37847173959480950e-3 * b daysPerYear.
132 vz: -2.96589568540237556e-5 * b daysPerYear.
133 mass: 4.36624404335156298e-5 * b solarMass.]
136 b@(benchmark Body) neptune
139 x: 1.53796971148509165e1.
140 y: -2.59193146099879641e1.
141 z: 1.79258772950371181e-1.
142 vx: 2.68067772490389322e-3 * b daysPerYear.
143 vy: 1.62824170038242295e-3 * b daysPerYear.
144 vz: -9.51592254519715870e-5 * b daysPerYear.
145 mass: 5.15138902046611451e-5 * b solarMass.]
148 b@(benchmark Body) offsetMomentum: px@(Float traits) y: py@(Float traits) z: pz@(Float traits)
157 n@(Integer traits) nbodies
159 bodies: benchmark NBodySystem new.
160 n timesRepeat: [bodies advance: 0.01].
164 n@(Integer traits) nbody
166 Console writer ; (0 nbodies as: String).
167 Console writer newLine.
168 Console writer ; (n nbodies as: String).
169 Console writer newLine.