use crate::datetime::mjd;
use crate::math::angle;
use crate::math::matrix::mat_r;
use crate::math::vector::vec_p;
use crate::math::sphe::sph_p::SphP;
use crate::BodyId;
use super::TO_ICRS;
const DMU: f64 = (0.5296909622785881e+03 - 0.2132990811942489e+03) / 880.0;
fn jupiter_terms() -> (Vec<i16>, Vec<Vec<Vec<(f64, f64, usize)>>>) {
(
vec![
0, 1473, 19, 2946, 1760, 1454, 287, 1167, 880, 1492, 4419, 2640,
],
vec![
vec![
vec![
(0.5995450695658069e+00, 0.0000000000000000e+00, 0),
(0.3320433851260807e-01, 0.9109637833239251e-01, 1),
(0.7250018335450959e-03, -0.5691217369045338e-02, 2),
(0.1985424640640104e-02, 0.2333581316897090e-02, 3),
(-0.5242936379734367e-03, 0.8184119299453390e-03, 4),
(-0.6403334713212935e-03, 0.3488102060373075e-03, 5),
(-0.6194905090074455e-03, 0.1713458904974218e-03, 6),
(-0.2634031506879374e-03, -0.2985397182828319e-03, 7),
(0.1142909780612095e-03, -0.3714591539099813e-03, 8),
(-0.5933825234264860e-04, -0.2733359559609898e-03, 9),
(0.1187120347695936e-03, 0.6614901453473903e-04, 10),
(-0.7744755866471679e-04, 0.4114921198208746e-04, 11),
],
vec![
(0.5296909622723741e+03, 0.0000000000000000e+00, 0),
(0.6261153085487643e-02, 0.1191740442480444e-02, 1),
(0.6080483337091830e-03, 0.3767075784103434e-03, 2),
(0.3891358887666329e-03, -0.7678985372670058e-04, 3),
(0.7517491028629564e-04, 0.3157135771494974e-04, 5),
],
vec![
(-0.4058011525892103e-04, -0.2503588842866821e-03, 1),
(-0.1482702960576531e-03, 0.0000000000000000e+00, 0),
],
],
vec![
vec![
(-0.2074293292139361e-01, 0.9186997526993108e-02, 1),
(0.1100914304616617e-02, 0.0000000000000000e+00, 0),
(-0.7921797738861901e-03, 0.7627925656119535e-03, 3),
(-0.7248674326301114e-04, 0.3622874100784935e-04, 5),
(0.6138849453313003e-04, -0.1941779370661158e-04, 9),
],
vec![
(0.9011919073001462e-03, 0.1170470085491707e-02, 1),
(0.7689544032321172e-04, 0.1087403864999091e-03, 3),
(0.1986184029284649e-04, 0.0000000000000000e+00, 0),
],
],
vec![
vec![
(0.5208874348086838e+01, 0.0000000000000000e+00, 0),
(-0.2368535271249723e+00, 0.8632290568995972e-01, 1),
(-0.4671855001049271e-02, 0.3931572864113317e-02, 3),
(-0.2378746266558446e-02, -0.1516015915283901e-02, 4),
(-0.9081304920914761e-03, -0.1642509027846126e-02, 5),
(0.6583221187246001e-03, -0.5658373592579514e-03, 7),
(0.7042287364097366e-03, -0.1535495368158646e-03, 9),
(0.6253951902171059e-03, 0.1956812186902301e-03, 8),
(-0.1678155736289721e-03, -0.2503648896791885e-03, 11),
(-0.3105751567562666e-04, -0.2897408924329618e-03, 6),
(0.2305415243265906e-03, -0.6495259013293128e-04, 2),
(-0.1104818406821979e-03, 0.1935233502213905e-03, 10),
],
vec![
(-0.3087362208415623e-02, 0.1627618123394481e-01, 1),
(0.1292866062833011e-03, 0.7926627868611435e-03, 3),
(0.4139739092520747e-03, 0.0000000000000000e+00, 0),
],
vec![
(0.6508148562081509e-03, -0.1061185140035286e-03, 1),
],
],
],
)
}
fn saturn_terms() -> (Vec<i16>, Vec<Vec<Vec<(f64, f64, usize)>>>) {
(
vec![
0, 593, 19, 574, 1186, 287, 612, 306, 1167, 1760, 1779, 880, 12, 31, 38, 562, 770,
],
vec![
vec![
vec![
(0.8740177338506789e+00, 0.0000000000000000e+00, 0),
(-0.7574105856050767e-01, 0.8124842961957993e-01, 1),
(-0.1784886882445774e-02, 0.1402887346304679e-01, 2),
(0.3455105620620864e-02, -0.1983273459475366e-02, 3),
(-0.3461925951169663e-02, 0.5647958324834785e-03, 4),
(0.2005625801133735e-02, -0.5047965148599808e-03, 5),
(-0.6070889154225823e-03, 0.5097966727739194e-03, 6),
(-0.1022464303025395e-04, 0.2396793070957350e-03, 7),
(0.1501487899880412e-03, -0.7016752287640170e-04, 8),
(0.9355146111558099e-04, -0.1275799035904682e-03, 9),
(-0.1371520762164380e-03, -0.6205178878758075e-04, 10),
(0.1297959396889700e-03, 0.7331399466438244e-04, 11),
(0.1580493393843886e-05, -0.1472585981154603e-03, 12),
(0.1231381550024101e-03, 0.4780559249241629e-04, 13),
(-0.3426970783160064e-04, 0.1270841963077466e-03, 14),
],
vec![
(0.2132990809732973e+03, 0.0000000000000000e+00, 0),
(0.4340938501186354e-02, -0.5418841549827147e-02, 1),
(-0.1498829350664881e-02, -0.9285477984913003e-03, 2),
(0.5619924327669309e-03, -0.1675995030875608e-03, 4),
],
vec![
(0.3661250801093046e-03, 0.0000000000000000e+00, 0),
(0.1106100998604507e-03, -0.9463047740013031e-04, 2),
(0.7071746343707461e-04, -0.1159490653274769e-03, 1),
],
],
vec![
vec![
(-0.3878089698456892e-01, 0.1927464789111172e-01, 1),
(-0.2303670873175813e-02, -0.6854327507756391e-03, 4),
(0.8474632250228872e-03, 0.0000000000000000e+00, 0),
(0.2866786215755259e-03, -0.1849544388701144e-03, 3),
(-0.2906827826057918e-03, 0.1037520989140559e-03, 6),
(-0.7669484722172480e-04, -0.1258400736742868e-03, 10),
(0.8734962385988288e-04, 0.4694776282262505e-04, 8),
],
vec![
(0.2260646552104705e-02, 0.5587564978527144e-02, 1),
(-0.3694748446937868e-03, 0.0000000000000000e+00, 0),
(0.2694935358319771e-04, 0.3442992399376276e-03, 4),
],
vec![(0.4924211443076070e-03, -0.1398712007977344e-03, 1)],
],
vec![
vec![
(0.9557582003189051e+01, 0.0000000000000000e+00, 0),
(-0.3874638122127037e+00, -0.3604708159943561e+00, 1),
(0.9360122837844483e-02, 0.1623169623679186e-01, 3),
(-0.1124454949670988e-02, -0.1460341652948698e-01, 4),
(0.7726296271925860e-02, 0.2802747369745328e-02, 11),
(0.1633285214452100e-02, 0.5225812631479847e-02, 5),
(-0.2395655893160825e-02, -0.2842008787127403e-02, 6),
(-0.3617850734540882e-02, -0.9113912781833796e-05, 2),
(0.1176870044588377e-02, 0.7695868388939142e-03, 9),
(-0.1077254652166863e-02, 0.1645191080563542e-03, 7),
(0.6500504507378022e-03, 0.2315801099378296e-03, 8),
(0.3598879554637265e-03, -0.4931918686890661e-03, 10),
(0.1054070184749009e-04, -0.4886074022453606e-03, 15),
(0.3181185903856893e-03, -0.6285269040103957e-04, 16),
],
vec![
(0.2585759681233912e-01, 0.2065889580201589e-01, 1),
(-0.1862671182975172e-02, 0.0000000000000000e+00, 0),
(0.2690190475162276e-03, 0.1808791529548621e-02, 4),
(0.7833665086945331e-03, -0.1545090766672087e-02, 3),
(0.6091241740560015e-03, 0.4436430551747135e-04, 6),
(0.2314367654749419e-03, -0.3985439278928142e-03, 2),
],
vec![
(0.5528474409496961e-03, 0.3278712407240941e-03, 1),
],
],
],
)
}
fn uranus_terms() -> (Vec<i16>, Vec<Vec<Vec<(f64, f64, usize)>>>) {
(
vec![
0, 208, 4, 204, 416, 177, 212, 8, 31, 200, 1265, 412, 102, 12, 624, 2739, 2738, 385,
200,
],
vec![
vec![
vec![
(0.5481220940299215e+01, 0.0000000000000000e+00, 0),
(0.5820243464403686e-01, -0.7203516157635016e-01, 1),
(-0.1323799851545778e-01, 0.6987826813432955e-02, 2),
(-0.1175374985423865e-02, -0.3446375602263179e-02, 3),
(-0.2659765858305692e-02, 0.5862201371733707e-03, 4),
(0.4424233542808494e-03, 0.5467917996063909e-03, 5),
(0.6731430420791602e-03, 0.1296422050708535e-03, 6),
(-0.3902244046717396e-03, -0.4817297912973961e-03, 7),
(-0.5935870067451457e-03, -0.1775024881579503e-03, 8),
(-0.2633631015847448e-03, 0.8223818399043866e-07, 9),
(0.2534986168903406e-03, 0.4334148850422474e-04, 10),
(-0.7227185329530044e-04, 0.1968873053599518e-03, 11),
(-0.3060682623900224e-04, -0.1745859478616181e-03, 12),
(0.1983096791081085e-04, 0.1168765116259525e-03, 13),
(0.1002372660822302e-03, 0.4915639923494293e-04, 14),
],
vec![
(0.7478166167358461e+02, 0.0000000000000000e+00, 0),
(0.9129878733798597e-03, 0.1439876034279062e-02, 1),
(0.2874658864386323e-03, 0.3698159320341746e-03, 2),
(0.1624348050316563e-03, -0.6332454039146911e-04, 3),
(0.1019252646466636e-03, -0.9763161366328983e-04, 8),
(0.5915163298419632e-04, -0.1257709887120436e-03, 5),
(0.1224682782507606e-04, -0.1002196865386298e-03, 4),
],
],
vec![
vec![
(-0.1166381793537791e-01, -0.6722740119713178e-02, 1),
(0.2247596452446944e-03, 0.5815163712774231e-03, 4),
(-0.6160596247716670e-03, 0.0000000000000000e+00, 0),
],
vec![
(0.3534575534763491e-03, -0.2642848279237776e-04, 1),
],
],
vec![
vec![
(0.1921264069592711e+02, 0.0000000000000000e+00, 0),
(0.6908229969244097e+00, 0.5577983410749090e+00, 1),
(0.3240682212666383e-01, -0.1103541631853334e-01, 3),
(-0.4335051419280965e-02, -0.2009675603980325e-01, 4),
(-0.1219759494020975e-02, 0.6344907819162663e-02, 6),
(-0.4533925895561529e-02, 0.3965180897087365e-02, 5),
(0.8362155997758774e-03, -0.4891873928211445e-02, 10),
(-0.6419374999722536e-03, -0.3568173043115625e-02, 15),
(0.6205614596728167e-03, 0.3450502144972520e-02, 16),
(-0.3146363672766541e-04, -0.3385985910419361e-02, 17),
(-0.9419106750010555e-06, -0.2422894176499027e-02, 18),
(-0.7853999656384045e-03, -0.1725293412354724e-02, 2),
(-0.1512695491101037e-02, -0.5525649985998048e-03, 11),
(0.2673245024510168e-03, -0.1412012306177687e-02, 8),
(0.9129807996496814e-03, -0.1607857116312711e-03, 12),
],
vec![
(-0.1379690401964202e-01, 0.8770926064687183e-02, 1),
(0.5972398168730488e-03, 0.1526222734726417e-02, 3),
(0.1099089695486743e-02, 0.4841738019396566e-03, 5),
],
],
],
)
}
fn neptune_terms() -> (Vec<i16>, Vec<Vec<Vec<(f64, f64, usize)>>>) {
(
vec![0, 106, 4, 102, 8, 98, 212, 1367, 110, 487],
vec![
vec![
vec![
(0.5311899081109972e+01, 0.0000000000000000e+00, 0),
(-0.1746453547131494e-01, -0.4284765113987862e-02, 1),
(0.9004372541127683e-02, -0.4756804055814676e-02, 2),
(0.1458925141879436e-03, 0.1234765750233906e-02, 3),
(0.2692658075603028e-03, 0.3223496781371420e-03, 4),
(0.3697567697683813e-03, 0.7160288711399143e-04, 5),
(0.1081531601904529e-03, -0.3200404439061314e-03, 6),
(0.1648269860386912e-03, -0.1031732909162797e-07, 7),
(0.2061544517786641e-04, 0.8940322632141960e-04, 8),
(0.8658559081514697e-04, -0.2439363437560494e-04, 9),
],
vec![
(0.3813297236551104e+02, 0.0000000000000000e+00, 0),
(-0.1972271712836072e-03, 0.2674362672068583e-03, 1),
(-0.1950568460632391e-03, -0.2517923345365344e-03, 2),
],
],
vec![
vec![
(0.3996022433674271e-02, -0.3062652907286201e-01, 1),
(0.2589205569950396e-03, 0.1005639208388431e-03, 6),
(0.2761982467779772e-03, 0.0000000000000000e+00, 0),
(-0.1439786584969279e-03, 0.5540782355253845e-04, 8),
(-0.1247566724374064e-03, -0.8918034289275630e-04, 3),
],
vec![
(-0.7056317557193836e-03, -0.1317242744601793e-03, 1),
],
],
vec![
vec![
(0.3007016195410603e+02, 0.0000000000000000e+00, 0),
(0.6453260169298154e-01, -0.2627809184969022e+00, 1),
(-0.1678851888878323e-01, 0.1857375342901981e-02, 3),
(0.3680433796866098e-02, 0.7178294404229702e-02, 2),
(-0.1022428981460446e-02, 0.5271984155507724e-02, 5),
(-0.1219659201023685e-05, -0.4957280766899717e-02, 7),
(-0.7449717541363589e-03, -0.2643202237165952e-02, 9),
(-0.1311632805234832e-02, 0.3102005438815479e-03, 8),
(0.1076981185368562e-02, 0.5684528419318696e-03, 6),
],
vec![
(-0.4023444681697872e-02, -0.2959775790201691e-02, 1),
],
],
],
)
}
pub fn get_lbr(mjd_tdb: f64, body: &BodyId) -> SphP {
let (frec, terms) = match body {
BodyId::JUPITER | BodyId::JUPITERB => jupiter_terms(),
BodyId::SATURN | BodyId::SATURNB => saturn_terms(),
BodyId::URANUS | BodyId::URANUSB => uranus_terms(),
BodyId::NEPTUNE | BodyId::NEPTUNEB => neptune_terms(),
_ => return SphP{ lon: f64::NAN, lat: f64::NAN, rad: f64::NAN},
};
let mut l = 0.0;
let mut b = 0.0;
let mut r = 0.0;
let dt = (mjd_tdb - mjd::J2000) / mjd::DJMILL;
let mut fcs: Vec<[f64; 3]> = Vec::new();
for i in frec.iter() {
let f = (*i as f64) * DMU * dt;
fcs.push([f, f.cos(), f.sin()]);
}
let mut n: u8 = 1; for i in terms.iter() {
let mut nt = 1.0;
let mut y = 0.0;
for j in i.iter() {
for k in j.iter() {
y += k.0 * fcs[k.2][1] + k.1 * fcs[k.2][2];
}
if n == 1 {
l += y * nt;
} else if n == 2 {
b += y * nt;
} else if n == 3 {
r += y * nt;
}
y = 0.0;
nt *= dt;
}
n += 1;
}
SphP {
lon: angle::norm_dblpi(l),
lat: b,
rad: r,
}
}
pub fn get_icrs_p(mjd_tdb: f64, body: &BodyId) -> vec_p::VecP {
let lbr = get_lbr(mjd_tdb, body);
let out = lbr.to_cart();
mat_r::mul_p(&TO_ICRS, &out)
}