@@ -5,87 +5,85 @@ use std::f64::consts::PI;
5
5
const SOLAR_MASS : f64 = 4.0 * PI * PI ;
6
6
const DAYS_PER_YEAR : f64 = 365.24 ;
7
7
8
- #[ derive( Debug ) ]
9
- #[ repr( simd) ]
8
+ #[ derive( Debug , Clone , Copy ) ]
10
9
pub struct Body {
11
- pub x : Simdf64 ( [ f64 , 4 ] ) ,
12
- pub v : Simdf64 ( [ f64 , 4 ] ) ,
10
+ pub x : f64x4 ,
11
+ pub v : f64x4 ,
13
12
pub mass : f64 ,
14
13
}
15
14
16
- // Translation attempt is this ^^^ far
17
- //
15
+ // translation up to here
18
16
const N_BODIES : usize = 5 ;
19
17
#[ allow( clippy:: unreadable_literal) ]
20
18
const BODIES : [ Body ; N_BODIES ] = [
21
19
// sun:
22
20
Body {
23
- x : f64x4:: new ( 0. , 0. , 0. , 0. ) ,
24
- v : f64x4:: new ( 0. , 0. , 0. , 0. ) ,
21
+ x : f64x4:: from_array ( [ 0. , 0. , 0. , 0. ] ) ,
22
+ v : f64x4:: from_array ( [ 0. , 0. , 0. , 0. ] ) ,
25
23
mass : SOLAR_MASS ,
26
24
} ,
27
25
// jupiter:
28
26
Body {
29
- x : f64x4:: new (
27
+ x : f64x4:: from_array ( [
30
28
4.84143144246472090e+00 ,
31
29
-1.16032004402742839e+00 ,
32
30
-1.03622044471123109e-01 ,
33
31
0. ,
34
- ) ,
35
- v : f64x4:: new (
32
+ ] ) ,
33
+ v : f64x4:: from_array ( [
36
34
1.66007664274403694e-03 * DAYS_PER_YEAR ,
37
35
7.69901118419740425e-03 * DAYS_PER_YEAR ,
38
36
-6.90460016972063023e-05 * DAYS_PER_YEAR ,
39
37
0. ,
40
- ) ,
38
+ ] ) ,
41
39
mass : 9.54791938424326609e-04 * SOLAR_MASS ,
42
40
} ,
43
41
// saturn:
44
42
Body {
45
- x : f64x4:: new (
43
+ x : f64x4:: from_array ( [
46
44
8.34336671824457987e+00 ,
47
45
4.12479856412430479e+00 ,
48
46
-4.03523417114321381e-01 ,
49
47
0. ,
50
- ) ,
51
- v : f64x4:: new (
48
+ ] ) ,
49
+ v : f64x4:: from_array ( [
52
50
-2.76742510726862411e-03 * DAYS_PER_YEAR ,
53
51
4.99852801234917238e-03 * DAYS_PER_YEAR ,
54
52
2.30417297573763929e-05 * DAYS_PER_YEAR ,
55
53
0. ,
56
- ) ,
54
+ ] ) ,
57
55
mass : 2.85885980666130812e-04 * SOLAR_MASS ,
58
56
} ,
59
57
// uranus:
60
58
Body {
61
- x : f64x4:: new (
59
+ x : f64x4:: from_array ( [
62
60
1.28943695621391310e+01 ,
63
61
-1.51111514016986312e+01 ,
64
62
-2.23307578892655734e-01 ,
65
63
0. ,
66
- ) ,
67
- v : f64x4:: new (
64
+ ] ) ,
65
+ v : f64x4:: from_array ( [
68
66
2.96460137564761618e-03 * DAYS_PER_YEAR ,
69
67
2.37847173959480950e-03 * DAYS_PER_YEAR ,
70
68
-2.96589568540237556e-05 * DAYS_PER_YEAR ,
71
69
0. ,
72
- ) ,
70
+ ] ) ,
73
71
mass : 4.36624404335156298e-05 * SOLAR_MASS ,
74
72
} ,
75
73
// neptune:
76
74
Body {
77
- x : f64x4:: new (
75
+ x : f64x4:: from_array ( [
78
76
1.53796971148509165e+01 ,
79
77
-2.59193146099879641e+01 ,
80
78
1.79258772950371181e-01 ,
81
79
0. ,
82
- ) ,
83
- v : f64x4:: new (
80
+ ] ) ,
81
+ v : f64x4:: from_array ( [
84
82
2.68067772490389322e-03 * DAYS_PER_YEAR ,
85
83
1.62824170038242295e-03 * DAYS_PER_YEAR ,
86
84
-9.51592254519715870e-05 * DAYS_PER_YEAR ,
87
85
0. ,
88
- ) ,
86
+ ] ) ,
89
87
mass : 5.15138902046611451e-05 * SOLAR_MASS ,
90
88
} ,
91
89
] ;
@@ -103,10 +101,10 @@ pub fn energy(bodies: &[Body; N_BODIES]) -> f64 {
103
101
let mut e = 0. ;
104
102
for i in 0 ..N_BODIES {
105
103
let bi = & bodies[ i] ;
106
- e += bi. mass * ( bi. v * bi. v ) . sum ( ) * 0.5 ;
104
+ e += bi. mass * ( bi. v * bi. v ) . horizontal_sum ( ) * 0.5 ;
107
105
for bj in bodies. iter ( ) . take ( N_BODIES ) . skip ( i + 1 ) {
108
106
let dx = bi. x - bj. x ;
109
- e -= bi. mass * bj. mass / ( dx * dx) . sum ( ) . sqrt ( )
107
+ e -= bi. mass * bj. mass / ( dx * dx) . horizontal_sum ( ) . sqrt ( )
110
108
}
111
109
}
112
110
e
@@ -130,8 +128,8 @@ pub fn advance(bodies: &mut [Body; N_BODIES], dt: f64) {
130
128
let mut mag = [ 0.0 ; N ] ;
131
129
let mut i = 0 ;
132
130
while i < N {
133
- let d2s = f64x2:: new ( ( r[ i] * r[ i] ) . sum ( ) , ( r[ i + 1 ] * r[ i + 1 ] ) . sum ( ) ) ;
134
- let dmags = f64x2:: splat ( dt) / ( d2s * d2s. sqrte ( ) ) ;
131
+ let d2s = f64x2:: from_array ( [ ( r[ i] * r[ i] ) . horizontal_sum ( ) , ( r[ i + 1 ] * r[ i + 1 ] ) . horizontal_sum ( ) ] ) ;
132
+ let dmags = f64x2:: splat ( dt) / ( d2s * d2s. sqrt ( ) ) ;
135
133
dmags. write_to_slice_unaligned ( & mut mag[ i..] ) ;
136
134
i += 2 ;
137
135
}
@@ -190,5 +188,5 @@ fn main() {
190
188
//.parse()
191
189
//.expect("argument should be a usize");
192
190
//run(&mut std::io::stdout(), n, alg);
193
- println ! ( "{:?}" , run_k<10 >( 10 , 10 ) ) ;
191
+ println ! ( "{:?}" , run_k:: <10 >( 10 , 10 ) ) ;
194
192
}
0 commit comments