4
4
5
5
fn main( ) {
6
6
7
+ log "foo" ;
8
+
7
9
let vec[ int] inputs = vec (
8
10
50000
9
11
//these segfault :(
@@ -56,7 +58,9 @@ mod NBodySystem {
56
58
py += body. vy * body. mass ;
57
59
pz += body. vz * body. mass ;
58
60
}
59
- bodies. ( 0 ) = Body . offsetMomentum ( bodies. ( 0 ) , px, py, pz) ;
61
+
62
+ // side-effecting
63
+ Body . offsetMomentum ( bodies. ( 0 ) , px, py, pz) ;
60
64
61
65
ret bodies;
62
66
}
@@ -76,6 +80,14 @@ mod NBodySystem {
76
80
let float distance;
77
81
rustrt. squareroot ( dSquared, distance) ;
78
82
let float mag = dt / ( dSquared * distance) ;
83
+
84
+ iBody. vx -= dx * jbody. mass * mag;
85
+ iBody. vy -= dy * jbody. mass * mag;
86
+ iBody. vz -= dz * jbody. mass * mag;
87
+
88
+ jbody. vx += dx * iBody. mass * mag;
89
+ jbody. vy += dy * iBody. mass * mag;
90
+ jbody. vz += dz * iBody. mass * mag;
79
91
}
80
92
}
81
93
@@ -125,8 +137,8 @@ mod NBodySystem {
125
137
126
138
mod Body {
127
139
128
- const float PI = 3 . 141592 ;
129
- const float SOLAR_MASS = 39 . 478417 ; // was 4 * PI * PI originally
140
+ const float PI = 3 . 14 ;
141
+ const float SOLAR_MASS = 39 . 47 ; // was 4 * PI * PI originally
130
142
const float DAYS_PER_YEAR = 365 . 24 ;
131
143
132
144
type props = rec ( float x,
@@ -142,49 +154,49 @@ mod Body {
142
154
// fit into a 32-bit int.
143
155
144
156
let Body . props p;
145
- p. x = 4.841431e +00 ;
146
- p. y = -1.160320e +00 ;
147
- p. z = -1.036220e -01 ;
148
- p. vx = 1.660076e -03 * DAYS_PER_YEAR ;
149
- p. vy = 7.699011e -03 * DAYS_PER_YEAR ;
150
- p. vz = -6.904600e -05 * DAYS_PER_YEAR ;
151
- p. mass = 9.547919e -04 * SOLAR_MASS ;
157
+ p. x = 4.84e +00 ;
158
+ p. y = -1.16e +00 ;
159
+ p. z = -1.03e -01 ;
160
+ p. vx = 1.66e -03 * DAYS_PER_YEAR ;
161
+ p. vy = 7.69e -03 * DAYS_PER_YEAR ;
162
+ p. vz = -6.90e -05 * DAYS_PER_YEAR ;
163
+ p. mass = 9.54e -04 * SOLAR_MASS ;
152
164
ret p;
153
165
}
154
166
155
167
fn saturn ( ) -> Body . props {
156
168
let Body . props p;
157
- p. x = 8.343366e +00 ;
158
- p. y = 4.124798e +00 ;
159
- p. z = -4.035234e -01 ;
160
- p. vx = -2.767425e -03 * DAYS_PER_YEAR ;
161
- p. vy = 4.998528e -03 * DAYS_PER_YEAR ;
162
- p. vz = 2.304172e -05 * DAYS_PER_YEAR ;
163
- p. mass = 2.858859e -04 * SOLAR_MASS ;
169
+ p. x = 8.34e +00 ;
170
+ p. y = 4.12e +00 ;
171
+ p. z = -4.03e -01 ;
172
+ p. vx = -2.76e -03 * DAYS_PER_YEAR ;
173
+ p. vy = 4.99e -03 * DAYS_PER_YEAR ;
174
+ p. vz = 2.30e -05 * DAYS_PER_YEAR ;
175
+ p. mass = 2.85e -04 * SOLAR_MASS ;
164
176
ret p;
165
177
}
166
178
167
179
fn uranus ( ) -> Body . props {
168
180
let Body . props p;
169
- p. x = 1.289436e +01 ;
170
- p. y = -1.511115e +01 ;
171
- p. z = -2.233075e -01 ;
172
- p. vx = 2.964601e -03 * DAYS_PER_YEAR ;
173
- p. vy = 2.378471e -03 * DAYS_PER_YEAR ;
174
- p. vz = -2.965895e -05 * DAYS_PER_YEAR ;
175
- p. mass = 4.366244e -05 * SOLAR_MASS ;
181
+ p. x = 1.28e +01 ;
182
+ p. y = -1.51e +01 ;
183
+ p. z = -2.23e -01 ;
184
+ p. vx = 2.96e -03 * DAYS_PER_YEAR ;
185
+ p. vy = 2.37e -03 * DAYS_PER_YEAR ;
186
+ p. vz = -2.96e -05 * DAYS_PER_YEAR ;
187
+ p. mass = 4.36e -05 * SOLAR_MASS ;
176
188
ret p;
177
189
}
178
190
179
191
fn neptune ( ) -> Body . props {
180
192
let Body . props p;
181
- p. x = 1.537969e +01 ;
182
- p. y = -2.591931e +01 ;
183
- p. z = 1.792587e -01 ;
184
- p. vx = 2.680677e -03 * DAYS_PER_YEAR ;
185
- p. vy = 1.628241e -03 * DAYS_PER_YEAR ;
186
- p. vz = -9.515922e -05 * DAYS_PER_YEAR ;
187
- p. mass = 5.151389e -05 * SOLAR_MASS ;
193
+ p. x = 1.53e +01 ;
194
+ p. y = -2.59e +01 ;
195
+ p. z = 1.79e -01 ;
196
+ p. vx = 2.68e -03 * DAYS_PER_YEAR ;
197
+ p. vy = 1.62e -03 * DAYS_PER_YEAR ;
198
+ p. vz = -9.51e -05 * DAYS_PER_YEAR ;
199
+ p. mass = 5.15e -05 * SOLAR_MASS ;
188
200
ret p;
189
201
}
190
202
@@ -194,17 +206,14 @@ mod Body {
194
206
ret p;
195
207
}
196
208
197
- fn offsetMomentum ( Body . props props ,
209
+ impure fn offsetMomentum ( mutable Body . props props,
198
210
float px,
199
211
float py,
200
212
float pz) -> Body . props {
201
213
202
- // TODO: should we create a new one or mutate the original?
203
- let Body . props p = props;
204
- p. vx = -px / SOLAR_MASS ;
205
- p. vy = -py / SOLAR_MASS ;
206
- p. vz = -pz / SOLAR_MASS ;
207
- ret p;
214
+ props. vx = -px / SOLAR_MASS ;
215
+ props. vy = -py / SOLAR_MASS ;
216
+ props. vz = -pz / SOLAR_MASS ;
208
217
}
209
218
210
219
}
0 commit comments