Made the VM quieter (in diagnostics) by default.
[cslatevm.git] / tests / benchmark / nbody.slate
blob1b4aeb7d7b95adc8d7f0d9c937669ab74535d889
2 prototypes ensureNamespace: #benchmark &delegate: True.
4 benchmark define: #NBodySystem &slots: {
5   #bodies.
6 }.
8 benchmark define: #Body &slots: {
9   #x. #y. #z. #vx. #vy. #vz. #mass.
12 n@(benchmark NBodySystem traits) new
13 [| px py pz s |
14   s: n clone.
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).
21   ].
22   s bodies first offsetMomentum: px y: py z: pz.
23   s
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).
44      ].
45   ].
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).
50   ].
53 n@(benchmark NBodySystem traits) energy
54 [| dx dy dz distance e b |
55   b: n bodies.
56   e: 0.0.
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).
68     ].
69   ].
70   e
73 _@(benchmark Body) daysPerYear
75   365.24
78 _@(benchmark Body) pi
80   3.141592653589793
83 b@(benchmark Body) solarMass
85   4.0 * (b pi) * (b pi)
88 b@(benchmark Body) sun
90   b clone `>> [
91     x: 0.0.
92     y: 0.0.
93     z: 0.0.
94     vx: 0.0.
95     vy: 0.0.
96     vz: 0.0.
97     mass: b solarMass.]
100 b@(benchmark Body) jupiter
102   b clone `>> [
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
114   b clone `>> [
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
126   b clone `>> [
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
138   b clone `>> [
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)
149 [| m |
150   m: b solarMass.
151   b `>> [
152     vx: px negated / m.
153     vy: py negated / m.
154     vz: pz negated / m.]
157 n@(Integer traits) nbodies
158 [| bodies |
159   bodies: benchmark NBodySystem new.
160   n timesRepeat: [bodies advance: 0.01].
161   bodies energy
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.