44
55fn main( ) {
66
7+ log "foo" ;
8+
79 let vec[ int] inputs = vec (
810 50000
911 //these segfault :(
@@ -56,7 +58,9 @@ mod NBodySystem {
5658 py += body. vy * body. mass ;
5759 pz += body. vz * body. mass ;
5860 }
59- bodies. ( 0 ) = Body . offsetMomentum ( bodies. ( 0 ) , px, py, pz) ;
61+
62+ // side-effecting
63+ Body . offsetMomentum ( bodies. ( 0 ) , px, py, pz) ;
6064
6165 ret bodies;
6266 }
@@ -76,6 +80,14 @@ mod NBodySystem {
7680 let float distance;
7781 rustrt. squareroot ( dSquared, distance) ;
7882 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;
7991 }
8092 }
8193
@@ -125,8 +137,8 @@ mod NBodySystem {
125137
126138mod Body {
127139
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
130142 const float DAYS_PER_YEAR = 365 . 24 ;
131143
132144 type props = rec ( float x,
@@ -142,49 +154,49 @@ mod Body {
142154 // fit into a 32-bit int.
143155
144156 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 ;
152164 ret p;
153165 }
154166
155167 fn saturn ( ) -> Body . props {
156168 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 ;
164176 ret p;
165177 }
166178
167179 fn uranus ( ) -> Body . props {
168180 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 ;
176188 ret p;
177189 }
178190
179191 fn neptune ( ) -> Body . props {
180192 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 ;
188200 ret p;
189201 }
190202
@@ -194,17 +206,14 @@ mod Body {
194206 ret p;
195207 }
196208
197- fn offsetMomentum ( Body . props props ,
209+ impure fn offsetMomentum ( mutable Body . props props,
198210 float px,
199211 float py,
200212 float pz) -> Body . props {
201213
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 ;
208217 }
209218
210219}
0 commit comments