Updated release image date.
[cslatevm.git] / tests / benchmark / nbody.slate
blobfd29889d3a823f049cab770020926d15a4aa7a21
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 |
14   s ::= n clone.
15   s bodies := {Body sun. Body jupiter. Body saturn. Body uranus. Body neptune}.
16   px := py := pz := 0.0.
17   s bodies do:
18     [| :body |
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.
23   s
26 n@(benchmark NBodySystem traits) advance: dt@(Float traits)
27 [| dx dy dz distance mag |
28   0 below: n bodies size do:
29     [| :i |
30      i + 1 below: n bodies size do:
31        [| :j |
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).
46   ]].
47   0 below: n bodies size do:
48     [| :i |
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 |
56   b := n bodies.
57   e := 0.0.
58   0 below: b size do:
59     [| :i |
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:
65        [| :j |
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]].
71   e
74 _@(benchmark Body) daysPerYear
76   365.24
79 _@(benchmark Body) pi
81   3.141592653589793
84 b@(benchmark Body) solarMass
86   4.0 * (b pi) * (b pi)
89 b@(benchmark Body) sun
91   b clone `>> [
92     x := 0.0.
93     y := 0.0.
94     z := 0.0.
95     vx := 0.0.
96     vy := 0.0.
97     vz := 0.0.
98     mass := b solarMass. ]
101 b@(benchmark Body) jupiter
103   b clone `>> [
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
115   b clone `>> [
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
127   b clone `>> [
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
139   b clone `>> [
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)
151   m ::= b solarMass.
152   b `>> [
153     vx := px negated / m.
154     vy := py negated / m.
155     vz := pz negated / m. ]
158 n@(Integer traits) nbodies
159 [| bodies |
160   bodies := benchmark NBodySystem new.
161   n timesRepeat: [bodies advance: 0.01].
162   bodies energy
165 n@(Integer traits) nbody
167   inform: '%s', 0 nbodies.
168   inform: '%s', n nbodies.