use crate::{constants::*, fundamental_argument::*};
#[allow(non_snake_case)]
pub fn S06(date1: f64, date2: f64, x: f64, y: f64) -> f64 {
let t = (date1 - ERFA_DJ00 + date2) / ERFA_DJC;
let fa: [f64; 8] = [
l03(t),
lp03(t),
f03(t),
d03(t),
om03(t),
ve03(t),
e03(t),
pa03(t),
];
let mut w0 = SP[0];
let mut w1 = SP[1];
let mut w2 = SP[2];
let mut w3 = SP[3];
let mut w4 = SP[4];
let w5 = SP[5];
for s0 in S0.iter().rev() {
let a = s0
.nfa
.iter()
.copied()
.zip(fa.iter().copied())
.fold(0.0, |acc, (nfa, fa)| acc + f64::from(nfa) * fa);
w0 += s0.s * a.sin() + s0.c * a.cos();
}
for s1 in S1.iter().rev() {
let a = s1
.nfa
.iter()
.copied()
.zip(fa.iter().copied())
.fold(0.0, |acc, (nfa, fa)| acc + f64::from(nfa) * fa);
w1 += s1.s * a.sin() + s1.c * a.cos();
}
for s2 in S2.iter().rev() {
let a = s2
.nfa
.iter()
.copied()
.zip(fa.iter().copied())
.fold(0.0, |acc, (nfa, fa)| acc + f64::from(nfa) * fa);
w2 += s2.s * a.sin() + s2.c * a.cos();
}
for s3 in S3.iter().rev() {
let a = s3
.nfa
.iter()
.copied()
.zip(fa.iter().copied())
.fold(0.0, |acc, (nfa, fa)| acc + f64::from(nfa) * fa);
w3 += s3.s * a.sin() + s3.c * a.cos();
}
for s4 in S4.iter().rev() {
let a = s4
.nfa
.iter()
.copied()
.zip(fa.iter().copied())
.fold(0.0, |acc, (nfa, fa)| acc + f64::from(nfa) * fa);
w4 += s4.s * a.sin() + s4.c * a.cos();
}
(w0 + (w1 + (w2 + (w3 + (w4 + w5 * t) * t) * t) * t) * t) * ERFA_DAS2R - x * y / 2.0
}
const SP: [f64; 6] = [
94.00e-6,
3808.65e-6,
-122.68e-6,
-72574.11e-6,
27.98e-6,
15.62e-6,
];
struct Term {
nfa: [i32; 8],
s: f64,
c: f64,
}
const S0: [Term; 33] = [
Term {
nfa: [0, 0, 0, 0, 1, 0, 0, 0],
s: -2640.73e-6,
c: 0.39e-6,
},
Term {
nfa: [0, 0, 0, 0, 2, 0, 0, 0],
s: -63.53e-6,
c: 0.02e-6,
},
Term {
nfa: [0, 0, 2, -2, 3, 0, 0, 0],
s: -11.75e-6,
c: -0.01e-6,
},
Term {
nfa: [0, 0, 2, -2, 1, 0, 0, 0],
s: -11.21e-6,
c: -0.01e-6,
},
Term {
nfa: [0, 0, 2, -2, 2, 0, 0, 0],
s: 4.57e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 2, 0, 3, 0, 0, 0],
s: -2.02e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 2, 0, 1, 0, 0, 0],
s: -1.98e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 0, 0, 3, 0, 0, 0],
s: 1.72e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 1, 0, 0, 1, 0, 0, 0],
s: 1.41e-6,
c: 0.01e-6,
},
Term {
nfa: [0, 1, 0, 0, -1, 0, 0, 0],
s: 1.26e-6,
c: 0.01e-6,
},
Term {
nfa: [1, 0, 0, 0, -1, 0, 0, 0],
s: 0.63e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, 0, 0, 1, 0, 0, 0],
s: 0.63e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 1, 2, -2, 3, 0, 0, 0],
s: -0.46e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 1, 2, -2, 1, 0, 0, 0],
s: -0.45e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 4, -4, 4, 0, 0, 0],
s: -0.36e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 1, -1, 1, -8, 12, 0],
s: 0.24e-6,
c: 0.12e-6,
},
Term {
nfa: [0, 0, 2, 0, 0, 0, 0, 0],
s: -0.32e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 2, 0, 2, 0, 0, 0],
s: -0.28e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, 2, 0, 3, 0, 0, 0],
s: -0.27e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, 2, 0, 1, 0, 0, 0],
s: -0.26e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 2, -2, 0, 0, 0, 0],
s: 0.21e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 1, -2, 2, -3, 0, 0, 0],
s: -0.19e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 1, -2, 2, -1, 0, 0, 0],
s: -0.18e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 0, 0, 0, 8, -13, -1],
s: 0.10e-6,
c: -0.05e-6,
},
Term {
nfa: [0, 0, 0, 2, 0, 0, 0, 0],
s: -0.15e-6,
c: 0.00e-6,
},
Term {
nfa: [2, 0, -2, 0, -1, 0, 0, 0],
s: 0.14e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 1, 2, -2, 2, 0, 0, 0],
s: 0.14e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, 0, -2, 1, 0, 0, 0],
s: -0.14e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, 0, -2, -1, 0, 0, 0],
s: -0.14e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 4, -2, 4, 0, 0, 0],
s: -0.13e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 2, -2, 4, 0, 0, 0],
s: 0.11e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, -2, 0, -3, 0, 0, 0],
s: -0.11e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, -2, 0, -1, 0, 0, 0],
s: -0.11e-6,
c: 0.00e-6,
},
];
const S1: [Term; 3] = [
Term {
nfa: [0, 0, 0, 0, 2, 0, 0, 0],
s: -0.07e-6,
c: 3.57e-6,
},
Term {
nfa: [0, 0, 0, 0, 1, 0, 0, 0],
s: 1.73e-6,
c: -0.03e-6,
},
Term {
nfa: [0, 0, 2, -2, 3, 0, 0, 0],
s: 0.00e-6,
c: 0.48e-6,
},
];
const S2: [Term; 25] = [
Term {
nfa: [0, 0, 0, 0, 1, 0, 0, 0],
s: 743.52e-6,
c: -0.17e-6,
},
Term {
nfa: [0, 0, 2, -2, 2, 0, 0, 0],
s: 56.91e-6,
c: 0.06e-6,
},
Term {
nfa: [0, 0, 2, 0, 2, 0, 0, 0],
s: 9.84e-6,
c: -0.01e-6,
},
Term {
nfa: [0, 0, 0, 0, 2, 0, 0, 0],
s: -8.85e-6,
c: 0.01e-6,
},
Term {
nfa: [0, 1, 0, 0, 0, 0, 0, 0],
s: -6.38e-6,
c: -0.05e-6,
},
Term {
nfa: [1, 0, 0, 0, 0, 0, 0, 0],
s: -3.07e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 1, 2, -2, 2, 0, 0, 0],
s: 2.23e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 2, 0, 1, 0, 0, 0],
s: 1.67e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, 2, 0, 2, 0, 0, 0],
s: 1.30e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 1, -2, 2, -2, 0, 0, 0],
s: 0.93e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, 0, -2, 0, 0, 0, 0],
s: 0.68e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 2, -2, 1, 0, 0, 0],
s: -0.55e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, -2, 0, -2, 0, 0, 0],
s: 0.53e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 0, 2, 0, 0, 0, 0],
s: -0.27e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, 0, 0, 1, 0, 0, 0],
s: -0.27e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, -2, -2, -2, 0, 0, 0],
s: -0.26e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, 0, 0, -1, 0, 0, 0],
s: -0.25e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, 2, 0, 1, 0, 0, 0],
s: 0.22e-6,
c: 0.00e-6,
},
Term {
nfa: [2, 0, 0, -2, 0, 0, 0, 0],
s: -0.21e-6,
c: 0.00e-6,
},
Term {
nfa: [2, 0, -2, 0, -1, 0, 0, 0],
s: 0.20e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 2, 2, 2, 0, 0, 0],
s: 0.17e-6,
c: 0.00e-6,
},
Term {
nfa: [2, 0, 2, 0, 2, 0, 0, 0],
s: 0.13e-6,
c: 0.00e-6,
},
Term {
nfa: [2, 0, 0, 0, 0, 0, 0, 0],
s: -0.13e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, 2, -2, 2, 0, 0, 0],
s: -0.12e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 2, 0, 0, 0, 0, 0],
s: -0.11e-6,
c: 0.00e-6,
},
];
const S3: [Term; 4] = [
Term {
nfa: [0, 0, 0, 0, 1, 0, 0, 0],
s: 0.30e-6,
c: -23.42e-6,
},
Term {
nfa: [0, 0, 2, -2, 2, 0, 0, 0],
s: -0.03e-6,
c: -1.46e-6,
},
Term {
nfa: [0, 0, 2, 0, 2, 0, 0, 0],
s: -0.01e-6,
c: -0.25e-6,
},
Term {
nfa: [0, 0, 0, 0, 2, 0, 0, 0],
s: 0.00e-6,
c: 0.23e-6,
},
];
const S4: [Term; 1] = [Term {
nfa: [0, 0, 0, 0, 1, 0, 0, 0],
s: -0.26e-6,
c: -0.01e-6,
}];