@@ -26,7 +26,8 @@ impl Frsqrt for f64x2 {
26
26
27
27
let u = unsafe {
28
28
vendor:: _mm_rsqrt_ps (
29
- f32x4:: new ( t. extract ( 0 ) , t. extract ( 1 ) , 0. , 0. ) ) . as_f64x4 ( )
29
+ f32x4:: new ( t. extract ( 0 ) , t. extract ( 1 ) , 0. , 0. ) ,
30
+ ) . as_f64x4 ( )
30
31
} ;
31
32
f64x2:: new ( u. extract ( 0 ) , u. extract ( 1 ) )
32
33
}
@@ -36,11 +37,12 @@ impl Frsqrt for f64x2 {
36
37
use self :: stdsimd:: vendor;
37
38
unsafe { vendor:: vrsqrte_f32 ( self . as_f32x2 ( ) ) . as_f64x2 ( ) }
38
39
}
39
- #[ cfg( not( any( all( any( target_arch = "x86" , target_arch = "x86_64" ) ,
40
+ #[ cfg( not( any( all( any( target_arch = "x86" ,
41
+ target_arch = "x86_64" ) ,
40
42
target_feature = "sse" ) ,
41
- all( any( target_arch = "arm" , target_arch = "aarch64" ) ,
42
- target_feature = "neon" )
43
- ) ) ) ]
43
+ all( any( target_arch = "arm" ,
44
+ target_arch = "aarch64" ) ,
45
+ target_feature = "neon" ) ) ) ) ]
44
46
{
45
47
self . replace ( 0 , 1. / self . extract ( 0 ) . sqrt ( ) ) ;
46
48
self . replace ( 1 , 1. / self . extract ( 1 ) . sqrt ( ) ) ;
@@ -57,9 +59,9 @@ struct Body {
57
59
}
58
60
59
61
impl Body {
60
- fn new ( x0 : f64 , x1 : f64 , x2 : f64 ,
61
- v0 : f64 , v1 : f64 , v2 : f64 ,
62
- mass : f64 ) -> Body {
62
+ fn new (
63
+ x0 : f64 , x1 : f64 , x2 : f64 , v0 : f64 , v1 : f64 , v2 : f64 , mass : f64
64
+ ) -> Body {
63
65
Body {
64
66
x : [ x0, x1, x2] ,
65
67
_fill : 0.0 ,
@@ -91,7 +93,7 @@ fn advance(bodies: &mut [Body; N_BODIES], dt: f64) {
91
93
92
94
let mut i = 0 ;
93
95
for j in 0 ..N_BODIES {
94
- for k in j+ 1 ..N_BODIES {
96
+ for k in j + 1 ..N_BODIES {
95
97
for m in 0 ..3 {
96
98
r[ i] [ m] = bodies[ j] . x [ m] - bodies[ k] . x [ m] ;
97
99
}
@@ -102,14 +104,15 @@ fn advance(bodies: &mut [Body; N_BODIES], dt: f64) {
102
104
i = 0 ;
103
105
while i < N {
104
106
for m in 0 ..3 {
105
- dx[ m] = f64x2:: new ( r[ i] [ m] , r[ i+ 1 ] [ m] ) ;
107
+ dx[ m] = f64x2:: new ( r[ i] [ m] , r[ i + 1 ] [ m] ) ;
106
108
}
107
109
108
110
dsquared = dx[ 0 ] * dx[ 0 ] + dx[ 1 ] * dx[ 1 ] + dx[ 2 ] * dx[ 2 ] ;
109
111
distance = dsquared. frsqrt ( ) ;
110
112
for _ in 0 ..2 {
111
- distance = distance * f64x2:: splat ( 1.5 ) -
112
- ( ( f64x2:: splat ( 0.5 ) * dsquared) * distance) * ( distance * distance)
113
+ distance = distance * f64x2:: splat ( 1.5 )
114
+ - ( ( f64x2:: splat ( 0.5 ) * dsquared) * distance)
115
+ * ( distance * distance)
113
116
}
114
117
dmag = f64x2:: splat ( dt) / dsquared * distance;
115
118
dmag. store ( & mut mag, i) ;
@@ -119,7 +122,7 @@ fn advance(bodies: &mut [Body; N_BODIES], dt: f64) {
119
122
120
123
i = 0 ;
121
124
for j in 0 ..N_BODIES {
122
- for k in j+ 1 ..N_BODIES {
125
+ for k in j + 1 ..N_BODIES {
123
126
for m in 0 ..3 {
124
127
bodies[ j] . v [ m] -= r[ i] [ m] * bodies[ k] . mass * mag[ i] ;
125
128
bodies[ k] . v [ m] += r[ i] [ m] * bodies[ j] . mass * mag[ i] ;
@@ -138,15 +141,19 @@ fn energy(bodies: &[Body; N_BODIES]) -> f64 {
138
141
let mut e = 0.0 ;
139
142
for i in 0 ..N_BODIES {
140
143
let bi = & bodies[ i] ;
141
- e += bi. mass * ( bi. v [ 0 ] * bi. v [ 0 ] + bi. v [ 1 ] * bi. v [ 1 ] + bi. v [ 2 ] * bi. v [ 2 ] ) / 2.0 ;
142
- for j in i+1 ..N_BODIES {
144
+ e += bi. mass
145
+ * ( bi. v [ 0 ] * bi. v [ 0 ] + bi. v [ 1 ] * bi. v [ 1 ] + bi. v [ 2 ] * bi. v [ 2 ] )
146
+ / 2.0 ;
147
+ for j in i + 1 ..N_BODIES {
143
148
let bj = & bodies[ j] ;
144
149
let mut dx = [ 0.0 ; 3 ] ;
145
150
for k in 0 ..3 {
146
151
dx[ k] = bi. x [ k] - bj. x [ k] ;
147
152
}
148
153
let mut distance = 0.0 ;
149
- for & d in & dx { distance += d * d }
154
+ for & d in & dx {
155
+ distance += d * d
156
+ }
150
157
e -= bi. mass * bj. mass / distance. sqrt ( )
151
158
}
152
159
}
@@ -156,48 +163,54 @@ fn energy(bodies: &[Body; N_BODIES]) -> f64 {
156
163
fn main ( ) {
157
164
let mut bodies: [ Body ; N_BODIES ] = [
158
165
/* sun */
159
- Body :: new ( 0.0 , 0.0 , 0.0 ,
160
- 0.0 , 0.0 , 0.0 ,
161
- SOLAR_MASS ) ,
166
+ Body :: new ( 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , SOLAR_MASS ) ,
162
167
/* jupiter */
163
- Body :: new ( 4.84143144246472090e+00 ,
164
- -1.16032004402742839e+00 ,
165
- -1.03622044471123109e-01 ,
166
- 1.66007664274403694e-03 * DAYS_PER_YEAR ,
167
- 7.69901118419740425e-03 * DAYS_PER_YEAR ,
168
- -6.90460016972063023e-05 * DAYS_PER_YEAR ,
169
- 9.54791938424326609e-04 * SOLAR_MASS
170
- ) ,
168
+ Body :: new (
169
+ 4.84143144246472090e+00 ,
170
+ -1.16032004402742839e+00 ,
171
+ -1.03622044471123109e-01 ,
172
+ 1.66007664274403694e-03 * DAYS_PER_YEAR ,
173
+ 7.69901118419740425e-03 * DAYS_PER_YEAR ,
174
+ -6.90460016972063023e-05 * DAYS_PER_YEAR ,
175
+ 9.54791938424326609e-04 * SOLAR_MASS ,
176
+ ) ,
171
177
/* saturn */
172
- Body :: new ( 8.34336671824457987e+00 ,
173
- 4.12479856412430479e+00 ,
174
- -4.03523417114321381e-01 ,
175
- -2.76742510726862411e-03 * DAYS_PER_YEAR ,
176
- 4.99852801234917238e-03 * DAYS_PER_YEAR ,
177
- 2.30417297573763929e-05 * DAYS_PER_YEAR ,
178
- 2.85885980666130812e-04 * SOLAR_MASS
179
- ) ,
178
+ Body :: new (
179
+ 8.34336671824457987e+00 ,
180
+ 4.12479856412430479e+00 ,
181
+ -4.03523417114321381e-01 ,
182
+ -2.76742510726862411e-03 * DAYS_PER_YEAR ,
183
+ 4.99852801234917238e-03 * DAYS_PER_YEAR ,
184
+ 2.30417297573763929e-05 * DAYS_PER_YEAR ,
185
+ 2.85885980666130812e-04 * SOLAR_MASS ,
186
+ ) ,
180
187
/* uranus */
181
- Body :: new ( 1.28943695621391310e+01 ,
182
- -1.51111514016986312e+01 ,
183
- -2.23307578892655734e-01 ,
184
- 2.96460137564761618e-03 * DAYS_PER_YEAR ,
185
- 2.37847173959480950e-03 * DAYS_PER_YEAR ,
186
- -2.96589568540237556e-05 * DAYS_PER_YEAR ,
187
- 4.36624404335156298e-05 * SOLAR_MASS
188
- ) ,
188
+ Body :: new (
189
+ 1.28943695621391310e+01 ,
190
+ -1.51111514016986312e+01 ,
191
+ -2.23307578892655734e-01 ,
192
+ 2.96460137564761618e-03 * DAYS_PER_YEAR ,
193
+ 2.37847173959480950e-03 * DAYS_PER_YEAR ,
194
+ -2.96589568540237556e-05 * DAYS_PER_YEAR ,
195
+ 4.36624404335156298e-05 * SOLAR_MASS ,
196
+ ) ,
189
197
/* neptune */
190
- Body :: new ( 1.53796971148509165e+01 ,
191
- -2.59193146099879641e+01 ,
192
- 1.79258772950371181e-01 ,
193
- 2.68067772490389322e-03 * DAYS_PER_YEAR ,
194
- 1.62824170038242295e-03 * DAYS_PER_YEAR ,
195
- -9.51592254519715870e-05 * DAYS_PER_YEAR ,
196
- 5.15138902046611451e-05 * SOLAR_MASS
197
- )
198
- ] ;
199
-
200
- let n: usize = std:: env:: args ( ) . nth ( 1 ) . expect ( "need one arg" ) . parse ( ) . unwrap ( ) ;
198
+ Body :: new (
199
+ 1.53796971148509165e+01 ,
200
+ -2.59193146099879641e+01 ,
201
+ 1.79258772950371181e-01 ,
202
+ 2.68067772490389322e-03 * DAYS_PER_YEAR ,
203
+ 1.62824170038242295e-03 * DAYS_PER_YEAR ,
204
+ -9.51592254519715870e-05 * DAYS_PER_YEAR ,
205
+ 5.15138902046611451e-05 * SOLAR_MASS ,
206
+ ) ,
207
+ ] ;
208
+
209
+ let n: usize = std:: env:: args ( )
210
+ . nth ( 1 )
211
+ . expect ( "need one arg" )
212
+ . parse ( )
213
+ . unwrap ( ) ;
201
214
202
215
offset_momentum ( & mut bodies) ;
203
216
println ! ( "{:.9}" , energy( & bodies) ) ;
0 commit comments