@@ -23,7 +23,7 @@ use snafu::ResultExt;
23
23
use crate :: cosmic:: { AstroPhysicsSnafu , Frame , Orbit } ;
24
24
use crate :: dynamics:: AccelModel ;
25
25
use crate :: io:: gravity:: HarmonicsMem ;
26
- use crate :: linalg:: { DMatrix , Matrix3 , Vector3 , U7 } ;
26
+ use crate :: linalg:: { DMatrix , Matrix3 , Vector3 , Vector4 , U7 } ;
27
27
use hyperdual:: linalg:: norm;
28
28
use hyperdual:: { hyperspace_from_vector, Float , OHyperdual } ;
29
29
use std:: cmp:: min;
@@ -208,16 +208,10 @@ impl AccelModel for Harmonics {
208
208
209
209
let rho = eq_radius_km / r_;
210
210
let mut rho_np1 = mu_km3_s2 / r_ * rho;
211
- let mut a0 = 0.0 ;
212
- let mut a1 = 0.0 ;
213
- let mut a2 = 0.0 ;
214
- let mut a3 = 0.0 ;
211
+ let mut accel4: Vector4 < f64 > = Vector4 :: zeros ( ) ;
215
212
216
213
for n in 1 ..max_degree {
217
- let mut sum0 = 0.0 ;
218
- let mut sum1 = 0.0 ;
219
- let mut sum2 = 0.0 ;
220
- let mut sum3 = 0.0 ;
214
+ let mut sum: Vector4 < f64 > = Vector4 :: zeros ( ) ;
221
215
rho_np1 *= rho;
222
216
223
217
for m in 0 ..=min ( n, max_order) {
@@ -234,18 +228,19 @@ impl AccelModel for Harmonics {
234
228
( s_val * r_m[ m - 1 ] - c_val * i_m[ m - 1 ] ) * 2.0 . sqrt ( )
235
229
} ;
236
230
237
- sum0 += ( m as f64 ) * a_nm[ ( n, m) ] * e_;
238
- sum1 += ( m as f64 ) * a_nm[ ( n, m) ] * f_;
239
- sum2 += self . vr01 [ ( n, m) ] * a_nm[ ( n, m + 1 ) ] * d_;
240
- sum3 + = self . vr11 [ ( n, m) ] * a_nm[ ( n + 1 , m + 1 ) ] * d_;
231
+ sum . x += ( m as f64 ) * a_nm[ ( n, m) ] * e_;
232
+ sum . y += ( m as f64 ) * a_nm[ ( n, m) ] * f_;
233
+ sum . z += self . vr01 [ ( n, m) ] * a_nm[ ( n, m + 1 ) ] * d_;
234
+ sum . w - = self . vr11 [ ( n, m) ] * a_nm[ ( n + 1 , m + 1 ) ] * d_;
241
235
}
242
236
let rr = rho_np1 / eq_radius_km;
243
- a0 += rr * sum0;
244
- a1 += rr * sum1;
245
- a2 += rr * sum2;
246
- a3 -= rr * sum3;
237
+ accel4 += rr * sum;
247
238
}
248
- let accel = Vector3 :: new ( a0 + a3 * s_, a1 + a3 * t_, a2 + a3 * u_) ;
239
+ let accel = Vector3 :: new (
240
+ accel4. x + accel4. w * s_,
241
+ accel4. y + accel4. w * t_,
242
+ accel4. z + accel4. w * u_,
243
+ ) ;
249
244
// Rotate this acceleration vector back into the integration frame (no center change needed, it's just a vector)
250
245
// As discussed with Sai, if the Earth was spinning faster, would the acceleration due to the harmonics be any different?
251
246
// No. Therefore, we do not need to account for the transport theorem here.
0 commit comments