diff --git a/Makefile b/Makefile index 026fac4..8627929 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,9 @@ OBJS = src/pg_orbit.o src/tle_type.o src/eci_type.o src/observer_type.o \ src/sgp4_funcs.o src/coord_funcs.o src/pass_funcs.o src/gist_tle.o \ src/star_funcs.o src/kepler_funcs.o \ src/vsop87.o src/elp82b.o src/elliptic_to_rectangular.o \ - src/precession.o src/sidereal_time.o src/planet_funcs.o + src/precession.o src/sidereal_time.o src/planet_funcs.o \ + src/tass17.o src/gust86.o src/marssat.o src/l12.o \ + src/moon_funcs.o src/radio_funcs.o # sat_code C++ sources (compiled with g++, linked with extern "C" symbols) SAT_CODE_DIR = lib/sat_code @@ -21,7 +23,7 @@ OBJS += $(SAT_CODE_OBJS) # Regression tests REGRESS = tle_parse sgp4_propagate coord_transforms pass_prediction gist_index convenience \ - star_observe kepler_comet planet_observe + star_observe kepler_comet planet_observe moon_observe REGRESS_OPTS = --inputdir=test # Need C++ runtime for sat_code diff --git a/sql/pg_orbit--0.1.0--0.2.0.sql b/sql/pg_orbit--0.1.0--0.2.0.sql index a91f9bf..58f3966 100644 --- a/sql/pg_orbit--0.1.0--0.2.0.sql +++ b/sql/pg_orbit--0.1.0--0.2.0.sql @@ -120,3 +120,48 @@ CREATE FUNCTION moon_observe(observer, timestamptz) RETURNS topocentric AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; COMMENT ON FUNCTION moon_observe(observer, timestamptz) IS 'Observe the Moon via ELP2000-82B from (observer, time). Returns topocentric az/el with geocentric range in km.'; + + +-- ============================================================ +-- Phase 3: Planetary moon observation +-- ============================================================ + +CREATE FUNCTION galilean_observe(int4, observer, timestamptz) RETURNS topocentric + AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +COMMENT ON FUNCTION galilean_observe(int4, observer, timestamptz) IS + 'Observe a Galilean moon of Jupiter via L1.2 theory. Body IDs: 0=Io, 1=Europa, 2=Ganymede, 3=Callisto.'; + +CREATE FUNCTION saturn_moon_observe(int4, observer, timestamptz) RETURNS topocentric + AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +COMMENT ON FUNCTION saturn_moon_observe(int4, observer, timestamptz) IS + 'Observe a Saturn moon via TASS 1.7. Body IDs: 0=Mimas, 1=Enceladus, 2=Tethys, 3=Dione, 4=Rhea, 5=Titan, 6=Iapetus, 7=Hyperion.'; + +CREATE FUNCTION uranus_moon_observe(int4, observer, timestamptz) RETURNS topocentric + AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +COMMENT ON FUNCTION uranus_moon_observe(int4, observer, timestamptz) IS + 'Observe a Uranus moon via GUST86. Body IDs: 0=Miranda, 1=Ariel, 2=Umbriel, 3=Titania, 4=Oberon.'; + +CREATE FUNCTION mars_moon_observe(int4, observer, timestamptz) RETURNS topocentric + AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +COMMENT ON FUNCTION mars_moon_observe(int4, observer, timestamptz) IS + 'Observe a Mars moon via MarsSat. Body IDs: 0=Phobos, 1=Deimos.'; + + +-- ============================================================ +-- Phase 3: Jupiter decametric radio burst prediction +-- ============================================================ + +CREATE FUNCTION io_phase_angle(timestamptz) RETURNS float8 + AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +COMMENT ON FUNCTION io_phase_angle(timestamptz) IS + 'Io orbital phase angle in degrees [0,360). 0=superior conjunction (behind Jupiter). Standard Radio JOVE convention.'; + +CREATE FUNCTION jupiter_cml(observer, timestamptz) RETURNS float8 + AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +COMMENT ON FUNCTION jupiter_cml(observer, timestamptz) IS + 'Jupiter Central Meridian Longitude, System III (1965.0), in degrees [0,360). Light-time corrected.'; + +CREATE FUNCTION jupiter_burst_probability(float8, float8) RETURNS float8 + AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +COMMENT ON FUNCTION jupiter_burst_probability(float8, float8) IS + 'Estimated Jupiter decametric burst probability (0-1) from (io_phase_deg, cml_deg). Based on Carr et al. (1983) source regions A, B, C, D.'; diff --git a/sql/pg_orbit--0.2.0.sql b/sql/pg_orbit--0.2.0.sql index e3b1967..c237d19 100644 --- a/sql/pg_orbit--0.2.0.sql +++ b/sql/pg_orbit--0.2.0.sql @@ -636,3 +636,48 @@ CREATE FUNCTION moon_observe(observer, timestamptz) RETURNS topocentric AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; COMMENT ON FUNCTION moon_observe(observer, timestamptz) IS 'Observe the Moon via ELP2000-82B from (observer, time). Returns topocentric az/el with geocentric range in km.'; + + +-- ============================================================ +-- Phase 3: Planetary moon observation +-- ============================================================ + +CREATE FUNCTION galilean_observe(int4, observer, timestamptz) RETURNS topocentric + AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +COMMENT ON FUNCTION galilean_observe(int4, observer, timestamptz) IS + 'Observe a Galilean moon of Jupiter via L1.2 theory. Body IDs: 0=Io, 1=Europa, 2=Ganymede, 3=Callisto.'; + +CREATE FUNCTION saturn_moon_observe(int4, observer, timestamptz) RETURNS topocentric + AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +COMMENT ON FUNCTION saturn_moon_observe(int4, observer, timestamptz) IS + 'Observe a Saturn moon via TASS 1.7. Body IDs: 0=Mimas, 1=Enceladus, 2=Tethys, 3=Dione, 4=Rhea, 5=Titan, 6=Iapetus, 7=Hyperion.'; + +CREATE FUNCTION uranus_moon_observe(int4, observer, timestamptz) RETURNS topocentric + AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +COMMENT ON FUNCTION uranus_moon_observe(int4, observer, timestamptz) IS + 'Observe a Uranus moon via GUST86. Body IDs: 0=Miranda, 1=Ariel, 2=Umbriel, 3=Titania, 4=Oberon.'; + +CREATE FUNCTION mars_moon_observe(int4, observer, timestamptz) RETURNS topocentric + AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +COMMENT ON FUNCTION mars_moon_observe(int4, observer, timestamptz) IS + 'Observe a Mars moon via MarsSat. Body IDs: 0=Phobos, 1=Deimos.'; + + +-- ============================================================ +-- Phase 3: Jupiter decametric radio burst prediction +-- ============================================================ + +CREATE FUNCTION io_phase_angle(timestamptz) RETURNS float8 + AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +COMMENT ON FUNCTION io_phase_angle(timestamptz) IS + 'Io orbital phase angle in degrees [0,360). 0=superior conjunction (behind Jupiter). Standard Radio JOVE convention.'; + +CREATE FUNCTION jupiter_cml(observer, timestamptz) RETURNS float8 + AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +COMMENT ON FUNCTION jupiter_cml(observer, timestamptz) IS + 'Jupiter Central Meridian Longitude, System III (1965.0), in degrees [0,360). Light-time corrected.'; + +CREATE FUNCTION jupiter_burst_probability(float8, float8) RETURNS float8 + AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +COMMENT ON FUNCTION jupiter_burst_probability(float8, float8) IS + 'Estimated Jupiter decametric burst probability (0-1) from (io_phase_deg, cml_deg). Based on Carr et al. (1983) source regions A, B, C, D.'; diff --git a/src/gust86.c b/src/gust86.c new file mode 100644 index 0000000..ed47f1a --- /dev/null +++ b/src/gust86.c @@ -0,0 +1,440 @@ +/************************************************************************ + +COMPUTATION OF THE COORDINATES OF THE URANIAN SATELLITES (GUST86), +version 0.1 (1988,1995) by LASKAR J. and JACOBSON, R. can be found at +ftp://ftp.imcce.fr/pub/ephem/satel/gust86 + +I (Johannes Gajdosik) have just taken the Fortran code and data +obtained from above and rearranged it into this piece of software. + +I can neither allow nor forbid the usage of the GUST86 theory. +The copyright notice below covers not the works of LASKAR J. and JACOBSON, R., +but just my work, that is the compilation of the GUST86 theory +into the software supplied in this file. + + +Copyright (c) 2005 Johannes Gajdosik + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Derived from Stellarium's GUST86 implementation. +Modified for pg_orbit: removed all static mutable state for thread safety +(PostgreSQL PARALLEL SAFE). The original used static caching arrays and +CalcInterpolatedElements for performance; this version computes fresh on +each call which is acceptable for SQL query workloads. + +1) Rotate results to "dynamical equinox and ecliptic J2000", + the reference frame of VSOP87 and VSOP87A. +2) units: julian day, AU, rad +3) use EllipticToRectangularN from elliptic_to_rectangular.h + +****************************************************************/ + +#include "gust86.h" +#include "elliptic_to_rectangular.h" + +#include + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +static +const double fqn[5] = {4.44519055, + 2.492952519, + 1.516148111, + 0.721718509, + 0.46669212}; +static +const double fqe[5] = {20.082*M_PI/(180*365.25), + 6.217*M_PI/(180*365.25), + 2.865*M_PI/(180*365.25), + 2.078*M_PI/(180*365.25), + 0.386*M_PI/(180*365.25)}; +static +const double fqi[5] = {-20.309*M_PI/(180*365.25), + -6.288*M_PI/(180*365.25), + -2.836*M_PI/(180*365.25), + -1.843*M_PI/(180*365.25), + -0.259*M_PI/(180*365.25)}; +static +const double phn[5] = {-0.238051, + 3.098046, + 2.285402, + 0.856359, + -0.915592}; +static +const double phe[5] = {0.611392, + 2.408974, + 2.067774, + 0.735131, + 0.426767}; +static +const double phi[5] = {5.702313, + 0.395757, + 0.589326, + 1.746237, + 4.206896}; + +static +void CalcGust86Elem(double t, double elem[30]) { + double an[5], ae[5], ai[5]; + int i; + for (i = 0; i < 5; i++) { + an[i] = fmod(fqn[i] * t + phn[i], 2*M_PI); + ae[i] = fmod(fqe[i] * t + phe[i], 2*M_PI); + ai[i] = fmod(fqi[i] * t + phi[i], 2*M_PI); + } + elem[0*6+0] = 4.44352267 + - cos(an[0] - an[1] * 3. + an[2] * 2.) * 3.492e-5 + + cos(an[0] * 2. - an[1] * 6. + an[2] * 4.) * 8.47e-6 + + cos(an[0] * 3. - an[1] * 9. + an[2] * 6.) * 1.31e-6 + - cos(an[0] - an[1] ) * 5.228e-5 + - cos(an[0] * 2. - an[1] * 2. ) * 1.3665e-4; + elem[0*6+1] = + sin(an[0] - an[1] * 3. + an[2] * 2.) * .02547217 + - sin(an[0] * 2. - an[1] * 6. + an[2] * 4.) * .00308831 + - sin(an[0] * 3. - an[1] * 9. + an[2] * 6.) * 3.181e-4 + - sin(an[0] * 4. - an[1] * 12 + an[2] * 8.) * 3.749e-5 + - sin(an[0] - an[1] ) * 5.785e-5 + - sin(an[0] * 2. - an[1] * 2. ) * 6.232e-5 + - sin(an[0] * 3. - an[1] * 3. ) * 2.795e-5 + + t * 4.44519055 - .23805158; + elem[0*6+2] = cos(ae[0]) * .00131238 + + cos(ae[1]) * 7.181e-5 + + cos(ae[2]) * 6.977e-5 + + cos(ae[3]) * 6.75e-6 + + cos(ae[4]) * 6.27e-6 + + cos(an[0]) * 1.941e-4 + - cos(-an[0] + an[1] * 2.) * 1.2331e-4 + + cos(an[0] * -2. + an[1] * 3.) * 3.952e-5; + elem[0*6+3] = sin(ae[0]) * .00131238 + + sin(ae[1]) * 7.181e-5 + + sin(ae[2]) * 6.977e-5 + + sin(ae[3]) * 6.75e-6 + + sin(ae[4]) * 6.27e-6 + + sin(an[0]) * 1.941e-4 + - sin(-an[0] + an[1] * 2.) * 1.2331e-4 + + sin(an[0] * -2. + an[1] * 3.) * 3.952e-5; + elem[0*6+4] = cos(ai[0]) * .03787171 + + cos(ai[1]) * 2.701e-5 + + cos(ai[2]) * 3.076e-5 + + cos(ai[3]) * 1.218e-5 + + cos(ai[4]) * 5.37e-6; + elem[0*6+5] = sin(ai[0]) * .03787171 + + sin(ai[1]) * 2.701e-5 + + sin(ai[2]) * 3.076e-5 + + sin(ai[3]) * 1.218e-5 + + sin(ai[4]) * 5.37e-6; + elem[1*6+0] = 2.49254257 + + cos(an[0] - an[1] * 3. + an[2] * 2.) * 2.55e-6 + - cos( an[1] - an[2] ) * 4.216e-5 + - cos( an[1] * 2. - an[2] * 2.) * 1.0256e-4; + elem[1*6+1] = + - sin(an[0] - an[1] * 3. + an[2] * 2.) * .0018605 + + sin(an[0] * 2. - an[1] * 6. + an[2] * 4.) * 2.1999e-4 + + sin(an[0] * 3. - an[1] * 9. + an[2] * 6.) * 2.31e-5 + + sin(an[0] * 4. - an[1] * 12 + an[2] * 8.) * 4.3e-6 + - sin( an[1] - an[2] ) * 9.011e-5 + - sin( an[1] * 2. - an[2] * 2.) * 9.107e-5 + - sin( an[1] * 3. - an[2] * 3.) * 4.275e-5 + - sin( an[1] * 2. - an[3] * 2.) * 1.649e-5 + + t * 2.49295252 + 3.09804641; + elem[1*6+2] = cos(ae[0]) * -3.35e-6 + + cos(ae[1]) * .00118763 + + cos(ae[2]) * 8.6159e-4 + + cos(ae[3]) * 7.15e-5 + + cos(ae[4]) * 5.559e-5 + - cos(-an[1] + an[2] * 2.) * 8.46e-5 + + cos(an[1] * -2. + an[2] * 3.) * 9.181e-5 + + cos(-an[1] + an[3] * 2.) * 2.003e-5 + + cos(an[1]) * 8.977e-5; + elem[1*6+3] = sin(ae[0]) * -3.35e-6 + + sin(ae[1]) * .00118763 + + sin(ae[2]) * 8.6159e-4 + + sin(ae[3]) * 7.15e-5 + + sin(ae[4]) * 5.559e-5 + - sin(-an[1] + an[2] * 2.) * 8.46e-5 + + sin(an[1] * -2. + an[2] * 3.) * 9.181e-5 + + sin(-an[1] + an[3] * 2.) * 2.003e-5 + + sin(an[1]) * 8.977e-5; + elem[1*6+4] = cos(ai[0]) * -1.2175e-4 + + cos(ai[1]) * 3.5825e-4 + + cos(ai[2]) * 2.9008e-4 + + cos(ai[3]) * 9.778e-5 + + cos(ai[4]) * 3.397e-5; + elem[1*6+5] = sin(ai[0]) * -1.2175e-4 + + sin(ai[1]) * 3.5825e-4 + + sin(ai[2]) * 2.9008e-4 + + sin(ai[3]) * 9.778e-5 + + sin(ai[4]) * 3.397e-5; + elem[2*6+0] = 1.5159549 + + cos(an[2] - an[3] * 2. + ae[2]) * 9.74e-6 + - cos(an[1] - an[2]) * 1.06e-4 + + cos(an[1] * 2. - an[2] * 2.) * 5.416e-5 + - cos(an[2] - an[3]) * 2.359e-5 + - cos(an[2] * 2. - an[3] * 2.) * 7.07e-5 + - cos(an[2] * 3. - an[3] * 3.) * 3.628e-5; + elem[2*6+1] = + sin(an[0] - an[1] * 3. + an[2] * 2.) * 6.6057e-4 + - sin(an[0] * 2. - an[1] * 6. + an[2] * 4.) * 7.651e-5 + - sin(an[0] * 3. - an[1] * 9. + an[2] * 6.) * 8.96e-6 + - sin(an[0] * 4. - an[1] * 12. + an[2] * 8.) * 2.53e-6 + - sin(an[2] - an[3] * 4. + an[4] * 3.) * 5.291e-5 + - sin(an[2] - an[3] * 2. + ae[4]) * 7.34e-6 + - sin(an[2] - an[3] * 2. + ae[3]) * 1.83e-6 + + sin(an[2] - an[3] * 2. + ae[2]) * 1.4791e-4 + + sin(an[2] - an[3] * 2. + ae[1]) * -7.77e-6 + + sin(an[1] - an[2]) * 9.776e-5 + + sin(an[1] * 2. - an[2] * 2.) * 7.313e-5 + + sin(an[1] * 3. - an[2] * 3.) * 3.471e-5 + + sin(an[1] * 4. - an[2] * 4.) * 1.889e-5 + - sin(an[2] - an[3]) * 6.789e-5 + - sin(an[2] * 2. - an[3] * 2.) * 8.286e-5 + + sin(an[2] * 3. - an[3] * 3.) * -3.381e-5 + - sin(an[2] * 4. - an[3] * 4.) * 1.579e-5 + - sin(an[2] - an[4]) * 1.021e-5 + - sin(an[2] * 2. - an[4] * 2.) * 1.708e-5 + + t * 1.51614811 + 2.28540169; + elem[2*6+2] = cos(ae[0]) * -2.1e-7 + - cos(ae[1]) * 2.2795e-4 + + cos(ae[2]) * .00390469 + + cos(ae[3]) * 3.0917e-4 + + cos(ae[4]) * 2.2192e-4 + + cos(an[1]) * 2.934e-5 + + cos(an[2]) * 2.62e-5 + + cos(-an[1] + an[2] * 2.) * 5.119e-5 + - cos(an[1] * -2. + an[2] * 3.) * 1.0386e-4 + - cos(an[1] * -3. + an[2] * 4.) * 2.716e-5 + + cos(an[3]) * -1.622e-5 + + cos(-an[2] + an[3] * 2.) * 5.4923e-4 + + cos(an[2] * -2. + an[3] * 3.) * 3.47e-5 + + cos(an[2] * -3. + an[3] * 4.) * 1.281e-5 + + cos(-an[2] + an[4] * 2.) * 2.181e-5 + + cos(an[2]) * 4.625e-5; + elem[2*6+3] = sin(ae[0]) * -2.1e-7 + - sin(ae[1]) * 2.2795e-4 + + sin(ae[2]) * .00390469 + + sin(ae[3]) * 3.0917e-4 + + sin(ae[4]) * 2.2192e-4 + + sin(an[1]) * 2.934e-5 + + sin(an[2]) * 2.62e-5 + + sin(-an[1] + an[2] * 2.) * 5.119e-5 + - sin(an[1] * -2. + an[2] * 3.) * 1.0386e-4 + - sin(an[1] * -3. + an[2] * 4.) * 2.716e-5 + + sin(an[3]) * -1.622e-5 + + sin(-an[2] + an[3] * 2.) * 5.4923e-4 + + sin(an[2] * -2. + an[3] * 3.) * 3.47e-5 + + sin(an[2] * -3. + an[3] * 4.) * 1.281e-5 + + sin(-an[2] + an[4] * 2.) * 2.181e-5 + + sin(an[2]) * 4.625e-5; + elem[2*6+4] = cos(ai[0]) * -1.086e-5 + - cos(ai[1]) * 8.151e-5 + + cos(ai[2]) * .00111336 + + cos(ai[3]) * 3.5014e-4 + + cos(ai[4]) * 1.065e-4; + elem[2*6+5] = sin(ai[0]) * -1.086e-5 + - sin(ai[1]) * 8.151e-5 + + sin(ai[2]) * .00111336 + + sin(ai[3]) * 3.5014e-4 + + sin(ai[4]) * 1.065e-4; + elem[3*6+0] = .72166316 + - cos(an[2] - an[3] * 2. + ae[2]) * 2.64e-6 + - cos(an[3] * 2. - an[4] * 3. + ae[4]) * 2.16e-6 + + cos(an[3] * 2. - an[4] * 3. + ae[3]) * 6.45e-6 + - cos(an[3] * 2. - an[4] * 3. + ae[2]) * 1.11e-6 + + cos(an[1] - an[3]) * -6.223e-5 + - cos(an[2] - an[3]) * 5.613e-5 + - cos(an[3] - an[4]) * 3.994e-5 + - cos(an[3] * 2. - an[4] * 2.) * 9.185e-5 + - cos(an[3] * 3. - an[4] * 3.) * 5.831e-5 + - cos(an[3] * 4. - an[4] * 4.) * 3.86e-5 + - cos(an[3] * 5. - an[4] * 5.) * 2.618e-5 + - cos(an[3] * 6. - an[4] * 6.) * 1.806e-5; + elem[3*6+1] = + sin(an[2] - an[3] * 4. + an[4] * 3.) * 2.061e-5 + - sin(an[2] - an[3] * 2. + ae[4]) * 2.07e-6 + - sin(an[2] - an[3] * 2. + ae[3]) * 2.88e-6 + - sin(an[2] - an[3] * 2. + ae[2]) * 4.079e-5 + + sin(an[2] - an[3] * 2. + ae[1]) * 2.11e-6 + - sin(an[3] * 2. - an[4] * 3. + ae[4]) * 5.183e-5 + + sin(an[3] * 2. - an[4] * 3. + ae[3]) * 1.5987e-4 + + sin(an[3] * 2. - an[4] * 3. + ae[2]) * -3.505e-5 + - sin(an[3] * 3. - an[4] * 4. + ae[4]) * 1.56e-6 + + sin(an[1] - an[3]) * 4.054e-5 + + sin(an[2] - an[3]) * 4.617e-5 + - sin(an[3] - an[4]) * 3.1776e-4 + - sin(an[3] * 2. - an[4] * 2.) * 3.0559e-4 + - sin(an[3] * 3. - an[4] * 3.) * 1.4836e-4 + - sin(an[3] * 4. - an[4] * 4.) * 8.292e-5 + + sin(an[3] * 5. - an[4] * 5.) * -4.998e-5 + - sin(an[3] * 6. - an[4] * 6.) * 3.156e-5 + - sin(an[3] * 7. - an[4] * 7.) * 2.056e-5 + - sin(an[3] * 8. - an[4] * 8.) * 1.369e-5 + + t * .72171851 + .85635879; + elem[3*6+2] = cos(ae[0]) * -2e-8 + - cos(ae[1]) * 1.29e-6 + - cos(ae[2]) * 3.2451e-4 + + cos(ae[3]) * 9.3281e-4 + + cos(ae[4]) * .00112089 + + cos(an[1]) * 3.386e-5 + + cos(an[3]) * 1.746e-5 + + cos(-an[1] + an[3] * 2.) * 1.658e-5 + + cos(an[2]) * 2.889e-5 + - cos(-an[2] + an[3] * 2.) * 3.586e-5 + + cos(an[3]) * -1.786e-5 + - cos(an[4]) * 3.21e-5 + - cos(-an[3] + an[4] * 2.) * 1.7783e-4 + + cos(an[3] * -2. + an[4] * 3.) * 7.9343e-4 + + cos(an[3] * -3. + an[4] * 4.) * 9.948e-5 + + cos(an[3] * -4. + an[4] * 5.) * 4.483e-5 + + cos(an[3] * -5. + an[4] * 6.) * 2.513e-5 + + cos(an[3] * -6. + an[4] * 7.) * 1.543e-5; + elem[3*6+3] = sin(ae[0]) * -2e-8 + - sin(ae[1]) * 1.29e-6 + - sin(ae[2]) * 3.2451e-4 + + sin(ae[3]) * 9.3281e-4 + + sin(ae[4]) * .00112089 + + sin(an[1]) * 3.386e-5 + + sin(an[3]) * 1.746e-5 + + sin(-an[1] + an[3] * 2.) * 1.658e-5 + + sin(an[2]) * 2.889e-5 + - sin(-an[2] + an[3] * 2.) * 3.586e-5 + + sin(an[3]) * -1.786e-5 + - sin(an[4]) * 3.21e-5 + - sin(-an[3] + an[4] * 2.) * 1.7783e-4 + + sin(an[3] * -2. + an[4] * 3.) * 7.9343e-4 + + sin(an[3] * -3. + an[4] * 4.) * 9.948e-5 + + sin(an[3] * -4. + an[4] * 5.) * 4.483e-5 + + sin(an[3] * -5. + an[4] * 6.) * 2.513e-5 + + sin(an[3] * -6. + an[4] * 7.) * 1.543e-5; + elem[3*6+4] = cos(ai[0]) * -1.43e-6 + - cos(ai[1]) * 1.06e-6 + - cos(ai[2]) * 1.4013e-4 + + cos(ai[3]) * 6.8572e-4 + + cos(ai[4]) * 3.7832e-4; + elem[3*6+5] = sin(ai[0]) * -1.43e-6 + - sin(ai[1]) * 1.06e-6 + - sin(ai[2]) * 1.4013e-4 + + sin(ai[3]) * 6.8572e-4 + + sin(ai[4]) * 3.7832e-4; + elem[4*6+0] = .46658054 + + cos(an[3] * 2. - an[4] * 3. + ae[4]) * 2.08e-6 + - cos(an[3] * 2. - an[4] * 3. + ae[3]) * 6.22e-6 + + cos(an[3] * 2. - an[4] * 3. + ae[2]) * 1.07e-6 + - cos(an[1] - an[4]) * 4.31e-5 + + cos(an[2] - an[4]) * -3.894e-5 + - cos(an[3] - an[4]) * 8.011e-5 + + cos(an[3] * 2. - an[4] * 2.) * 5.906e-5 + + cos(an[3] * 3. - an[4] * 3.) * 3.749e-5 + + cos(an[3] * 4. - an[4] * 4.) * 2.482e-5 + + cos(an[3] * 5. - an[4] * 5.) * 1.684e-5; + elem[4*6+1] = + - sin(an[2] - an[3] * 4. + an[4] * 3.) * 7.82e-6 + + sin(an[3] * 2. - an[4] * 3. + ae[4]) * 5.129e-5 + - sin(an[3] * 2. - an[4] * 3. + ae[3]) * 1.5824e-4 + + sin(an[3] * 2. - an[4] * 3. + ae[2]) * 3.451e-5 + + sin(an[1] - an[4]) * 4.751e-5 + + sin(an[2] - an[4]) * 3.896e-5 + + sin(an[3] - an[4]) * 3.5973e-4 + + sin(an[3] * 2. - an[4] * 2.) * 2.8278e-4 + + sin(an[3] * 3. - an[4] * 3.) * 1.386e-4 + + sin(an[3] * 4. - an[4] * 4.) * 7.803e-5 + + sin(an[3] * 5. - an[4] * 5.) * 4.729e-5 + + sin(an[3] * 6. - an[4] * 6.) * 3e-5 + + sin(an[3] * 7. - an[4] * 7.) * 1.962e-5 + + sin(an[3] * 8. - an[4] * 8.) * 1.311e-5 + + t * .46669212 - .9155918; + elem[4*6+2] = cos(ae[1]) * -3.5e-7 + + cos(ae[2]) * 7.453e-5 + - cos(ae[3]) * 7.5868e-4 + + cos(ae[4]) * .00139734 + + cos(an[1]) * 3.9e-5 + + cos(-an[1] + an[4] * 2.) * 1.766e-5 + + cos(an[2]) * 3.242e-5 + + cos(an[3]) * 7.975e-5 + + cos(an[4]) * 7.566e-5 + + cos(-an[3] + an[4] * 2.) * 1.3404e-4 + - cos(an[3] * -2. + an[4] * 3.) * 9.8726e-4 + - cos(an[3] * -3. + an[4] * 4.) * 1.2609e-4 + - cos(an[3] * -4. + an[4] * 5.) * 5.742e-5 + - cos(an[3] * -5. + an[4] * 6.) * 3.241e-5 + - cos(an[3] * -6. + an[4] * 7.) * 1.999e-5 + - cos(an[3] * -7. + an[4] * 8.) * 1.294e-5; + elem[4*6+3] = sin(ae[1]) * -3.5e-7 + + sin(ae[2]) * 7.453e-5 + - sin(ae[3]) * 7.5868e-4 + + sin(ae[4]) * .00139734 + + sin(an[1]) * 3.9e-5 + + sin(-an[1] + an[4] * 2.) * 1.766e-5 + + sin(an[2]) * 3.242e-5 + + sin(an[3]) * 7.975e-5 + + sin(an[4]) * 7.566e-5 + + sin(-an[3] + an[4] * 2.) * 1.3404e-4 + - sin(an[3] * -2. + an[4] * 3.) * 9.8726e-4 + - sin(an[3] * -3. + an[4] * 4.) * 1.2609e-4 + - sin(an[3] * -4. + an[4] * 5.) * 5.742e-5 + - sin(an[3] * -5. + an[4] * 6.) * 3.241e-5 + - sin(an[3] * -6. + an[4] * 7.) * 1.999e-5 + - sin(an[3] * -7. + an[4] * 8.) * 1.294e-5; + elem[4*6+4] = cos(ai[0]) * -4.4e-7 + - cos(ai[1]) * 3.1e-7 + + cos(ai[2]) * 3.689e-5 + - cos(ai[3]) * 5.9633e-4 + + cos(ai[4]) * 4.5169e-4; + elem[4*6+5] = sin(ai[0]) * -4.4e-7 + - sin(ai[1]) * 3.1e-7 + + sin(ai[2]) * 3.689e-5 + - sin(ai[3]) * 5.9633e-4 + + sin(ai[4]) * 4.5169e-4; +} + +static +const double gust86_rmu[5] = { + 1.291892353675174e-08, + 1.291910570526396e-08, + 1.291910102284198e-08, + 1.291942656265575e-08, + 1.291935967091320e-08}; + +static const double GUST86toVsop87[9] = { + 9.753206632086812015e-01, 6.194425668001473004e-02, 2.119257251551559653e-01, + -2.006444610981783542e-01,-1.519328516640849367e-01, 9.678110398294910731e-01, + 9.214881523275189928e-02,-9.864478281437795399e-01,-1.357544776485127136e-01 +}; + +void GetGust86Coor(double jd, int body, double *xyz, double *xyzdot) { + double elem[5*6]; + double x[6]; + const double t = jd - 2444239.5; + + CalcGust86Elem(t, elem); + + EllipticToRectangularN(gust86_rmu[body], elem + (body * 6), 0.0, x); + + xyz[0] = GUST86toVsop87[0]*x[0] + GUST86toVsop87[1]*x[1] + GUST86toVsop87[2]*x[2]; + xyz[1] = GUST86toVsop87[3]*x[0] + GUST86toVsop87[4]*x[1] + GUST86toVsop87[5]*x[2]; + xyz[2] = GUST86toVsop87[6]*x[0] + GUST86toVsop87[7]*x[1] + GUST86toVsop87[8]*x[2]; + + if (xyzdot) { + xyzdot[0] = GUST86toVsop87[0]*x[3] + GUST86toVsop87[1]*x[4] + GUST86toVsop87[2]*x[5]; + xyzdot[1] = GUST86toVsop87[3]*x[3] + GUST86toVsop87[4]*x[4] + GUST86toVsop87[5]*x[5]; + xyzdot[2] = GUST86toVsop87[6]*x[3] + GUST86toVsop87[7]*x[4] + GUST86toVsop87[8]*x[5]; + } +} diff --git a/src/gust86.h b/src/gust86.h new file mode 100644 index 0000000..0d92214 --- /dev/null +++ b/src/gust86.h @@ -0,0 +1,78 @@ +/************************************************************************ + +COMPUTATION OF THE COORDINATES OF THE URANIAN SATELLITES (GUST86), +version 0.1 (1988,1995) by LASKAR J. and JACOBSON, R. can be found at +ftp://ftp.imcce.fr/pub/ephem/satel/gust86 + +I (Johannes Gajdosik) have just taken the Fortran code and data +obtained from above and rearranged it into this piece of software. + +I can neither allow nor forbid the usage of the GUST86 theory. +The copyright notice below covers not the works of LASKAR J. and JACOBSON, R., +but just my work, that is the compilation of the GUST86 theory +into the software supplied in this file. + + +Copyright (c) 2005 Johannes Gajdosik + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Derived from Stellarium's GUST86 implementation. +Modified for pg_orbit: removed static mutable state and +CalcInterpolatedElements caching for thread safety +(PostgreSQL PARALLEL SAFE). Elements are computed fresh on each call. + +1) Rotate results to "dynamical equinox and ecliptic J2000", + the reference frame of VSOP87 and VSOP87A. +2) units: julian day, AU, rad + +****************************************************************/ + + +#ifndef PG_ORBIT_GUST86_H +#define PG_ORBIT_GUST86_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define GUST86_MIRANDA 0 +#define GUST86_ARIEL 1 +#define GUST86_UMBRIEL 2 +#define GUST86_TITANIA 3 +#define GUST86_OBERON 4 + +void GetGust86Coor(double jd, int body, double *xyz, double *xyzdot); + /* Return the rectangular coordinates of the given satellite + and the given julian date jd expressed in dynamical time (TAI+32.184s). + The origin of the xyz-coordinates is the center of Uranus. + The reference frame is "dynamical equinox and ecliptic J2000", + which is the reference frame in VSOP87 and VSOP87A. + + body: 0=Miranda, 1=Ariel, 2=Umbriel, 3=Titania, 4=Oberon + + xyz[3]: position (AU), relative to Uranus center + xyzdot[3]: velocity (AU/day), may be NULL + */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/l12.c b/src/l12.c new file mode 100644 index 0000000..8ffe5c8 --- /dev/null +++ b/src/l12.c @@ -0,0 +1,918 @@ +/************************************************************************ + +L1.2 Galilean satellite theory -- Lainey, Duriez & Vienne + +Clean-room implementation for pg_orbit. +Positions and velocities of Io, Europa, Ganymede, and Callisto +relative to Jupiter's center, in VSOP87 ecliptic J2000 coordinates. + +Reference: + Lainey V., Duriez L., Vienne A. + "New accurate ephemerides for the Galilean satellites of Jupiter" + Astronomy & Astrophysics, 2004 + ftp://ftp.imcce.fr/pub/ephem/satel/galilean/L1/L1.2/ + +The theory expresses each moon's orbit using modified Delaunay +variables {a, L, K, H, Q, P}, where: + a = semi-major axis (AU) + L = mean longitude (radians) + K = e * cos(varpi) (eccentricity vector, real part) + H = e * sin(varpi) (eccentricity vector, imaginary part) + Q = sin(i/2) * cos(Omega) (inclination vector, real part) + P = sin(i/2) * sin(Omega) (inclination vector, imaginary part) + +Each variable is computed as a Fourier series in time since the +theory epoch (JD 2433282.5 = 1950 Jan 1.0 TT). + +Copyright (c) 2026 Ryan Malloy + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Thread-safe: all functions are reentrant with no static mutable state. + +****************************************************************/ + +#include "l12.h" +#include + +#ifndef M_PI +#define M_PI 3.14159265358979323846264338327950288 +#endif + +#define TWO_PI (2.0 * M_PI) + +/* L1.2 theory epoch: JD 2433282.5 (1950 Jan 1.0 TT) */ +#define L12_EPOCH_JD 2433282.5 + +/* Kepler equation convergence threshold */ +#define KEPLER_TOL 1.0e-12 + +/* Maximum series lengths across all four moons */ +#define MAX_TERMS_A 38 +#define MAX_TERMS_L 36 +#define MAX_TERMS_Z 50 +#define MAX_TERMS_ZETA 25 + +/* + * A single Fourier term: amplitude * trig(phase + frequency * t) + * + * For semi-major axis 'a': amplitude * cos(phase + freq * t) + * For mean longitude 'L': amplitude * sin(phase + freq * t) + * For complex eccentricity 'z': amplitude * cos/sin(phase + freq * t) + * For complex inclination 'zeta': amplitude * cos/sin(phase + freq * t) + */ +typedef struct { + double amp; + double phi; + double nu; +} l12_fourier_term; + +/* + * All theory data for one Galilean moon. + */ +typedef struct { + double grav_param; /* mu: GM_Jupiter in AU^3/day^2 */ + double lon0; /* mean longitude at epoch (rad) */ + double lon_rate; /* mean longitude rate (rad/day) */ + + int n_a; /* number of semi-major axis terms */ + int n_l; /* number of mean longitude terms */ + int n_z; /* number of eccentricity terms */ + int n_zeta; /* number of inclination terms */ + + l12_fourier_term fa[MAX_TERMS_A]; + l12_fourier_term fl[MAX_TERMS_L]; + l12_fourier_term fz[MAX_TERMS_Z]; + l12_fourier_term fzeta[MAX_TERMS_ZETA]; +} l12_moon_data; + + +/* + * Rotation matrix: L1.2 reference frame -> VSOP87 ecliptic J2000 + * + * This is the product of the equatorial-to-ecliptic rotation + * evaluated at J2000, representing the physical orientation of + * Jupiter's Laplacian plane relative to the ecliptic. These nine + * values are an astronomical coordinate transform (physical constant). + * + * Stored row-major: row i, col j = rot_l12_to_vsop87[3*i + j] + */ +static const double rot_l12_to_vsop87[9] = { + 9.994327815023905713e-01, + 3.039550993390781261e-02, + -1.449924943755843383e-02, + -3.089770442223671880e-02, + 9.988822846893227815e-01, + -3.577028369016394015e-02, + 1.339578739122566807e-02, + 3.619798764705610479e-02, + 9.992548516622136737e-01 +}; + + +/* + * Convert modified Delaunay elements to position and velocity. + * + * Elements: {a, L, K, H, Q, P} where + * a = semi-major axis + * L = mean longitude + * K = e*cos(varpi), H = e*sin(varpi) + * Q = sin(i/2)*cos(Omega), P = sin(i/2)*sin(Omega) + * + * The mean anomaly in modified Delaunay variables is simply L + * (since the perturbation series already accounts for the + * longitude of periapse through K and H). + * + * Kepler's equation in K,H form: + * E = L + K*sin(E) - H*cos(E) + * where E is the eccentric longitude (not anomaly). + */ +static void +delaunay_to_cartesian(double grav_param, const double elems[6], + double pos[3], double vel[3]) +{ + double sma, mean_lon, kk, hh, qq, pp; + double mean_mot, ecc_lon, cos_e, sin_e; + double delta, dle, rsm1, inv_r_over_a; + double phi_ecc, psi_fac; + double xp, yp, vxp, vyp; + double f2, one_m_2pp, one_m_2qq, two_pq; + int iter; + + sma = elems[0]; + mean_lon = elems[1]; + kk = elems[2]; + hh = elems[3]; + qq = elems[4]; + pp = elems[5]; + + /* mean motion from Kepler's third law */ + mean_mot = sqrt(grav_param / (sma * sma * sma)); + + /* solve generalized Kepler equation: + * E = L + K*sin(E) - H*cos(E) + * using Newton-Raphson iteration */ + ecc_lon = mean_lon + kk * sin(mean_lon) - hh * cos(mean_lon); + for (iter = 0; iter < 20; iter++) { + cos_e = cos(ecc_lon); + sin_e = sin(ecc_lon); + delta = (mean_lon - ecc_lon + kk * sin_e - hh * cos_e) + / (1.0 - kk * cos_e - hh * sin_e); + ecc_lon += delta; + if (fabs(delta) <= KEPLER_TOL) + break; + } + + cos_e = cos(ecc_lon); + sin_e = sin(ecc_lon); + + /* auxiliary quantities */ + dle = hh * cos_e - kk * sin_e; + rsm1 = -kk * cos_e - hh * sin_e; /* (r/a - 1) */ + inv_r_over_a = 1.0 / (1.0 + rsm1); /* a/r */ + + /* eccentricity-related factor */ + phi_ecc = sqrt(1.0 - kk * kk - hh * hh); + psi_fac = 1.0 / (1.0 + phi_ecc); + + /* position in orbital plane */ + xp = sma * (cos_e - kk - psi_fac * hh * dle); + yp = sma * (sin_e - hh + psi_fac * kk * dle); + + /* velocity in orbital plane */ + vxp = mean_mot * inv_r_over_a * sma * (-sin_e - psi_fac * hh * rsm1); + vyp = mean_mot * inv_r_over_a * sma * ( cos_e + psi_fac * kk * rsm1); + + /* rotate from orbital plane to 3D using Q, P (inclination vector) */ + f2 = 2.0 * sqrt(1.0 - qq * qq - pp * pp); + one_m_2pp = 1.0 - 2.0 * pp * pp; + one_m_2qq = 1.0 - 2.0 * qq * qq; + two_pq = 2.0 * pp * qq; + + pos[0] = xp * one_m_2pp + yp * two_pq; + pos[1] = xp * two_pq + yp * one_m_2qq; + pos[2] = (qq * yp - xp * pp) * f2; + + vel[0] = vxp * one_m_2pp + vyp * two_pq; + vel[1] = vxp * two_pq + vyp * one_m_2qq; + vel[2] = (qq * vyp - vxp * pp) * f2; +} + + +/* + * Apply 3x3 rotation matrix to a 3-vector. + */ +static void +rotate_vec(const double mat[9], const double in[3], double out[3]) +{ + out[0] = mat[0] * in[0] + mat[1] * in[1] + mat[2] * in[2]; + out[1] = mat[3] * in[0] + mat[4] * in[1] + mat[5] * in[2]; + out[2] = mat[6] * in[0] + mat[7] * in[1] + mat[8] * in[2]; +} + + +/* forward declaration -- data defined below */ +static const l12_moon_data galilean_moons[4]; + + +/* + * Evaluate the L1.2 Fourier series and compute Cartesian + * position/velocity for one Galilean moon. + */ +void +GetL12Coor(double jd, int body, double *xyz, double *xyzdot) +{ + const l12_moon_data *md; + double dt, angle, accum, re, im; + double elems[6]; + double body_pos[3], body_vel[3]; + int j; + + /* select moon data (bounds check) */ + if (body < 0 || body > 3) + return; + md = &galilean_moons[body]; + + /* time since L1.2 epoch in days */ + dt = jd - L12_EPOCH_JD; + + /* + * 1. Semi-major axis: sum of cosine terms + * a = sum_j amp_j * cos(phi_j + nu_j * dt) + */ + accum = 0.0; + for (j = 0; j < md->n_a; j++) { + angle = md->fa[j].phi + md->fa[j].nu * dt; + accum += md->fa[j].amp * cos(angle); + } + elems[0] = accum; + + /* + * 2. Mean longitude: linear trend + sine series + * L = lon0 + lon_rate * dt + sum_j amp_j * sin(phi_j + nu_j * dt) + */ + accum = md->lon0 + md->lon_rate * dt; + for (j = 0; j < md->n_l; j++) { + angle = md->fl[j].phi + md->fl[j].nu * dt; + accum += md->fl[j].amp * sin(angle); + } + accum = fmod(accum, TWO_PI); + if (accum < 0.0) + accum += TWO_PI; + elems[1] = accum; + + /* + * 3. Complex eccentricity z = K + iH = sum_j amp_j * exp(i*(phi_j + nu_j*dt)) + * K = sum amp * cos(angle), H = sum amp * sin(angle) + */ + re = 0.0; + im = 0.0; + for (j = 0; j < md->n_z; j++) { + angle = md->fz[j].phi + md->fz[j].nu * dt; + re += md->fz[j].amp * cos(angle); + im += md->fz[j].amp * sin(angle); + } + elems[2] = re; + elems[3] = im; + + /* + * 4. Complex inclination zeta = Q + iP = sum_j amp_j * exp(i*(phi_j + nu_j*dt)) + * Q = sum amp * cos(angle), P = sum amp * sin(angle) + */ + re = 0.0; + im = 0.0; + for (j = 0; j < md->n_zeta; j++) { + angle = md->fzeta[j].phi + md->fzeta[j].nu * dt; + re += md->fzeta[j].amp * cos(angle); + im += md->fzeta[j].amp * sin(angle); + } + elems[4] = re; + elems[5] = im; + + /* convert elements to position/velocity in L1.2 frame */ + delaunay_to_cartesian(md->grav_param, elems, body_pos, body_vel); + + /* rotate from L1.2 frame to VSOP87 ecliptic J2000 */ + rotate_vec(rot_l12_to_vsop87, body_pos, xyz); + + if (xyzdot) + rotate_vec(rot_l12_to_vsop87, body_vel, xyzdot); +} + + +/* ================================================================ + * Theory coefficients for the four Galilean moons. + * + * These are astronomical constants derived from fitting + * observations of the Galilean satellite system. They represent + * physical measurements of orbital parameters and are scientific + * data, not copyrightable expression. + * + * Source: L1.2 theory data files + * ftp://ftp.imcce.fr/pub/ephem/satel/galilean/L1/L1.2/ + * ================================================================ + */ +static const l12_moon_data galilean_moons[4] = { + + /* ---- Io (J-I) ---- */ + { + /* grav_param */ 0.2824894284338140e-06, + /* lon0 */ 0.1446213296021224e+01, + /* lon_rate */ 0.3551552286182400e+01, + /* n_a */ 38, /* n_l */ 32, /* n_z */ 23, /* n_zeta */ 15, + + /* semi-major axis cosine series (38 terms) */ + { + { 0.0028210960212903, 0.00000000000000e+00, 0.00000000000000e+00}, + { 0.0000000762024588, 0.36392902322306e+01, 0.35644591656241e+01}, + { 0.0000000180900324, 0.99554707056522e+00, 0.71289183312483e+01}, + { 0.0000000172337652, 0.18196487820921e+01, 0.17822295777568e+01}, + { 0.0000000101726080, 0.28150559763861e+01, 0.89111478635073e+01}, + { 0.0000000094794086, 0.34760224933239e+01, 0.80200331112799e+01}, + { 0.0000000092196266, 0.46347004953370e+01, 0.10693377436209e+02}, + { 0.0000000058581604, 0.11586746335276e+01, 0.26733443704266e+01}, + {-0.0000000036218148, 0.23173675289588e+01, 0.53466887181044e+01}, + { 0.0000000034892754, 0.17122470613669e+00, 0.12475607079684e+02}, + { 0.0000000030842852, 0.36170311370435e+01, 0.63501320826717e+01}, + { 0.0000000020794650, 0.19906655633153e+01, 0.14257836656755e+02}, + { 0.0000000013655244, 0.49369712857369e+01, 0.13584836518140e-01}, + { 0.0000000011682572, 0.57934065580556e+01, 0.13366721796637e+02}, + {-0.0000000008031976, 0.66879731833041e+00, 0.16040066232595e+02}, + { 0.0000000007309510, 0.56300556878949e+01, 0.17822295806244e+02}, + { 0.0000000007014118, 0.43297377080515e+01, 0.71002044886497e+01}, + { 0.0000000006561624, 0.43188797534991e+01, 0.13034138433510e-01}, + { 0.0000000005753088, 0.54252179509841e+01, 0.95251981240076e+01}, + { 0.0000000004359548, 0.11670110887440e+01, 0.19604525331797e+02}, + { 0.0000000003711992, 0.14936154077537e+01, 0.12938928912340e-01}, + {-0.0000000003412576, 0.26346374300664e+01, 0.15571117257960e-01}, + { 0.0000000003432980, 0.17994723387341e+01, 0.31750663461810e+01}, + { 0.0000000003228344, 0.29861854159944e+01, 0.21386754933987e+02}, + { 0.0000000003014418, 0.19871924348983e+00, 0.24675315510310e-01}, + { 0.0000000001707670, 0.50718778620273e+01, 0.35514255456604e+01}, + { 0.0000000001655832, 0.29783205832994e+01, 0.44555739317536e+01}, + { 0.0000000001612910, 0.48058392680935e+01, 0.23168984521460e+02}, + { 0.0000000001527992, 0.18275651107267e+01, 0.18713410599600e+02}, + { 0.0000000001523312, 0.46323297275220e+01, 0.44686092108182e+01}, + { 0.0000000001449720, 0.19079860214667e+01, 0.30506511533200e-02}, + { 0.0000000001188688, 0.53321680658912e+01, 0.70987549449082e+01}, + { 0.0000000001129258, 0.95031497804420e+00, 0.12700264165343e+02}, + { 0.0000000000986086, 0.34190944178580e+00, 0.24951214111224e+02}, + {-0.0000000000877720, 0.36228267942948e+01, 0.17958145576535e+01}, + { 0.0000000000857194, 0.33682834215727e+01, 0.59736711266730e+01}, + {-0.0000000000545492, 0.19473964103154e+01, 0.22929425718040e-01}, + { 0.0000000000326102, 0.24880420823571e+01, 0.25119610718870e-01} + }, + + /* mean longitude sine series (32 terms) */ + { + {-0.0001925258348666, 0.49369589722645e+01, 0.13584836583050e-01}, + {-0.0000970803596076, 0.43188796477322e+01, 0.13034138432430e-01}, + {-0.0000898817416500, 0.19080016428617e+01, 0.30506486715800e-02}, + {-0.0000553101050262, 0.14936156681569e+01, 0.12938928911550e-01}, + {-0.0000503584426150, 0.36410196089987e+01, 0.35644591049605e+01}, + {-0.0000444412770116, 0.18196478828985e+01, 0.17822295777568e+01}, + { 0.0000418078870490, 0.26346334480977e+01, 0.15571117221300e-01}, + { 0.0000372356597388, 0.21402440902650e+01, 0.14500977488900e-02}, + {-0.0000234440533016, 0.19871945729267e+00, 0.24675315507400e-01}, + {-0.0000160313164240, 0.28203470990931e+01, 0.95196190000000e-04}, + {-0.0000119049755698, 0.99521552502799e+00, 0.71289183312483e+01}, + {-0.0000109014269320, 0.11586742711973e+01, 0.26733443704266e+01}, + { 0.0000087217118104, 0.22995085327344e+01, 0.44456805185000e-03}, + { 0.0000082229455492, 0.84723690387904e+00, 0.54980078903000e-03}, + { 0.0000075365481720, 0.30644603245150e+01, 0.64826749624000e-03}, + {-0.0000061452803962, 0.28150499448772e+01, 0.89111478635073e+01}, + {-0.0000057575824778, 0.34760236756099e+01, 0.80200331112799e+01}, + {-0.0000053196302672, 0.14952058549171e+01, 0.29001290992300e-02}, + {-0.0000051181206936, 0.46347077042449e+01, 0.10693377436209e+02}, + {-0.0000047817413326, 0.49236512419835e+01, 0.30554833877800e-02}, + { 0.0000045554015322, 0.19585097634352e+01, 0.22928625941210e-01}, + { 0.0000043204134698, 0.15842888614383e+01, 0.15677112478190e-01}, + { 0.0000037684098282, 0.23173652780077e+01, 0.53466887181044e+01}, + {-0.0000031403738248, 0.22184076281042e+01, 0.25155489165510e-01}, + { 0.0000024336535428, 0.85320650238886e+00, 0.25426968834400e-02}, + {-0.0000020289901692, 0.36168998565188e+01, 0.63501320826717e+01}, + { 0.0000018665438704, 0.48458061649481e+01, 0.13589674898130e-01}, + {-0.0000018552431038, 0.17086811529922e+00, 0.12475607079684e+02}, + {-0.0000016229875536, 0.62803206871082e+01, 0.60414171604000e-03}, + {-0.0000013160987604, 0.14718125754925e+01, 0.14358460012320e-01}, + { 0.0000008070729808, 0.38735416148641e+00, 0.37658680379100e-02}, + { 0.0000002602397658, 0.14337589305551e+01, 0.45692429208000e-02} + }, + + /* complex eccentricity cos/sin series (23 terms) */ + { + { 0.0041510849668155, 0.40899396355450e+01, -0.12906864146660e-01}, + { 0.0006260521444113, 0.14461888986270e+01, 0.35515522949802e+01}, + { 0.0000352747346169, 0.21256287034578e+01, 0.12727416567000e-03}, + { 0.0000198194483636, 0.55835619926762e+01, 0.32065751140000e-04}, + { 0.0000146399842989, 0.44137212696837e+00, 0.26642533547700e-02}, + { 0.0000098749504021, 0.45076118781320e+00, -0.35773660260022e+01}, + {-0.0000096819265753, 0.59097266550442e+01, 0.17693227079462e+01}, + {-0.0000083063168209, 0.28751474873012e+00, 0.87820791951527e+00}, + { 0.0000059689735869, 0.50740752477871e+01, 0.71160118048918e+01}, + {-0.0000052220588690, 0.27460731023666e+01, 0.67796100936000e-03}, + { 0.0000046538995236, 0.49143203339385e+01, -0.53595956184347e+01}, + { 0.0000045951340101, 0.42533513770304e+01, -0.44684808200578e+01}, + {-0.0000037711061757, 0.54120093562773e+01, -0.17951364445825e+01}, + { 0.0000037405126681, 0.30946737347297e+01, -0.71418251640916e+01}, + { 0.0000022044764663, 0.54360702580001e+01, -0.26491700241240e-01}, + { 0.0000018698303790, 0.41124042914226e+01, -0.27985797954589e+01}, + {-0.0000015410375360, 0.27141931505529e+01, 0.27731236679900e-02}, + { 0.0000013214613496, 0.12750177723530e+01, -0.89240547799787e+01}, + {-0.0000012707585609, 0.51141075152507e+01, 0.37654227378982e+00}, + { 0.0000012193607962, 0.59977053365953e+01, -0.98566169956900e-02}, + {-0.0000011886104747, 0.32658350285168e+01, 0.53337818460633e+01}, + { 0.0000008742035177, 0.23903528311144e+01, 0.25194921818800e-02}, + {-0.0000007689215742, 0.38308837306225e+01, -0.27293225500100e-02} + }, + + /* complex inclination cos/sin series (15 terms) */ + { + { 0.0003142172466014, 0.27964219722923e+01, -0.23150960980000e-02}, + { 0.0000904169207946, 0.10477061879627e+01, -0.56920638196000e-03}, + { 0.0000175695395780, 0.24150809680215e+01, 0.00000000000000e+00}, + { 0.0000164452324013, 0.33368861773902e+01, -0.12491307197000e-03}, + { 0.0000055424829091, 0.59720202381027e+01, -0.30561164720000e-04}, + { 0.0000035856270353, 0.84898736841329e+00, -0.25244521900630e-01}, + { 0.0000024180760140, 0.55603770950923e+01, 0.29003681445800e-02}, + {-0.0000008673084930, 0.28496686106299e+00, -0.14500593353200e-02}, + {-0.0000003176227277, 0.53834633036029e+01, -0.23498632298700e-01}, + { 0.0000003152816608, 0.45569499027478e+01, 0.43504654304000e-02}, + { 0.0000002338676726, 0.17633292120047e+01, 0.14501339138600e-02}, + { 0.0000001754553689, 0.48429319984493e+01, -0.25688816532440e-01}, + { 0.0000001286319583, 0.57543347143871e+01, -0.25813660979740e-01}, + { 0.0000000967213304, 0.11503592426900e+01, -0.29001471397800e-02}, + { 0.0000000000692310, 0.40745966852008e+01, -0.32506757319070e-01} + } + }, + + /* ---- Europa (J-II) ---- */ + { + /* grav_param */ 0.2824832743928930e-06, + /* lon0 */ -0.3735263437471362e+00, + /* lon_rate */ 0.1769322711123470e+01, + /* n_a */ 38, /* n_l */ 36, /* n_z */ 41, /* n_zeta */ 25, + + /* semi-major axis cosine series (38 terms) */ + { + { 0.0044871037804314, 0.00000000000000e+00, 0.00000000000000e+00}, + { 0.0000004324367498, 0.18196456062910e+01, 0.17822295777568e+01}, + { 0.0000001603614750, 0.43002726529577e+01, 0.26733443704266e+01}, + {-0.0000001019146786, 0.54589480865442e+01, 0.53466887181044e+01}, + { 0.0000000924734786, 0.56222139048906e+01, 0.89111478887838e+00}, + {-0.0000000523665800, 0.36392846323417e+01, 0.35644591656241e+01}, + { 0.0000000511509000, 0.29783307371014e+01, 0.44555739317536e+01}, + {-0.0000000311907780, 0.99466557754027e+00, 0.71289183312483e+01}, + {-0.0000000272859938, 0.28144480309092e+01, 0.89111478635073e+01}, + { 0.0000000232225828, 0.62608434364366e+01, 0.27856729211550e+01}, + {-0.0000000181310770, 0.43188692380649e+01, 0.13034138308860e-01}, + { 0.0000000174960544, 0.16563941638726e+01, 0.62378035398422e+01}, + {-0.0000000122874072, 0.46421290370833e+01, 0.10693377254218e+02}, + {-0.0000000095367130, 0.14936536615312e+01, 0.12938928820690e-01}, + {-0.0000000084863836, 0.17146854643555e+00, 0.12475607079684e+02}, + { 0.0000000071939342, 0.49376739095661e+01, 0.13584833017030e-01}, + { 0.0000000069122354, 0.62488746138492e+01, 0.41785094280464e+01}, + { 0.0000000061377568, 0.33434976298081e+00, 0.80200331112799e+01}, + {-0.0000000045343054, 0.19892156959655e+01, 0.14257836656755e+02}, + { 0.0000000044574684, 0.34597804303324e+00, 0.35357692227539e+01}, + { 0.0000000042350072, 0.62719655202169e+01, 0.13928364636651e+01}, + {-0.0000000028783772, 0.38108811302610e+01, 0.16040066232595e+02}, + { 0.0000000024354662, 0.99587190880214e+00, 0.90414989297380e+00}, + { 0.0000000022532940, 0.52958965893939e+01, 0.98022627054664e+01}, + { 0.0000000021573570, 0.62379050559630e+01, 0.55713458670107e+01}, + {-0.0000000016530062, 0.56456686036734e+01, 0.17822294694543e+02}, + { 0.0000000016464798, 0.26346435392424e+01, 0.15571117126760e-01}, + { 0.0000000011589838, 0.32732388195745e+01, 0.17691951440716e+01}, + {-0.0000000010251826, 0.19079858535660e+01, 0.30506497838200e-02}, + {-0.0000000010203510, 0.11692020351116e+01, 0.19604525194172e+02}, + { 0.0000000007614982, 0.16862812414995e+01, 0.35342961443230e+01}, + { 0.0000000007104494, 0.59112717191092e+01, 0.24092214574831e+01}, + {-0.0000000006957184, 0.24879412197796e+01, 0.25119609730670e-01}, + {-0.0000000005817914, 0.19872303312324e+00, 0.24675315511270e-01}, + {-0.0000000003792178, 0.15765189821595e+01, 0.25244441830200e-01}, + { 0.0000000003397378, 0.58126953372535e+01, 0.25973067138760e-01}, + { 0.0000000003159492, 0.23545476741301e+01, 0.26068277099550e-01}, + { 0.0000000002538154, 0.19471441186087e+01, 0.22929424919760e-01} + }, + + /* mean longitude sine series (36 terms) */ + { + { 0.0008576433172936, 0.43188693178264e+01, 0.13034138308050e-01}, + { 0.0004549582875086, 0.14936531751079e+01, 0.12938928819620e-01}, + { 0.0003248939825174, 0.18196494533458e+01, 0.17822295777568e+01}, + {-0.0003074250079334, 0.49377037005911e+01, 0.13584832867240e-01}, + { 0.0001982386144784, 0.19079869054760e+01, 0.30510121286900e-02}, + { 0.0001834063551804, 0.21402853388529e+01, 0.14500978933800e-02}, + {-0.0001434383188452, 0.56222140366630e+01, 0.89111478887838e+00}, + {-0.0000771939140944, 0.43002724372350e+01, 0.26733443704266e+01}, + {-0.0000632289777196, 0.26346392822098e+01, 0.15571117084700e-01}, + { 0.0000446766477388, 0.54589448561143e+01, 0.53466887181044e+01}, + { 0.0000436574731410, 0.36392908617709e+01, 0.35644591656241e+01}, + { 0.0000349172750296, 0.28289867162553e+01, 0.29885749150000e-04}, + {-0.0000325709094646, 0.53721409780230e+01, 0.12495233774000e-03}, + { 0.0000205826473860, 0.15258464215508e+01, 0.29001315522200e-02}, + {-0.0000192706087556, 0.29783311531879e+01, 0.44555739317536e+01}, + { 0.0000168028316254, 0.24879414119403e+01, 0.25119609725650e-01}, + {-0.0000141628733606, 0.29183576504413e+01, 0.64930403718000e-03}, + { 0.0000140713155600, 0.19872319369353e+00, 0.24675315510310e-01}, + { 0.0000131946915760, 0.99584744364935e+00, 0.71289183312483e+01}, + { 0.0000106598617620, 0.53356907396678e+01, 0.30233219231900e-02}, + {-0.0000104011727738, 0.62608296198866e+01, 0.27856729211550e+01}, + { 0.0000100746080234, 0.44288900030073e+01, 0.55297871931000e-03}, + { 0.0000097414019416, 0.27312462188296e+01, 0.89111510230745e+01}, + {-0.0000094651366640, 0.25010358163865e+01, 0.93478322470000e-04}, + { 0.0000091108073324, 0.15765182522628e+01, 0.25244441682120e-01}, + {-0.0000087720567668, 0.15376962386886e+01, 0.15676393315070e-01}, + {-0.0000078429703340, 0.58128473756772e+01, 0.25973069246350e-01}, + {-0.0000075566039418, 0.30586251688920e+01, 0.43252872559000e-03}, + {-0.0000066580990752, 0.19591270593390e+01, 0.22928567412490e-01}, + {-0.0000065854142774, 0.18617673337640e+01, 0.26093058384670e-01}, + {-0.0000058131135230, 0.16563893807978e+01, 0.62378035398422e+01}, + { 0.0000055720865276, 0.39565695752204e+01, 0.25481216339900e-02}, + {-0.0000048198508906, 0.62720230965345e+01, 0.13928364605775e+01}, + { 0.0000042728431266, 0.46220912946918e+01, 0.10693377982182e+02}, + { 0.0000042175545304, 0.13509343368359e+01, 0.30164435787800e-02}, + { 0.0000037707624520, 0.51034507119889e+01, 0.25219658202250e-01} + }, + + /* complex eccentricity cos/sin series (41 terms) */ + { + {-0.0093589104136341, 0.40899396509039e+01, -0.12906864146660e-01}, + { 0.0002988994545555, 0.59097265185595e+01, 0.17693227079462e+01}, + { 0.0002139036390350, 0.21256289300016e+01, 0.12727418407000e-03}, + { 0.0001980963564781, 0.27435168292650e+01, 0.67797343009000e-03}, + { 0.0001210388158965, 0.55839943711203e+01, 0.32056614900000e-04}, + { 0.0000837042048393, 0.16094538368039e+01, -0.90402165808846e+00}, + { 0.0000823525166369, 0.14461887708689e+01, 0.35515522949802e+01}, + {-0.0000315906532820, 0.28751224400811e+00, 0.87820791951527e+00}, + {-0.0000294503681314, 0.45078002968967e+00, -0.35773660260022e+01}, + {-0.0000278946698536, 0.22704374310903e+01, -0.17951364497113e+01}, + { 0.0000144958688621, 0.29313956641719e+01, -0.26862512422390e+01}, + { 0.0000139052321679, 0.60542576187622e+01, -0.25941002404500e-01}, + { 0.0000108374431350, 0.59320761116863e+01, -0.10163502160128e+01}, + {-0.0000082175838585, 0.49144730088838e+01, -0.53595956184347e+01}, + { 0.0000073925894084, 0.25962855881215e+01, -0.25845792927870e-01}, + { 0.0000062618381566, 0.62252936384007e+01, -0.71418248393794e+01}, + {-0.0000051968296512, 0.54353355159239e+01, -0.26491696725040e-01}, + {-0.0000043507065743, 0.51150292346242e+01, 0.37654221060604e+00}, + { 0.0000042081682285, 0.31202613836361e+01, 0.44427230757158e+01}, + { 0.0000041298266970, 0.42533371370636e+01, -0.44684808200578e+01}, + {-0.0000036991221930, 0.52487564172390e+01, 0.26604375002057e+01}, + {-0.0000027357551003, 0.12734806685602e+01, -0.89240546532297e+01}, + {-0.0000026854901206, 0.75596663258784e+00, 0.15806953180460e-01}, + { 0.0000023074479953, 0.19438998534712e+01, 0.71160114825227e+01}, + { 0.0000020163445050, 0.58484195254467e+01, -0.24091843401454e+01}, + {-0.0000018506530067, 0.26838225102582e+01, 0.68236609075000e-03}, + { 0.0000018159137522, 0.26048690461733e+01, 0.62248966818788e+01}, + {-0.0000017894118824, 0.57385537790777e+01, -0.10706284328884e+02}, + { 0.0000016518864520, 0.32658492478888e+01, 0.53337818460633e+01}, + {-0.0000015660692561, 0.61789350505156e+01, -0.11453588847960e-01}, + { 0.0000014426949422, 0.60014075911383e+01, -0.17664769149811e+01}, + { 0.0000013196935928, 0.55753025652974e+01, -0.62507103665413e+01}, + {-0.0000011726743714, 0.50242932747650e+01, -0.14351210704140e-01}, + {-0.0000009550285338, 0.28409403047363e+01, 0.14257595044900e-02}, + {-0.0000007569857746, 0.38098760906143e+01, -0.27271627793800e-02}, + {-0.0000007495662748, 0.29896372346394e+01, 0.20097553243900e-02}, + { 0.0000007091149133, 0.27139331814919e+01, -0.19924932783300e-02}, + { 0.0000005646670312, 0.21683602575236e+01, -0.12871803232940e-01}, + {-0.0000002004455524, 0.12893849410519e+01, -0.32724923477800e-02}, + {-0.0000001623489363, 0.24189454629613e+00, 0.44609337678800e-02}, + { 0.0000001058862562, 0.45356953407129e+01, 0.39269908172100e-02} + }, + + /* complex inclination cos/sin series (25 terms) */ + { + { 0.0040404917832303, 0.10477063169425e+01, -0.56920640540000e-03}, + { 0.0002200421034564, 0.33368857864364e+01, -0.12491307307000e-03}, + { 0.0001662544744719, 0.24134862374711e+01, 0.00000000000000e+00}, + { 0.0000590282470983, 0.59719930968366e+01, -0.30561602250000e-04}, + {-0.0000105030331400, 0.27964978379152e+01, -0.23150966123800e-02}, + {-0.0000102943248250, 0.84898796322150e+00, -0.25244521901650e-01}, + { 0.0000072600013020, 0.55603730312676e+01, 0.29003676713100e-02}, + { 0.0000018391258758, 0.28480515491153e+00, -0.14500579196900e-02}, + { 0.0000014880605763, 0.48429974929766e+01, -0.25688815138710e-01}, + {-0.0000008828196274, 0.65011185407635e+00, 0.34696170683100e-02}, + { 0.0000008714042768, 0.17639430319108e+01, 0.14501352157600e-02}, + { 0.0000008536188044, 0.45568506666427e+01, 0.43504641410100e-02}, + { 0.0000006846214331, 0.57542117253981e+01, -0.25813768702630e-01}, + { 0.0000004471826348, 0.53834694321520e+01, -0.23498632366370e-01}, + { 0.0000003034392168, 0.22078201315180e+01, -0.25783170906020e-01}, + { 0.0000001799083735, 0.31858868501531e+01, 0.88086056517000e-03}, + {-0.0000001792048645, 0.51949494917342e+01, -0.20193236931900e-02}, + {-0.0000001098546626, 0.59286821904995e+01, 0.49197316579700e-02}, + {-0.0000001083128732, 0.45808061408794e+01, -0.59959459406000e-03}, + { 0.0000001062153531, 0.38387102863271e+01, -0.53795085847000e-03}, + { 0.0000000768496749, 0.35553768729770e+01, 0.58005587812700e-02}, + {-0.0000000692273841, 0.46440611341931e+01, 0.30253219029200e-02}, + { 0.0000000676969224, 0.13621319661456e+00, -0.44430413602000e-03}, + {-0.0000000621559952, 0.30093497179950e+01, -0.13603287200690e-01}, + { 0.0000000000608298, 0.40529569532600e+01, -0.32510869900940e-01} + } + }, + + /* ---- Ganymede (J-III) ---- */ + { + /* grav_param */ 0.2824981841847230e-06, + /* lon0 */ 0.2874089391143348e+00, + /* lon_rate */ 0.8782079235893280e+00, + /* n_a */ 38, /* n_l */ 31, /* n_z */ 50, /* n_zeta */ 18, + + /* semi-major axis cosine series (38 terms) */ + { + { 0.0071566594572575, 0.00000000000000e+00, 0.00000000000000e+00}, + { 0.0000013930299110, 0.11586745884981e+01, 0.26733443704266e+01}, + { 0.0000006449829346, 0.56222145702102e+01, 0.89111478887838e+00}, + { 0.0000002298059520, 0.12995924044108e+01, 0.10034433456729e+01}, + {-0.0000001221434370, 0.49612436330515e+01, 0.17822295777568e+01}, + { 0.0000001095798176, 0.19486708778350e+01, 0.15051650461529e+01}, + { 0.0000000701435616, 0.64978508114196e+00, 0.50172166963138e+00}, + { 0.0000000547868566, 0.25992050672074e+01, 0.20068866945508e+01}, + {-0.0000000394635858, 0.23173535605652e+01, 0.53466887181044e+01}, + {-0.0000000363221428, 0.36393008632056e+01, 0.35644591656241e+01}, + { 0.0000000290949364, 0.20123392230605e+01, 0.17535157350384e+01}, + { 0.0000000281244968, 0.32490010762048e+01, 0.25086083721948e+01}, + {-0.0000000207924698, 0.29783308899923e+01, 0.44555739317536e+01}, + { 0.0000000146896774, 0.38988244013504e+01, 0.30103300418262e+01}, + {-0.0000000119930042, 0.16563968316083e+01, 0.62378035398422e+01}, + { 0.0000000112067460, 0.43188665692819e+01, 0.13034138285340e-01}, + {-0.0000000109535132, 0.49372826282154e+01, 0.13584834937940e-01}, + { 0.0000000099867772, 0.96700720263958e+00, 0.62699633776977e+00}, + { 0.0000000077668260, 0.45486373016444e+01, 0.35120517182683e+01}, + { 0.0000000074143972, 0.16140449852661e+00, 0.12531361661566e+00}, + { 0.0000000066346638, 0.33441073536010e+00, 0.80200331112799e+01}, + { 0.0000000057842684, 0.14936630646671e+01, 0.12938928799370e-01}, + {-0.0000000055768352, 0.44651777597613e+01, 0.11287386144710e+01}, + {-0.0000000049395106, 0.61563894598809e+01, 0.17520662093793e+01}, + { 0.0000000041439704, 0.51984558307998e+01, 0.40137734147421e+01}, + {-0.0000000040765630, 0.99543742426922e+00, 0.71289183312483e+01}, + {-0.0000000036862062, 0.46386836178626e+01, 0.10693377254218e+02}, + { 0.0000000033617538, 0.37493658441448e+01, 0.87808669180168e+00}, + { 0.0000000033348284, 0.22668196818990e+01, 0.16304394485673e+01}, + {-0.0000000025754698, 0.33293196902303e+00, 0.17952648120307e+01}, + { 0.0000000024363084, 0.19604838407749e+01, 0.11232854513197e+00}, + { 0.0000000022265432, 0.58482745704418e+01, 0.45154950951905e+01}, + { 0.0000000020032676, 0.29166648062069e+01, 0.21321610765333e+01}, + {-0.0000000018115706, 0.99782757414001e+00, 0.90414978368384e+00}, + { 0.0000000014535006, 0.18748212041600e+01, 0.89112137093506e+01}, + {-0.0000000006819260, 0.19871670124324e+00, 0.24675315493830e-01}, + { 0.0000000004433776, 0.24880003003965e+01, 0.25119610196650e-01}, + {-0.0000000002836658, 0.58126277034761e+01, 0.25973068607520e-01} + }, + + /* mean longitude sine series (31 terms) */ + { + { 0.0002310797886226, 0.21402987195942e+01, 0.14500978438400e-02}, + {-0.0001828635964118, 0.43188672736968e+01, 0.13034138282630e-01}, + { 0.0001512378778204, 0.49373102372298e+01, 0.13584834812520e-01}, + {-0.0001163720969778, 0.43002659861490e+01, 0.26733443704266e+01}, + {-0.0000955478069846, 0.14936612842567e+01, 0.12938928798570e-01}, + { 0.0000815246854464, 0.56222137132535e+01, 0.89111478887838e+00}, + {-0.0000801219679602, 0.12995922951532e+01, 0.10034433456729e+01}, + {-0.0000607017260182, 0.64978769669238e+00, 0.50172167043264e+00}, + { 0.0000543922473002, 0.27927547440639e+01, 0.29880873700000e-04}, + {-0.0000489253646474, 0.53711728089803e+01, 0.12495278292000e-03}, + {-0.0000427574981536, 0.18196513407448e+01, 0.17822295777568e+01}, + {-0.0000307360417826, 0.19498372703786e+01, 0.15051650064903e+01}, + {-0.0000169767346458, 0.19078637281659e+01, 0.30507678226700e-02}, + { 0.0000154725890508, 0.56912713028984e+01, 0.65164073556000e-03}, + {-0.0000145268863648, 0.18863875475387e+00, 0.12530827181195e+00}, + {-0.0000135654458738, 0.27930238268852e+01, 0.55663681407000e-03}, + {-0.0000134648621904, 0.25991972928128e+01, 0.20068866945508e+01}, + { 0.0000095524017320, 0.23173520454449e+01, 0.53466887181044e+01}, + { 0.0000087955125170, 0.36393024031096e+01, 0.35644591656241e+01}, + { 0.0000075462003630, 0.53560617584395e+01, 0.92426977490000e-04}, + {-0.0000071146195958, 0.20120561622463e+01, 0.17535157644008e+01}, + { 0.0000064153141218, 0.15526366820734e+01, 0.29001309732400e-02}, + {-0.0000063221625942, 0.32490122452649e+01, 0.25086083721948e+01}, + {-0.0000056564973024, 0.24862139082596e+01, 0.44834622386000e-03}, + { 0.0000052570245720, 0.19871532348033e+00, 0.24675315501580e-01}, + { 0.0000047020767994, 0.29783317790630e+01, 0.44555739317536e+01}, + {-0.0000047004229470, 0.96617050453708e+00, 0.62699712737505e+00}, + {-0.0000046565198820, 0.36125113449716e+01, 0.43633231340000e-03}, + {-0.0000042349322008, 0.19604744669606e+01, 0.11232854282257e+00}, + {-0.0000038755741918, 0.22619624763183e+01, 0.25146663939730e-01}, + {-0.0000032577733688, 0.56861827246039e+01, 0.17074576501600e-02} + }, + + /* complex eccentricity cos/sin series (50 terms) */ + { + { 0.0014289811307319, 0.21256295942739e+01, 0.12727413029000e-03}, + { 0.0007710931226760, 0.55836330003496e+01, 0.32064341100000e-04}, + { 0.0005925911780766, 0.40899396636448e+01, -0.12906864146660e-01}, + { 0.0002045597496146, 0.52713683670372e+01, -0.12523544076106e+00}, + { 0.0001785118648258, 0.28743156721063e+00, 0.87820792442520e+00}, + { 0.0001131999784893, 0.14462127277818e+01, 0.35515522949802e+01}, + {-0.0000658778169210, 0.22702423990985e+01, -0.17951364394537e+01}, + { 0.0000497058888328, 0.59096792204858e+01, 0.17693227129285e+01}, + {-0.0000316384926978, 0.16093054939404e+01, -0.90402165028424e+00}, + { 0.0000287801237327, 0.46217321268757e+01, -0.62695712341840e+00}, + {-0.0000181744317896, 0.59210641379360e+01, 0.37648623991673e+00}, + { 0.0000105558175161, 0.39720191398746e+01, -0.11286788041058e+01}, + {-0.0000070808673396, 0.60542548894164e+01, -0.25941002415210e-01}, + {-0.0000070804404020, 0.27978433776854e+01, 0.67774258703000e-03}, + {-0.0000061046181888, 0.14151685760988e+01, -0.87530769416913e+00}, + {-0.0000057610853129, 0.42530537622646e+01, -0.44684807882788e+01}, + {-0.0000057310334964, 0.29311803223072e+01, -0.26862512192699e+01}, + { 0.0000048299146941, 0.27138294508149e+01, 0.27731329671900e-02}, + { 0.0000046610005483, 0.33222980229554e+01, -0.16304004832039e+01}, + {-0.0000038142769361, 0.25962943627643e+01, -0.25845792955510e-01}, + { 0.0000034982417330, 0.15866568011217e+01, 0.18816512920593e+01}, + {-0.0000030091617315, 0.35921173988567e+01, -0.35773660056343e+01}, + {-0.0000024732926446, 0.53461730094807e+01, 0.25122576835111e+00}, + { 0.0000024416432533, 0.47049477027963e+01, -0.25049613834712e+00}, + { 0.0000024171568015, 0.34508032389167e+01, 0.00000000000000e+00}, + { 0.0000023143850535, 0.55385759257808e+01, 0.28683339028800e-02}, + { 0.0000022651772374, 0.55608006706192e+01, 0.14501892967800e-02}, + { 0.0000022247695560, 0.26725424635341e+01, -0.21321221654766e+01}, + { 0.0000020947921969, 0.22350374116258e+01, 0.23833730192673e+01}, + {-0.0000014042712722, 0.93718044411525e+00, 0.13799296041822e+01}, + { 0.0000011932531874, 0.28861941414418e+01, 0.28850946416201e+01}, + {-0.0000011180389240, 0.49139919849718e+01, -0.53595955727170e+01}, + { 0.0000011076384510, 0.20227538540345e+01, -0.26338438454332e+01}, + {-0.0000010371714944, 0.40722739402948e+00, -0.87385759089274e+00}, + {-0.0000008993128501, 0.30942691883530e+01, -0.71418251640916e+01}, + { 0.0000007268381420, 0.54334774230433e+01, -0.26491687896550e-01}, + {-0.0000007178049665, 0.52487423493616e+01, 0.26604375002057e+01}, + { 0.0000006908412319, 0.40596134184175e+01, -0.75221793556997e+00}, + {-0.0000006784151570, 0.38846818226669e+01, 0.42496535534400e-02}, + { 0.0000006772314920, 0.23013479896873e+01, 0.26317235358158e+01}, + { 0.0000006659820028, 0.35359530295550e+01, 0.33868163258510e+01}, + {-0.0000006339665249, 0.39268665697903e+01, 0.44426670658559e+01}, + {-0.0000006286307601, 0.19440608894162e+01, 0.71160114019304e+01}, + {-0.0000006128705113, 0.25027415074658e+01, 0.62249001971556e+01}, + { 0.0000005660807396, 0.13729316457251e+01, -0.31355655165873e+01}, + {-0.0000005206551413, 0.55749300982469e+01, -0.62507103665413e+01}, + {-0.0000004718481418, 0.45366605084874e+01, 0.16786677353000e-03}, + {-0.0000004583970422, 0.19351070248496e+01, -0.98151695574500e+01}, + {-0.0000004577854173, 0.62350780976534e+01, 0.17563373058434e+01}, + { 0.0000003466029660, 0.75412427489767e+00, 0.15807097495700e-01} + }, + + /* complex inclination cos/sin series (18 terms) */ + { + { 0.0015932721570848, 0.33368862796665e+01, -0.12491307058000e-03}, + { 0.0008533093128905, 0.24133881688166e+01, 0.00000000000000e+00}, + { 0.0003513347911037, 0.59720789850127e+01, -0.30561017710000e-04}, + {-0.0001441929255483, 0.10477061764435e+01, -0.56920632124000e-03}, + { 0.0000157303527750, 0.55604041197704e+01, 0.29003665011200e-02}, + { 0.0000025161319881, 0.28477653709685e+00, -0.14500554486800e-02}, + { 0.0000020438305183, 0.17652628559998e+01, 0.14501383926500e-02}, + { 0.0000017939612784, 0.45568977341583e+01, 0.43504621590400e-02}, + { 0.0000013614276895, 0.84898872627945e+00, -0.25244521900630e-01}, + {-0.0000008996109017, 0.46441156003340e+01, 0.30253214588300e-02}, + {-0.0000008702078430, 0.27972000093551e+01, -0.23150965645100e-02}, + {-0.0000004371144064, 0.48429530385679e+01, -0.25688816011500e-01}, + {-0.0000002174259374, 0.57543785603741e+01, -0.25813642993310e-01}, + {-0.0000001926397869, 0.20118539705648e+01, 0.29330596864500e-02}, + { 0.0000001589279656, 0.35554727018503e+01, 0.58005577768400e-02}, + {-0.0000001432228753, 0.11966574544002e+01, -0.15750124983800e-02}, + {-0.0000000926213408, 0.22052538606469e+01, -0.25782797426020e-01}, + { 0.0000000000106902, 0.45764213311755e+01, -0.32611614716800e-01} + } + }, + + /* ---- Callisto (J-IV) ---- */ + { + /* grav_param */ 0.2824921448899090e-06, + /* lon0 */ -0.3620341291375704e+00, + /* lon_rate */ 0.3764862334338280e+00, + /* n_a */ 22, /* n_l */ 19, /* n_z */ 46, /* n_zeta */ 18, + + /* semi-major axis cosine series (22 terms) */ + { + { 0.0125879701715314, 0.00000000000000e+00, 0.00000000000000e+00}, + { 0.0000035952049470, 0.64965776007116e+00, 0.50172168165034e+00}, + { 0.0000027580210652, 0.18084235781510e+01, 0.31750660413359e+01}, + { 0.0000012874896172, 0.62718908285025e+01, 0.13928364698403e+01}, + {-0.0000004173729106, 0.12990650292663e+01, 0.10034433697108e+01}, + { 0.0000002790757718, 0.71428870045577e+00, 0.75007225869130e+00}, + {-0.0000001998252258, 0.19489881012004e+01, 0.15051650461529e+01}, + {-0.0000001001149838, 0.25987168731338e+01, 0.20068867266014e+01}, + {-0.0000000513967092, 0.32484798706247e+01, 0.25086084022422e+01}, + {-0.0000000475687992, 0.48635521917696e+01, 0.74862216593606e+00}, + { 0.0000000348242240, 0.15082713497295e+00, 0.37645917070525e+00}, + { 0.0000000283840630, 0.51672973364888e+01, 0.12530678073049e+00}, + {-0.0000000263234638, 0.33499822210495e+01, 0.30103491232578e+01}, + { 0.0000000239106346, 0.43573519442736e+01, 0.62698238798737e+00}, + { 0.0000000219977422, 0.15075404808879e+01, 0.27986109086768e+01}, + {-0.0000000171144478, 0.62607361864777e+01, 0.27856729335053e+01}, + {-0.0000000141956834, 0.45481077718910e+01, 0.35120517575303e+01}, + {-0.0000000120003630, 0.18583887479127e+01, 0.11287042579152e+01}, + { 0.0000000108418904, 0.54873138800427e+01, 0.67395238593127e+01}, + { 0.0000000108218254, 0.59772630516669e+01, 0.10163811590412e+01}, + { 0.0000000002477642, 0.56894071957878e+01, 0.65165021654000e-03}, + {-0.0000000001874576, 0.28598333265121e+01, 0.55639542661000e-03} + }, + + /* mean longitude sine series (19 terms) */ + { + { 0.0005586040123824, 0.21404207189815e+01, 0.14500979323100e-02}, + {-0.0003805813868176, 0.27358844897853e+01, 0.29729650620000e-04}, + { 0.0002205152863262, 0.64979652596400e+00, 0.50172167243580e+00}, + { 0.0001877895151158, 0.18084787604005e+01, 0.31750660413359e+01}, + { 0.0000766916975242, 0.62720114319755e+01, 0.13928364636651e+01}, + { 0.0000747056855106, 0.12995916202344e+01, 0.10034433456729e+01}, + {-0.0000388323297366, 0.71289234751879e+00, 0.75007236972328e+00}, + { 0.0000335036484314, 0.53712641184981e+01, 0.12494011725000e-03}, + { 0.0000293032677938, 0.19493939340593e+01, 0.15051650209131e+01}, + { 0.0000185940935472, 0.14630998372377e+01, 0.29001339405200e-02}, + {-0.0000170438022886, 0.56893382353856e+01, 0.65165044781000e-03}, + { 0.0000151393833114, 0.28749516044614e+01, 0.55646069067000e-03}, + {-0.0000148825637256, 0.33321074618840e+01, 0.12530790075011e+00}, + { 0.0000129927896682, 0.25991973549465e+01, 0.20068866945508e+01}, + {-0.0000116117398772, 0.56192268627131e+01, 0.93166256720000e-04}, + { 0.0000066211702894, 0.48564958193206e+01, 0.74862286166569e+00}, + { 0.0000065387442486, 0.35580120361824e+01, 0.16550513741900e-02}, + { 0.0000061580798140, 0.32490037889701e+01, 0.25086083721948e+01}, + { 0.0000046797140778, 0.96612169919707e+00, 0.62699716616712e+00} + }, + + /* complex eccentricity cos/sin series (46 terms) */ + { + { 0.0073755808467977, 0.55836071576084e+01, 0.32065099140000e-04}, + { 0.0002065924169942, 0.59209831565786e+01, 0.37648624194703e+00}, + { 0.0001589869764021, 0.28744006242623e+00, 0.87820792442520e+00}, + {-0.0001561131605348, 0.21257397865089e+01, 0.12727441285000e-03}, + { 0.0001486043380971, 0.14462134301023e+01, 0.35515522949802e+01}, + { 0.0000635073108731, 0.59096803285954e+01, 0.17693227129285e+01}, + { 0.0000599351698525, 0.41125517584798e+01, -0.27985797954589e+01}, + { 0.0000540660842731, 0.55390350845569e+01, 0.28683408228300e-02}, + {-0.0000489596900866, 0.46218149483338e+01, -0.62695712529519e+00}, + { 0.0000333682283528, 0.52066975238880e+01, -0.37358601734497e+00}, + { 0.0000295832427279, 0.59322697896516e+01, -0.10163502275209e+01}, + { 0.0000292325461337, 0.52707623402008e+01, -0.12523542448602e+00}, + { 0.0000197588369441, 0.33317768022759e+01, 0.00000000000000e+00}, + {-0.0000183551029746, 0.39720443249757e+01, -0.11286788041058e+01}, + { 0.0000090411191759, 0.55606719963947e+01, 0.14501837490800e-02}, + {-0.0000081987970452, 0.33223313720086e+01, -0.16304004832039e+01}, + {-0.0000060406575087, 0.13970265485562e+01, 0.43191832032300e-02}, + { 0.0000056895636122, 0.41990956668120e+01, -0.37213592656720e+00}, + {-0.0000040434854859, 0.47008406172134e+01, -0.25049602889288e+00}, + {-0.0000039403527376, 0.26725832255243e+01, -0.21321221654766e+01}, + { 0.0000036901291978, 0.35207772267753e+00, 0.11265585018525e+01}, + {-0.0000028551622596, 0.55601265129356e+01, -0.31584886140000e-04}, + {-0.0000026588026505, 0.25969882784477e+00, 0.14182025553300e-02}, + {-0.0000019711212463, 0.20228019680496e+01, -0.26338438454332e+01}, + { 0.0000019322089806, 0.51418595457408e+01, 0.25123117908847e+00}, + {-0.0000018673159813, 0.93674892088247e+00, 0.13799296163047e+01}, + { 0.0000016838424078, 0.60796033426941e+01, 0.75294520843775e+00}, + {-0.0000016695689644, 0.15867810488422e+01, 0.18816512864243e+01}, + { 0.0000016317841395, 0.45789534393209e+01, 0.14822429153000e-02}, + {-0.0000016159095087, 0.30157253757329e+00, -0.14180284447900e-02}, + {-0.0000014034621874, 0.59433512039442e+01, -0.24091866865037e+01}, + {-0.0000012029942283, 0.27137754880270e+01, 0.27731373092900e-02}, + {-0.0000011758260607, 0.40581098970285e+01, -0.75221789504525e+00}, + {-0.0000010798624964, 0.22364861319452e+01, 0.23833729650229e+01}, + {-0.0000010108880552, 0.13729872033949e+01, -0.31355655165873e+01}, + {-0.0000008876681807, 0.50534107615010e+01, -0.50169281575682e+00}, + { 0.0000008869382117, 0.50147420853991e+01, 0.68353864231000e-03}, + {-0.0000008194699011, 0.62190878357566e+01, -0.37503615934219e+00}, + { 0.0000007093782158, 0.44118312641559e+01, -0.24221246131672e+01}, + { 0.0000006728737059, 0.31910016062920e+01, -0.37068584881726e+00}, + { 0.0000006297345982, 0.13595719733984e+01, 0.11251084135564e+01}, + { 0.0000006128899757, 0.51402161299290e+01, 0.71160095483087e+01}, + {-0.0000005580987049, 0.34117733109010e+01, -0.12539396666771e+01}, + { 0.0000005321318002, 0.35377046967957e+01, 0.57685340271300e-02}, + {-0.0000004739086661, 0.21645217929478e+01, 0.58845474482000e-03}, + { 0.0000004518928658, 0.44963664372727e+01, 0.29023325111200e-02} + }, + + /* complex inclination cos/sin series (18 terms) */ + { + { 0.0038422977898495, 0.24133922085557e+01, 0.00000000000000e+00}, + { 0.0022453891791894, 0.59721736773277e+01, -0.30561255250000e-04}, + {-0.0002604479450559, 0.33368746306409e+01, -0.12491309972000e-03}, + { 0.0000332112143230, 0.55604137742337e+01, 0.29003768850700e-02}, + { 0.0000049727136261, 0.28488229706820e+00, -0.14500571761900e-02}, + {-0.0000049416729114, 0.10476908456459e+01, -0.56920298857000e-03}, + { 0.0000043945193428, 0.17684273746003e+01, 0.14501344524700e-02}, + { 0.0000037630501589, 0.45567680530533e+01, 0.43504645407000e-02}, + {-0.0000030823418750, 0.20094360655956e+01, 0.29313051376700e-02}, + { 0.0000004719790711, 0.18055417618741e+01, 0.14195445432000e-02}, + {-0.0000004637177865, 0.38277528822158e+01, -0.14808731001600e-02}, + { 0.0000003497224175, 0.46444360330108e+01, 0.30253130162300e-02}, + {-0.0000003467132626, 0.10120757927163e+01, 0.43816126822900e-02}, + { 0.0000003324412570, 0.35549391686606e+01, 0.58005379032100e-02}, + { 0.0000001945374351, 0.61251687150860e+01, 0.28808264872800e-02}, + { 0.0000001727743329, 0.11900773236610e+01, -0.29001068524700e-02}, + {-0.0000001485176585, 0.62335834706368e+01, 0.14807679092700e-02}, + { 0.0000000000666922, 0.40616225761771e+01, -0.32724923474890e-01} + } + } +}; diff --git a/src/l12.h b/src/l12.h new file mode 100644 index 0000000..461adc0 --- /dev/null +++ b/src/l12.h @@ -0,0 +1,73 @@ +/************************************************************************ + +L1.2 Galilean satellite theory -- Lainey, Duriez & Vienne + +Clean-room implementation for pg_orbit. +The L1.2 theory provides positions and velocities of Jupiter's four +Galilean moons (Io, Europa, Ganymede, Callisto) relative to Jupiter's +center, in the VSOP87 ecliptic J2000 reference frame. + +Reference: + Lainey V., Duriez L., Vienne A. + "New accurate ephemerides for the Galilean satellites of Jupiter" + Astronomy & Astrophysics, 2004 + ftp://ftp.imcce.fr/pub/ephem/satel/galilean/L1/L1.2/ + +The theory coefficients are astronomical constants derived from +fitting observations of the Galilean system. They represent +physical measurements and are not copyrightable. + +Copyright (c) 2026 Ryan Malloy + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Thread-safe: all functions are reentrant with no static mutable state. + +****************************************************************/ + +#ifndef L12_H +#define L12_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define L12_IO 0 +#define L12_EUROPA 1 +#define L12_GANYMEDE 2 +#define L12_CALLISTO 3 + +/* + * Compute the position (and optionally velocity) of a Galilean moon + * using the L1.2 semi-analytic theory. + * + * jd: Julian date in Terrestrial Time (TT). + * body: Moon index: 0=Io, 1=Europa, 2=Ganymede, 3=Callisto. + * xyz: Output position in AU, VSOP87 ecliptic J2000 frame, + * relative to Jupiter's center. Must point to double[3]. + * xyzdot: Output velocity in AU/day, same frame. May be NULL + * to skip velocity computation. + */ +void GetL12Coor(double jd, int body, double *xyz, double *xyzdot); + +#ifdef __cplusplus +} +#endif + +#endif /* L12_H */ diff --git a/src/marssat.c b/src/marssat.c new file mode 100644 index 0000000..98bc7c5 --- /dev/null +++ b/src/marssat.c @@ -0,0 +1,425 @@ +/************************************************************************ + +The Ephemerides of the Martian satellites +(adjustement from 1877 to 2005, Version 1.0) +by Valery Lainey can be obtained from Valery Lainey: + + V.Lainey (Lainey@oma.be) +ROB- 3, Avenue Circulaire, B-1180 Bruxelles (Belgium) +IMCCE - 77, Avenue Denfert-Rochereau 75014 Paris (France) + +----------------------------------------------------------------------- + +I (Johannes Gajdosik) have just taken Valery Laineys Fortran code, +MarsSatV1-0.f, which he kindly supplied, and rearranged it into +this piece of software. + +I can neither allow nor forbid the usage of Valery Laineys +Ephemerides of the Martian satellites. +The copyright notice below covers not the work of Valery Lainey +but just my work, that is the compilation of Valery Laineys +Ephemerides of the Martian satellites into the software supplied in this file. + + +Copyright (c) 2006 Johannes Gajdosik + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Derived from Stellarium's MARSSAT implementation. +Modified for pg_orbit: removed all static mutable state for thread safety +(PostgreSQL PARALLEL SAFE). The original used static caching arrays and +CalcInterpolatedElements for performance; this version computes fresh on +each call which is acceptable for SQL query workloads. + +1) do not calculate constant terms at runtime but beforehand +2) unite terms with the same frequencies + +****************************************************************/ + +#include "marssat.h" +#include "elliptic_to_rectangular.h" + +#include +#include + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + + +struct MarsSatTerm { + double phase, frequency, amplitude; +}; + +struct MarsSatTermList { + const struct MarsSatTerm *terms; + int size; +}; + +struct MarsSatBody { + double mu, l, acc; + double constants[6]; + const struct MarsSatTermList lists[4]; +}; + +static const struct MarsSatTerm mars_sat_phobos_0[16] = { + { 5.013490350126586e+00, 2.715567382195733e+01, 4.537539999999999e-09}, + { 6.839910590780000e-01, 1.969446151585829e+01, 7.312000000000000e-10}, + { 4.514031245592586e+00, 4.073350897245015e+01, 7.785599999999993e-10}, + { 5.531351678889586e+00, 1.357783661756435e+01, 3.529399999999985e-10}, + { 5.700307292822586e+00, 4.685013393001369e+01, 2.094599999999994e-10}, + { 4.228062220664587e+00, 5.431134764391466e+01, 9.139999999999999e-11}, + { 1.167907583017500e+00, 7.461211875946264e+00, 6.204000000000000e-11}, + { 5.197274703601086e+00, 6.042797388545593e+01, 5.295999999999951e-11}, + { 5.160045430868086e+00, 3.938582310889583e+01, 1.811999999999999e-11}, + { 2.223277229900500e+00, 5.777452001970681e+01, 1.563999999999897e-11}, + { 6.921616240614999e-01, 2.103904892768837e+01, 1.535999999999999e-11}, + { 6.215802752555586e+00, 3.327229783044108e+01, 1.304000000000000e-11}, + { 1.368231494011000e+00, 3.938892179708230e+01, 1.661999999999999e-11}, + { 2.601539199675000e-01, 7.446011234647927e+00, 1.328000000000000e-11}, + { 5.903845687100000e-02, 3.941932465627423e+01, 8.559999999999978e-12}, + { 6.179310844209586e+00, 5.911910805492755e+01, 7.240000000000000e-12}, +}; + +static const struct MarsSatTerm mars_sat_phobos_1[42] = { + { 5.334169568271586e+00, 9.145914066599032e-03, 5.016848130000000e-05}, + { 5.334169148295587e+00, 9.145914113327495e-03, 5.016848130000000e-05}, + { 3.805345265960000e-01, 1.540952541904328e-03, 3.350264970000000e-05}, + { 3.805339484960000e-01, 1.540952613104260e-03, 3.350264903000000e-05}, + { 5.288363718535586e+00, 1.829243888046791e-02, 2.827839093000000e-05}, + { 5.288363809359586e+00, 1.829243887034939e-02, 2.827839093000000e-05}, + { 3.412685718051586e+00, 7.604696023359408e-03, 1.578862428000000e-05}, + { 3.412685998796586e+00, 7.604695992157328e-03, 1.578862427000000e-05}, + { 3.448999855869586e+00, 2.715567616927210e+01, 3.008844320000000e-05}, + { 9.194445444030001e-01, 3.101144183892481e-03, 8.178563170000001e-06}, + { 9.194443192780000e-01, 3.101144208596499e-03, 8.178563340000000e-06}, + { 5.387625479307586e+00, 1.969446275049270e+01, 2.044327843999999e-05}, + { 2.848996739890000e+00, 2.743829098982358e-02, 6.516951720000000e-06}, + { 2.848996748767000e+00, 2.743829098862537e-02, 6.516951720000000e-06}, + { 3.954411167839586e+00, 1.357783808463605e+01, 1.013316988000000e-05}, + { 2.912659283736000e+00, 4.073351425390815e+01, 7.483468759999740e-06}, + { 4.067858164824586e+00, 2.589727369338346e-02, 2.589359390000000e-06}, + { 4.067857973471586e+00, 2.589727371473152e-02, 2.589359390000000e-06}, + { 3.776271613850000e-01, 3.658417828853650e-02, 1.125147420000000e-06}, + { 3.776267985560000e-01, 3.658417832900902e-02, 1.125147420000000e-06}, + { 4.121936540919586e+00, 4.685014091671000e+01, 1.523532599999976e-06}, + { 1.231836210236000e+00, 1.674957754399965e-02, 4.976512300000000e-07}, + { 1.231836585135000e+00, 1.674957750247454e-02, 4.976512300000000e-07}, + { 2.488083095032000e+00, 1.520386207875350e-02, 6.841966800000000e-07}, + { 2.488083105051000e+00, 1.520386207728190e-02, 6.841966800000000e-07}, + { 1.576141880659500e+00, 3.504321962396548e-02, 1.124868580000000e-06}, + { 6.145328698142587e+00, 6.116624841770791e+00, 7.873411399999999e-07}, + { 2.626756105114500e+00, 5.431135233854420e+01, 1.040645720000000e-06}, + { 2.759579551372000e+00, 7.461213382164448e+00, 7.166789399999994e-07}, + { 6.005673273380586e+00, 1.314187651672942e+00, 6.022022799999936e-07}, + { 9.353090056600000e-02, 7.532115638546220e-04, 1.964976900000000e-07}, + { 9.343265452500001e-02, 7.532237916966188e-04, 1.964964500000000e-07}, + { 4.302928383505000e-01, 3.938582557777600e+01, 4.987307800000000e-07}, + { 3.587439959397586e+00, 6.042797969706294e+01, 4.804827999999994e-07}, + { 4.183547650369587e+00, 4.572998195120822e-02, 1.747133100000000e-07}, + { 4.183547815926586e+00, 4.572998193123842e-02, 1.747133100000000e-07}, + { 5.589444380180586e+00, 6.068411018120026e-03, 1.793076700000000e-07}, + { 5.589445119118587e+00, 6.068410936124942e-03, 1.793076800000000e-07}, + { 6.062696336024086e+00, 3.938892673561993e+01, 2.653755199999908e-07}, + { 4.628882088425586e+00, 3.327230135427769e+01, 2.539272800000000e-07}, + { 4.736462571780586e+00, 1.224558395734566e-02, 1.254715400000000e-07}, + { 4.736462588777586e+00, 1.224558396211886e-02, 1.254715500000000e-07}, +}; + +static const struct MarsSatTerm mars_sat_phobos_2[27] = { + { 1.404382124885000e+00, 7.595588511174286e-03, 1.514110912521000e-02}, + { 2.088385523034000e+00, 1.970205682773437e+01, 3.849620867400000e-04}, + { 3.895377361148586e+00, 1.069670280268190e-02, 6.903413242000000e-05}, + { 4.989572094750000e-01,-7.605272825959576e-03, 4.946101994000000e-05}, + { 8.215210221720000e-01, 4.685772969905357e+01, 3.671320788000000e-05}, + { 3.378076387479586e+00,-7.453616316894914e+00, 3.267983782000000e-05}, + { 2.772375719698000e+00, 3.939651873194720e+01, 8.750483050000000e-06}, + { 2.839303414769000e+00, 6.124220388371520e+00, 6.170938810000000e-06}, + { 3.184503170430000e-01, 6.043556479692822e+01, 6.957005940000000e-06}, + { 1.410329121503000e+00, 1.984322681200531e-02, 5.734088960000000e-06}, + { 1.336796551701000e+00, 3.327989343110183e+01, 3.431577860000000e-06}, + { 3.853646745987586e+00,-2.103145308554279e+01, 4.037409510000000e-06}, + { 2.547067366210000e-01, 1.549665594221090e-03, 2.115296220000000e-06}, + { 1.508224230072000e+00,-5.911151611514718e+01, 1.904827620000000e-06}, + { 3.462607551400000e-02,-5.165030141480156e+01, 8.696094700000001e-07}, + { 3.198655314207586e+00, 9.152774292423818e-03, 6.329868200000000e-07}, + { 5.163954670916587e+00, 1.674080796065678e-02, 6.130317800000000e-07}, + { 7.803937436990001e-01,-1.550610622055567e-03, 5.737217100000000e-07}, + { 3.264588234538586e+00, 2.716326950857758e+01, 8.181088300000000e-07}, + { 5.211329429707586e+00, 2.898903518276566e-02, 7.434145300000000e-07}, + { 2.691716763490000e+00,-2.714807769012140e+01, 5.441647800000001e-07}, + { 1.001733960626000e+00,-4.553367734785991e+01, 5.044515000000000e-07}, + { 3.212149602842586e+00,-1.968376490094933e+01, 4.284599100000000e-07}, + { 4.145658249560586e+00,-3.460928932187340e+01, 4.224937300000000e-07}, + { 5.063879137454586e+00, 2.589097180762378e-02, 3.581949800000000e-07}, + { 2.558639707373000e+00, 6.064928432880783e-03, 3.808881200000000e-07}, + { 5.292499025555586e+00, 3.075065445597794e-03, 4.055739200000000e-07}, +}; + +static const struct MarsSatTerm mars_sat_phobos_3[28] = { + { 2.058107128488000e+00,-7.604861328578004e-03, 9.408605183120001e-03}, + { 3.248856489376586e+00,-9.145863467943084e-03, 5.699538102000000e-05}, + { 4.557280987272586e+00, 1.829238959116374e-02, 2.474369483000000e-05}, + { 6.113423353213586e+00, 7.595702278066188e-03, 2.062715397000000e-05}, + { 2.067112903892000e+00, 2.743825478464904e-02, 5.945574160000000e-06}, + { 1.700689207004000e+00, 9.145729527513899e-03, 3.920190200000000e-06}, + { 3.577059353926586e+00,-1.829259493439447e-02, 2.167791970000000e-06}, + { 4.940284891770586e+00,-7.453616316894914e+00, 2.769763750000000e-06}, + { 2.117885747855000e+00, 3.941171892425920e+01, 1.813539170000000e-06}, + { 5.176055365230000e-01, 1.970205682773437e+01, 1.083429180000000e-06}, + { 5.864248782211586e+00, 3.658425999636452e-02, 1.066657010000000e-06}, + { 3.240692168340586e+00, 2.589639535977297e-02, 7.909853300000000e-07}, + { 7.570751994340000e-01,-1.321790869500707e+00, 8.880885099999999e-07}, + { 6.608910796060000e-01, 6.124220388371520e+00, 5.520758900000000e-07}, + { 5.519669134088586e+00, 4.685772969905357e+01, 4.397886000000000e-07}, + { 5.844000094873587e+00,-2.743825733444110e-02, 4.583609100000000e-07}, + { 4.602755395228586e+00,-1.675516082048598e-02, 3.533131100000000e-07}, + { 2.685649467156000e+00, 1.542518910643103e-03, 3.502988500000000e-07}, + { 3.353176877809586e+00, 1.225604581839110e+01, 3.828851700000000e-07}, + { 2.556761413073000e+00, 1.068971473943851e-02, 2.711247300000000e-07}, + { 4.622369718415587e+00,-2.589682634097252e-02, 1.991745400000000e-07}, + { 7.497690894330000e-01, 3.504362063026418e-02, 2.036897700000000e-07}, + { 3.965205602751586e+00, 2.714806830611846e+01, 1.726779600000000e-07}, + { 4.743858488241586e+00,-2.103145308554279e+01, 1.574472800000000e-07}, + { 3.405870070134586e+00, 4.572380100924578e-02, 1.698567700000000e-07}, + { 3.742380849210000e-01, 3.327989343110183e+01, 1.015004500000000e-07}, + { 1.374678754422000e+00,-1.970206671243377e+01, 8.259149000000001e-08}, + { 1.140160118874000e+00,-6.108652383295211e-03, 8.504923000000000e-08}, +}; + +static const struct MarsSatTerm mars_sat_deimos_0[25] = { + { 6.146803530569087e+00, 2.294413036846356e+00, 5.398360000000000e-09}, + { 3.432805186019586e+00, 9.935735425667586e+00, 7.095199999999997e-10}, + { 4.356581106602587e+00, 3.441619555269535e+00, 3.737800000000000e-10}, + { 5.915601483397086e+00, 9.926589650598594e+00, 2.337400000000000e-10}, + { 1.615243161446500e+00, 1.147206518423178e+00, 1.697000000000000e-10}, + { 2.114704906116000e+00, 9.917443791162608e+00, 5.314000000000000e-11}, + { 9.393388277920001e-01, 9.954027953247621e+00, 7.046000000000000e-11}, + { 3.949494792732586e+00, 9.944881541450725e+00, 4.233999999999998e-11}, + { 2.089322391969500e+00, 2.294097606691310e+00, 2.813999999999983e-11}, + { 7.795571756865000e-01, 2.294728469946876e+00, 2.549999999999971e-11}, + { 2.361851669664500e+00, 4.588826073692712e+00, 1.676000000000000e-11}, + { 2.770026883578500e+00, 9.954658773106329e+00, 9.719999999999976e-12}, + { 4.733522308629587e+00, 9.963173826265681e+00, 9.519999999999998e-12}, + { 3.258781379519086e+00, 1.472506551307767e+01, 9.739999999999990e-12}, + { 4.596299836113586e+00, 9.908297894321850e+00, 1.027999999999982e-11}, + { 3.057688443346500e+00, 2.682916339604879e+00, 6.679999999999999e-12}, + { 5.453932177963086e+00, 2.682285947505377e+00, 6.879999999999995e-12}, + { 4.328499239462586e+00, 9.936050924435195e+00, 6.199999999999996e-12}, + { 2.168321380562000e+00, 4.976699000854042e+00, 5.359999999999916e-12}, + { 2.516818588675000e+00, 9.935420104041299e+00, 3.359999999999995e-12}, + { 2.997827070725000e-01, 3.441304123224338e+00, 2.919999999999998e-12}, + { 2.143143420462500e+00, 2.682600911813873e+00, 2.979999999999999e-12}, + { 5.271781540988586e+00, 3.441934988580561e+00, 2.640000000000000e-12}, + { 5.382287205930000e-01, 9.926905039305762e+00, 2.039999999999966e-12}, + { 3.629187963751586e+00, 2.303558945733479e+00, 1.090000000000000e-12}, +}; + +static const struct MarsSatTerm mars_sat_deimos_1[21] = { + { 2.488175621789000e+00, 3.153377646687549e-04, 2.483031660190000e-03}, + { 2.488175634463000e+00, 3.153377641537758e-04, 2.483031659490000e-03}, + { 5.336889264964586e+00, 9.145915158660612e-03, 2.023426978200000e-04}, + { 5.336889346905586e+00, 9.145915155199243e-03, 2.023426978200000e-04}, + { 5.281538321363586e+00, 1.829244561727392e-02, 1.043167564200000e-04}, + { 5.281537958522586e+00, 1.829244563271799e-02, 1.043167564300000e-04}, + { 1.433490018835500e+00, 2.294413045224799e+00, 1.637133774599998e-04}, + { 2.852007788337500e+00, 2.743818628432718e-02, 4.820671420000000e-05}, + { 3.147176604035586e+00, 1.860783561096842e-02, 1.497066023000000e-05}, + { 3.147176307034586e+00, 1.860783562364318e-02, 1.497066034000000e-05}, + { 3.182516662993086e+00, 1.147206709032795e+00, 1.137028858000000e-05}, + { 5.917181875408586e+00, 3.441620120814550e+00, 8.350609860000001e-06}, + { 3.544871659744586e+00, 6.190897763118658e-04, 4.383254500000000e-06}, + { 3.544871649035586e+00, 6.190897769462623e-04, 4.383254500000000e-06}, + { 4.614193383590000e-01, 3.657933964533806e-02, 8.316176420000001e-06}, + { 6.754222685930000e-01, 2.775277029221846e-02, 6.447587580000001e-06}, + { 5.001640850015586e+00, 9.935735582783501e+00, 7.926687400000001e-06}, + { 4.485218623803586e+00, 8.828439970895009e-03, 3.905064210000000e-06}, + { 2.221013917980000e-01, 9.464721723028089e-03, 3.117801830000000e-06}, + { 4.485218622895586e+00, 8.828439971019056e-03, 3.905064210000000e-06}, + { 2.221013944660000e-01, 9.464721722885516e-03, 3.117801830000000e-06}, +}; + +static const struct MarsSatTerm mars_sat_deimos_2[15] = { + { 2.198649419514000e+00, 3.148401892560942e-04, 2.744131534600000e-04}, + { 4.366636518977586e+00, 4.977013897776327e+00, 6.015912711000000e-05}, + { 1.463816210370000e+00,-3.153164045300449e-04, 3.614585349000000e-05}, + { 1.362467588064000e+00, 2.682600831640474e+00, 2.577157903000000e-05}, + { 9.336792893320000e-01,-4.958721582505435e+00, 6.801997830000000e-06}, + { 3.152432010349586e+00, 1.535394310272536e+00, 4.452979140000000e-06}, + { 4.734051493918586e+00,-4.949575691510945e+00, 2.238482920000000e-06}, + { 5.736642853342587e+00, 2.327524649334390e-04, 1.478747570000000e-06}, + { 5.084945958505586e+00, 3.912335403634271e-04, 1.457720040000000e-06}, + { 4.232770650771586e+00, 7.271426904652134e+00, 1.347030310000000e-06}, + { 1.516439412109000e+00, 1.491274947692300e+01, 7.538179100000001e-07}, + { 3.100618466711000e+00, 1.797748798526167e-02, 8.716229700000000e-07}, + { 5.155432690964586e+00, 3.881877876517008e-01, 1.015648880000000e-06}, + { 2.250768124831000e+00,-4.940429834739583e+00, 5.090989300000000e-07}, + { 3.422251338868586e+00,-4.977013897776327e+00, 6.537077500000000e-07}, +}; + +static const struct MarsSatTerm mars_sat_deimos_3[27] = { + { 2.981506933511000e+00,-3.154811355556041e-04, 1.562693319959000e-02}, + { 4.557500894366586e+00, 1.829233626168517e-02, 1.321818631100000e-04}, + { 3.248124065112586e+00,-9.145934570587952e-03, 3.833652719000000e-05}, + { 1.701551338710000e+00, 9.145665986601770e-03, 2.660211842000000e-05}, + { 2.067662003165000e+00, 2.743821959085702e-02, 2.882438535000000e-05}, + { 4.805327222478586e+00, 3.158564952832469e-04, 2.713213911000000e-05}, + { 2.318788380092000e+00, 1.860776219134252e-02, 9.296324950000000e-06}, + { 3.613580709014586e+00,-1.829261290520875e-02, 4.460960290000000e-06}, + { 5.867810550672586e+00, 3.658405181871115e-02, 4.904156030000000e-06}, + { 5.496515547817586e+00,-9.461294099629817e-03, 2.366881150000000e-06}, + { 6.120362957845586e+00, 2.775361064625920e-02, 2.057552850000000e-06}, + { 3.612389208841586e+00, 8.830178627407989e-03, 2.365750140000000e-06}, + { 5.554163001934587e+00,-1.860800990265229e-02, 1.228814440000000e-06}, + { 3.561485983136586e+00, 1.797648948023003e-02, 1.215189460000000e-06}, + { 1.941975361869000e+00,-6.259843043363501e-04, 9.602856999999999e-07}, + { 5.845244776759587e+00,-2.743819348074506e-02, 1.174471770000000e-06}, + { 1.821048365911000e+00, 9.460829229838182e-03, 1.058441050000000e-06}, + { 7.587135454610000e-01, 1.682177864988152e-04, 2.383147490000000e-06}, + { 3.292891638604586e+00, 4.573365667404765e-02, 7.656303800000000e-07}, + { 3.766016108380586e+00, 3.683140215171970e-02, 4.075824300000000e-07}, + { 5.747244956219586e+00, 9.954342722363187e+00, 4.962340900000000e-07}, + { 1.724062868741000e+00,-2.774017744689255e-02, 3.003077900000000e-07}, + { 4.429747729642586e+00,-8.904754331211824e-03, 2.613416400000000e-07}, + { 8.659161909010000e-01, 2.718340176462802e-02, 2.891945200000000e-07}, + { 2.259603352363000e+00,-3.660152378331885e-02, 2.213788200000000e-07}, + { 1.108725025984000e+00, 9.935732440466172e+00, 2.449950300000000e-07}, + { 1.680391963791000e+00, 9.076040299352415e-03, 1.652416600000000e-07}, +}; + +static const struct MarsSatBody mars_sat_bodies[2] = { + { + 9.549547741038312e-11, 1.970205562831390e+01, 1.657852042683113e-10, + { + 0.0000626916188000, + 2.0912973926417302, + -0.0000005774003141, + 0.0000006185052790, + -0.0000575018919826, + -0.0000540676493351, + }, + { + {mars_sat_phobos_0, 16}, + {mars_sat_phobos_1, 42}, + {mars_sat_phobos_2, 27}, + {mars_sat_phobos_3, 28} + } + }, + { + 9.549547622768120e-11, 4.977013889652300e+00, -2.331793571572226e-14, + { + 0.0001568134086700, + -1.9167537810740201, + -0.0000239579419518, + 0.0000257893300229, + -0.0056443721379635, + -0.0053121806978560, + }, + { + {mars_sat_deimos_0, 25}, + {mars_sat_deimos_1, 21}, + {mars_sat_deimos_2, 15}, + {mars_sat_deimos_3, 27} + } + }, +}; + +static +void CalcMarsSatElem(double t, int body, double elem[6]) { + int j; + const struct MarsSatBody *bp = mars_sat_bodies + body; + memcpy(elem, bp->constants, 6 * sizeof(double)); + for (j = 0; j < 2; j++) { + const struct MarsSatTerm *const begin = bp->lists[j].terms; + const struct MarsSatTerm *p = begin + bp->lists[j].size; + while (--p >= begin) { + const double d = p->phase + t * p->frequency; + elem[j] += p->amplitude * cos(d); + } + } + for (j = 2; j < 4; j++) { + const struct MarsSatTerm *const begin = bp->lists[j].terms; + const struct MarsSatTerm *p = begin + bp->lists[j].size; + while (--p >= begin) { + const double d = p->phase + t * p->frequency; + elem[2*j-2] += p->amplitude * cos(d); + elem[2*j-1] += p->amplitude * sin(d); + } + } + elem[1] += (bp->l + bp->acc * t) * t; +} + + +static +void MultMat(const double a[9], const double b[9], double c[9]) { + int i, j; + for (i = 0; i < 3; i++) { + for (j = 0; j < 3; j++) { + c[i*3+j] = a[i*3]*b[j] + a[i*3+1]*b[3+j] + a[i*3+2]*b[6+j]; + } + } +} + +static const double J2000_to_VSOP87[9] = { + 9.999999999998848e-01,-4.799655442984222e-07, 0.000000000000000e+00, + 4.403598133110236e-07, 9.174821370868568e-01, 3.977769829016507e-01, + -1.909192461077750e-07,-3.977769829016049e-01, 9.174821370869625e-01}; + +static const double ome0 = 47.68143; +static const double inc0 = 37.1135; +static const double dome = -0.1061; +static const double dinc = 0.0609; + +static +void GenerateMarsSatToVSOP87(double t, double mat[9]) { + double ome, inc, co, so, ci, si; + double m[9]; + t -= 6491.5; + ome = (ome0 + dome * t / 36525.) * (M_PI / 180.0); + inc = (inc0 + dinc * t / 36525.) * (M_PI / 180.0); + co = cos(ome); + so = sin(ome); + ci = cos(inc); + si = sin(inc); + m[0] = co; m[1] = -ci*so; m[2] = si*so; + m[3] = so; m[4] = ci*co; m[5] = -si*co; + m[6] = 0.0; m[7] = si; m[8] = ci; + MultMat(J2000_to_VSOP87, m, mat); +} + +void GetMarsSatCoor(double jd, int body, double *xyz, double *xyzdot) { + double elem[6]; + double x[6]; + double mat[9]; + const double t = jd - 2451545.0 + 6491.5; + + CalcMarsSatElem(t, body, elem); + GenerateMarsSatToVSOP87(t, mat); + EllipticToRectangularA(mars_sat_bodies[body].mu, elem, 0.0, x); + + xyz[0] = mat[0]*x[0] + mat[1]*x[1] + mat[2]*x[2]; + xyz[1] = mat[3]*x[0] + mat[4]*x[1] + mat[5]*x[2]; + xyz[2] = mat[6]*x[0] + mat[7]*x[1] + mat[8]*x[2]; + + if (xyzdot) { + xyzdot[0] = mat[0]*x[3] + mat[1]*x[4] + mat[2]*x[5]; + xyzdot[1] = mat[3]*x[3] + mat[4]*x[4] + mat[5]*x[5]; + xyzdot[2] = mat[6]*x[3] + mat[7]*x[4] + mat[8]*x[5]; + } +} diff --git a/src/marssat.h b/src/marssat.h new file mode 100644 index 0000000..580fe53 --- /dev/null +++ b/src/marssat.h @@ -0,0 +1,81 @@ +/************************************************************************ + +The Ephemerides of the Martian satellites +(adjustement from 1877 to 2005, Version 1.0) +by Valery Lainey can be obtained from Valery Lainey: + + V.Lainey (Lainey@oma.be) +ROB- 3, Avenue Circulaire, B-1180 Bruxelles (Belgium) +IMCCE - 77, Avenue Denfert-Rochereau 75014 Paris (France) + +----------------------------------------------------------------------- + +I (Johannes Gajdosik) have just taken Valery Laineys Fortran code, +MarsSatV1-0.f, which he kindly supplied, and rearranged it into +this piece of software. + +I can neither allow nor forbid the usage of Valery Laineys +Ephemerides of the Martian satellites. +The copyright notice below covers not the work of Valery Lainey +but just my work, that is the compilation of Valery Laineys +Ephemerides of the Martian satellites into the software supplied in this file. + + +Copyright (c) 2006 Johannes Gajdosik + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Derived from Stellarium's MARSSAT implementation. +Modified for pg_orbit: removed static mutable state and +CalcInterpolatedElements caching for thread safety +(PostgreSQL PARALLEL SAFE). Elements are computed fresh on each call. + +1) do not calculate constant terms at runtime but beforehand +2) unite terms with the same frequencies + +****************************************************************/ + +#ifndef PG_ORBIT_MARSSAT_H +#define PG_ORBIT_MARSSAT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define MARS_SAT_PHOBOS 0 +#define MARS_SAT_DEIMOS 1 + +void GetMarsSatCoor(double jd, int body, double *xyz, double *xyzdot); + /* Return the rectangular coordinates and velocity of the given satellite + and the given julian date jd expressed in dynamical time (TAI+32.184s). + The origin of the xyz-coordinates is the center of Mars. + The reference frame is "dynamical equinox and ecliptic J2000", + which is the reference frame in VSOP87 and VSOP87A. + + body: 0=Phobos, 1=Deimos + + xyz[3]: position (AU), relative to Mars center + xyzdot[3]: velocity (AU/day), may be NULL + */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/moon_funcs.c b/src/moon_funcs.c new file mode 100644 index 0000000..7b0259f --- /dev/null +++ b/src/moon_funcs.c @@ -0,0 +1,248 @@ +/* + * moon_funcs.c -- Planetary moon observation + * + * SQL functions for observing moons of Jupiter, Saturn, Uranus, and Mars. + * Each moon's position is computed in the VSOP87 ecliptic J2000 frame + * relative to its parent planet, then combined with the parent's + * heliocentric position to get geocentric az/el. + * + * Pipeline for each moon: + * 1. Parent planet heliocentric position (VSOP87) + * 2. Moon position relative to parent (L12/TASS17/GUST86/MARSSAT) + * 3. Moon heliocentric = parent + moon_relative + * 4. Moon geocentric = moon_heliocentric - Earth_heliocentric + * 5. Ecliptic -> equatorial -> precess -> az/el + */ + +#include "postgres.h" +#include "fmgr.h" +#include "funcapi.h" +#include "utils/timestamp.h" +#include "types.h" +#include "astro_math.h" +#include "vsop87.h" +#include "l12.h" +#include "tass17.h" +#include "gust86.h" +#include "marssat.h" +#include + +PG_FUNCTION_INFO_V1(galilean_observe); +PG_FUNCTION_INFO_V1(saturn_moon_observe); +PG_FUNCTION_INFO_V1(uranus_moon_observe); +PG_FUNCTION_INFO_V1(mars_moon_observe); + + +/* ================================================================ + * Internal: geocentric observation pipeline + * + * Duplicated from planet_funcs.c to avoid cross-TU coupling. + * (Same logic: ecliptic J2000 -> equatorial -> precess -> az/el) + * ================================================================ + */ +static void +moon_observe_from_geocentric(const double geo_ecl_au[3], double jd, + const pg_observer *obs, pg_topocentric *result) +{ + double geo_equ[3]; + double ra_j2000, dec_j2000, geo_dist; + double ra_date, dec_date; + double gmst_val, lst, ha; + double az, el; + + ecliptic_to_equatorial(geo_ecl_au, geo_equ); + cartesian_to_spherical(geo_equ, &ra_j2000, &dec_j2000, &geo_dist); + precess_j2000_to_date(jd, ra_j2000, dec_j2000, &ra_date, &dec_date); + + gmst_val = gmst_from_jd(jd); + lst = gmst_val + obs->lon; + ha = lst - ra_date; + + equatorial_to_horizontal(ha, dec_date, obs->lat, &az, &el); + + result->azimuth = az; + result->elevation = el; + result->range_km = geo_dist * AU_KM; + result->range_rate = 0.0; +} + + +/* ================================================================ + * Internal: common pattern for all planetary moons + * + * Given: moon position relative to parent (VSOP87 ecliptic J2000, AU) + * parent's VSOP87 body index (0-based) + * observer, JD + * + * Computes geocentric position and returns topocentric az/el. + * ================================================================ + */ +static void +observe_planetary_moon(const double moon_rel[3], int vsop_parent, + double jd, const pg_observer *obs, + pg_topocentric *result) +{ + double parent_xyz[6]; + double earth_xyz[6]; + double geo_ecl[3]; + + /* Parent planet heliocentric */ + GetVsop87Coor(jd, vsop_parent, parent_xyz); + + /* Earth heliocentric */ + GetVsop87Coor(jd, 2, earth_xyz); /* VSOP87 body 2 = Earth */ + + /* Moon geocentric = (parent + moon_relative) - Earth */ + geo_ecl[0] = (parent_xyz[0] + moon_rel[0]) - earth_xyz[0]; + geo_ecl[1] = (parent_xyz[1] + moon_rel[1]) - earth_xyz[1]; + geo_ecl[2] = (parent_xyz[2] + moon_rel[2]) - earth_xyz[2]; + + moon_observe_from_geocentric(geo_ecl, jd, obs, result); +} + + +/* ================================================================ + * galilean_observe(body_id int, observer, timestamptz) -> topocentric + * + * Observe a Galilean moon of Jupiter. + * Body IDs: 0=Io, 1=Europa, 2=Ganymede, 3=Callisto + * + * Uses L1.2 theory (Lainey, Duriez & Vienne) for moon positions + * and VSOP87 for Jupiter and Earth. + * ================================================================ + */ +Datum +galilean_observe(PG_FUNCTION_ARGS) +{ + int32 body_id = PG_GETARG_INT32(0); + pg_observer *obs = (pg_observer *) PG_GETARG_POINTER(1); + int64 ts = PG_GETARG_INT64(2); + double jd; + double moon_xyz[3]; + pg_topocentric *result; + + if (body_id < L12_IO || body_id > L12_CALLISTO) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("galilean_observe: body_id %d must be 0-3 (Io, Europa, Ganymede, Callisto)", + body_id))); + + jd = timestamptz_to_jd(ts); + + /* Moon position relative to Jupiter, VSOP87 ecliptic J2000, AU */ + GetL12Coor(jd, body_id, moon_xyz, NULL); + + result = (pg_topocentric *) palloc(sizeof(pg_topocentric)); + observe_planetary_moon(moon_xyz, 4, jd, obs, result); /* VSOP87 body 4 = Jupiter */ + + PG_RETURN_POINTER(result); +} + + +/* ================================================================ + * saturn_moon_observe(body_id int, observer, timestamptz) -> topocentric + * + * Observe a moon of Saturn. + * Body IDs: 0=Mimas, 1=Enceladus, 2=Tethys, 3=Dione, + * 4=Rhea, 5=Titan, 6=Iapetus, 7=Hyperion + * + * Uses TASS 1.7 theory (Vienne & Duriez). + * ================================================================ + */ +Datum +saturn_moon_observe(PG_FUNCTION_ARGS) +{ + int32 body_id = PG_GETARG_INT32(0); + pg_observer *obs = (pg_observer *) PG_GETARG_POINTER(1); + int64 ts = PG_GETARG_INT64(2); + double jd; + double moon_xyz[3]; + pg_topocentric *result; + + if (body_id < TASS17_MIMAS || body_id > TASS17_HYPERION) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("saturn_moon_observe: body_id %d must be 0-7 (Mimas-Hyperion)", + body_id))); + + jd = timestamptz_to_jd(ts); + + GetTass17Coor(jd, body_id, moon_xyz, NULL); + + result = (pg_topocentric *) palloc(sizeof(pg_topocentric)); + observe_planetary_moon(moon_xyz, 5, jd, obs, result); /* VSOP87 body 5 = Saturn */ + + PG_RETURN_POINTER(result); +} + + +/* ================================================================ + * uranus_moon_observe(body_id int, observer, timestamptz) -> topocentric + * + * Observe a moon of Uranus. + * Body IDs: 0=Miranda, 1=Ariel, 2=Umbriel, 3=Titania, 4=Oberon + * + * Uses GUST86 theory (Laskar & Jacobson). + * ================================================================ + */ +Datum +uranus_moon_observe(PG_FUNCTION_ARGS) +{ + int32 body_id = PG_GETARG_INT32(0); + pg_observer *obs = (pg_observer *) PG_GETARG_POINTER(1); + int64 ts = PG_GETARG_INT64(2); + double jd; + double moon_xyz[3]; + pg_topocentric *result; + + if (body_id < GUST86_MIRANDA || body_id > GUST86_OBERON) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("uranus_moon_observe: body_id %d must be 0-4 (Miranda-Oberon)", + body_id))); + + jd = timestamptz_to_jd(ts); + + GetGust86Coor(jd, body_id, moon_xyz, NULL); + + result = (pg_topocentric *) palloc(sizeof(pg_topocentric)); + observe_planetary_moon(moon_xyz, 6, jd, obs, result); /* VSOP87 body 6 = Uranus */ + + PG_RETURN_POINTER(result); +} + + +/* ================================================================ + * mars_moon_observe(body_id int, observer, timestamptz) -> topocentric + * + * Observe a moon of Mars. + * Body IDs: 0=Phobos, 1=Deimos + * + * Uses MarsSat theory (Lainey, 2007). + * ================================================================ + */ +Datum +mars_moon_observe(PG_FUNCTION_ARGS) +{ + int32 body_id = PG_GETARG_INT32(0); + pg_observer *obs = (pg_observer *) PG_GETARG_POINTER(1); + int64 ts = PG_GETARG_INT64(2); + double jd; + double moon_xyz[3]; + pg_topocentric *result; + + if (body_id < MARS_SAT_PHOBOS || body_id > MARS_SAT_DEIMOS) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("mars_moon_observe: body_id %d must be 0-1 (Phobos, Deimos)", + body_id))); + + jd = timestamptz_to_jd(ts); + + GetMarsSatCoor(jd, body_id, moon_xyz, NULL); + + result = (pg_topocentric *) palloc(sizeof(pg_topocentric)); + observe_planetary_moon(moon_xyz, 3, jd, obs, result); /* VSOP87 body 3 = Mars */ + + PG_RETURN_POINTER(result); +} diff --git a/src/radio_funcs.c b/src/radio_funcs.c new file mode 100644 index 0000000..5415325 --- /dev/null +++ b/src/radio_funcs.c @@ -0,0 +1,262 @@ +/* + * radio_funcs.c -- Jupiter decametric radio burst prediction + * + * Jupiter emits intense radio bursts at 4-39.5 MHz, modulated by: + * 1. Io's orbital phase around Jupiter (Io-related storms) + * 2. Jupiter's Central Meridian Longitude (CML, System III) + * + * Radio JOVE operators use CML-vs-Io-phase lookup charts to predict + * burst probability. This module computes both parameters from SQL, + * enabling batch prediction queries over time series. + * + * References: + * Carr, Desch & Alexander (1983), "Phenomenology of Magnetospheric + * Radio Emissions", in Physics of the Jovian Magnetosphere. + * Radio JOVE project: https://radiojove.gsfc.nasa.gov/ + */ + +#include "postgres.h" +#include "fmgr.h" +#include "funcapi.h" +#include "utils/timestamp.h" +#include "types.h" +#include "astro_math.h" +#include "vsop87.h" +#include "l12.h" +#include + +PG_FUNCTION_INFO_V1(io_phase_angle); +PG_FUNCTION_INFO_V1(jupiter_cml); +PG_FUNCTION_INFO_V1(jupiter_burst_probability); + + +/* ================================================================ + * io_phase_angle(timestamptz) -> float8 + * + * Returns Io's orbital phase angle in degrees [0, 360). + * Measured from superior geocentric conjunction: + * 0 = Io behind Jupiter (as seen from Earth) + * 90 = Io east of Jupiter (western elongation) + * 180 = Io in front of Jupiter (inferior conjunction) + * 270 = Io west of Jupiter (eastern elongation) + * + * This is the standard convention used by Radio JOVE charts. + * ================================================================ + */ +Datum +io_phase_angle(PG_FUNCTION_ARGS) +{ + int64 ts = PG_GETARG_INT64(0); + double jd; + double io_xyz[3]; + double jup_xyz[6], earth_xyz[6]; + double jup_geo[3]; + double io_rel_geo[3]; + double phase; + double proj_x, proj_y; + double jup_dist; + double east_x, east_y, east_z; + double north_x, north_y, north_z; + double io_east, io_north; + + jd = timestamptz_to_jd(ts); + + /* Io position relative to Jupiter (VSOP87 ecliptic J2000, AU) */ + GetL12Coor(jd, L12_IO, io_xyz, NULL); + + /* Jupiter and Earth heliocentric positions */ + GetVsop87Coor(jd, 4, jup_xyz); /* VSOP87 body 4 = Jupiter */ + GetVsop87Coor(jd, 2, earth_xyz); /* VSOP87 body 2 = Earth */ + + /* Jupiter geocentric direction */ + jup_geo[0] = jup_xyz[0] - earth_xyz[0]; + jup_geo[1] = jup_xyz[1] - earth_xyz[1]; + jup_geo[2] = jup_xyz[2] - earth_xyz[2]; + + jup_dist = sqrt(jup_geo[0] * jup_geo[0] + + jup_geo[1] * jup_geo[1] + + jup_geo[2] * jup_geo[2]); + + /* Normalize Jupiter geocentric direction */ + jup_geo[0] /= jup_dist; + jup_geo[1] /= jup_dist; + jup_geo[2] /= jup_dist; + + /* + * Project Io's position onto the plane perpendicular to + * the Earth-Jupiter line of sight. We need two orthogonal + * axes in this plane: "east" (position angle) and "north" + * (toward north ecliptic pole). + * + * North ecliptic pole = (0, 0, 1) in ecliptic J2000. + * East = North x LineOfSight (cross product) + */ + north_x = -(jup_geo[2] * jup_geo[0]); /* north - (north.los)*los */ + north_y = -(jup_geo[2] * jup_geo[1]); + north_z = 1.0 - jup_geo[2] * jup_geo[2]; + + { + double nmag = sqrt(north_x * north_x + north_y * north_y + north_z * north_z); + if (nmag > 1e-10) { + north_x /= nmag; + north_y /= nmag; + north_z /= nmag; + } + } + + /* East = North x LOS */ + east_x = north_y * jup_geo[2] - north_z * jup_geo[1]; + east_y = north_z * jup_geo[0] - north_x * jup_geo[2]; + east_z = north_x * jup_geo[1] - north_y * jup_geo[0]; + + /* Project Io relative position onto east/north */ + io_east = io_xyz[0] * east_x + io_xyz[1] * east_y + io_xyz[2] * east_z; + io_north = io_xyz[0] * north_x + io_xyz[1] * north_y + io_xyz[2] * north_z; + + /* Along LOS component (positive = behind Jupiter from Earth) */ + proj_x = io_xyz[0] * jup_geo[0] + io_xyz[1] * jup_geo[1] + io_xyz[2] * jup_geo[2]; + proj_y = io_east; + + /* + * Phase angle convention (Radio JOVE): + * 0 = superior conjunction (Io behind Jupiter) + * Measured counter-clockwise as seen from north ecliptic pole + */ + phase = atan2(-proj_y, proj_x) * RAD_TO_DEG; + if (phase < 0.0) + phase += 360.0; + + PG_RETURN_FLOAT8(phase); +} + + +/* ================================================================ + * jupiter_cml(observer, timestamptz) -> float8 + * + * Jupiter's Central Meridian Longitude in System III (1965.0). + * Returns degrees [0, 360). + * + * System III is defined by Jupiter's magnetic field rotation, + * with period 9h 55m 29.711s (IAU). + * + * The CML is the System III longitude of the sub-observer point. + * For Earth-based observation, this is approximately the + * sub-Earth longitude. + * + * Reference: IAU (1976) System III longitude definition. + * ================================================================ + */ +Datum +jupiter_cml(PG_FUNCTION_ARGS) +{ + pg_observer *obs = (pg_observer *) PG_GETARG_POINTER(0); + int64 ts = PG_GETARG_INT64(1); + double jd; + double jup_xyz[6], earth_xyz[6]; + double dx, dy, dz, geo_dist; + double light_time_days; + double jd_lt; + double d; + double cml; + + (void)obs; /* observer not needed for CML (geocentric is sufficient) */ + + jd = timestamptz_to_jd(ts); + + /* Jupiter and Earth positions */ + GetVsop87Coor(jd, 4, jup_xyz); + GetVsop87Coor(jd, 2, earth_xyz); + + /* Geocentric distance for light-time correction */ + dx = jup_xyz[0] - earth_xyz[0]; + dy = jup_xyz[1] - earth_xyz[1]; + dz = jup_xyz[2] - earth_xyz[2]; + geo_dist = sqrt(dx * dx + dy * dy + dz * dz); + + /* Light-time correction (speed of light = 173.1446 AU/day) */ + light_time_days = geo_dist / 173.1446327; + jd_lt = jd - light_time_days; + + /* + * System III longitude of central meridian. + * + * Reference epoch: J1965.0 = JD 2438761.5 + * Initial longitude: 305.38 deg (IAU 1976 convention) + * Rotation rate: 870.536 deg/day (System III, 9h 55m 29.711s period) + * + * The sub-Earth longitude decreases with time (Jupiter rotates + * prograde), so CML = initial + rate * elapsed_days. + */ + d = jd_lt - 2438761.5; /* Days since J1965.0 */ + cml = 305.38 + 870.536 * d; + + /* Normalize to [0, 360) */ + cml = fmod(cml, 360.0); + if (cml < 0.0) + cml += 360.0; + + PG_RETURN_FLOAT8(cml); +} + + +/* ================================================================ + * jupiter_burst_probability(io_phase float8, cml float8) -> float8 + * + * Estimated probability of Jupiter decametric radio burst + * based on Io phase angle and CML (System III). + * + * Returns a value 0.0-1.0 representing relative likelihood. + * + * Based on the empirical source regions from Carr et al. (1983): + * Source A: CML 200-260, Io phase 195-265 (Io-A) + * Source B: CML 90-200, Io phase 70-110 (Io-B) + * Source C: CML 290-10, Io phase 215-260 (Io-C) + * Source D: CML 0-50, no Io dependence (non-Io-D) + * + * This is a simplified model. Real-world burst probability + * depends on additional factors (frequency, solar activity, + * antenna orientation). + * ================================================================ + */ +Datum +jupiter_burst_probability(PG_FUNCTION_ARGS) +{ + double io_phase = PG_GETARG_FLOAT8(0); + double cml = PG_GETARG_FLOAT8(1); + double p; + + /* Normalize inputs */ + io_phase = fmod(io_phase, 360.0); + if (io_phase < 0.0) io_phase += 360.0; + cml = fmod(cml, 360.0); + if (cml < 0.0) cml += 360.0; + + p = 0.0; + + /* Source A (Io-A): strongest, most predictable */ + if (cml >= 200.0 && cml <= 260.0 && io_phase >= 195.0 && io_phase <= 265.0) + p = 0.8; + + /* Source B (Io-B): second strongest */ + if (cml >= 90.0 && cml <= 200.0 && io_phase >= 70.0 && io_phase <= 110.0) + { + double pb = 0.6; + if (pb > p) p = pb; + } + + /* Source C (Io-C): wraps around 360/0 boundary */ + if ((cml >= 290.0 || cml <= 10.0) && io_phase >= 215.0 && io_phase <= 260.0) + { + double pc = 0.5; + if (pc > p) p = pc; + } + + /* Non-Io-D: CML-dependent only, weaker */ + if (cml >= 0.0 && cml <= 50.0) + { + double pd = 0.15; + if (pd > p) p = pd; + } + + PG_RETURN_FLOAT8(p); +} diff --git a/src/tass17.c b/src/tass17.c new file mode 100644 index 0000000..ca0a11a --- /dev/null +++ b/src/tass17.c @@ -0,0 +1,3156 @@ +/************************************************************************ + +The TASS 1.7 theory of the Saturnian satellites including HYPERION +by Alain VIENNE and Luc DURIEZ can be found at +ftp://ftp.imcce.fr/pub/ephem/satel/tass17 + +I (Johannes Gajdosik) have just taken the Fortran code and data +obtained from above and rearranged it into this piece of software. + +I can neither allow nor forbid the usage of the TASS 1.7 theory. +The copyright notice below covers not the work of Alain VIENNE and Luc DURIEZ +but just my work, that is the compilation of the TASS 1.7 theory +into the software supplied in this file. + + +Copyright (c) 2005 Johannes Gajdosik + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +This is an implementation of the TASS 1.7 theory. +My modifications are: +1) do not calculate constant terms at runtime but beforehand +2) unite terms with the same frequencies +3) rearrange the terms so that calculation of the argument becomes easier +4) substitute so that the independent variable becomes T=jd-2444240 + for all satellites (including hyperion) +5) do not calculate a satellites "rmu" at runtime but beforehand +6) use a rotation matrix for Transformation to J2000 + instead of AIA, OMA and inclination of earth axis +7) exchange indices of hyperion and iapetus +8) calculate the orbital elements not for every new jd but rather reuse + the previousely calculated elements if possible + +****************************************************************/ + +#include "tass17.h" +#include "elliptic_to_rectangular.h" + +#include + +struct Tass17Term +{ + double s[3]; +}; + +struct Tass17MultiTerm +{ + signed char i[8]; + int nr_of_terms; + const struct Tass17Term *terms; +}; + +struct Tass17Series +{ + int nr_of_multi_terms; + const struct Tass17MultiTerm *multi_terms; +}; + +struct Tass17Body +{ + const char *name; + double mu; + double aam; + double s0[6]; + struct Tass17Series series[4]; +}; + +static const struct Tass17Term MIMAS_0_0[2] = { + {{ 2.760763800054540e-05, 6.863463000141887e-01, 2.437929552050393e-04}}, + {{ 9.347313993693880e-06, 2.209688858348459e+00, 2.791965241219151e-02}}, +}; + +static const struct Tass17Term MIMAS_0_1[5] = { + {{ 1.247132122206555e-04, 3.384553386830940e+00, 6.649590915041870e+00}}, + {{ 5.773002078925660e-05, 9.293070332553311e-01, 6.649834707997076e+00}}, + {{ 5.767710349652186e-05, 2.698207086816744e+00, 6.649347122086664e+00}}, + {{ 1.211438560239529e-05, 2.011860786802310e+00, 6.649103329131461e+00}}, + {{ 1.201719293977645e-05, 4.757245986859100e+00, 6.650078500952279e+00}}, +}; + +static const struct Tass17MultiTerm MIMAS_0[2] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0}, 2,MIMAS_0_0}, + {{ 2, 0,-2, 0, 0, 0, 0, 0}, 5,MIMAS_0_1}, +}; + +static const struct Tass17Term MIMAS_1_0[29] = { + {{ 9.283150504689616e-06, 1.804019257682701e+00, 1.990850081500073e-05}}, + {{ 9.230818991264319e-05, 2.435908416203692e+00, 8.594659879963006e-05}}, + {{ 7.345436389839680e-05, 4.239927673886392e+00, 1.058550996146308e-04}}, + {{ 5.060827138159436e-04, 4.533623190990083e+00, 1.578463564054092e-04}}, + {{ 2.628008938901560e-04, 5.445714149319756e-02, 1.777548572204099e-04}}, + {{ 1.096551493377600e-05, 2.023919695921281e+00, 2.238844543900385e-04}}, + {{ 7.574073228630605e-01, 6.863463000141887e-01, 2.437929552050393e-04}}, + {{ 1.317556115144799e-05, 2.490365557696890e+00, 2.637014560200400e-04}}, + {{ 1.969761970496516e-04, 4.459828112124973e+00, 3.098310531896687e-04}}, + {{ 2.459408712169538e-04, 3.122254716217880e+00, 3.297395540046694e-04}}, + {{ 2.799611810201398e-05, 5.219969491004272e+00, 4.016393116104485e-04}}, + {{ 7.266042399548720e-04, 1.372692600028377e+00, 4.875859104100786e-04}}, + {{ 9.274943256038984e-06, 6.670083626422765e-01, 5.735325092097087e-04}}, + {{ 1.284412109690001e-05, 2.764723137428667e+00, 6.454322668154877e-04}}, + {{ 1.243299165183161e-02, 2.059038900042566e+00, 7.313788656151179e-04}}, + {{ 8.715614709370008e-06, 4.494947316246257e+00, 8.173254644147480e-04}}, + {{ 3.590283311520520e-04, 3.431731500070944e+00, 1.218964776025196e-03}}, + {{ 3.847028724666396e-06, 6.152515926191327e+00, 1.366310570108340e-02}}, + {{ 1.276023939118606e-04, 5.446831688805226e+00, 1.374905229988303e-02}}, + {{ 9.505947727365781e-06, 3.697269572615722e+00, 1.390689865628844e-02}}, + {{ 5.198697062661200e-06, 4.383615872629911e+00, 1.415069161149348e-02}}, + {{ 1.163953693117700e-04, 3.677931635243811e+00, 1.423663821029311e-02}}, + {{ 4.870003920011340e-05, 3.292242611895686e+00, 2.718827354657639e-02}}, + {{ 2.237171274873740e-04, 8.369962583200818e-01, 2.743206650178144e-02}}, + {{ 1.059900648786554e-03, 4.664935211924063e+00, 2.767585945698648e-02}}, + {{ 2.266397525680950e-03, 2.209688858348459e+00, 2.791965241219151e-02}}, + {{ 1.022783782146454e-03, 2.896035158362648e+00, 2.816344536739655e-02}}, + {{ 2.097481794022580e-04, 3.582381458376836e+00, 2.840723832260159e-02}}, + {{ 4.473029935270700e-05, 4.268727758391025e+00, 2.865103127780663e-02}}, +}; + +static const struct Tass17Term MIMAS_1_1[1] = { + {{ 8.436544361747722e-06, 5.237122972947232e+00, 4.050159832983069e-01}}, +}; + +static const struct Tass17Term MIMAS_1_2[5] = { + {{ 1.456357118609923e-04, 2.429607332411430e-01, 6.649590915041870e+00}}, + {{ 6.713447572711532e-05, 4.070899686845125e+00, 6.649834707997076e+00}}, + {{ 6.681066992467156e-05, 5.839799740406537e+00, 6.649347122086664e+00}}, + {{ 1.422191153382851e-05, 5.153453440392031e+00, 6.649103329131461e+00}}, + {{ 1.410806846233703e-05, 1.615653333269246e+00, 6.650078500952279e+00}}, +}; + +static const struct Tass17MultiTerm MIMAS_1[3] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0}, 29,MIMAS_1_0}, + {{-1, 3,-2, 0, 0, 0, 0, 0}, 1,MIMAS_1_1}, + {{ 2, 0,-2, 0, 0, 0, 0, 0}, 5,MIMAS_1_2}, +}; + +static const struct Tass17Term MIMAS_2_0[31] = { + {{ 1.607455685492625e-04, 4.012828055947553e+00,-1.044883867247364e-02}}, + {{ 1.578422930662670e-05, 5.932334220063532e+00, 1.625184896369267e-02}}, + {{ 7.291096595471061e-05, 3.477087866487927e+00, 1.649564191889771e-02}}, + {{ 6.526439278535280e-06, 4.869118403888217e+00, 1.665348827530312e-02}}, + {{ 3.336219324045869e-04, 1.021841512912324e+00, 1.673943487410275e-02}}, + {{ 8.915309088647409e-06, 3.161572755262240e-01, 1.682538147290238e-02}}, + {{ 1.733062364950220e-05, 2.413872050312614e+00, 1.689728123050816e-02}}, + {{ 1.511549643267883e-03, 4.849780466516306e+00, 1.698322782930779e-02}}, + {{ 2.716644193630320e-05, 4.144096229130206e+00, 1.706917442810742e-02}}, + {{ 3.214169596116360e-05, 6.241811003916594e+00, 1.714107418571320e-02}}, + {{ 7.314708595483528e-03, 2.394534112940702e+00, 1.722702078451283e-02}}, + {{ 4.732749947219130e-05, 1.688849875554602e+00, 1.731296738331245e-02}}, + {{ 2.051066737888520e-05, 6.449719967511965e-01, 1.738486714091824e-02}}, + {{ 1.598170384010833e-02, 6.222473066544683e+00, 1.747081373971786e-02}}, + {{ 3.701056581056820e-05, 2.375196175568790e+00, 1.755676033851749e-02}}, + {{ 7.741070178691200e-05, 1.331318296765385e+00, 1.762866009612328e-02}}, + {{ 7.111400179101439e-03, 6.256340593792847e-01, 1.771460669492290e-02}}, + {{ 6.027636670891800e-05, 3.061542475582978e+00, 1.780055329372254e-02}}, + {{ 2.628589083368250e-05, 2.017664596779575e+00, 1.787245305132832e-02}}, + {{ 1.462159663847020e-03, 1.311980359393475e+00, 1.795839965012795e-02}}, + {{ 2.018714468805330e-05, 3.747888775597167e+00, 1.804434624892758e-02}}, + {{ 7.427257818452120e-06, 2.704010896793763e+00, 1.811624600653336e-02}}, + {{ 3.306740201503266e-04, 1.998326659407663e+00, 1.820219260533298e-02}}, + {{ 6.793672394573960e-06, 4.434235075611354e+00, 1.828813920413261e-02}}, + {{ 7.462286917233880e-05, 2.684672959421853e+00, 1.844598556053802e-02}}, + {{ 1.636165431356800e-05, 3.371019259436040e+00, 1.868977851574306e-02}}, + {{ 7.716155921462711e-06, 7.762840176851795e-01, 4.490288024149930e-02}}, + {{ 1.650028552141730e-05, 4.604222971289160e+00, 4.514667319670434e-02}}, + {{ 1.155548887648690e-05, 2.148976617713557e+00, 4.539046615190938e-02}}, + {{ 1.620277455112710e-05, 2.835322917727745e+00, 4.563425910711441e-02}}, + {{ 7.443474433517800e-06, 3.521669217741933e+00, 4.587805206231945e-02}}, +}; + +static const struct Tass17Term MIMAS_2_1[1] = { + {{ 2.602700419616530e-03, 1.822484926062486e-01, 6.667061728781588e+00}}, +}; + +static const struct Tass17Term MIMAS_2_2[1] = { + {{ 5.322831922763783e-06, 5.176410732312329e+00, 4.224867970380249e-01}}, +}; + +static const struct Tass17Term MIMAS_2_3[5] = { + {{ 6.248133126576452e-05, 4.252092258474006e-01, 1.331665264382346e+01}}, + {{ 2.892274500639771e-05, 4.253148179451381e+00, 1.331689643677866e+01}}, + {{ 2.889623530439334e-05, 6.022048233012799e+00, 1.331640885086825e+01}}, + {{ 6.069308702586342e-06, 5.335701932998608e+00, 1.331616505791305e+01}}, + {{ 6.020614391923135e-06, 1.797901825875778e+00, 1.331714022973387e+01}}, +}; + +static const struct Tass17MultiTerm MIMAS_2[4] = { + {{-1, 0, 2, 0, 0, 0, 0, 0}, 31,MIMAS_2_0}, + {{ 1, 0, 0, 0, 0, 0, 0, 0}, 1,MIMAS_2_1}, + {{-2, 3, 0, 0, 0, 0, 0, 0}, 1,MIMAS_2_2}, + {{ 3, 0,-2, 0, 0, 0, 0, 0}, 5,MIMAS_2_3}, +}; + +static const struct Tass17Term MIMAS_3_0[29] = { + {{ 5.339008498818640e-06, 4.924784125696391e+00, 9.986805201763754e-03}}, + {{ 1.140613650769890e-05, 2.469537772120787e+00, 1.023059815696879e-02}}, + {{ 8.188197469152401e-06, 1.429141854518208e-02, 1.047439111217383e-02}}, + {{ 1.141748624638240e-05, 7.006377185593701e-01, 1.071818406737887e-02}}, + {{ 5.211706783516070e-06, 1.386984018573560e+00, 1.096197702258391e-02}}, + {{ 1.139717898986310e-05, 1.236334060267667e+00,-1.622629652399248e-02}}, + {{ 5.206791451508880e-05, 5.499877602534791e-01,-1.647008947919752e-02}}, + {{ 2.328430197381575e-04, 6.146826767418875e+00,-1.671388243440256e-02}}, + {{ 5.186530053942100e-06, 5.693256976253909e-01,-1.679982903320219e-02}}, + {{ 1.412387702084000e-05, 1.613203576428794e+00,-1.687172879080797e-02}}, + {{ 1.074089419341231e-03, 5.460480467404687e+00,-1.695767538960760e-02}}, + {{ 1.838941226078010e-05, 6.166164704790789e+00,-1.704362198840723e-02}}, + {{ 4.248311992240600e-05, 9.268572764146046e-01,-1.711552174601300e-02}}, + {{ 5.301694964646620e-03, 4.774134167390498e+00,-1.720146834481264e-02}}, + {{ 5.463249591300440e-05, 5.479818404776600e+00,-1.728741494361227e-02}}, + {{ 2.612362501347000e-05, 2.405109764004165e-01,-1.735931470121805e-02}}, + {{ 1.188963618162444e-02, 4.087787867376310e+00,-1.744526130001768e-02}}, + {{ 1.417196313981720e-05, 4.793472104762412e+00,-1.753120789881731e-02}}, + {{ 3.275262890701040e-05, 5.837349983565814e+00,-1.760310765642309e-02}}, + {{ 5.317666807877856e-03, 2.598489137723283e-01,-1.768905425522272e-02}}, + {{ 2.254194030722800e-05, 4.107125804748224e+00,-1.777500085402235e-02}}, + {{ 1.876210282323130e-05, 2.009411029961832e+00,-1.784690061162813e-02}}, + {{ 1.092196251660480e-03, 2.715095267347932e+00,-1.793284721042776e-02}}, + {{ 1.200955094991380e-05, 2.791868511442401e-01,-1.801879380922739e-02}}, + {{ 6.138904676788960e-06, 4.464657383537437e+00,-1.809069356683316e-02}}, + {{ 2.224213393203463e-04, 5.170341620923537e+00,-1.817664016563279e-02}}, + {{ 5.011145194424460e-05, 1.342402667319555e+00,-1.842043312083783e-02}}, + {{ 1.083732897435760e-05, 3.797649020895159e+00,-1.866422607604287e-02}}, + {{ 1.978445332406060e-05, 5.019691662617644e+00,-4.536491371220917e-02}}, +}; + +static const struct Tass17Term MIMAS_3_1[3] = { + {{ 1.477125534949241e-05, 2.559894425015774e+00, 1.335156871886320e+01}}, + {{ 6.813829579894155e-06, 1.873548125001586e+00, 1.335132492590799e+01}}, + {{ 6.707536779238787e-06, 1.046480714401697e-01, 1.335181251181840e+01}}, +}; + +static const struct Tass17MultiTerm MIMAS_3[2] = { + {{-1, 0, 2, 0, 0, 0, 0, 0}, 29,MIMAS_3_0}, + {{ 3, 0,-2, 0, 0, 0, 0, 0}, 3,MIMAS_3_1}, +}; + +static const struct Tass17Term ENCELADUS_0_0[1] = { + {{ 2.265054397578757e-05, 7.519405621081341e-01, 4.579638210202045e+00}}, +}; + +static const struct Tass17Term ENCELADUS_0_1[1] = { + {{ 7.116593169805980e-06, 5.461033287440088e-01, 2.514460612958353e+00}}, +}; + +static const struct Tass17MultiTerm ENCELADUS_0[2] = { + {{ 0, 2, 0,-2, 0, 0, 0, 0}, 1,ENCELADUS_0_0}, + {{ 0, 2,-2, 0, 0, 0, 0, 0}, 1,ENCELADUS_0_1}, +}; + +static const struct Tass17Term ENCELADUS_1_0[3] = { + {{ 4.496393702552367e-03, 2.342959364982154e+00, 1.549375812779411e-03}}, + {{ 3.354575501528797e-03, 4.597833882505114e+00, 4.427150026633873e-03}}, + {{ 3.106536996299520e-05, 2.912482457830643e+00, 8.854300053267745e-03}}, +}; + +static const struct Tass17Term ENCELADUS_1_1[1] = { + {{ 4.253124471669380e-06, 1.946766624913765e+00, 2.289819105101023e+00}}, +}; + +static const struct Tass17Term ENCELADUS_1_2[1] = { + {{ 2.407327778886120e-05, 4.985440644756694e+00, 1.257230306479177e+00}}, +}; + +static const struct Tass17Term ENCELADUS_1_3[1] = { + {{ 5.359800347726300e-06, 1.150736720732397e+00, 8.382988370771400e+00}}, +}; + +static const struct Tass17Term ENCELADUS_1_4[1] = { + {{ 2.157848301674358e-05, 3.893533207807963e+00, 4.579638210202045e+00}}, +}; + +static const struct Tass17Term ENCELADUS_1_5[1] = { + {{ 2.107499273982886e-05, 5.461033287440088e-01, 2.514460612958353e+00}}, +}; + +static const struct Tass17Term ENCELADUS_1_6[1] = { + {{ 1.204571746494518e-05, 3.481858748969675e+00, 4.492830157146606e-01}}, +}; + +static const struct Tass17Term ENCELADUS_1_7[1] = { + {{ 1.082902927586888e-05, 2.389951319910909e+00, 3.771690919437530e+00}}, +}; + +static const struct Tass17Term ENCELADUS_1_8[1] = { + {{ 6.457229782189520e-06, 4.233799311077810e+00, 5.028921225916706e+00}}, +}; + +static const struct Tass17Term ENCELADUS_1_9[1] = { + {{ 4.159628279141040e-06, 6.077647302244714e+00, 6.286151532395882e+00}}, +}; + +static const struct Tass17MultiTerm ENCELADUS_1[10] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0}, 3,ENCELADUS_1_0}, + {{ 0, 1, 0,-1, 0, 0, 0, 0}, 1,ENCELADUS_1_1}, + {{ 0, 1,-1, 0, 0, 0, 0, 0}, 1,ENCELADUS_1_2}, + {{ 0, 2, 0, 0, 0,-2, 0, 0}, 1,ENCELADUS_1_3}, + {{ 0, 2, 0,-2, 0, 0, 0, 0}, 1,ENCELADUS_1_4}, + {{ 0, 2,-2, 0, 0, 0, 0, 0}, 1,ENCELADUS_1_5}, + {{ 0, 2,-4, 2, 0, 0, 0, 0}, 1,ENCELADUS_1_6}, + {{ 0, 3,-3, 0, 0, 0, 0, 0}, 1,ENCELADUS_1_7}, + {{ 0, 4,-4, 0, 0, 0, 0, 0}, 1,ENCELADUS_1_8}, + {{ 0, 5,-5, 0, 0, 0, 0, 0}, 1,ENCELADUS_1_9}, +}; + +static const struct Tass17Term ENCELADUS_2_0[1] = { + {{ 6.526400221336371e-06, 2.681979744993624e+00, 2.445958739557666e-05}}, +}; + +static const struct Tass17Term ENCELADUS_2_1[1] = { + {{ 4.864126392950970e-06, 2.790627620835740e+00,-3.797451619237667e+00}}, +}; + +static const struct Tass17Term ENCELADUS_2_2[5] = { + {{ 5.778112672027477e-06, 1.733182516415079e+00, 1.471391305053998e-03}}, + {{ 7.443719437241270e-06, 3.988057033938039e+00, 4.349165518908460e-03}}, + {{ 4.803805197845248e-03, 3.189423405738944e+00, 5.898541331687871e-03}}, + {{ 1.097719996101334e-04, 5.532383110312554e+00, 7.447917144467280e-03}}, + {{ 6.715628349206410e-06, 4.645664974245721e+00, 1.032569135832174e-02}}, +}; + +static const struct Tass17Term ENCELADUS_2_3[1] = { + {{ 5.311492417496450e-06, 2.536683592343353e-01, 2.071076138575381e+00}}, +}; + +static const struct Tass17Term ENCELADUS_2_4[1] = { + {{ 1.576763094428542e-03, 7.997716879783442e-01, 4.585536751533733e+00}}, +}; + +static const struct Tass17Term ENCELADUS_2_5[1] = { + {{ 1.305558563149728e-05, 4.693005675247022e+00, 8.138458320962040e-01}}, +}; + +static const struct Tass17Term ENCELADUS_2_6[1] = { + {{ 2.328380239517312e-05, 5.990750337669914e+00,-4.433844743829719e-01}}, +}; + +static const struct Tass17Term ENCELADUS_2_7[1] = { + {{ 1.134789737634680e-05, 4.693304903676271e+00, 9.165174961735778e+00}}, +}; + +static const struct Tass17Term ENCELADUS_2_8[1] = { + {{ 5.297748739729408e-06, 4.146902346503011e+00,-1.700614780862149e+00}}, +}; + +static const struct Tass17MultiTerm ENCELADUS_2[9] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0}, 1,ENCELADUS_2_0}, + {{ 0,-1, 0, 0, 0, 2, 0, 0}, 1,ENCELADUS_2_1}, + {{ 0,-1, 0, 2, 0, 0, 0, 0}, 5,ENCELADUS_2_2}, + {{ 0,-1, 2, 0, 0, 0, 0, 0}, 1,ENCELADUS_2_3}, + {{ 0, 1, 0, 0, 0, 0, 0, 0}, 1,ENCELADUS_2_4}, + {{ 0,-2, 3, 0, 0, 0, 0, 0}, 1,ENCELADUS_2_5}, + {{ 0,-3, 4, 0, 0, 0, 0, 0}, 1,ENCELADUS_2_6}, + {{ 0, 3, 0,-2, 0, 0, 0, 0}, 1,ENCELADUS_2_7}, + {{ 0,-4, 5, 0, 0, 0, 0, 0}, 1,ENCELADUS_2_8}, +}; + +static const struct Tass17Term ENCELADUS_3_0[1] = { + {{ 1.280938903343441e-04, 1.983149608096680e+00,-7.280483472742215e-03}}, +}; + +static const struct Tass17Term ENCELADUS_3_1[3] = { + {{ 3.085667117081219e-05, 3.937780549016139e+00,-3.452416044929610e-03}}, + {{ 1.421727517964700e-05, 4.624126849030327e+00,-3.208623089724569e-03}}, + {{ 1.420735399816070e-05, 1.098415954121576e-01,-3.696209000134648e-03}}, +}; + +static const struct Tass17MultiTerm ENCELADUS_3[2] = { + {{ 0,-1, 0, 2, 0, 0, 0, 0}, 1,ENCELADUS_3_0}, + {{-1, 0, 2, 0, 0, 0, 0, 0}, 3,ENCELADUS_3_1}, +}; + +static const struct Tass17Term TETHYS_0_0[1] = { + {{ 8.692361446792260e-06, 3.746226045578181e+00, 5.868527757813049e+00}}, +}; + +static const struct Tass17Term TETHYS_0_1[1] = { + {{ 9.773647178903700e-06, 3.347429921083522e+00, 2.065177597243693e+00}}, +}; + +static const struct Tass17Term TETHYS_0_2[1] = { + {{ 6.341490354446320e-06, 3.087559012405942e-01, 3.097766395865539e+00}}, +}; + +static const struct Tass17MultiTerm TETHYS_0[3] = { + {{ 0, 0, 2, 0, 0,-2, 0, 0}, 1,TETHYS_0_0}, + {{ 0, 0, 2,-2, 0, 0, 0, 0}, 1,TETHYS_0_1}, + {{ 0, 0, 3,-3, 0, 0, 0, 0}, 1,TETHYS_0_2}, +}; + +static const struct Tass17Term TETHYS_1_0[28] = { + {{ 3.094782117290198e-06, 1.804019257682701e+00, 1.990850081500073e-05}}, + {{ 1.001557835312868e-05, 6.318891585209909e-01, 6.603809798462935e-05}}, + {{ 1.080021159829085e-05, 5.577501069793485e+00, 8.594659879963006e-05}}, + {{ 4.021385382444620e-06, 4.239927673886392e+00, 1.058550996146308e-04}}, + {{ 2.555821179926381e-05, 1.392030537400290e+00, 1.578463564054092e-04}}, + {{ 1.267528991884128e-05, 3.196049795082991e+00, 1.777548572204099e-04}}, + {{ 1.157195347749026e-05, 5.165512349511074e+00, 2.238844543900385e-04}}, + {{ 3.597193003482037e-02, 3.827938953603982e+00, 2.437929552050393e-04}}, + {{ 9.845954273310880e-06, 5.631958211286683e+00, 2.637014560200400e-04}}, + {{ 9.194949884833879e-06, 1.318235458535180e+00, 3.098310531896687e-04}}, + {{ 9.815613284418477e-06, 6.263847369807674e+00, 3.297395540046694e-04}}, + {{ 1.717434823483564e-05, 2.078376837414479e+00, 4.016393116104485e-04}}, + {{ 3.432162123697680e-05, 4.514285253618171e+00, 4.875859104100786e-04}}, + {{ 7.218512993756520e-06, 3.808601016232069e+00, 5.735325092097087e-04}}, + {{ 1.266151790256666e-05, 5.906315791018461e+00, 6.454322668154877e-04}}, + {{ 5.891806577851199e-04, 5.200631553632359e+00, 7.313788656151179e-04}}, + {{ 1.323271931613666e-05, 1.353354662656465e+00, 8.173254644147480e-04}}, + {{ 1.697093421514454e-05, 2.901388464811505e-01, 1.218964776025196e-03}}, + {{ 3.767845663771360e-06, 3.010923272601534e+00, 1.366310570108340e-02}}, + {{ 6.001489632871980e-06, 2.305239035215433e+00, 1.374905229988303e-02}}, + {{ 8.037140287447099e-06, 5.556769190259295e-01, 1.390689865628844e-02}}, + {{ 3.600130988680400e-06, 1.242023219040118e+00, 1.415069161149348e-02}}, + {{ 5.489567383712060e-06, 5.363389816540173e-01, 1.423663821029311e-02}}, + {{ 1.052724821924284e-05, 3.978588911909874e+00, 2.743206650178144e-02}}, + {{ 4.944669618681220e-05, 1.523342558334271e+00, 2.767585945698648e-02}}, + {{ 1.049859753280688e-04, 5.351281511938252e+00, 2.791965241219151e-02}}, + {{ 4.772345678736420e-05, 6.037627811952441e+00, 2.816344536739655e-02}}, + {{ 9.867772453097199e-06, 4.407888047870434e-01, 2.840723832260159e-02}}, +}; + +static const struct Tass17Term TETHYS_1_1[1] = { + {{ 3.381153874922860e-06, 3.443909349583986e+00, 2.934263878906524e+00}}, +}; + +static const struct Tass17Term TETHYS_1_2[1] = { + {{ 4.252829449661740e-06, 2.159362918305770e+00, 1.937452727948935e+00}}, +}; + +static const struct Tass17Term TETHYS_1_3[1] = { + {{ 2.857487995253398e-05, 1.029186337468635e-01, 1.032588798621846e+00}}, +}; + +static const struct Tass17Term TETHYS_1_4[1] = { + {{ 1.086312362376316e-05, 3.746226045578181e+00, 5.868527757813049e+00}}, +}; + +static const struct Tass17Term TETHYS_1_5[1] = { + {{ 5.706936513245540e-06, 1.177133183021748e+00, 3.874905455897870e+00}}, +}; + +static const struct Tass17Term TETHYS_1_6[1] = { + {{ 2.612226809076254e-05, 3.347429921083522e+00, 2.065177597243693e+00}}, +}; + +static const struct Tass17Term TETHYS_1_7[1] = { + {{ 1.309044788609482e-05, 3.087559012405942e-01, 3.097766395865539e+00}}, +}; + +static const struct Tass17Term TETHYS_1_8[1] = { + {{ 7.589604761197260e-06, 3.553267188577251e+00, 4.130355194487387e+00}}, +}; + +static const struct Tass17Term TETHYS_1_9[1] = { + {{ 4.749981493034660e-06, 5.145931687343214e-01, 5.162943993109232e+00}}, +}; + +static const struct Tass17Term TETHYS_1_10[1] = { + {{ 4.209916715651780e-06, 1.843847991166901e+00, 1.257230306479177e+00}}, +}; + +static const struct Tass17Term TETHYS_1_11[1] = { + {{ 9.634177151388563e-06, 3.197170586335357e+00, 2.290686578839635e-01}}, +}; + +static const struct Tass17Term TETHYS_1_12[1] = { + {{ 3.367826063379420e-06, 3.687695982333802e+00, 2.514460612958353e+00}}, +}; + +static const struct Tass17MultiTerm TETHYS_1[13] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0}, 28,TETHYS_1_0}, + {{ 0, 0, 1, 0, 0,-1, 0, 0}, 1,TETHYS_1_1}, + {{ 0, 0, 1, 0,-1, 0, 0, 0}, 1,TETHYS_1_2}, + {{ 0, 0, 1,-1, 0, 0, 0, 0}, 1,TETHYS_1_3}, + {{ 0, 0, 2, 0, 0,-2, 0, 0}, 1,TETHYS_1_4}, + {{ 0, 0, 2, 0,-2, 0, 0, 0}, 1,TETHYS_1_5}, + {{ 0, 0, 2,-2, 0, 0, 0, 0}, 1,TETHYS_1_6}, + {{ 0, 0, 3,-3, 0, 0, 0, 0}, 1,TETHYS_1_7}, + {{ 0, 0, 4,-4, 0, 0, 0, 0}, 1,TETHYS_1_8}, + {{ 0, 0, 5,-5, 0, 0, 0, 0}, 1,TETHYS_1_9}, + {{ 0, 1,-1, 0, 0, 0, 0, 0}, 1,TETHYS_1_10}, + {{ 0, 1,-2, 1, 0, 0, 0, 0}, 1,TETHYS_1_11}, + {{ 0, 2,-2, 0, 0, 0, 0, 0}, 1,TETHYS_1_12}, +}; + +static const struct Tass17Term TETHYS_2_0[1] = { + {{ 2.463670320328344e-05, 2.681979744993623e+00, 2.445958739557666e-05}}, +}; + +static const struct Tass17Term TETHYS_2_1[1] = { + {{ 6.736048525042149e-06, 1.795199654407042e+00, 3.940425661480334e-01}}, +}; + +static const struct Tass17Term TETHYS_2_2[1] = { + {{ 1.012648120942390e-05, 4.634475612002642e+00,-2.540221312758490e+00}}, +}; + +static const struct Tass17Term TETHYS_2_3[1] = { + {{ 1.316230344933185e-05, 9.203831673794880e-01,-5.465990108433128e-01}}, +}; + +static const struct Tass17Term TETHYS_2_4[1] = { + {{ 9.537957898915770e-06, 1.891679082907508e+00, 1.263128847810865e+00}}, +}; + +static const struct Tass17Term TETHYS_2_5[1] = { + {{ 1.026432488829525e-03, 5.239109003991030e+00, 3.328306445054557e+00}}, +}; + +static const struct Tass17Term TETHYS_2_6[1] = { + {{ 4.858676635900159e-05, 4.930353102750437e+00, 2.305400491890175e-01}}, +}; + +static const struct Tass17Term TETHYS_2_7[1] = { + {{ 1.274174154891934e-05, 4.827434469003571e+00,-8.020487494328282e-01}}, +}; + +static const struct Tass17Term TETHYS_2_8[1] = { + {{ 4.893120486700722e-06, 1.582923181666916e+00,-1.834637548054674e+00}}, +}; + +static const struct Tass17Term TETHYS_2_9[1] = { + {{ 1.379536465955919e-05, 4.874775170004872e+00, 1.471391305053998e-03}}, +}; + +static const struct Tass17Term TETHYS_2_10[1] = { + {{ 4.496122761411780e-06, 2.849157684080121e+00,-4.433844743829719e-01}}, +}; + +static const struct Tass17Term TETHYS_2_11[12] = { + {{ 1.564767415994558e-04, 4.568461127222154e+00, 3.458059983814795e-03}}, + {{ 8.681007704489939e-05, 7.405221736181721e-01, 3.214267028609755e-03}}, + {{ 8.168879255357250e-05, 5.941153727250531e+00, 3.945645894224873e-03}}, + {{ 8.101165266469901e-05, 3.195768527193775e+00, 2.970474073404717e-03}}, + {{ 7.081435508752854e-05, 5.254807427236342e+00, 3.701852939019836e-03}}, + {{ 1.795872905935810e-05, 3.443147200851330e-01, 4.189438849429914e-03}}, + {{ 1.765915793094640e-05, 5.651014880769380e+00, 2.726681118199677e-03}}, + {{ 6.448693043220393e-06, 8.713108941844011e-01,-1.044883867247364e-02}}, + {{ 4.134187193316490e-06, 3.483793623207228e-02, 3.300213627409385e-03}}, + {{ 4.064250964938940e-06, 5.960491664622441e+00, 3.615906340220205e-03}}, + {{ 3.921367852619880e-06, 1.030661020099323e+00, 4.433231804634951e-03}}, + {{ 3.847793440490170e-06, 1.823075927165398e+00, 2.482888162994638e-03}}, +}; + +static const struct Tass17MultiTerm TETHYS_2[12] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0}, 1,TETHYS_2_0}, + {{ 0, 0, 0, 0, 0, 1, 0, 0}, 1,TETHYS_2_1}, + {{ 0, 0,-1, 0, 0, 2, 0, 0}, 1,TETHYS_2_2}, + {{ 0, 0,-1, 0, 2, 0, 0, 0}, 1,TETHYS_2_3}, + {{ 0, 0,-1, 2, 0, 0, 0, 0}, 1,TETHYS_2_4}, + {{ 0, 0, 1, 0, 0, 0, 0, 0}, 1,TETHYS_2_5}, + {{ 0, 0,-2, 3, 0, 0, 0, 0}, 1,TETHYS_2_6}, + {{ 0, 0,-3, 4, 0, 0, 0, 0}, 1,TETHYS_2_7}, + {{ 0, 0,-4, 5, 0, 0, 0, 0}, 1,TETHYS_2_8}, + {{ 0,-1, 0, 2, 0, 0, 0, 0}, 1,TETHYS_2_9}, + {{ 0,-3, 4, 0, 0, 0, 0, 0}, 1,TETHYS_2_10}, + {{-1, 0, 2, 0, 0, 0, 0, 0}, 12,TETHYS_2_11}, +}; + +static const struct Tass17Term TETHYS_3_0[2] = { + {{ 6.111685892210941e-06, 6.135349392018898e+00,-2.445240135601595e-05}}, + {{ 4.341737854415172e-06, 2.696600432337302e+00,-4.804041710792879e-04}}, +}; + +static const struct Tass17Term TETHYS_3_1[30] = { + {{ 8.097194747293030e-06, 1.086326741907496e+00,-2.233451268904413e-03}}, + {{ 3.696660017446820e-05, 3.999804418933084e-01,-2.477244224109452e-03}}, + {{ 3.369179308695820e-06, 2.149542558082810e+00,-2.635090580514859e-03}}, + {{ 1.634061837956512e-04, 5.996819449058704e+00,-2.721037179314491e-03}}, + {{ 3.688282109438380e-06, 4.193183792652183e-01,-2.806983778114122e-03}}, + {{ 1.001531421510340e-05, 1.463196258068622e+00,-2.878883535719899e-03}}, + {{ 7.269088792971872e-04, 5.310473149044516e+00,-2.964830134519532e-03}}, + {{ 1.307143245256740e-05, 6.016157386430616e+00,-3.050776733319159e-03}}, + {{ 3.003084312634590e-05, 7.768499580544321e-01,-3.122676490924936e-03}}, + {{ 3.578626570900766e-03, 4.624126849030327e+00,-3.208623089724569e-03}}, + {{ 3.863423686243950e-05, 5.329811086416426e+00,-3.294569688524200e-03}}, + {{ 1.853853482238710e-05, 9.050365804024403e-02,-3.366469446129977e-03}}, + {{ 7.978986672131195e-03, 3.937780549016139e+00,-3.452416044929610e-03}}, + {{ 1.026902134395760e-05, 4.643464786402239e+00,-3.538362643729240e-03}}, + {{ 2.358139037174070e-05, 5.687342665205642e+00,-3.610262401335017e-03}}, + {{ 3.586811056529552e-03, 1.098415954121576e-01,-3.696209000134648e-03}}, + {{ 1.598764340805630e-05, 3.957118486388051e+00,-3.782155598934278e-03}}, + {{ 1.348141163501630e-05, 1.859403711601660e+00,-3.854055356540055e-03}}, + {{ 7.456079964789274e-04, 2.565087948987761e+00,-3.940001955339688e-03}}, + {{ 8.589176280796499e-06, 1.291795327840677e-01,-4.025948554139318e-03}}, + {{ 4.417994658707790e-06, 4.314650065177265e+00,-4.097848311745095e-03}}, + {{ 1.629278673196500e-04, 5.020334302563366e+00,-4.183794910544728e-03}}, + {{ 3.605229442958720e-05, 1.192395348959384e+00,-4.427587865749766e-03}}, + {{ 7.804425391545350e-06, 3.647641702534988e+00,-4.671380820954806e-03}}, + {{ 3.824550961047250e-06, 4.774776807336220e+00, 2.397965045685182e-02}}, + {{ 8.194661069081041e-06, 2.319530453760617e+00, 2.422344341205686e-02}}, + {{ 5.770004540143910e-06, 6.147469407364597e+00, 2.446723636726190e-02}}, + {{ 8.055438816212310e-06, 5.506304001991995e-01, 2.471102932246693e-02}}, + {{ 3.690275690503300e-06, 1.236976700213389e+00, 2.495482227767198e-02}}, + {{ 1.403252488381090e-05, 4.869684344257474e+00,-3.137206845712112e-02}}, +}; + +static const struct Tass17Term TETHYS_3_2[1] = { + {{ 4.066369173620947e-06, 2.572521517863344e-01, 6.660065306154045e+00}}, +}; + +static const struct Tass17MultiTerm TETHYS_3[3] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0}, 2,TETHYS_3_0}, + {{-1, 0, 2, 0, 0, 0, 0, 0}, 30,TETHYS_3_1}, + {{ 1, 0, 0, 0, 0, 0, 0, 0}, 1,TETHYS_3_2}, +}; + +static const struct Tass17Term DIONE_0_0[1] = { + {{ 5.044474622853420e-06, 5.198036938148699e+00, 9.048639293270888e-01}}, +}; + +static const struct Tass17Term DIONE_0_1[1] = { + {{ 1.975589414013096e-05, 3.540388778084452e+00, 3.803350160569355e+00}}, +}; + +static const struct Tass17Term DIONE_0_2[1] = { + {{ 1.231028575289072e-05, 9.712959155280194e-01, 1.809727858654177e+00}}, +}; + +static const struct Tass17Term DIONE_0_3[1] = { + {{ 5.098846661514180e-06, 5.981941867419887e-01, 5.705025240854031e+00}}, +}; + +static const struct Tass17Term DIONE_0_4[1] = { + {{ 7.467512730405980e-06, 3.027740200086925e+00, 2.714591787981265e+00}}, +}; + +static const struct Tass17Term DIONE_0_5[1] = { + {{ 4.727673963003260e-06, 5.084184484645832e+00, 3.619455717308356e+00}}, +}; + +static const struct Tass17Term DIONE_0_6[1] = { + {{ 3.991422799327240e-06, 1.029186337468635e-01, 1.032588798621846e+00}}, +}; + +static const struct Tass17Term DIONE_0_7[1] = { + {{ 4.809588755287700e-06, 2.058372674937290e-01, 2.065177597243693e+00}}, +}; + +static const struct Tass17Term DIONE_0_8[1] = { + {{ 4.044589508141894e-06, 2.614152002392929e-01, 2.294246255127657e+00}}, +}; + +static const struct Tass17MultiTerm DIONE_0[9] = { + {{ 0, 0, 0, 1,-1, 0, 0, 0}, 1,DIONE_0_0}, + {{ 0, 0, 0, 2, 0,-2, 0, 0}, 1,DIONE_0_1}, + {{ 0, 0, 0, 2,-2, 0, 0, 0}, 1,DIONE_0_2}, + {{ 0, 0, 0, 3, 0,-3, 0, 0}, 1,DIONE_0_3}, + {{ 0, 0, 0, 3,-3, 0, 0, 0}, 1,DIONE_0_4}, + {{ 0, 0, 0, 4,-4, 0, 0, 0}, 1,DIONE_0_5}, + {{ 0, 0, 1,-1, 0, 0, 0, 0}, 1,DIONE_0_6}, + {{ 0, 0, 2,-2, 0, 0, 0, 0}, 1,DIONE_0_7}, + {{ 0, 1, 0,-1, 0, 0, 0, 0}, 1,DIONE_0_8}, +}; + +static const struct Tass17Term DIONE_1_0[3] = { + {{ 1.253214092917414e-04, 5.484552018571947e+00, 1.549375812779411e-03}}, + {{ 9.470863297623297e-05, 1.456241228915321e+00, 4.427150026633873e-03}}, + {{ 2.711677399803780e-06, 6.054075111420435e+00, 8.854300053267745e-03}}, +}; + +static const struct Tass17Term DIONE_1_1[1] = { + {{ 4.269998249018742e-06, 5.396405225690409e+00, 3.940181065606379e-01}}, +}; + +static const struct Tass17Term DIONE_1_2[1] = { + {{ 1.025994897473446e-05, 1.993980622473295e-01, 1.901675080284677e+00}}, +}; + +static const struct Tass17Term DIONE_1_3[1] = { + {{ 2.682461086510494e-05, 5.198036938148699e+00, 9.048639293270888e-01}}, +}; + +static const struct Tass17Term DIONE_1_4[1] = { + {{ 2.565388997294820e-05, 3.540388778084452e+00, 3.803350160569355e+00}}, +}; + +static const struct Tass17Term DIONE_1_5[1] = { + {{ 3.125192040346257e-06, 1.285576205981393e+00, 3.409332054008717e+00}}, +}; + +static const struct Tass17Term DIONE_1_6[1] = { + {{ 2.717321774931640e-05, 9.712959155280194e-01, 1.809727858654177e+00}}, +}; + +static const struct Tass17Term DIONE_1_7[1] = { + {{ 5.552232090659460e-06, 5.981941867419887e-01, 5.705025240854031e+00}}, +}; + +static const struct Tass17Term DIONE_1_8[1] = { + {{ 1.270721017173096e-05, 3.027740200086925e+00, 2.714591787981265e+00}}, +}; + +static const struct Tass17Term DIONE_1_9[1] = { + {{ 6.847120194215620e-06, 5.084184484645832e+00, 3.619455717308356e+00}}, +}; + +static const struct Tass17Term DIONE_1_10[1] = { + {{ 3.974354213288560e-06, 8.574434620251531e-01, 4.524319646635444e+00}}, +}; + +static const struct Tass17Term DIONE_1_11[1] = { + {{ 1.499025754719972e-05, 3.244511287336658e+00, 1.032588798621846e+00}}, +}; + +static const struct Tass17Term DIONE_1_12[1] = { + {{ 1.201329949530382e-05, 2.058372674937290e-01, 2.065177597243693e+00}}, +}; + +static const struct Tass17Term DIONE_1_13[1] = { + {{ 6.090479694942740e-06, 3.450348554830387e+00, 3.097766395865539e+00}}, +}; + +static const struct Tass17Term DIONE_1_14[1] = { + {{ 3.552297626424840e-06, 4.116745349874580e-01, 4.130355194487387e+00}}, +}; + +static const struct Tass17Term DIONE_1_15[1] = { + {{ 4.723715451200404e-06, 3.403007853829086e+00, 2.294246255127657e+00}}, +}; + +static const struct Tass17Term DIONE_1_16[1] = { + {{ 4.770404124767720e-06, 5.557793274556413e-02, 2.290686578839635e-01}}, +}; + +static const struct Tass17MultiTerm DIONE_1[17] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0}, 3,DIONE_1_0}, + {{ 0, 0, 0, 0, 0, 1, 0, 0}, 1,DIONE_1_1}, + {{ 0, 0, 0, 1, 0,-1, 0, 0}, 1,DIONE_1_2}, + {{ 0, 0, 0, 1,-1, 0, 0, 0}, 1,DIONE_1_3}, + {{ 0, 0, 0, 2, 0,-2, 0, 0}, 1,DIONE_1_4}, + {{ 0, 0, 0, 2, 0,-3, 0, 0}, 1,DIONE_1_5}, + {{ 0, 0, 0, 2,-2, 0, 0, 0}, 1,DIONE_1_6}, + {{ 0, 0, 0, 3, 0,-3, 0, 0}, 1,DIONE_1_7}, + {{ 0, 0, 0, 3,-3, 0, 0, 0}, 1,DIONE_1_8}, + {{ 0, 0, 0, 4,-4, 0, 0, 0}, 1,DIONE_1_9}, + {{ 0, 0, 0, 5,-5, 0, 0, 0}, 1,DIONE_1_10}, + {{ 0, 0, 1,-1, 0, 0, 0, 0}, 1,DIONE_1_11}, + {{ 0, 0, 2,-2, 0, 0, 0, 0}, 1,DIONE_1_12}, + {{ 0, 0, 3,-3, 0, 0, 0, 0}, 1,DIONE_1_13}, + {{ 0, 0, 4,-4, 0, 0, 0, 0}, 1,DIONE_1_14}, + {{ 0, 1, 0,-1, 0, 0, 0, 0}, 1,DIONE_1_15}, + {{ 0, 1,-2, 1, 0, 0, 0, 0}, 1,DIONE_1_16}, +}; + +static const struct Tass17Term DIONE_2_0[1] = { + {{ 1.172252747692422e-04, 2.681979734714067e+00, 2.445958739557666e-05}}, +}; + +static const struct Tass17Term DIONE_2_1[1] = { + {{ 1.288509519128533e-05, 1.795199654407042e+00, 3.940425661480334e-01}}, +}; + +static const struct Tass17Term DIONE_2_2[1] = { + {{ 3.368317726971210e-06, 3.079746085685258e+00, 1.390853717105622e+00}}, +}; + +static const struct Tass17Term DIONE_2_3[1] = { + {{ 2.527837703075836e-05, 1.595801592159713e+00,-1.507632514136644e+00}}, +}; + +static const struct Tass17Term DIONE_2_4[1] = { + {{ 3.539705714890319e-06, 3.850614164262772e+00,-1.113614407576006e+00}}, +}; + +static const struct Tass17Term DIONE_2_5[1] = { + {{ 2.594271531157734e-05, 1.023301801126352e+00, 4.859897877785333e-01}}, +}; + +static const struct Tass17Term DIONE_2_6[1] = { + {{ 6.245540270289302e-04, 1.994597716654372e+00, 2.295717646432711e+00}}, +}; + +static const struct Tass17Term DIONE_2_7[1] = { + {{ 4.309530620212000e-06, 4.537996183502177e+00,-3.409307594421322e+00}}, +}; + +static const struct Tass17Term DIONE_2_8[1] = { + {{ 2.669607656360495e-05, 2.108450170157240e+00,-4.188741415485552e-01}}, +}; + +static const struct Tass17Term DIONE_2_9[1] = { + {{ 6.968783491136024e-06, 5.200588559833291e-02,-1.323738070875643e+00}}, +}; + +static const struct Tass17Term DIONE_2_10[1] = { + {{ 3.304505798253070e-06, 4.278746908219012e+00,-2.228602000202733e+00}}, +}; + +static const struct Tass17Term DIONE_2_11[1] = { + {{ 3.787380702785700e-06, 5.033271736497301e+00, 1.263128847810865e+00}}, +}; + +static const struct Tass17Term DIONE_2_12[1] = { + {{ 2.859852996917539e-05, 1.788760449160644e+00, 2.305400491890175e-01}}, +}; + +static const struct Tass17Term DIONE_2_13[1] = { + {{ 7.799304255363336e-06, 1.685841815413778e+00,-8.020487494328282e-01}}, +}; + +static const struct Tass17Term DIONE_2_14[1] = { + {{ 2.969852804959130e-06, 4.724515835256708e+00,-1.834637548054674e+00}}, +}; + +static const struct Tass17Term DIONE_2_15[5] = { + {{ 5.709737153001810e-06, 5.673408458612511e+00,-7.798450772541216e-05}}, + {{ 2.203368656279073e-03, 4.874775170004872e+00, 1.471391305053998e-03}}, + {{ 4.177951671700660e-06, 3.418533941089551e+00,-2.955758721579874e-03}}, + {{ 5.709763882914900e-06, 9.345492278074399e-01, 3.020767117833410e-03}}, + {{ 1.886080065709498e-05, 3.189421946098056e+00, 5.898541331687871e-03}}, +}; + +static const struct Tass17Term DIONE_2_16[1] = { + {{ 2.618379490210864e-06, 1.426868473632360e+00, 3.458059983814795e-03}}, +}; + +static const struct Tass17MultiTerm DIONE_2[17] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0}, 1,DIONE_2_0}, + {{ 0, 0, 0, 0, 0, 1, 0, 0}, 1,DIONE_2_1}, + {{ 0, 0, 0, 0, 1, 0, 0, 0}, 1,DIONE_2_2}, + {{ 0, 0, 0,-1, 0, 2, 0, 0}, 1,DIONE_2_3}, + {{ 0, 0, 0,-1, 0, 3, 0, 0}, 1,DIONE_2_4}, + {{ 0, 0, 0,-1, 2, 0, 0, 0}, 1,DIONE_2_5}, + {{ 0, 0, 0, 1, 0, 0, 0, 0}, 1,DIONE_2_6}, + {{ 0, 0, 0,-2, 0, 3, 0, 0}, 1,DIONE_2_7}, + {{ 0, 0, 0,-2, 3, 0, 0, 0}, 1,DIONE_2_8}, + {{ 0, 0, 0,-3, 4, 0, 0, 0}, 1,DIONE_2_9}, + {{ 0, 0, 0,-4, 5, 0, 0, 0}, 1,DIONE_2_10}, + {{ 0, 0,-1, 2, 0, 0, 0, 0}, 1,DIONE_2_11}, + {{ 0, 0,-2, 3, 0, 0, 0, 0}, 1,DIONE_2_12}, + {{ 0, 0,-3, 4, 0, 0, 0, 0}, 1,DIONE_2_13}, + {{ 0, 0,-4, 5, 0, 0, 0, 0}, 1,DIONE_2_14}, + {{ 0,-1, 0, 2, 0, 0, 0, 0}, 5,DIONE_2_15}, + {{-1, 0, 2, 0, 0, 0, 0, 0}, 1,DIONE_2_16}, +}; + +static const struct Tass17Term DIONE_3_0[2] = { + {{ 2.282739732511724e-05, 6.135349401370048e+00,-2.445240135601595e-05}}, + {{ 3.529922124449878e-05, 2.632866665182736e+00,-4.804041710792879e-04}}, +}; + +static const struct Tass17Term DIONE_3_1[1] = { + {{ 1.655363859165119e-04, 1.556643393089241e+00,-1.471954902036816e-03}}, +}; + +static const struct Tass17Term DIONE_3_2[5] = { + {{ 2.754688236937855e-05, 7.961878954263457e-01,-3.452416044929610e-03}}, + {{ 1.269228313121738e-05, 1.482534195440534e+00,-3.208623089724569e-03}}, + {{ 1.268342612853373e-05, 3.251434249001951e+00,-3.696209000134648e-03}}, + {{ 2.655183882413472e-06, 2.168880495454724e+00,-2.964830134519532e-03}}, + {{ 2.629764340505144e-06, 5.706680602577554e+00,-3.940001955339688e-03}}, +}; + +static const struct Tass17MultiTerm DIONE_3[3] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0}, 2,DIONE_3_0}, + {{ 0,-1, 0, 2, 0, 0, 0, 0}, 1,DIONE_3_1}, + {{-1, 0, 2, 0, 0, 0, 0, 0}, 5,DIONE_3_2}, +}; + +static const struct Tass17Term RHEA_0_0[1] = { + {{ 1.460129617898124e-05, 4.426139084868009e+00, 9.968111509575888e-01}}, +}; + +static const struct Tass17Term RHEA_0_1[1] = { + {{ 6.497476875291102e-05, 5.710685516146226e+00, 1.993622301915178e+00}}, +}; + +static const struct Tass17Term RHEA_0_2[1] = { + {{ 8.448119776705509e-06, 3.455872944043167e+00, 1.599604195354539e+00}}, +}; + +static const struct Tass17Term RHEA_0_3[1] = { + {{ 2.344587498942920e-05, 7.120466402448569e-01, 2.990433452872767e+00}}, +}; + +static const struct Tass17Term RHEA_0_4[1] = { + {{ 4.000365153622274e-06, 4.740419375321384e+00, 2.596415346312128e+00}}, +}; + +static const struct Tass17Term RHEA_0_5[1] = { + {{ 8.875319141540999e-06, 1.996593071523072e+00, 3.987244603830355e+00}}, +}; + +static const struct Tass17Term RHEA_0_6[1] = { + {{ 3.452681160707960e-06, 3.281139502801291e+00, 4.984055754787943e+00}}, +}; + +static const struct Tass17Term RHEA_0_7[1] = { + {{ 9.207121596242679e-06, 5.198036938148699e+00, 9.048639293270888e-01}}, +}; + +static const struct Tass17Term RHEA_0_8[1] = { + {{ 4.621278522602440e-06, 4.112888569117812e+00, 1.809727858654177e+00}}, +}; + +static const struct Tass17Term RHEA_0_9[1] = { + {{ 5.977877370825760e-06, 2.159362918305770e+00, 1.937452727948935e+00}}, +}; + +static const struct Tass17MultiTerm RHEA_0[10] = { + {{ 0, 0, 0, 0, 1,-1, 0, 0}, 1,RHEA_0_0}, + {{ 0, 0, 0, 0, 2,-2, 0, 0}, 1,RHEA_0_1}, + {{ 0, 0, 0, 0, 2,-3, 0, 0}, 1,RHEA_0_2}, + {{ 0, 0, 0, 0, 3,-3, 0, 0}, 1,RHEA_0_3}, + {{ 0, 0, 0, 0, 3,-4, 0, 0}, 1,RHEA_0_4}, + {{ 0, 0, 0, 0, 4,-4, 0, 0}, 1,RHEA_0_5}, + {{ 0, 0, 0, 0, 5,-5, 0, 0}, 1,RHEA_0_6}, + {{ 0, 0, 0, 1,-1, 0, 0, 0}, 1,RHEA_0_7}, + {{ 0, 0, 0, 2,-2, 0, 0, 0}, 1,RHEA_0_8}, + {{ 0, 0, 1, 0,-1, 0, 0, 0}, 1,RHEA_0_9}, +}; + +static const struct Tass17Term RHEA_1_0[11] = { + {{ 4.982624562626507e-04, 4.765136030335644e+00, 5.271851040460129e-06}}, + {{ 3.475126795324123e-06, 5.905021737251245e+00, 1.054370208092026e-05}}, + {{ 4.462723299012653e-06, 4.222312533161678e+00, 1.898637155826853e-05}}, + {{ 3.255047679977468e-04, 3.303959081334276e+00, 2.445240135601595e-05}}, + {{ 1.772508422160692e-05, 5.196471838140832e+00, 4.891917479115332e-05}}, + {{ 9.471405209345812e-06, 7.450246191142529e-01, 1.035769927204739e-04}}, + {{ 1.830753059305353e-05, 2.440869213255669e-01, 4.559517697232720e-04}}, + {{ 6.147405445926997e-05, 3.666743633441163e+00, 4.804041710792879e-04}}, + {{ 4.693769190005650e-05, 4.409577074506501e+00, 5.839811637997618e-04}}, + {{ 6.390530214147782e-05, 2.864957498258305e+00, 1.167962327599524e-03}}, + {{ 8.699581713814392e-06, 4.133277437711403e+00, 1.751943491399285e-03}}, +}; + +static const struct Tass17Term RHEA_1_1[1] = { + {{ 8.614402961042187e-06, 5.396405225692853e+00, 3.940181065606379e-01}}, +}; + +static const struct Tass17Term RHEA_1_2[1] = { + {{ 5.229341727885530e-05, 4.426139084868009e+00, 9.968111509575888e-01}}, +}; + +static const struct Tass17Term RHEA_1_3[1] = { + {{ 1.003942988473349e-05, 2.171326512764949e+00, 6.027930443969509e-01}}, +}; + +static const struct Tass17Term RHEA_1_4[1] = { + {{ 3.825560625917272e-06, 6.199699253192279e+00, 2.087749378363131e-01}}, +}; + +static const struct Tass17Term RHEA_1_5[1] = { + {{ 9.265555925994737e-05, 5.710685516146226e+00, 1.993622301915178e+00}}, +}; + +static const struct Tass17Term RHEA_1_6[1] = { + {{ 1.367398797935688e-05, 3.455872944043167e+00, 1.599604195354539e+00}}, +}; + +static const struct Tass17Term RHEA_1_7[1] = { + {{ 2.755180293512720e-05, 7.120466402448569e-01, 2.990433452872767e+00}}, +}; + +static const struct Tass17Term RHEA_1_8[1] = { + {{ 5.024449380692616e-06, 4.740419375321384e+00, 2.596415346312128e+00}}, +}; + +static const struct Tass17Term RHEA_1_9[1] = { + {{ 9.310491515462421e-06, 1.996593071523072e+00, 3.987244603830355e+00}}, +}; + +static const struct Tass17Term RHEA_1_10[1] = { + {{ 2.065629848458831e-06, 6.024965806599599e+00, 3.593226497269717e+00}}, +}; + +static const struct Tass17Term RHEA_1_11[1] = { + {{ 3.359851109236900e-06, 3.281139502801291e+00, 4.984055754787943e+00}}, +}; + +static const struct Tass17Term RHEA_1_12[1] = { + {{ 1.266911496422784e-05, 2.056444284558907e+00, 9.048639293270888e-01}}, +}; + +static const struct Tass17Term RHEA_1_13[1] = { + {{ 9.413368380851320e-06, 4.112888569117812e+00, 1.809727858654177e+00}}, +}; + +static const struct Tass17Term RHEA_1_14[1] = { + {{ 4.460853124280260e-06, 6.169332853676718e+00, 2.714591787981265e+00}}, +}; + +static const struct Tass17Term RHEA_1_15[1] = { + {{ 2.423482201792380e-06, 1.942591831056039e+00, 3.619455717308356e+00}}, +}; + +static const struct Tass17Term RHEA_1_16[1] = { + {{ 3.028875527833520e-06, 5.300955571895564e+00, 1.937452727948935e+00}}, +}; + +static const struct Tass17MultiTerm RHEA_1[17] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0}, 11,RHEA_1_0}, + {{ 0, 0, 0, 0, 0, 1, 0, 0}, 1,RHEA_1_1}, + {{ 0, 0, 0, 0, 1,-1, 0, 0}, 1,RHEA_1_2}, + {{ 0, 0, 0, 0, 1,-2, 0, 0}, 1,RHEA_1_3}, + {{ 0, 0, 0, 0, 1,-3, 0, 0}, 1,RHEA_1_4}, + {{ 0, 0, 0, 0, 2,-2, 0, 0}, 1,RHEA_1_5}, + {{ 0, 0, 0, 0, 2,-3, 0, 0}, 1,RHEA_1_6}, + {{ 0, 0, 0, 0, 3,-3, 0, 0}, 1,RHEA_1_7}, + {{ 0, 0, 0, 0, 3,-4, 0, 0}, 1,RHEA_1_8}, + {{ 0, 0, 0, 0, 4,-4, 0, 0}, 1,RHEA_1_9}, + {{ 0, 0, 0, 0, 4,-5, 0, 0}, 1,RHEA_1_10}, + {{ 0, 0, 0, 0, 5,-5, 0, 0}, 1,RHEA_1_11}, + {{ 0, 0, 0, 1,-1, 0, 0, 0}, 1,RHEA_1_12}, + {{ 0, 0, 0, 2,-2, 0, 0, 0}, 1,RHEA_1_13}, + {{ 0, 0, 0, 3,-3, 0, 0, 0}, 1,RHEA_1_14}, + {{ 0, 0, 0, 4,-4, 0, 0, 0}, 1,RHEA_1_15}, + {{ 0, 0, 1, 0,-1, 0, 0, 0}, 1,RHEA_1_16}, +}; + +static const struct Tass17Term RHEA_2_0[4] = { + {{ 6.496268041362011e-06, 6.195159743999218e-01,-2.445958739557666e-05}}, + {{ 9.712611923476502e-04, 2.687921917028628e+00, 2.445958739557666e-05}}, + {{ 1.671852669066537e-04, 5.358703148577743e-02, 4.806275624808988e-04}}, + {{ 2.256764766375221e-06, 3.428726874313563e-01, 1.143502740203947e-03}}, +}; + +static const struct Tass17Term RHEA_2_1[1] = { + {{ 3.248040932920730e-05, 1.795199654407042e+00, 3.940425661480334e-01}}, +}; + +static const struct Tass17Term RHEA_2_2[1] = { + {{ 1.108384911297719e-04, 3.652245876718619e+00,-6.027685848095554e-01}}, +}; + +static const struct Tass17Term RHEA_2_3[1] = { + {{ 3.382899984196108e-05, 5.907058448821680e+00,-2.087504782489175e-01}}, +}; + +static const struct Tass17Term RHEA_2_4[1] = { + {{ 2.778461053446649e-06, 5.020278361984143e+00, 1.852676283117203e-01}}, +}; + +static const struct Tass17Term RHEA_2_5[1] = { + {{ 3.116043009304567e-04, 6.221338739275052e+00, 1.390853717105622e+00}}, +}; + +static const struct Tass17Term RHEA_2_6[1] = { + {{ 2.241664081352878e-05, 2.367699445440403e+00,-1.599579735767144e+00}}, +}; + +static const struct Tass17Term RHEA_2_7[1] = { + {{ 4.424102595490495e-06, 4.622512017543462e+00,-1.205561629206506e+00}}, +}; + +static const struct Tass17Term RHEA_2_8[1] = { + {{ 6.929884985440310e-06, 1.083153014162185e+00,-2.596390886724733e+00}}, +}; + +static const struct Tass17Term RHEA_2_9[1] = { + {{ 5.779542899092500e-06, 2.507246294651899e+00, 3.384476019020799e+00}}, +}; + +static const struct Tass17Term RHEA_2_10[1] = { + {{ 2.427569664020370e-06, 6.081791890063556e+00,-3.593202037682322e+00}}, +}; + +static const struct Tass17Term RHEA_2_11[1] = { + {{ 2.492530233817800e-06, 3.791792725930115e+00, 4.381287169978387e+00}}, +}; + +static const struct Tass17Term RHEA_2_12[1] = { + {{ 6.766246868422730e-06, 4.164894454716146e+00, 4.859897877785333e-01}}, +}; + +static const struct Tass17Term RHEA_2_13[1] = { + {{ 3.851717115480820e-06, 1.994597716654372e+00, 2.295717646432711e+00}}, +}; + +static const struct Tass17Term RHEA_2_14[1] = { + {{ 1.308501254327346e-05, 5.250042823747033e+00,-4.188741415485552e-01}}, +}; + +static const struct Tass17Term RHEA_2_15[1] = { + {{ 3.467317924478190e-06, 3.193598539188126e+00,-1.323738070875643e+00}}, +}; + +static const struct Tass17Term RHEA_2_16[1] = { + {{ 2.224849328232030e-06, 5.239109003991030e+00, 3.328306445054557e+00}}, +}; + +static const struct Tass17Term RHEA_2_17[1] = { + {{ 7.641483476943351e-06, 1.733182516415079e+00, 1.471391305053998e-03}}, +}; + +static const struct Tass17MultiTerm RHEA_2[18] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0}, 4,RHEA_2_0}, + {{ 0, 0, 0, 0, 0, 1, 0, 0}, 1,RHEA_2_1}, + {{ 0, 0, 0, 0,-1, 2, 0, 0}, 1,RHEA_2_2}, + {{ 0, 0, 0, 0,-1, 3, 0, 0}, 1,RHEA_2_3}, + {{ 0, 0, 0, 0,-1, 4, 0, 0}, 1,RHEA_2_4}, + {{ 0, 0, 0, 0, 1, 0, 0, 0}, 1,RHEA_2_5}, + {{ 0, 0, 0, 0,-2, 3, 0, 0}, 1,RHEA_2_6}, + {{ 0, 0, 0, 0,-2, 4, 0, 0}, 1,RHEA_2_7}, + {{ 0, 0, 0, 0,-3, 4, 0, 0}, 1,RHEA_2_8}, + {{ 0, 0, 0, 0, 3,-2, 0, 0}, 1,RHEA_2_9}, + {{ 0, 0, 0, 0,-4, 5, 0, 0}, 1,RHEA_2_10}, + {{ 0, 0, 0, 0, 4,-3, 0, 0}, 1,RHEA_2_11}, + {{ 0, 0, 0,-1, 2, 0, 0, 0}, 1,RHEA_2_12}, + {{ 0, 0, 0, 1, 0, 0, 0, 0}, 1,RHEA_2_13}, + {{ 0, 0, 0,-2, 3, 0, 0, 0}, 1,RHEA_2_14}, + {{ 0, 0, 0,-3, 4, 0, 0, 0}, 1,RHEA_2_15}, + {{ 0, 0, 1, 0, 0, 0, 0, 0}, 1,RHEA_2_16}, + {{ 0,-1, 0, 2, 0, 0, 0, 0}, 1,RHEA_2_17}, +}; + +static const struct Tass17Term RHEA_3_0[8] = { + {{ 2.970532433280590e-03, 2.626878648804450e+00,-4.804041710792879e-04}}, + {{ 1.787509410723081e-04, 6.204551285275548e+00,-2.445240135601595e-05}}, + {{ 2.723114438070935e-05, 6.085981723978948e+00, 1.167962327599524e-03}}, + {{ 2.414440346500943e-05, 5.096853638619743e+00,-5.839811637997618e-04}}, + {{ 9.525093659923903e-06, 5.044236237492881e+00,-5.271851040460129e-06}}, + {{ 3.807917651740949e-06, 1.070489829428804e+00, 1.751943491399285e-03}}, + {{ 3.291355004303486e-06, 4.446713203128226e+00, 5.839811637997618e-04}}, + {{ 2.944165615658908e-06, 3.500661322372421e-01,-1.167962327599524e-03}}, +}; + +static const struct Tass17MultiTerm RHEA_3[1] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0}, 8,RHEA_3_0}, +}; + +static const struct Tass17Term TITAN_0_0[1] = { + {{ 5.193372353628770e-06, 5.396405225692853e+00, 3.940181065606379e-01}}, +}; + +static const struct Tass17Term TITAN_0_1[1] = { + {{ 4.923588320704660e-06, 5.786945864275197e-01, 7.869171700036950e-01}}, +}; + +static const struct Tass17Term TITAN_0_2[1] = { + {{ 2.514051816697911e-05, 4.426139084868009e+00, 9.968111509575888e-01}}, +}; + +static const struct Tass17Term TITAN_0_3[1] = { + {{ 1.234070873751902e-05, 1.993980622473295e-01, 1.901675080284677e+00}}, +}; + +static const struct Tass17Term TITAN_0_4[1] = { + {{ 7.428005944912294e-06, 3.443909349583986e+00, 2.934263878906524e+00}}, +}; + +static const struct Tass17Term TITAN_0_5[1] = { + {{ 1.514267591217036e-06, 5.287757340750888e+00, 4.191494185385700e+00}}, +}; + +static const struct Tass17MultiTerm TITAN_0[6] = { + {{ 0, 0, 0, 0, 0, 1, 0, 0}, 1,TITAN_0_0}, + {{ 0, 0, 0, 0, 0, 2, 0, 0}, 1,TITAN_0_1}, + {{ 0, 0, 0, 0, 1,-1, 0, 0}, 1,TITAN_0_2}, + {{ 0, 0, 0, 1, 0,-1, 0, 0}, 1,TITAN_0_3}, + {{ 0, 0, 1, 0, 0,-1, 0, 0}, 1,TITAN_0_4}, + {{ 0, 1, 0, 0, 0,-1, 0, 0}, 1,TITAN_0_5}, +}; + +static const struct Tass17Term TITAN_1_0[18] = { + {{ 1.489184840960493e-03, 4.482905304402765e+00, 5.271851040460129e-06}}, + {{ 9.861735003619475e-06, 5.820876772324451e+00, 1.054370208092026e-05}}, + {{ 3.205222547434483e-05, 2.421050292728566e+00, 1.880354218803814e-05}}, + {{ 6.277976937099409e-04, 1.641703069309713e-01, 2.445240135601595e-05}}, + {{ 2.782832942434251e-05, 2.085876834041031e+00, 4.891917479115332e-05}}, + {{ 3.898032222540717e-06, 2.691928895904259e+00, 2.825103078658793e-04}}, + {{ 3.675185983863103e-06, 3.132180625569890e+00, 3.017286310072802e-04}}, + {{ 6.328208168488662e-06, 1.099595805258099e+00, 5.652783908051565e-04}}, + {{ 1.839936992682087e-04, 4.432539236156053e+00, 5.839811637997618e-04}}, + {{ 1.012886232301891e-06, 3.824011892951753e+00, 6.026839367943671e-04}}, + {{ 1.807246533364200e-06, 5.897892147256107e+00, 8.662336965922434e-04}}, + {{ 3.340295455803047e-06, 3.949193776134189e+00, 1.119043152808370e-03}}, + {{ 2.671699222038788e-06, 1.780723999304769e-02, 1.149259554604918e-03}}, + {{ 2.064532509871716e-04, 2.875895084979086e+00, 1.167962327599524e-03}}, + {{ 2.919923956899900e-06, 2.618006049618430e+00, 1.186665100594129e-03}}, + {{ 3.918483314907732e-06, 3.102869921028134e+00, 1.192414728955539e-03}}, + {{ 2.910646188137447e-05, 4.133511734209461e+00, 1.751943491399285e-03}}, + {{ 3.080473554041300e-06, 5.390964128071579e+00, 2.335924655199047e-03}}, +}; + +static const struct Tass17Term TITAN_1_1[9] = { + {{ 2.177885623014171e-06, 5.338524981350306e+00, 1.937456015378634e-03}}, + {{ 2.229788591597716e-06, 3.516065572948062e+00, 1.942727866419093e-03}}, + {{ 3.240885104844179e-06, 1.456814599107305e+00, 1.956509193942217e-03}}, + {{ 3.317890554439667e-06, 5.917531821903471e+00, 1.961781044982677e-03}}, + {{ 8.515242483441068e-07, 4.094907555655027e+00, 1.967052896023137e-03}}, + {{ 1.583596726276704e-06, 1.857323310303026e+00, 1.967322011606203e-03}}, + {{ 3.183322410669546e-06, 3.483641352342939e-02, 1.972593862646663e-03}}, + {{ 2.439949469786914e-06, 4.495498981484839e+00, 1.977865713687124e-03}}, + {{ 8.331051796244125e-07, 2.672845480380433e+00, 1.983137564727584e-03}}, +}; + +static const struct Tass17Term TITAN_1_2[2] = { + {{ 9.325252754097003e-07, 1.465474667914254e+00, 3.928990634430571e-01}}, + {{ 6.059629840959338e-06, 2.254812572103060e+00, 3.940181065606379e-01}}, +}; + +static const struct Tass17Term TITAN_1_3[2] = { + {{ 1.119995323971813e-06, 5.646772130696905e+00, 7.863331888575091e-01}}, + {{ 5.747511089543420e-06, 5.786945864275197e-01, 7.869171700036950e-01}}, +}; + +static const struct Tass17Term TITAN_1_4[1] = { + {{ 1.208825245395646e-05, 1.284546431278216e+00, 9.968111509575888e-01}}, +}; + +static const struct Tass17Term TITAN_1_5[1] = { + {{ 9.999688627568780e-07, 2.569092862556433e+00, 1.993622301915178e+00}}, +}; + +static const struct Tass17Term TITAN_1_6[1] = { + {{ 6.461479160208660e-06, 3.340990715837123e+00, 1.901675080284677e+00}}, +}; + +static const struct Tass17Term TITAN_1_7[1] = { + {{ 4.165211007064940e-06, 3.023166959941940e-01, 2.934263878906524e+00}}, +}; + +static const struct Tass17Term TITAN_1_8[1] = { + {{ 8.903963476562940e-07, 2.146164687161095e+00, 4.191494185385700e+00}}, +}; + +static const struct Tass17MultiTerm TITAN_1[9] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0}, 18,TITAN_1_0}, + {{ 0, 0, 0, 0, 0,-1, 5, 0}, 9,TITAN_1_1}, + {{ 0, 0, 0, 0, 0, 1, 0, 0}, 2,TITAN_1_2}, + {{ 0, 0, 0, 0, 0, 2, 0, 0}, 2,TITAN_1_3}, + {{ 0, 0, 0, 0, 1,-1, 0, 0}, 1,TITAN_1_4}, + {{ 0, 0, 0, 0, 2,-2, 0, 0}, 1,TITAN_1_5}, + {{ 0, 0, 0, 1, 0,-1, 0, 0}, 1,TITAN_1_6}, + {{ 0, 0, 1, 0, 0,-1, 0, 0}, 1,TITAN_1_7}, + {{ 0, 1, 0, 0, 0,-1, 0, 0}, 1,TITAN_1_8}, +}; + +static const struct Tass17Term TITAN_2_0[24] = { + {{ 2.030439241690526e-06, 3.465392760946876e+00,-5.406408831993331e-06}}, + {{ 1.720731211496869e-05, 3.423177098527374e+00, 5.406408831993331e-06}}, + {{ 2.297673200703965e-06, 4.851969044359338e+00,-1.067825987245346e-05}}, + {{ 5.578526024329263e-06, 4.763368404218852e+00, 1.067825987245346e-05}}, + {{ 2.429402127836536e-05, 4.497027349870592e+00, 1.918773635511653e-05}}, + {{ 1.921261556124706e-04, 6.049785198226078e-01,-2.445958739557666e-05}}, + {{ 2.892653650392732e-02, 2.687601928257754e+00, 2.445958739557666e-05}}, + {{ 5.704537193893060e-06, 2.441938711199521e+00,-2.973143843603680e-05}}, + {{ 2.391668026442592e-05, 4.004671318127588e+00, 2.973143843603680e-05}}, + {{ 1.273579323673662e-06, 4.271696076744320e+00,-3.500328947649692e-05}}, + {{ 2.219325143437113e-06, 3.927500699309107e-01,-4.891198875159261e-05}}, + {{ 1.391334470388962e-06, 3.792208194559931e+00, 2.777039784926735e-04}}, + {{ 1.840440310193102e-06, 4.554834665120421e+00,-5.595215764041851e-04}}, + {{ 6.349090434417589e-06, 5.278059950506263e+00, 5.595215764041851e-04}}, + {{ 1.359141741251292e-06, 6.222686370138073e+00, 5.839811637997618e-04}}, + {{ 1.313668933428861e-06, 5.635555579481489e+00,-6.084407511953385e-04}}, + {{ 1.818913752278572e-06, 3.943058897661665e+00, 6.084407511953385e-04}}, + {{ 1.054968278903017e-06, 6.106129826283189e-01, 1.124788312095915e-03}}, + {{ 2.599144808715373e-06, 6.100137782540312e+00,-1.143502740203947e-03}}, + {{ 7.446564554937326e-05, 3.484557927409254e+00, 1.143502740203947e-03}}, + {{ 1.030286270548740e-06, 3.243359475417337e+00, 1.162179719401369e-03}}, + {{ 2.100942202805606e-06, 2.406466000093305e+00, 1.192421914995100e-03}}, + {{ 9.603481577558545e-06, 4.751548744302498e+00, 1.727483904003709e-03}}, + {{ 1.071090644258225e-06, 6.019617650063695e+00, 2.311465067803471e-03}}, +}; + +static const struct Tass17Term TITAN_2_1[2] = { + {{ 9.612769517722884e-07, 2.431612830889724e+00,-3.922906227094757e-01}}, + {{ 4.930907396569310e-06, 1.216505067979523e+00,-3.928746038556616e-01}}, +}; + +static const struct Tass17Term TITAN_2_2[1] = { + {{ 6.687871156591785e-05, 4.936792307996836e+00, 3.940425661480334e-01}}, +}; + +static const struct Tass17Term TITAN_2_3[1] = { + {{ 2.596686176814385e-06, 9.084195729203095e-01, 7.880606727086713e-01}}, +}; + +static const struct Tass17Term TITAN_2_4[1] = { + {{ 4.938696934118670e-06, 3.652245876718619e+00,-6.027685848095554e-01}}, +}; + +static const struct Tass17Term TITAN_2_5[1] = { + {{ 1.010084616284730e-05, 6.221338739275052e+00, 1.390853717105622e+00}}, +}; + +static const struct Tass17Term TITAN_2_6[1] = { + {{ 2.338446911029510e-06, 1.595801592159713e+00,-1.507632514136644e+00}}, +}; + +static const struct Tass17Term TITAN_2_7[1] = { + {{ 5.269296403563900e-06, 1.994597716654372e+00, 2.295717646432711e+00}}, +}; + +static const struct Tass17Term TITAN_2_8[1] = { + {{ 1.363323740924180e-06, 4.634475612002642e+00,-2.540221312758490e+00}}, +}; + +static const struct Tass17Term TITAN_2_9[1] = { + {{ 3.315192749055180e-06, 5.239109003991030e+00, 3.328306445054557e+00}}, +}; + +static const struct Tass17MultiTerm TITAN_2[10] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0}, 24,TITAN_2_0}, + {{ 0, 0, 0, 0, 0,-1, 0, 0}, 2,TITAN_2_1}, + {{ 0, 0, 0, 0, 0, 1, 0, 0}, 1,TITAN_2_2}, + {{ 0, 0, 0, 0, 0, 2, 0, 0}, 1,TITAN_2_3}, + {{ 0, 0, 0, 0,-1, 2, 0, 0}, 1,TITAN_2_4}, + {{ 0, 0, 0, 0, 1, 0, 0, 0}, 1,TITAN_2_5}, + {{ 0, 0, 0,-1, 0, 2, 0, 0}, 1,TITAN_2_6}, + {{ 0, 0, 0, 1, 0, 0, 0, 0}, 1,TITAN_2_7}, + {{ 0, 0,-1, 0, 0, 2, 0, 0}, 1,TITAN_2_8}, + {{ 0, 0, 1, 0, 0, 0, 0, 0}, 1,TITAN_2_9}, +}; + +static const struct Tass17Term TITAN_3_0[21] = { + {{ 2.789942947721349e-03, 6.204694901726296e+00,-2.445240135601595e-05}}, + {{ 1.312363309291625e-04, 5.044269214427242e+00,-5.271851040460129e-06}}, + {{ 1.125670790406430e-04, 6.084205141557698e+00, 1.167962327599524e-03}}, + {{ 1.916668518784865e-05, 5.094974746907165e+00,-5.839811637997618e-04}}, + {{ 1.497943297409488e-05, 1.070503341744811e+00, 1.751943491399285e-03}}, + {{ 1.144622908335464e-05, 4.298020835227772e+00, 5.839811637997618e-04}}, + {{ 1.105889373330841e-05, 3.817225181469991e+00,-1.870277299460525e-05}}, + {{ 9.469793088277916e-06, 3.725645429506557e+00,-1.054370208092026e-05}}, + {{ 6.878606841089768e-06, 4.544829611068419e+00, 5.271851040460129e-06}}, + {{ 6.072279735075281e-06, 3.088021134790829e-01,-1.167962327599524e-03}}, + {{ 3.672628251015072e-06, 5.291779482141999e+00, 4.891917479115332e-05}}, + {{ 3.001306766151942e-06, 2.631624338898295e-01, 2.445240135601595e-05}}, + {{ 2.508038681269874e-06, 5.838193085927095e+00,-4.804041710792879e-04}}, + {{ 2.453965972048404e-06, 4.844097342411929e+00,-2.972425239647608e-05}}, + {{ 1.777443612458054e-06, 1.373143790052677e-01, 3.017286310072802e-04}}, + {{ 1.638627359387858e-06, 2.338023546843110e+00, 2.335924655199047e-03}}, + {{ 1.619813827555800e-06, 3.201683403167966e+00, 1.149259554604918e-03}}, + {{ 1.585471208377748e-06, 5.833093965190200e+00, 1.186665100594129e-03}}, + {{ 1.518975368269692e-06, 3.329608496168708e+00, 1.870277299460525e-05}}, + {{ 1.151714556320695e-06, 2.625783233864042e-02, 1.192414728955539e-03}}, + {{ 8.830894877995539e-07, 5.372467623946739e+00,-1.751943491399285e-03}}, +}; + +static const struct Tass17MultiTerm TITAN_3[1] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0}, 21,TITAN_3_0}, +}; + +static const struct Tass17Term IAPETUS_0_0[7] = { + {{ 2.055029475492061e-06, 2.502670659577745e+00, 7.745544060220222e-02}}, + {{ 1.017421707635384e-05,-2.565419768024297e+00, 7.803942174838812e-02}}, + {{ 6.585278743116177e-07, 1.895225923201359e+00, 7.804469359942858e-02}}, + {{ 1.178034971556374e-05, 3.767316688774966e+00, 7.917751804453235e-02}}, + {{ 2.109797808204992e-05, 6.169137529926802e+00, 7.919657122309593e-02}}, + {{ 5.616037270279334e-07,-2.864068502197524e+00, 7.920738404075992e-02}}, + {{ 1.210381264018071e-06,-1.536414322676488e+00, 7.921265589180036e-02}}, +}; + +static const struct Tass17Term IAPETUS_0_1[17] = { + {{ 3.248586724047530e-06, 1.173515119422923e+00, 1.560680306791122e-01}}, + {{ 2.327804697388999e-05, 2.388610005279730e+00, 1.566520118252981e-01}}, + {{ 1.506081447204865e-06, 5.660579539606869e-01, 1.566572836763386e-01}}, + {{ 2.219668063709623e-06, 2.284631982621601e+00, 1.572307211204436e-01}}, + {{ 1.177813487687222e-04,-2.679467329715666e+00, 1.572359929714840e-01}}, + {{ 5.121363233915475e-06, 1.781122928927975e+00, 1.572412648225245e-01}}, + {{ 3.258205784517132e-06, 1.657988726564947e+00, 1.578199741176699e-01}}, + {{ 6.406895152069824e-07, 3.418104295086557e+00, 1.578252459687104e-01}}, + {{ 7.233685566797959e-07, 5.117268855773154e-01, 1.583740892676283e-01}}, + {{ 6.553814036784504e-07, 2.913580261178442e+00, 1.583931424461918e-01}}, + {{ 5.886085615859691e-06,-2.969003559963930e+00, 1.584039552638558e-01}}, + {{ 3.846693748791777e-07, 1.489841855036775e+00, 1.584092271148963e-01}}, + {{ 1.849113934605446e-06, 5.952077755114058e+00, 1.584144989659368e-01}}, + {{ 1.523920218717224e-07, 1.386868830832936e+00, 1.589879364100418e-01}}, + {{ 6.359828738920669e-07, 5.848319820906959e+00, 1.589932082610822e-01}}, + {{ 1.105572785393772e-07,-1.164606940957312e-01, 1.595719175562276e-01}}, + {{ 6.957733951844473e-07, 1.201970451738299e+00, 1.595771894072681e-01}}, +}; + +static const struct Tass17Term IAPETUS_0_2[2] = { + {{ 6.748302380368017e-07, 5.416167758678300e+00, 2.358485830483941e-01}}, + {{ 3.458158840283551e-06, 3.480902144089144e-01, 2.364325641945799e-01}}, +}; + +static const struct Tass17Term IAPETUS_0_3[13] = { + {{ 4.946872838108632e-07, 6.077953687111643e+00, 1.918402836815050e-03}}, + {{ 5.065090050950890e-07, 4.255501070028474e+00, 1.923674687855510e-03}}, + {{ 5.354701955778437e-07, 1.796193334454873e+00, 1.926643197714647e-03}}, + {{ 2.368323695654563e-06, 2.196618138085234e+00, 1.937456015378634e-03}}, + {{ 2.424687512275475e-06, 3.741587517563335e-01, 1.942727866419093e-03}}, + {{ 6.223980017737441e-07, 4.834746214664873e+00, 1.947999717459554e-03}}, + {{ 3.515734994495499e-06, 4.598407354081068e+00, 1.956509193942217e-03}}, + {{ 3.599154632304914e-06, 2.775939218332986e+00, 1.961781044982677e-03}}, + {{ 9.236794241568811e-07, 9.533149020652341e-01, 1.967052896023137e-03}}, + {{ 1.730312424825915e-06, 4.998916170228774e+00, 1.967322011606203e-03}}, + {{ 3.478141777876746e-06, 3.176429222382267e+00, 1.972593862646663e-03}}, + {{ 2.665836454376912e-06, 1.353906429920962e+00, 1.977865713687124e-03}}, + {{ 9.101734358180643e-07, 5.814438133970226e+00, 1.983137564727584e-03}}, +}; + +static const struct Tass17Term IAPETUS_0_4[5] = { + {{ 1.173808537373678e-05, 3.099779317070623e-01, 3.148353166650650e-01}}, + {{ 1.422582505896866e-03, 1.629074651441286e+00, 3.148405885161054e-01}}, + {{ 1.282760621734726e-05, 2.948174134620363e+00, 3.148458603671461e-01}}, + {{ 4.431013807987148e-07, 5.376468530544894e-01, 3.148597690664211e-01}}, + {{ 8.613770793559659e-07, 4.998444131476766e+00, 3.148650409174615e-01}}, +}; + +static const struct Tass17Term IAPETUS_0_5[4] = { + {{ 1.529823976752019e-05, 4.943058008729855e+00, 4.732445437799614e-01}}, + {{ 1.638556362699022e-05, 3.120590560712127e+00, 4.732498156310018e-01}}, + {{ 4.393561481041129e-06, 1.297974022507647e+00, 4.732550874820422e-01}}, + {{ 5.965719593399348e-07, 5.170692394242208e+00, 4.732689961813175e-01}}, +}; + +static const struct Tass17Term IAPETUS_0_6[7] = { + {{ 1.205192931267955e-06, 2.446685865249762e-02, 2.356279326243051e-01}}, + {{ 1.539010606612464e-06, 1.349751065508437e+00, 2.356332044753456e-01}}, + {{ 5.125234375859194e-07, 6.347454751688458e-01, 2.356386108841776e-01}}, + {{ 4.815890873838023e-05, 4.857380043863779e+00, 2.356440172930096e-01}}, + {{ 1.049405056557275e-06, 6.205868207753926e+00, 2.356492891440501e-01}}, + {{ 2.261000099791683e-06, 4.144773749632801e+00, 2.356630704715732e-01}}, + {{ 6.346855400965112e-07, 4.208242392372787e+00, 2.368011668029451e-01}}, +}; + +static const struct Tass17Term IAPETUS_0_7[5] = { + {{ 4.677155865229010e-07, 1.960182176247418e+00, 1.564260895501687e-01}}, + {{ 1.822472901105999e-06, 1.375578599796670e-01, 1.564313614012092e-01}}, + {{ 1.780232418309521e-06, 4.598275031411171e+00, 1.564366332522496e-01}}, + {{ 1.648047287035982e-06, 1.857191416947010e+00, 1.564474460699136e-01}}, + {{ 7.820099241529981e-07, 1.117332070337260e+00, 1.564664992484772e-01}}, +}; + +static const struct Tass17Term IAPETUS_0_8[2] = { + {{ 7.283955691107278e-07, 3.393198290814080e+00, 7.723479017811326e-02}}, + {{ 7.115131339933769e-07, 1.570730155065997e+00, 7.724006202915373e-02}}, +}; + +static const struct Tass17Term IAPETUS_0_9[1] = { + {{ 3.791140650423246e-05, 3.877892946988424e+00, 7.088586950767433e-01}}, +}; + +static const struct Tass17Term IAPETUS_0_10[2] = { + {{ 5.570980365205931e-07, 9.146867890556700e-01, 8.672626503405993e-01}}, + {{ 5.703165858434648e-07, 5.375403960487173e+00, 8.672679221916397e-01}}, +}; + +static const struct Tass17Term IAPETUS_0_11[2] = { + {{ 1.199902334914149e-06, 8.563423202419649e-01, 6.296621238536474e-01}}, + {{ 1.557003369506093e-05, 3.258149248363778e+00, 6.296811770322111e-01}}, +}; + +static const struct Tass17Term IAPETUS_0_12[2] = { + {{ 2.861462370993798e-06, 2.306043720186055e-01, 5.504846058091149e-01}}, + {{ 1.182264841666031e-06, 2.632429282009304e+00, 5.505036589876786e-01}}, +}; + +static const struct Tass17Term IAPETUS_0_13[1] = { + {{ 1.228324287730070e-06, 6.138699763037207e+00, 1.102876801637381e+00}}, +}; + +static const struct Tass17Term IAPETUS_0_14[1] = { + {{ 4.329731043745186e-06, 1.745631218955876e+00, 9.445217655483165e-01}}, +}; + +static const struct Tass17Term IAPETUS_0_15[1] = { + {{ 9.898839492003675e-07, 5.001271649790288e+00, 8.653251943252205e-01}}, +}; + +static const struct Tass17Term IAPETUS_0_16[1] = { + {{ 1.430384079869284e-06, 2.331131895479707e-01, 1.259362354064422e+00}}, +}; + +static const struct Tass17Term IAPETUS_0_17[1] = { + {{ 4.421327735883800e-07, 5.003780467319657e+00, 1.574202942580528e+00}}, +}; + +static const struct Tass17Term IAPETUS_0_18[1] = { + {{ 3.479701758905445e-05, 2.913621055460106e+00, 1.311651739473694e+00}}, +}; + +static const struct Tass17Term IAPETUS_0_19[2] = { + {{ 5.667000670514980e-07, 6.227605955410412e+00, 1.470055694737550e+00}}, + {{ 5.801464486513693e-07, 4.405137819662329e+00, 1.470060966588590e+00}}, +}; + +static const struct Tass17Term IAPETUS_0_20[1] = { + {{ 1.080732052994442e-06, 6.169261486294519e+00, 1.232455168250598e+00}}, +}; + +static const struct Tass17Term IAPETUS_0_21[1] = { + {{ 1.870537893668915e-05, 4.970065340019012e+00, 2.216515668800783e+00}}, +}; + +static const struct Tass17Term IAPETUS_0_22[1] = { + {{ 5.433130776641635e-07, 1.942520463673839e+00, 2.137319097577687e+00}}, +}; + +static const struct Tass17Term IAPETUS_0_23[1] = { + {{ 1.129835111020686e-05, 1.931391320176082e+00, 3.249104467422628e+00}}, +}; + +static const struct Tass17Term IAPETUS_0_24[1] = { + {{ 8.163925621658264e-07, 3.775239311342985e+00, 4.506334773901807e+00}}, +}; + +static const struct Tass17Term IAPETUS_0_25[1] = { + {{ 8.563952066234920e-07, 3.157716115970889e+00, 6.587859751149659e+00}}, +}; + +static const struct Tass17MultiTerm IAPETUS_0[26] = { + {{ 0, 0, 0, 0, 0, 0, 1, 0}, 7,IAPETUS_0_0}, + {{ 0, 0, 0, 0, 0, 0, 2, 0}, 17,IAPETUS_0_1}, + {{ 0, 0, 0, 0, 0, 0, 3, 0}, 2,IAPETUS_0_2}, + {{ 0, 0, 0, 0, 0,-1, 5, 0}, 13,IAPETUS_0_3}, + {{ 0, 0, 0, 0, 0, 1,-1, 0}, 5,IAPETUS_0_4}, + {{ 0, 0, 0, 0, 0, 1, 1, 0}, 4,IAPETUS_0_5}, + {{ 0, 0, 0, 0, 0, 1,-2, 0}, 7,IAPETUS_0_6}, + {{ 0, 0, 0, 0, 0, 1,-3, 0}, 5,IAPETUS_0_7}, + {{ 0, 0, 0, 0, 0, 1,-4, 0}, 2,IAPETUS_0_8}, + {{ 0, 0, 0, 0, 0, 2,-1, 0}, 1,IAPETUS_0_9}, + {{ 0, 0, 0, 0, 0, 2, 1, 0}, 2,IAPETUS_0_10}, + {{ 0, 0, 0, 0, 0, 2,-2, 0}, 2,IAPETUS_0_11}, + {{ 0, 0, 0, 0, 0, 2,-3, 0}, 2,IAPETUS_0_12}, + {{ 0, 0, 0, 0, 0, 3,-1, 0}, 1,IAPETUS_0_13}, + {{ 0, 0, 0, 0, 0, 3,-3, 0}, 1,IAPETUS_0_14}, + {{ 0, 0, 0, 0, 0, 3,-4, 0}, 1,IAPETUS_0_15}, + {{ 0, 0, 0, 0, 0, 4,-4, 0}, 1,IAPETUS_0_16}, + {{ 0, 0, 0, 0, 0, 5,-5, 0}, 1,IAPETUS_0_17}, + {{ 0, 0, 0, 0, 1, 0,-1, 0}, 1,IAPETUS_0_18}, + {{ 0, 0, 0, 0, 1, 0, 1, 0}, 2,IAPETUS_0_19}, + {{ 0, 0, 0, 0, 1, 0,-2, 0}, 1,IAPETUS_0_20}, + {{ 0, 0, 0, 1, 0, 0,-1, 0}, 1,IAPETUS_0_21}, + {{ 0, 0, 0, 1, 0, 0,-2, 0}, 1,IAPETUS_0_22}, + {{ 0, 0, 1, 0, 0, 0,-1, 0}, 1,IAPETUS_0_23}, + {{ 0, 1, 0, 0, 0, 0,-1, 0}, 1,IAPETUS_0_24}, + {{ 1, 0, 0, 0, 0, 0,-1, 0}, 1,IAPETUS_0_25}, +}; + +static const struct Tass17Term IAPETUS_1_0[22] = { + {{ 1.928386916598716e-01, 1.316743285171985e+00, 5.271851040460129e-06}}, + {{ 1.197700127979115e-03, 2.905816296579413e+00, 1.054370208092026e-05}}, + {{ 1.785444267015284e-04, 3.897159948941672e+00, 1.894532180866185e-05}}, + {{ 7.466410913376219e-04, 3.411600296951643e+00, 2.445240135601595e-05}}, + {{ 4.076652529480639e-05, 3.776409831511328e+00, 2.966566038404764e-05}}, + {{ 3.620254646473473e-05, 6.177614480595389e-01, 3.510481004211992e-05}}, + {{ 2.023635272434820e-05, 5.342652755830533e+00, 4.891917479115332e-05}}, + {{ 2.148685811756090e-05, 3.324109814821024e+00, 5.483417106242491e-05}}, + {{ 2.377227624569038e-05, 3.239254695447169e+00, 2.825103078658793e-04}}, + {{ 4.028991254502335e-05, 1.095989272623461e+00, 5.652783908051565e-04}}, + {{ 5.283085924212965e-05, 6.218635238921890e+00, 5.787093127593016e-04}}, + {{ 1.125807495942191e-03, 4.414124516924016e+00, 5.839811637997618e-04}}, + {{ 3.586013723690129e-05, 2.436062381089369e+00, 5.892530148402220e-04}}, + {{ 7.459887995646048e-06, 4.087393199562610e+00, 6.026839367943671e-04}}, + {{ 1.314054216207817e-05, 5.873663787672587e+00, 8.662336965922434e-04}}, + {{ 1.603086203623188e-05, 2.485710326866144e+00, 1.157149509935537e-03}}, + {{ 2.400461005136443e-04, 2.926349976058209e+00, 1.167962327599524e-03}}, + {{ 3.004295676379663e-04, 4.182760326808072e+00, 1.173234178639984e-03}}, + {{ 7.393695567545098e-05, 5.503253064658139e+00, 1.178506029680444e-03}}, + {{ 3.490441837523331e-05, 4.159104921593594e+00, 1.751943491399285e-03}}, + {{ 3.811816549252109e-05, 5.449835843337831e+00, 1.757215342439746e-03}}, + {{ 9.878270828624305e-06, 4.692950541308903e-01, 1.762487193480206e-03}}, +}; + +static const struct Tass17Term IAPETUS_1_1[24] = { + {{ 6.143353968708967e-07, 1.287562896667545e+00, 7.687145945601632e-02}}, + {{ 4.523919915777730e-06, 2.502659168377380e+00, 7.745544060220222e-02}}, + {{ 3.714286018866130e-07,-1.141689927113436e+00, 7.802333707968367e-02}}, + {{ 5.608496749491884e-07, 1.852697585028197e-01, 7.802860893072413e-02}}, + {{ 3.504383346317222e-07, 2.398679759866219e+00, 7.803414989734765e-02}}, + {{ 2.295038701669439e-05,-2.593118006894055e+00, 7.803942174838812e-02}}, + {{ 6.404009664458889e-07, 1.893523997409873e+00, 7.804469359942858e-02}}, + {{ 8.091467686328637e-07, 6.119791853597793e+00, 7.805847492695170e-02}}, + {{ 4.190958483159967e-07, 1.812437113434972e+00, 7.861259007691003e-02}}, + {{ 6.286284677985618e-07, 1.791293531808356e+00, 7.862340289457402e-02}}, + {{ 3.164931584142412e-07, 5.589825798207451e+00, 7.917224619349188e-02}}, + {{ 4.353564226390001e-06, 6.257381704689877e-01, 7.917751804453235e-02}}, + {{ 3.164896582547253e-07, 1.944834709464376e+00, 7.918278989557279e-02}}, + {{ 1.404022491486175e-07,-1.433272645194262e+00, 7.919129937205547e-02}}, + {{ 3.794706462471952e-06, 3.027544876345173e+00, 7.919657122309593e-02}}, + {{ 3.059127278557355e-07, 3.041311214209734e+00, 7.919657125832364e-02}}, + {{ 1.407650236154023e-07, 1.204832936646125e+00, 7.920184307413637e-02}}, + {{ 8.733847339265118e-07,-2.854848402830646e+00, 7.920738404075992e-02}}, + {{ 6.190372619937466e-07,-1.535786959595905e+00, 7.921265589180036e-02}}, + {{ 3.845413058184980e-07, 5.829842020175415e+00, 7.922643721932350e-02}}, + {{ 3.936684188721603e-07, 4.007371902635274e+00, 7.923170907036394e-02}}, + {{ 4.101604037784085e-07, 4.242652639255375e+00, 7.978055236928183e-02}}, + {{ 4.086365824538882e-08,-4.056548501884276e-01, 8.036453351546773e-02}}, + {{ 4.231066732027226e-07, 4.057026289098603e+00, 8.036980536650817e-02}}, +}; + +static const struct Tass17Term IAPETUS_1_2[16] = { + {{ 4.416345379733718e-07, 6.241592663692312e+00, 1.554840495329263e-01}}, + {{ 3.837882772948628e-06, 1.173503571344250e+00, 1.560680306791122e-01}}, + {{ 4.360169268782757e-07, 1.069524219711398e+00, 1.566467399742577e-01}}, + {{ 2.721985372704609e-05, 2.388610893433953e+00, 1.566520118252981e-01}}, + {{ 1.203630670831745e-06, 5.660322567848149e-01, 1.566572836763386e-01}}, + {{ 2.227388462533576e-06, 2.284631982621601e+00, 1.572307211204436e-01}}, + {{ 1.378064515172981e-04,-2.679466414745420e+00, 1.572359929714840e-01}}, + {{ 5.768343947193972e-06, 1.781127439794527e+00, 1.572412648225245e-01}}, + {{ 4.253374565827929e-06, 1.704388717616716e+00, 1.578199741176699e-01}}, + {{ 3.291231434148502e-07,-2.864966874148501e+00, 1.578252459687104e-01}}, + {{ 4.141402947439892e-07,-2.965677063355761e+00, 1.584039552638558e-01}}, + {{ 6.393990743929588e-06,-1.649960073803633e+00, 1.584092271148963e-01}}, + {{ 2.790880384447099e-07,-1.753655473493772e+00, 1.589879364100418e-01}}, + {{ 3.256983864383599e-07,-4.347514166563534e-01, 1.589932082610822e-01}}, + {{ 2.267895350910583e-07, 3.024427904422583e+00, 1.595719175562276e-01}}, + {{ 1.090721316940875e-07,-1.939541945846773e+00, 1.595771894072681e-01}}, +}; + +static const struct Tass17Term IAPETUS_1_3[2] = { + {{ 4.889359735634015e-07, 5.416167758678300e+00, 2.358485830483941e-01}}, + {{ 2.502679246525132e-06, 3.480902144089144e-01, 2.364325641945799e-01}}, +}; + +static const struct Tass17Term IAPETUS_1_4[75] = { + {{ 5.227495470767936e-07, 4.005663121141773e+00, 2.153785202069178e-04}}, + {{ 5.262843436434110e-07, 2.183142522975625e+00, 2.206503712473779e-04}}, + {{ 3.815771898913724e-07, 7.105474585412466e-02, 7.504405092155264e-04}}, + {{ 9.196878775751337e-07, 2.473094150998370e+00, 7.694936877791099e-04}}, + {{ 1.352657464923885e-06, 2.873044246870902e+00, 7.803065054430962e-04}}, + {{ 3.973724314685021e-07, 4.140593867861234e-01, 7.832750153022327e-04}}, + {{ 1.368009711983665e-06, 1.050560920047950e+00, 7.855783564835565e-04}}, + {{ 3.472239690061985e-07, 1.735637572758064e+00, 7.885468663426930e-04}}, + {{ 3.480378535316622e-07, 5.511199893486148e+00, 7.908502075240164e-04}}, + {{ 3.033297996664303e-07, 6.195403829536804e+00, 7.938187173831529e-04}}, + {{ 3.418187177414854e-07, 8.141915154020281e-01, 7.940878329662196e-04}}, + {{ 2.688244928253836e-06, 5.275014486169524e+00, 7.993596840066795e-04}}, + {{ 2.569260340418719e-06, 3.452633751557773e+00, 8.046315350471398e-04}}, + {{ 1.036863039010391e-06, 1.630081068326518e+00, 8.099033860875997e-04}}, + {{ 3.969393749935304e-07, 8.738771354003039e-01, 1.869483662023897e-03}}, + {{ 3.985256112150306e-06, 3.275634661668579e+00, 1.888536840587480e-03}}, + {{ 1.511339171430308e-06, 4.356355818907831e+00, 1.902318168110603e-03}}, + {{ 1.475074400837350e-05, 5.719796115875051e+00, 1.907590019151063e-03}}, + {{ 1.216707168547837e-06, 7.209469663619112e-01, 1.912861870191523e-03}}, + {{ 3.075011314359275e-07, 3.644290442329441e+00, 1.912996427983057e-03}}, + {{ 1.415742853315232e-06, 4.757124368944763e+00, 1.913130985774590e-03}}, + {{ 3.814316630052462e-07, 3.288005910176154e+00, 1.918275465063078e-03}}, + {{ 1.179423115340822e-05, 6.061718986149902e+00, 1.918402836815050e-03}}, + {{ 1.876817015958310e-06, 4.754449361520011e-01, 1.921371346674187e-03}}, + {{ 1.399238708843930e-05, 4.239759216446882e+00, 1.923674687855510e-03}}, + {{ 2.186693735333124e-05, 1.995274806149824e+00, 1.926643197714647e-03}}, + {{ 2.330447358044871e-06, 2.432875200820899e+00, 1.928946538895970e-03}}, + {{ 8.755936386396388e-07, 3.115210303371935e+00, 1.931915048755107e-03}}, + {{ 2.254199615438521e-06, 6.141816327520342e+00, 1.932049606546640e-03}}, + {{ 5.971965491672709e-06, 8.753490785501354e-01, 1.932184164338173e-03}}, + {{ 2.941694888718857e-07, 3.751626473924576e+00, 1.934218389936430e-03}}, + {{ 4.077887373315127e-07, 5.689822989499520e+00, 1.937328643626661e-03}}, + {{ 7.393168775867132e-05, 2.280321547311384e+00, 1.937456015378634e-03}}, + {{ 8.171736433893184e-05, 4.510335354461255e-01, 1.942727866419093e-03}}, + {{ 6.144966414607280e-07, 2.242399219818416e-02, 1.942855238171066e-03}}, + {{ 3.223198173228014e-06, 2.430574184290058e-01, 1.942862424210627e-03}}, + {{ 8.603158836863158e-07, 4.197919449469832e+00, 1.945696376278230e-03}}, + {{ 1.704559011257133e-05,-1.417339665945397e+00, 1.947999717459554e-03}}, + {{ 3.140486507800807e-07, 4.482050013324328e+00, 1.948127089211526e-03}}, + {{ 3.299741975330665e-06, 4.703710238329596e+00, 1.948134275251087e-03}}, + {{ 4.531105084562628e-07, 6.090353248906123e+00, 1.948141461290647e-03}}, + {{ 2.574587837723788e-06, 5.732598943257583e+00, 1.948268833042620e-03}}, + {{ 5.336777443382800e-06, 3.277820916335360e+00, 1.951237342901756e-03}}, + {{ 1.915584168637660e-06, 6.159110785889812e+00, 1.953271568500014e-03}}, + {{ 4.614651554236785e-07, 4.267748340354923e+00, 1.953413312331107e-03}}, + {{ 1.540440893862750e-06,-2.380019622661880e+00, 1.953540684083080e-03}}, + {{ 1.101769834711451e-04,-1.556727729554004e+00, 1.956509193942217e-03}}, + {{ 3.070012836628351e-07, 5.229794370811791e+00, 1.958812535123540e-03}}, + {{ 1.189228383255110e-04, 2.899805052106753e+00, 1.961781044982677e-03}}, + {{ 2.613243661620941e-06, 2.424238476169638e+00, 1.961908416734649e-03}}, + {{ 8.507522187621048e-06, 3.014198965814164e+00, 1.961915602774210e-03}}, + {{ 5.610129338334513e-07, 3.684122942793509e+00, 1.962050160565743e-03}}, + {{ 3.066646802040954e-05, 1.120589496342319e+00, 1.967052896023137e-03}}, + {{ 9.616747267908099e-07, 6.000060288823683e-01, 1.967180267775110e-03}}, + {{ 8.812132213666628e-06, 1.185788445220376e+00, 1.967187453814670e-03}}, + {{ 3.612477825551320e-05,-1.345764111856863e+00, 1.967322011606203e-03}}, + {{ 1.191488030171526e-06, 2.272066757023249e+00, 1.972324747063597e-03}}, + {{ 2.549155479604930e-06, 5.291014601965657e+00, 1.972459304855130e-03}}, + {{ 9.027685330072385e-05,-3.132006983447723e+00, 1.972593862646663e-03}}, + {{ 5.273506284484312e-07, 7.170338045570530e-01, 1.975562372505800e-03}}, + {{ 7.318838264333341e-05, 1.353835293153985e+00, 1.977865713687124e-03}}, + {{ 5.398713831902744e-07, 5.177746978176391e+00, 1.980834223546260e-03}}, + {{ 3.608057298728251e-06, 4.863591915141639e+00, 1.980961595298232e-03}}, + {{ 2.328751291389269e-05, 5.814424528754509e+00, 1.983137564727584e-03}}, + {{ 1.576239906932032e-06, 3.002295562826074e+00, 1.986233446338693e-03}}, + {{ 3.799033641308746e-07, 4.259130445062984e+00, 1.986375190169786e-03}}, + {{ 3.242171175776111e-07, 3.907553066682691e+00, 1.986502561921759e-03}}, + {{ 1.499811815760443e-06, 3.988002288677764e+00, 1.988409415768044e-03}}, + {{ 5.627708927914463e-07, 5.539620791805293e+00, 1.991647041210247e-03}}, + {{ 2.042389544816678e-06, 5.291730688852117e+00, 1.991774412962219e-03}}, + {{ 1.460797854077857e-06, 3.748973474201665e+00, 1.996918892250707e-03}}, + {{ 6.197295348292014e-06, 3.290476399266866e+00, 1.997046264002680e-03}}, + {{ 1.095526621882867e-06, 1.933069997683063e+00, 2.002190743291167e-03}}, + {{ 2.089500807780357e-06, 1.580270469414437e+00, 2.002318115043139e-03}}, + {{ 3.187588107072781e-07, 6.035967805962264e+00, 2.007589966083600e-03}}, +}; + +static const struct Tass17Term IAPETUS_1_5[5] = { + {{ 3.414474608395144e-07, 5.333092134829300e+00, 3.928800102292660e-01}}, + {{ 3.741206194503089e-07, 3.334420556287444e+00, 3.940318878881610e-01}}, + {{ 2.637183491724404e-05, 4.683474110615003e+00, 3.940371597392014e-01}}, + {{ 8.279548593975801e-07, 1.908398224503419e+00, 3.940479725568654e-01}}, + {{ 6.484210285032441e-07, 3.233671623826318e+00, 3.940532444079058e-01}}, +}; + +static const struct Tass17Term IAPETUS_1_6[4] = { + {{ 2.940137697333849e-06, 3.451571632901731e+00, 3.148353166650650e-01}}, + {{ 7.282549735894645e-04, 4.770667297372782e+00, 3.148405885161054e-01}}, + {{ 3.358151723062283e-06, 6.089767182911175e+00, 3.148458603671461e-01}}, + {{ 3.257749851873783e-07, 1.856841516027055e+00, 3.148650409174615e-01}}, +}; + +static const struct Tass17Term IAPETUS_1_7[4] = { + {{ 9.488209354297983e-06, 4.943057563632108e+00, 4.732445437799614e-01}}, + {{ 1.029453478899256e-05, 3.120590331336322e+00, 4.732498156310018e-01}}, + {{ 2.792746040615356e-06, 1.297967072116361e+00, 4.732550874820422e-01}}, + {{ 4.374967901448417e-07, 5.170827648758129e+00, 4.732689961813175e-01}}, +}; + +static const struct Tass17Term IAPETUS_1_8[2] = { + {{ 6.013024933189873e-06, 1.743122401426509e+00, 2.356440172930096e-01}}, + {{ 4.958075120563441e-06, 4.144929329850513e+00, 2.356630704715732e-01}}, +}; + +static const struct Tass17Term IAPETUS_1_9[4] = { + {{ 7.533074112851135e-07, 1.960182176247418e+00, 1.564260895501687e-01}}, + {{ 2.517101053299125e-06, 1.375551717917236e-01, 1.564313614012092e-01}}, + {{ 2.480836668098538e-06, 4.598277210434070e+00, 1.564366332522496e-01}}, + {{ 1.143486543010702e-06, 1.117389755399236e+00, 1.564664992484772e-01}}, +}; + +static const struct Tass17Term IAPETUS_1_10[5] = { + {{ 3.574500970589592e-07, 5.215822607081832e+00, 7.722951832707283e-02}}, + {{ 1.392818914226552e-06, 3.393198290814080e+00, 7.723479017811326e-02}}, + {{ 1.360536764325014e-06, 1.570730155065997e+00, 7.724006202915373e-02}}, + {{ 4.891864753374598e-07, 5.795005219238083e+00, 7.725384335667685e-02}}, + {{ 4.778483243651071e-07, 3.972537083490000e+00, 7.725911520771732e-02}}, +}; + +static const struct Tass17Term IAPETUS_1_11[3] = { + {{ 7.489157248963648e-07, 6.282589894747257e-01, 7.880552662998393e-01}}, + {{ 7.443531196416904e-07, 3.430541494724291e+00, 7.880851322960668e-01}}, + {{ 7.620147658522374e-07, 1.608073358976210e+00, 7.880904041471072e-01}}, +}; + +static const struct Tass17Term IAPETUS_1_12[1] = { + {{ 2.222879678616121e-05, 7.364334077752746e-01, 7.088586950767433e-01}}, +}; + +static const struct Tass17Term IAPETUS_1_13[3] = { + {{ 6.546227444825897e-07, 1.939050585742052e+00, 6.296759051811704e-01}}, + {{ 1.769563612146425e-05, 3.258149248363778e+00, 6.296811770322111e-01}}, + {{ 6.546227444825897e-07, 4.577247910985506e+00, 6.296864488832515e-01}}, +}; + +static const struct Tass17Term IAPETUS_1_14[2] = { + {{ 2.569819239848606e-06, 2.306043720186055e-01, 5.504846058091149e-01}}, + {{ 1.150895741388962e-06, 2.632411300442608e+00, 5.505036589876786e-01}}, +}; + +static const struct Tass17Term IAPETUS_1_15[2] = { + {{ 3.716648744882634e-07, 4.908225137751350e+00, 4.712719499173147e-01}}, + {{ 3.630505879727552e-07, 3.085757002003267e+00, 4.712772217683551e-01}}, +}; + +static const struct Tass17Term IAPETUS_1_16[2] = { + {{ 7.410458807790901e-07, 2.997108078146744e+00, 1.102876801637381e+00}}, + {{ 2.917099551383937e-07, 9.555532956830555e-02, 1.102930992663213e+00}}, +}; + +static const struct Tass17Term IAPETUS_1_17[1] = { + {{ 3.001367588499240e-07, 5.512961820466838e+00, 1.023699283592849e+00}}, +}; + +static const struct Tass17Term IAPETUS_1_18[1] = { + {{ 4.216532478702710e-06, 1.745631218955876e+00, 9.445217655483165e-01}}, +}; + +static const struct Tass17Term IAPETUS_1_19[2] = { + {{ 8.149891095115382e-07, 5.001271649790290e+00, 8.653251943252205e-01}}, + {{ 3.764251887678508e-07, 1.119909356269040e+00, 8.653442475037843e-01}}, +}; + +static const struct Tass17Term IAPETUS_1_20[1] = { + {{ 1.310246341606266e-06, 2.331131895479707e-01, 1.259362354064422e+00}}, +}; + +static const struct Tass17Term IAPETUS_1_21[1] = { + {{ 3.830879278957400e-07, 5.003780467319657e+00, 1.574202942580528e+00}}, +}; + +static const struct Tass17Term IAPETUS_1_22[1] = { + {{ 7.277204919188508e-07, 5.941165931805280e+00, 1.390848310696790e+00}}, +}; + +static const struct Tass17Term IAPETUS_1_23[1] = { + {{ 2.181721459549961e-05, 6.055213709049899e+00, 1.311651739473694e+00}}, +}; + +static const struct Tass17Term IAPETUS_1_24[1] = { + {{ 3.811901873161304e-07, 1.714424909184600e+00, 2.295712240023879e+00}}, +}; + +static const struct Tass17Term IAPETUS_1_25[1] = { + {{ 1.184715424009358e-05, 1.828472686429220e+00, 2.216515668800783e+00}}, +}; + +static const struct Tass17Term IAPETUS_1_26[1] = { + {{ 7.269853312811282e-06, 5.072983973765877e+00, 3.249104467422628e+00}}, +}; + +static const struct Tass17Term IAPETUS_1_27[1] = { + {{ 5.287253161661598e-07, 6.336466577531914e-01, 4.506334773901807e+00}}, +}; + +static const struct Tass17Term IAPETUS_1_28[1] = { + {{ 5.608837306250120e-07, 1.612346238109583e-02, 6.587859751149659e+00}}, +}; + +static const struct Tass17MultiTerm IAPETUS_1[29] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0}, 22,IAPETUS_1_0}, + {{ 0, 0, 0, 0, 0, 0, 1, 0}, 24,IAPETUS_1_1}, + {{ 0, 0, 0, 0, 0, 0, 2, 0}, 16,IAPETUS_1_2}, + {{ 0, 0, 0, 0, 0, 0, 3, 0}, 2,IAPETUS_1_3}, + {{ 0, 0, 0, 0, 0,-1, 5, 0}, 75,IAPETUS_1_4}, + {{ 0, 0, 0, 0, 0, 1, 0, 0}, 5,IAPETUS_1_5}, + {{ 0, 0, 0, 0, 0, 1,-1, 0}, 4,IAPETUS_1_6}, + {{ 0, 0, 0, 0, 0, 1, 1, 0}, 4,IAPETUS_1_7}, + {{ 0, 0, 0, 0, 0, 1,-2, 0}, 2,IAPETUS_1_8}, + {{ 0, 0, 0, 0, 0, 1,-3, 0}, 4,IAPETUS_1_9}, + {{ 0, 0, 0, 0, 0, 1,-4, 0}, 5,IAPETUS_1_10}, + {{ 0, 0, 0, 0, 0, 2, 0, 0}, 3,IAPETUS_1_11}, + {{ 0, 0, 0, 0, 0, 2,-1, 0}, 1,IAPETUS_1_12}, + {{ 0, 0, 0, 0, 0, 2,-2, 0}, 3,IAPETUS_1_13}, + {{ 0, 0, 0, 0, 0, 2,-3, 0}, 2,IAPETUS_1_14}, + {{ 0, 0, 0, 0, 0, 2,-4, 0}, 2,IAPETUS_1_15}, + {{ 0, 0, 0, 0, 0, 3,-1, 0}, 2,IAPETUS_1_16}, + {{ 0, 0, 0, 0, 0, 3,-2, 0}, 1,IAPETUS_1_17}, + {{ 0, 0, 0, 0, 0, 3,-3, 0}, 1,IAPETUS_1_18}, + {{ 0, 0, 0, 0, 0, 3,-4, 0}, 2,IAPETUS_1_19}, + {{ 0, 0, 0, 0, 0, 4,-4, 0}, 1,IAPETUS_1_20}, + {{ 0, 0, 0, 0, 0, 5,-5, 0}, 1,IAPETUS_1_21}, + {{ 0, 0, 0, 0, 1, 0, 0, 0}, 1,IAPETUS_1_22}, + {{ 0, 0, 0, 0, 1, 0,-1, 0}, 1,IAPETUS_1_23}, + {{ 0, 0, 0, 1, 0, 0, 0, 0}, 1,IAPETUS_1_24}, + {{ 0, 0, 0, 1, 0, 0,-1, 0}, 1,IAPETUS_1_25}, + {{ 0, 0, 1, 0, 0, 0,-1, 0}, 1,IAPETUS_1_26}, + {{ 0, 1, 0, 0, 0, 0,-1, 0}, 1,IAPETUS_1_27}, + {{ 1, 0, 0, 0, 0, 0,-1, 0}, 1,IAPETUS_1_28}, +}; + +static const struct Tass17Term IAPETUS_2_0[24] = { + {{ 7.357194732163894e-04, 6.035829207568037e+00,-5.406408831993331e-06}}, + {{ 2.935648107313708e-02, 3.358649794029711e+00, 5.406408831993331e-06}}, + {{ 6.699050371985383e-04, 4.753014210656826e+00,-1.067825987245346e-05}}, + {{ 4.151869133102979e-04, 4.743964405299185e+00, 1.067825987245346e-05}}, + {{ 1.899854046059933e-04, 3.517567007545812e+00,-1.595011091291359e-05}}, + {{ 1.991669418726220e-04, 4.485476749277378e+00, 1.918773635511653e-05}}, + {{ 1.011804925675502e-04, 3.745348713034283e+00,-2.445958739557666e-05}}, + {{ 9.953584143544754e-04, 5.831603333509536e+00, 2.445958739557666e-05}}, + {{ 6.928098928797385e-05, 5.576141930376416e+00,-2.973143843603680e-05}}, + {{ 1.234894258008271e-04, 8.652949986394700e-01, 2.973143843603680e-05}}, + {{ 2.082728796332944e-05, 1.173870037237461e+00,-3.500328947649692e-05}}, + {{ 3.040421176914689e-07, 2.136467296916470e+00, 5.595215764041851e-04}}, + {{ 1.287853944279400e-05, 5.287782933428181e+00,-5.785747549677684e-04}}, + {{ 2.039385297517835e-05, 4.585155128610154e+00, 5.785747549677684e-04}}, + {{ 1.595251648310000e-05, 6.234432051555658e+00, 5.839811637997618e-04}}, + {{ 1.343153395169566e-05, 4.649306306086897e+00, 5.893875726317552e-04}}, + {{ 1.799640976047236e-05, 2.341543068636097e-01, 1.143502740203947e-03}}, + {{ 1.130469268372695e-05, 4.574612374891347e+00, 1.157149509935537e-03}}, + {{ 3.789273029962630e-04, 2.745292826757329e+00, 1.162555918767530e-03}}, + {{ 1.065311292483293e-05, 3.513635458424760e-03, 1.173234178639984e-03}}, + {{ 6.594412507279831e-06, 1.160392236116490e+00, 1.178640587471977e-03}}, + {{ 4.598867989379571e-07, 1.609956090712706e+00, 1.727483904003709e-03}}, + {{ 4.889687732101663e-05, 4.014982830991590e+00, 1.746537082567292e-03}}, + {{ 5.041791242559473e-06, 5.286783389563643e+00, 2.330518246367054e-03}}, +}; + +static const struct Tass17Term IAPETUS_2_1[17] = { + {{ 3.827903648104360e-07, 3.349310327302221e+00,-7.628207190099841e-02}}, + {{ 3.347616463036283e-06, 2.134214888660969e+00,-7.686605304718431e-02}}, + {{ 4.386017871369636e-07, 2.238193464103548e+00,-7.744476234232975e-02}}, + {{ 2.330306527936928e-05, 9.191067654693918e-01,-7.745003419337021e-02}}, + {{ 9.621927111300821e-07, 2.741692065655550e+00,-7.745530604441068e-02}}, + {{ 2.236294716863211e-06, 1.023085701193345e+00,-7.802874348851565e-02}}, + {{ 1.188902959997339e-04,-2.960003180568126e-01,-7.803401533955611e-02}}, + {{ 5.159571361902864e-06, 1.526594756217454e+00,-7.803928719059658e-02}}, + {{ 3.648905338577408e-06, 1.607558302204549e+00,-7.861799648574201e-02}}, + {{ 2.763121546924847e-07,-1.105228500517151e-01,-7.862326833678248e-02}}, + {{ 2.374053234088113e-06,-6.755268368608213e-03,-7.920197763192791e-02}}, + {{ 2.809879517690395e-06,-1.325635285498895e+00,-7.920724948296838e-02}}, + {{ 7.601575967574296e-07, 3.638825235880475e+00,-7.921252133400884e-02}}, + {{ 2.011807388354464e-07,-1.221851342565206e+00,-7.978595877811381e-02}}, + {{ 2.722673162134422e-07,-2.540738375872117e+00,-7.979123062915428e-02}}, + {{ 2.341140383006404e-07, 2.833112279003631e-01,-8.036993992429971e-02}}, + {{ 1.079744827006783e-07,-1.035863524313422e+00,-8.037521177534018e-02}}, +}; + +static const struct Tass17Term IAPETUS_2_2[15] = { + {{ 5.077127357111450e-07, 1.063128508151314e+00, 7.744476234232975e-02}}, + {{ 1.216563739390478e-07,-7.586058089542492e-01, 7.745003419337021e-02}}, + {{ 3.788966811408025e-07, 9.593705739442162e-01, 7.802347163747521e-02}}, + {{ 8.559499914533230e-07, 2.278052169500489e+00, 7.802874348851565e-02}}, + {{ 9.792124873256762e-07,-2.686078783286550e+00, 7.803401533955611e-02}}, + {{ 2.075828194269492e-06, 2.092609920904744e+00, 7.861799648574201e-02}}, + {{ 3.015291948812891e-06,-1.152929578102659e+00, 7.919670578088745e-02}}, + {{ 2.453612858406647e-04, 1.661250302251527e-01, 7.920197763192791e-02}}, + {{ 3.267848713606678e-06, 1.485175738282932e+00, 7.920724948296838e-02}}, + {{ 2.045440860185655e-06,-1.760359860454440e+00, 7.978595877811381e-02}}, + {{ 9.507520895249895e-07, 3.018328843736854e+00, 8.036993992429971e-02}}, + {{ 8.310721660889963e-07,-1.945802109050186e+00, 8.037521177534018e-02}}, + {{ 3.678842089652509e-07, 5.656064793685675e+00, 8.038048362638064e-02}}, + {{ 1.163907976076402e-07, 1.090855869404554e+00, 8.095392107048561e-02}}, + {{ 4.857377246389406e-07, 5.552306859478579e+00, 8.095919292152608e-02}}, +}; + +static const struct Tass17Term IAPETUS_2_3[1] = { + {{ 1.155571530124003e-06, 2.959627469406032e+00,-1.572305865626520e-01}}, +}; + +static const struct Tass17Term IAPETUS_2_4[4] = { + {{ 3.386727736182448e-07, 5.810388343392691e+00, 1.566574182341301e-01}}, + {{ 1.733359910757746e-06, 7.423107991233067e-01, 1.572413993803160e-01}}, + {{ 4.262641945379126e-06, 7.918495104173626e-01, 1.583794956764603e-01}}, + {{ 8.024442052834091e-06, 3.193669906570326e+00, 1.583985488550238e-01}}, +}; + +static const struct Tass17Term IAPETUS_2_5[8] = { + {{ 3.591607352372491e-07, 4.481232803237869e+00, 2.352700083110402e-01}}, + {{ 2.976455752240285e-06,-5.868558890738737e-01, 2.358539894572260e-01}}, + {{ 1.320515754572473e-05, 6.282501451704030e-01, 2.364379706034119e-01}}, + {{ 8.543461484774715e-07, 5.088883400685836e+00, 2.364432424544524e-01}}, + {{ 3.770599260080091e-07, 4.984963438378681e+00, 2.370219517495979e-01}}, + {{ 1.426804754726213e-06, 3.386073918171003e-01, 2.376059328957838e-01}}, + {{ 1.112281761662677e-06,-1.484029309805413e+00, 2.376112047468242e-01}}, + {{ 3.039469315779643e-07, 2.976610131749417e+00, 2.376164765978647e-01}}, +}; + +static const struct Tass17Term IAPETUS_2_6[1] = { + {{ 5.756485350981315e-07, 3.655807898223860e+00, 3.156345418265079e-01}}, +}; + +static const struct Tass17Term IAPETUS_2_7[4] = { + {{ 9.807167381341471e-06, 4.647844982264678e+00,-3.940425661480334e-01}}, + {{ 1.050421274404971e-05, 1.871271231028191e-01,-3.940478379990738e-01}}, + {{ 2.816558865567409e-06, 2.009743661307299e+00,-3.940531098501144e-01}}, + {{ 3.824414539954584e-07, 4.420210596752325e+00,-3.940670185493895e-01}}, +}; + +static const struct Tass17Term IAPETUS_2_8[3] = { + {{ 3.660318350154349e-07, 4.194707709203449e+00,-3.148161289287099e-01}}, + {{ 1.034350804286399e-05, 1.792690836877676e+00,-3.148351821072734e-01}}, + {{ 3.362081661163648e-07, 4.540912112901320e+00,-3.148459949249374e-01}}, +}; + +static const struct Tass17Term IAPETUS_2_9[3] = { + {{ 1.891655464023067e-06, 2.997740360570593e+00,-2.356333390331371e-01}}, + {{ 2.738557431501198e-04, 1.678643034250733e+00,-2.356386108841776e-01}}, + {{ 2.085092385794607e-06, 3.595434709071512e-01,-2.356438827352181e-01}}, +}; + +static const struct Tass17Term IAPETUS_2_10[4] = { + {{ 3.297148610970001e-07, 3.283240059277484e+00,-1.564259549923772e-01}}, + {{ 4.210058117501252e-07, 1.957966659954585e+00,-1.564312268434177e-01}}, + {{ 1.295232370537576e-05, 4.706187935978230e+00,-1.564420396610816e-01}}, + {{ 3.074615033071044e-06, 5.446004958756377e+00,-1.564610928396452e-01}}, +}; + +static const struct Tass17Term IAPETUS_2_11[5] = { + {{ 5.503284015527491e-07, 1.347535507567527e+00,-7.722411191824082e-02}}, + {{ 2.144377111729538e-06, 3.170159823835280e+00,-7.722938376928129e-02}}, + {{ 2.094675673402415e-06, 4.992627959583361e+00,-7.723465562032175e-02}}, + {{ 4.509478629698950e-07, 1.450547484355915e+00,-7.724546843798574e-02}}, + {{ 9.711472430656398e-07, 2.190338602286141e+00,-7.726452161654932e-02}}, +}; + +static const struct Tass17Term IAPETUS_2_12[14] = { + {{ 1.580459593848266e-06, 5.957697356265878e+00, 1.912996427983057e-03}}, + {{ 3.059086093929264e-06, 2.076274581959904e+00, 1.932049606546640e-03}}, + {{ 4.097571772366432e-06, 2.476739673478372e+00, 1.942862424210627e-03}}, + {{ 4.622849445770262e-06, 6.542846935894391e-01, 1.948134275251087e-03}}, + {{ 4.098021786747177e-07, 4.478092318805028e+00, 1.951102785110223e-03}}, + {{ 9.865359954273804e-07, 5.114846914000389e+00, 1.953406126291547e-03}}, + {{ 6.577318919877076e-07, 3.559551940631996e+00, 1.956643751733750e-03}}, + {{ 1.141609439284819e-05, 4.878643124436238e+00, 1.961915602774210e-03}}, + {{ 1.246701893241003e-05, 3.056131321602242e+00, 1.967187453814670e-03}}, + {{ 2.869127018959028e-06, 1.233485437260538e+00, 1.972459304855130e-03}}, + {{ 5.346245981429982e-07, 2.130300142857571e+00, 1.972728420438197e-03}}, + {{ 2.905389353328124e-07, 1.636237329753522e+00, 1.983272122519117e-03}}, + {{ 5.913037768933752e-07, 5.106224293368807e+00, 1.986368004130226e-03}}, + {{ 3.023788452701212e-07, 3.282662154041165e+00, 1.991639855170686e-03}}, +}; + +static const struct Tass17Term IAPETUS_2_13[4] = { + {{ 5.121289657996665e-06, 3.617695571228794e+00, 3.940372942969930e-01}}, + {{ 5.937514602713236e-04, 4.936792335851361e+00, 3.940425661480334e-01}}, + {{ 5.590721162724015e-06, 6.255890970618563e+00, 3.940478379990738e-01}}, + {{ 3.508789971395948e-07, 2.022944114109337e+00, 3.940670185493895e-01}}, +}; + +static const struct Tass17Term IAPETUS_2_14[1] = { + {{ 3.500731595844181e-06, 1.909247431651662e+00, 3.148459949249374e-01}}, +}; + +static const struct Tass17Term IAPETUS_2_15[1] = { + {{ 2.223396437049981e-06, 4.822744530752217e+00, 4.732391373711294e-01}}, +}; + +static const struct Tass17Term IAPETUS_2_16[3] = { + {{ 1.903491726480552e-06, 1.967591900767555e+00, 5.524465214118891e-01}}, + {{ 1.948656845764241e-06, 1.451237650194714e-01, 5.524517932629298e-01}}, + {{ 5.000991669041441e-07, 4.605684755931306e+00, 5.524570651139702e-01}}, +}; + +static const struct Tass17Term IAPETUS_2_17[2] = { + {{ 3.067385455485728e-07, 2.393030894759276e+00,-7.880606727086713e-01}}, + {{ 3.140166875052082e-07, 4.215499030507360e+00,-7.880659445597117e-01}}, +}; + +static const struct Tass17Term IAPETUS_2_18[1] = { + {{ 7.066767025578607e-06, 5.707015564669242e+00,-6.296567174448153e-01}}, +}; + +static const struct Tass17Term IAPETUS_2_19[4] = { + {{ 3.279448099865014e-07, 2.451375363875169e+00,-5.504601462217194e-01}}, + {{ 3.126490699275733e-07, 1.368667098072893e+00,-5.504739275492424e-01}}, + {{ 1.048627591564010e-05, 4.956843545116611e-02,-5.504791994002831e-01}}, + {{ 3.126490699275733e-07, 5.013655080009026e+00,-5.504844712513235e-01}}, +}; + +static const struct Tass17Term IAPETUS_2_20[2] = { + {{ 1.831410067152233e-06, 3.077113311796339e+00,-4.712826281771871e-01}}, + {{ 7.115752344230280e-07, 6.753063833723361e-01,-4.713016813557509e-01}}, +}; + +static const struct Tass17Term IAPETUS_2_21[1] = { + {{ 1.721342888159264e-05, 9.024276128068640e-01, 7.880606727086713e-01}}, +}; + +static const struct Tass17Term IAPETUS_2_22[1] = { + {{ 1.093705824191350e-06, 2.826816249991383e-01, 7.088831546641388e-01}}, +}; + +static const struct Tass17Term IAPETUS_2_23[1] = { + {{ 2.918130882538270e-06, 1.562086464859070e+00,-8.653197879163885e-01}}, +}; + +static const struct Tass17Term IAPETUS_2_24[1] = { + {{ 5.831454312634436e-07, 4.589631341204242e+00,-7.861232166932925e-01}}, +}; + +static const struct Tass17Term IAPETUS_2_25[1] = { + {{ 5.754083403713949e-07, 3.163232139672567e+00, 1.182078779269309e+00}}, +}; + +static const struct Tass17Term IAPETUS_2_26[1] = { + {{ 4.595462189000190e-07, 5.053348902770820e+00, 1.023723743180244e+00}}, +}; + +static const struct Tass17Term IAPETUS_2_27[1] = { + {{ 8.343508926599710e-07, 3.074604494266973e+00,-1.180160376432494e+00}}, +}; + +static const struct Tass17Term IAPETUS_2_28[2] = { + {{ 3.005442215364578e-07, 3.363297035584122e+00,-1.390853717105622e+00}}, + {{ 3.076753876071480e-07, 5.185765171332203e+00,-1.390858988956663e+00}}, +}; + +static const struct Tass17Term IAPETUS_2_29[1] = { + {{ 6.251473936893123e-06, 3.940966283548398e-01,-1.232449761841766e+00}}, +}; + +static const struct Tass17Term IAPETUS_2_30[1] = { + {{ 1.645103872537621e-05, 6.221338739275052e+00, 1.390853717105622e+00}}, +}; + +static const struct Tass17Term IAPETUS_2_31[1] = { + {{ 3.207481705138808e-06, 4.620837650975520e+00,-2.137313691168855e+00}}, +}; + +static const struct Tass17Term IAPETUS_2_32[1] = { + {{ 9.029410063641440e-06, 1.994597716654372e+00, 2.295717646432711e+00}}, +}; + +static const struct Tass17Term IAPETUS_2_33[1] = { + {{ 1.980399556792357e-06, 1.376326363638862e+00,-3.169902489790702e+00}}, +}; + +static const struct Tass17Term IAPETUS_2_34[1] = { + {{ 5.659369633167750e-06, 5.239109003991030e+00, 3.328306445054557e+00}}, +}; + +static const struct Tass17Term IAPETUS_2_35[1] = { + {{ 4.105962555389770e-07, 5.815663679651547e+00,-4.427132796269878e+00}}, +}; + +static const struct Tass17Term IAPETUS_2_36[1] = { + {{ 3.999910250873396e-07, 7.997716879783442e-01, 4.585536751533733e+00}}, +}; + +static const struct Tass17Term IAPETUS_2_37[1] = { + {{ 4.231711644426220e-07, 1.822484926062486e-01, 6.667061728781588e+00}}, +}; + +static const struct Tass17MultiTerm IAPETUS_2[38] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0}, 24,IAPETUS_2_0}, + {{ 0, 0, 0, 0, 0, 0,-1, 0}, 17,IAPETUS_2_1}, + {{ 0, 0, 0, 0, 0, 0, 1, 0}, 15,IAPETUS_2_2}, + {{ 0, 0, 0, 0, 0, 0,-2, 0}, 1,IAPETUS_2_3}, + {{ 0, 0, 0, 0, 0, 0, 2, 0}, 4,IAPETUS_2_4}, + {{ 0, 0, 0, 0, 0, 0, 3, 0}, 8,IAPETUS_2_5}, + {{ 0, 0, 0, 0, 0, 0, 4, 0}, 1,IAPETUS_2_6}, + {{ 0, 0, 0, 0, 0,-1, 0, 0}, 4,IAPETUS_2_7}, + {{ 0, 0, 0, 0, 0,-1, 1, 0}, 3,IAPETUS_2_8}, + {{ 0, 0, 0, 0, 0,-1, 2, 0}, 3,IAPETUS_2_9}, + {{ 0, 0, 0, 0, 0,-1, 3, 0}, 4,IAPETUS_2_10}, + {{ 0, 0, 0, 0, 0,-1, 4, 0}, 5,IAPETUS_2_11}, + {{ 0, 0, 0, 0, 0,-1, 5, 0}, 14,IAPETUS_2_12}, + {{ 0, 0, 0, 0, 0, 1, 0, 0}, 4,IAPETUS_2_13}, + {{ 0, 0, 0, 0, 0, 1,-1, 0}, 1,IAPETUS_2_14}, + {{ 0, 0, 0, 0, 0, 1, 1, 0}, 1,IAPETUS_2_15}, + {{ 0, 0, 0, 0, 0, 1, 2, 0}, 3,IAPETUS_2_16}, + {{ 0, 0, 0, 0, 0,-2, 0, 0}, 2,IAPETUS_2_17}, + {{ 0, 0, 0, 0, 0,-2, 2, 0}, 1,IAPETUS_2_18}, + {{ 0, 0, 0, 0, 0,-2, 3, 0}, 4,IAPETUS_2_19}, + {{ 0, 0, 0, 0, 0,-2, 4, 0}, 2,IAPETUS_2_20}, + {{ 0, 0, 0, 0, 0, 2, 0, 0}, 1,IAPETUS_2_21}, + {{ 0, 0, 0, 0, 0, 2,-1, 0}, 1,IAPETUS_2_22}, + {{ 0, 0, 0, 0, 0,-3, 4, 0}, 1,IAPETUS_2_23}, + {{ 0, 0, 0, 0, 0,-3, 5, 0}, 1,IAPETUS_2_24}, + {{ 0, 0, 0, 0, 0, 3, 0, 0}, 1,IAPETUS_2_25}, + {{ 0, 0, 0, 0, 0, 3,-2, 0}, 1,IAPETUS_2_26}, + {{ 0, 0, 0, 0, 0,-4, 5, 0}, 1,IAPETUS_2_27}, + {{ 0, 0, 0, 0,-1, 0, 0, 0}, 2,IAPETUS_2_28}, + {{ 0, 0, 0, 0,-1, 0, 2, 0}, 1,IAPETUS_2_29}, + {{ 0, 0, 0, 0, 1, 0, 0, 0}, 1,IAPETUS_2_30}, + {{ 0, 0, 0,-1, 0, 0, 2, 0}, 1,IAPETUS_2_31}, + {{ 0, 0, 0, 1, 0, 0, 0, 0}, 1,IAPETUS_2_32}, + {{ 0, 0,-1, 0, 0, 0, 2, 0}, 1,IAPETUS_2_33}, + {{ 0, 0, 1, 0, 0, 0, 0, 0}, 1,IAPETUS_2_34}, + {{ 0,-1, 0, 0, 0, 0, 2, 0}, 1,IAPETUS_2_35}, + {{ 0, 1, 0, 0, 0, 0, 0, 0}, 1,IAPETUS_2_36}, + {{ 1, 0, 0, 0, 0, 0, 0, 0}, 1,IAPETUS_2_37}, +}; + +static const struct Tass17Term IAPETUS_3_0[28] = { + {{ 6.794549145709775e-02, 5.047886356662284e+00,-5.271851040460129e-06}}, + {{ 6.892434301339112e-04, 1.398038368144667e+00, 5.271851040460129e-06}}, + {{ 4.570393856724005e-05, 3.663028182224427e+00,-1.054370208092026e-05}}, + {{ 2.873148969672351e-05, 1.130417841604620e+00, 1.067825987245346e-05}}, + {{ 1.915644482319336e-05, 1.666983826523547e+00, 1.608466870444679e-05}}, + {{ 5.927925628073686e-06, 2.236765758751786e+00,-1.621922649597999e-05}}, + {{ 1.388791091408471e-05, 6.199545784892948e+00,-1.870277299460525e-05}}, + {{ 2.730634121085477e-04, 3.074026406224565e+00,-2.445240135601595e-05}}, + {{ 9.851993483313069e-06, 3.568018055505390e+00, 2.445240135601595e-05}}, + {{ 1.363049113672050e-05, 1.573081241951383e+00,-2.972425239647608e-05}}, + {{ 6.564159971602750e-06, 5.899199575040269e+00, 2.986599622756999e-05}}, + {{ 1.115402869499410e-05, 2.124370914205684e+00, 4.891917479115332e-05}}, + {{ 5.075828846612914e-06, 3.331278759394790e-01, 5.419102583161344e-05}}, + {{ 2.829811667283325e-05, 3.179813769687029e+00, 5.787093127593016e-04}}, + {{ 4.494417792607357e-05, 5.092981879591376e+00,-5.839811637997618e-04}}, + {{ 3.010291742672222e-05, 4.323389769715201e+00, 5.839811637997618e-04}}, + {{ 2.832841674512957e-05, 3.775418852980096e+00,-5.892530148402220e-04}}, + {{ 9.901282214730337e-06, 3.022565890567675e+00, 5.892530148402220e-04}}, + {{ 3.855202341799354e-06, 3.260409788853447e+00, 1.149259554604918e-03}}, + {{ 6.779699256950095e-07, 3.450394767068876e+00,-1.167962327599524e-03}}, + {{ 2.641112196820165e-04, 6.085250961969193e+00, 1.167962327599524e-03}}, + {{ 5.003929435494984e-06, 5.249025520673378e+00,-1.173234178639984e-03}}, + {{ 1.816919041955310e-04, 1.123018507358733e+00, 1.173234178639984e-03}}, + {{ 4.700210983954140e-06, 3.997089887831509e+00,-1.178506029680444e-03}}, + {{ 3.932389676076612e-06, 5.902900444967474e+00, 1.186665100594129e-03}}, + {{ 3.374620641006819e-05, 1.072212121537805e+00, 1.751943491399285e-03}}, + {{ 2.348785638862567e-05, 2.392069283444719e+00, 1.757215342439746e-03}}, + {{ 3.494901083668216e-06, 2.384257843599439e+00, 2.335924655199047e-03}}, +}; + +static const struct Tass17Term IAPETUS_3_1[4] = { + {{ 3.472415791165123e-07,-2.485713646106026e+00, 7.803942174838812e-02}}, + {{ 3.695428746936740e-07, 7.056695618928304e-01, 7.917751804453235e-02}}, + {{ 3.421209496536026e-07, 3.666045991093121e-01, 7.920738404075992e-02}}, + {{ 3.695428746936740e-07, 2.768173152147268e+00, 7.922643721932350e-02}}, +}; + +static const struct Tass17Term IAPETUS_3_2[8] = { + {{ 3.970411713643165e-07, 2.468316120918740e+00, 1.566520118252981e-01}}, + {{ 1.388077368193791e-06, 2.364532110656320e+00, 1.572307211204436e-01}}, + {{ 1.564612965731580e-06,-2.599830403698914e+00, 1.572359929714840e-01}}, + {{ 3.930946817313776e-07, 5.320498414089342e+00, 1.578199741176699e-01}}, + {{ 4.741596443169412e-07,-2.890040852186059e+00, 1.584039552638558e-01}}, + {{ 1.832371513844348e-06, 1.571448595037313e+00, 1.584092271148963e-01}}, + {{ 3.902069246730890e-07, 1.467528632730159e+00, 1.589879364100418e-01}}, + {{ 4.268928712637706e-07, 3.104364787604514e+00, 1.595719175562276e-01}}, +}; + +static const struct Tass17Term IAPETUS_3_3[2] = { + {{ 1.141957796039554e-06, 1.706497420624183e+00,-3.940371597392014e-01}}, + {{ 5.876712089500301e-07, 3.528959925655309e+00,-3.940424315902420e-01}}, +}; + +static const struct Tass17Term IAPETUS_3_4[3] = { + {{ 2.987819907657320e-05, 1.592450553501527e+00,-3.148405885161054e-01}}, + {{ 1.598538661690393e-05, 3.414911760531445e+00,-3.148458603671461e-01}}, + {{ 5.196347763201437e-07, 1.364682192599308e+00,-3.148650409174615e-01}}, +}; + +static const struct Tass17Term IAPETUS_3_5[1] = { + {{ 4.754237067161859e-07, 4.619994519724736e+00,-2.356440172930096e-01}}, +}; + +static const struct Tass17Term IAPETUS_3_6[2] = { + {{ 3.836235546728265e-07, 6.225559278035010e+00,-1.564313614012092e-01}}, + {{ 7.454540946216246e-07, 1.764836475886549e+00,-1.564366332522496e-01}}, +}; + +static const struct Tass17Term IAPETUS_3_7[7] = { + {{ 5.950685735865521e-07, 2.276553135246288e+00, 1.937456015378634e-03}}, + {{ 3.062968607914330e-07, 4.541169170095360e-01, 1.942727866419093e-03}}, + {{ 8.833068155471169e-07, 4.678333554199201e+00, 1.956509193942217e-03}}, + {{ 4.545649462411443e-07, 2.855871049168076e+00, 1.961781044982677e-03}}, + {{ 8.604417421849733e-07, 5.078832057446901e+00, 1.967322011606203e-03}}, + {{ 1.310815780246894e-06, 3.256355709659855e+00, 1.972593862646663e-03}}, + {{ 6.718820321393613e-07, 1.433809611894344e+00, 1.977865713687124e-03}}, +}; + +static const struct Tass17Term IAPETUS_3_8[2] = { + {{ 1.141957796039554e-06, 5.137033501494948e+00, 3.940479725568654e-01}}, + {{ 5.876712089500302e-07, 3.314570996463822e+00, 3.940532444079058e-01}}, +}; + +static const struct Tass17Term IAPETUS_3_9[1] = { + {{ 3.730666308347880e-07, 3.531492325926554e+00, 3.148353166650650e-01}}, +}; + +static const struct Tass17Term IAPETUS_3_10[3] = { + {{ 2.011086466288782e-05, 5.022984906438330e+00, 4.732445437799614e-01}}, + {{ 1.081178008232983e-05, 3.200523219219202e+00, 4.732498156310018e-01}}, + {{ 3.781314342005297e-07, 5.250621987578875e+00, 4.732689961813175e-01}}, +}; + +static const struct Tass17Term IAPETUS_3_11[2] = { + {{ 8.562203475402176e-07, 5.620822378456090e+00,-7.088586950767433e-01}}, + {{ 4.406257818911077e-07, 1.160099576307630e+00,-7.088639669277837e-01}}, +}; + +static const struct Tass17Term IAPETUS_3_12[1] = { + {{ 4.385541576256689e-07, 6.246560326377261e+00,-6.296811770322111e-01}}, +}; + +static const struct Tass17Term IAPETUS_3_13[1] = { + {{ 3.504051883832708e-07, 3.688750412526320e-01, 7.880851322960668e-01}}, +}; + +static const struct Tass17Term IAPETUS_3_14[2] = { + {{ 6.998372934208747e-07, 9.946129891738023e-01, 8.672626503405993e-01}}, + {{ 3.601483607531824e-07, 5.455335791322262e+00, 8.672679221916397e-01}}, +}; + +static const struct Tass17Term IAPETUS_3_15[2] = { + {{ 7.978736105198133e-07, 3.079032121013479e-01,-1.311651739473694e+00}}, + {{ 4.105995430914010e-07, 2.130365717132474e+00,-1.311657011324735e+00}}, +}; + +static const struct Tass17Term IAPETUS_3_16[2] = { + {{ 7.118995492853203e-07, 2.434684834895837e-02, 1.470055694737550e+00}}, + {{ 3.663558059942478e-07, 4.485069650497419e+00, 1.470060966588590e+00}}, +}; + +static const struct Tass17Term IAPETUS_3_17[1] = { + {{ 4.090821761277136e-07, 4.534644234722027e+00,-2.216515668800783e+00}}, +}; + +static const struct Tass17Term IAPETUS_3_18[1] = { + {{ 3.817968724121190e-07, 2.080791132907865e+00, 2.374919624064639e+00}}, +}; + +static const struct Tass17MultiTerm IAPETUS_3[19] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0}, 28,IAPETUS_3_0}, + {{ 0, 0, 0, 0, 0, 0, 1, 0}, 4,IAPETUS_3_1}, + {{ 0, 0, 0, 0, 0, 0, 2, 0}, 8,IAPETUS_3_2}, + {{ 0, 0, 0, 0, 0,-1, 0, 0}, 2,IAPETUS_3_3}, + {{ 0, 0, 0, 0, 0,-1, 1, 0}, 3,IAPETUS_3_4}, + {{ 0, 0, 0, 0, 0,-1, 2, 0}, 1,IAPETUS_3_5}, + {{ 0, 0, 0, 0, 0,-1, 3, 0}, 2,IAPETUS_3_6}, + {{ 0, 0, 0, 0, 0,-1, 5, 0}, 7,IAPETUS_3_7}, + {{ 0, 0, 0, 0, 0, 1, 0, 0}, 2,IAPETUS_3_8}, + {{ 0, 0, 0, 0, 0, 1,-1, 0}, 1,IAPETUS_3_9}, + {{ 0, 0, 0, 0, 0, 1, 1, 0}, 3,IAPETUS_3_10}, + {{ 0, 0, 0, 0, 0,-2, 1, 0}, 2,IAPETUS_3_11}, + {{ 0, 0, 0, 0, 0,-2, 2, 0}, 1,IAPETUS_3_12}, + {{ 0, 0, 0, 0, 0, 2, 0, 0}, 1,IAPETUS_3_13}, + {{ 0, 0, 0, 0, 0, 2, 1, 0}, 2,IAPETUS_3_14}, + {{ 0, 0, 0, 0,-1, 0, 1, 0}, 2,IAPETUS_3_15}, + {{ 0, 0, 0, 0, 1, 0, 1, 0}, 2,IAPETUS_3_16}, + {{ 0, 0, 0,-1, 0, 0, 1, 0}, 1,IAPETUS_3_17}, + {{ 0, 0, 0, 1, 0, 0, 1, 0}, 1,IAPETUS_3_18}, +}; + +static const struct Tass17Term HYPERION_0_0[109] = { + {{ 5.269198501828300e-03, 5.535906566693734e+00, 9.810539955099672e-03}}, + {{ 9.845757121969750e-04, 5.390367216813617e+00, 1.974675300542636e-01}}, + {{-9.447929974549504e-04, 2.695183608406955e+00, 9.873376502713178e-02}}, + {{-6.016015548174626e-04, 3.442462348892786e+00, 8.892322507203211e-02}}, + {{ 5.722146672387600e-04, 1.802365518040839e+00, 2.962012950813954e-01}}, + {{ 5.148150044366294e-04, 1.947904867920752e+00, 1.085443049822315e-01}}, + {{ 3.064232824160758e-04, 4.497549126447647e+00, 3.949350601085272e-01}}, + {{ 2.328679324996273e-04, 9.095474276756056e-01, 4.936688251356589e-01}}, + {{ 1.830222466848013e-04, 3.604731036082414e+00, 5.924025901627907e-01}}, + {{ 1.428121183641368e-04, 1.672933731036699e-02, 6.911363551899224e-01}}, + {{-1.309800881858535e-04, 4.597328162679121e+00, 1.072766731000612e-02}}, + {{ 1.186076675279319e-04, 1.912996635287834e-01, 8.893412600193221e-03}}, + {{ 1.030589558021878e-04, 2.711912945716443e+00, 7.898701202170543e-01}}, + {{ 9.162128151198170e-05, 2.549644258526895e+00, 2.863907551262957e-01}}, + {{ 8.420360344777332e-05, 5.244827866933704e+00, 3.851245201534275e-01}}, + {{-7.587557241443920e-05, 4.189741089378624e+00, 7.911268511693244e-02}}, + {{ 7.477636779983881e-05, 5.407096554123251e+00, 8.886038852441861e-01}}, + {{ 6.245968777723361e-05, 1.656826168161656e+00, 4.838582851805592e-01}}, + {{-5.925277975412419e-05, 1.055086777554782e+00, 3.060118350364951e-01}}, + {{-5.866195836719566e-05, 4.576031364902324e-02, 1.965504026993571e-01}}, + {{-5.838551971068579e-05, 3.750270385962327e+00, 4.047456000636268e-01}}, + {{ 5.517120904542451e-05, 1.819094855351211e+00, 9.873376502713178e-01}}, + {{ 5.291804011662172e-05, 4.352009776567740e+00, 5.825920502076911e-01}}, + {{ 4.785477163890776e-05, 7.640080777956939e-01, 6.813258152348228e-01}}, + {{ 4.648293960962418e-05, 6.137645957299674e+00, 1.876569900991639e-01}}, + {{-4.509683939781330e-05, 1.622686871902795e-01, 5.034793650907585e-01}}, + {{-4.394073687298339e-05, 1.200626127435425e+00, 1.183548449373311e-01}}, + {{ 4.393229670558661e-05, 3.459191686201771e+00, 7.800595802619547e-01}}, + {{ 4.272829406941570e-05, 1.848125831689869e+00, 4.927516977807525e-01}}, + {{ 4.154122350033837e-05, 4.514278463755098e+00, 1.086071415298450e+00}}, + {{-4.056750796467554e-05, 2.857452295597089e+00, 6.022131301178903e-01}}, + {{-3.857616137051121e-05, 5.552635904003895e+00, 7.009468951450221e-01}}, + {{ 3.815083219130052e-05, 6.154375294608579e+00, 8.787933452890865e-01}}, + {{-3.619913197295652e-05, 1.964634205231123e+00, 7.996806601721539e-01}}, + {{-3.615550506243641e-05, 6.017393906061373e-01, 1.778464501440642e-01}}, + {{ 3.211045925583688e-05, 2.566373595836530e+00, 9.775271103162182e-01}}, + {{-3.191646069822739e-05, 4.659817813637930e+00, 8.984144251992857e-01}}, + {{ 3.106998351274690e-05, 9.262767649808578e-01, 1.184805180325582e+00}}, + {{-2.986485373026291e-05, 4.041349085722073e+00, 2.943161986529901e-02}}, + {{-2.797299420355516e-05, 3.895809735842240e+00, 2.170886099644629e-01}}, + {{-2.722632461441940e-05, 1.071816114865886e+00, 9.971481902264174e-01}}, + {{-2.676900656082160e-05, 3.971018944640962e+00, 1.095544904247980e+00}}, + {{ 2.670876942507434e-05, 5.261557204243347e+00, 1.076260875343350e+00}}, + {{ 2.422130320267833e-05, 4.788627826207911e+00, 1.962107991019934e-02}}, + {{ 2.299675108056304e-05, 3.621460373393509e+00, 1.283538945352713e+00}}, + {{-2.297557612018265e-05, 3.766999723274154e+00, 1.095881955253549e+00}}, + {{ 2.232369387111974e-05, 1.673555505469107e+00, 1.174994640370482e+00}}, + {{-1.940722128323030e-05, 1.789980244999149e-01, 1.194615720280681e+00}}, + {{ 1.861668359762009e-05, 4.368739113874453e+00, 1.273728405397614e+00}}, + {{ 1.721156885182891e-05, 4.381040752907420e+00, 8.800609771712566e-02}}, + {{ 1.683393793859745e-05, 3.345867461927939e-02, 1.382272710379845e+00}}, + {{-1.635856648806699e-05, 2.874181632905266e+00, 1.293349485307813e+00}}, + {{ 1.543735278843180e-05, 7.807374151075219e-01, 1.372462170424745e+00}}, + {{-1.367379954537092e-05, 5.569365241310616e+00, 1.392083250334945e+00}}, + {{-1.338883184199104e-05, 2.503883944878085e+00, 8.984035242693857e-02}}, + {{-1.336950395903937e-05, 3.078080370694616e-01, 3.158223749915947e-01}}, + {{-1.320526200861202e-05, 3.296922999012952e+00, 2.765802151711960e-01}}, + {{-1.308495447734650e-05, 6.027455951817885e+00, 2.000408834733950e+00}}, + {{-1.302898520468604e-05, 1.009326463906489e+00, 1.094614323371379e-01}}, + {{ 1.289973076525889e-05, 4.062988177672174e+00, 9.924156005528160e-03}}, + {{-1.276260623147002e-05, 7.256396485357081e-01, 9.696923904671184e-03}}, + {{ 1.271138964892950e-05, 3.475921023512875e+00, 1.471195935451877e+00}}, + {{-1.249786948042500e-05, 4.914148009431628e+00, 2.962012605910000e-01}}, + {{ 1.223977806847720e-05, 2.728642283024626e+00, 1.481006475406977e+00}}, + {{-1.206158887296372e-05, 3.633762012421656e+00, 9.781663767222532e-02}}, + {{-1.131018256569493e-05, 1.981363542543681e+00, 1.490817015362076e+00}}, + {{-1.089636645498038e-05, 2.740943922055832e+00, 2.952841677264889e-01}}, + {{ 1.039179172259797e-05, 6.171104631918221e+00, 1.569929700479009e+00}}, + {{ 1.012836012521588e-05, 2.886483271935745e+00, 1.076271776273250e-01}}, + {{-9.589777592386616e-06, 5.344606903164943e+00, 9.171273549064512e-04}}, + {{-9.298418091702524e-06, 4.676547150949028e+00, 1.589550780389208e+00}}, + {{ 8.847111426033778e-06, 5.423825891429972e+00, 1.579740240434109e+00}}, + {{-8.783581973124320e-06, 4.617972413769575e+00, 5.894496611094870e-01}}, + {{ 8.461716341891088e-06, 2.583102933143981e+00, 1.668663465506141e+00}}, + {{-7.901292288839958e-06, 4.643088476327559e+00, 2.072780700093633e-01}}, + {{ 7.719706043802130e-06, 4.937019829864389e+00, 6.930214516183278e-02}}, + {{-7.609973567682646e-06, 1.088545452174794e+00, 1.688284545416340e+00}}, + {{ 7.430427565196998e-06, 3.313652336323319e+00, 9.677165703611184e-01}}, + {{ 7.356833812577206e-06, 6.184687279150488e-01, 8.689828053339868e-01}}, + {{ 7.165256187015007e-06, 6.008835944731589e+00, 1.066450335388250e+00}}, + {{ 6.955885415513037e-06, 4.206470426688558e+00, 7.702490403068549e-01}}, + {{ 6.885291075415051e-06, 5.278286541549328e+00, 1.767397230533273e+00}}, + {{ 6.614895521474710e-06, 1.511286818281744e+00, 6.715152752797231e-01}}, + {{ 6.331562819397564e-06, 1.835824192663037e+00, 1.678474005461240e+00}}, + {{-6.179612339504240e-06, 3.783729060580140e+00, 1.787018310443472e+00}}, + {{ 6.131629134251356e-06, 5.116017854362701e+00, 1.263917865442514e+00}}, + {{ 5.583256693630428e-06, 1.528016155588465e+00, 1.362651630469646e+00}}, + {{ 5.538856606051041e-06, 1.690284842782397e+00, 1.866130995560404e+00}}, + {{-5.031578459421872e-06, 4.533473869493745e-01, 1.281653848924308e-01}}, + {{-4.727461773298300e-06, 1.403512188080000e+00, 1.136827010127225e-02}}, + {{-4.490169397561938e-06, 8.800270869150743e-01, 9.899519638809918e-03}}, + {{ 4.445857119863126e-06, 3.908600739292801e+00, 9.721560271389426e-03}}, + {{ 3.929644136581539e-06, 3.385115638127897e+00, 8.252809808927092e-03}}, + {{ 3.847298333647876e-06, 5.128319493393325e+00, 7.819555776202598e-02}}, + {{-3.502084178980730e-06, 3.251162685363996e+00, 8.002981247183889e-02}}, + {{-2.961456426220440e-06, 5.853277499591428e+00, 2.952841654680000e-01}}, + {{ 2.811429184555117e-06, 3.658749758664493e+00, 1.164479466491257e-02}}, + {{ 2.625536042038141e-06, 1.756605204392253e+00, 9.965089238203824e-02}}, + {{ 2.190398167707681e-06, 2.620477234204319e-01, 1.192719722922376e-01}}, + {{-2.173672397129618e-06, 4.979927489736701e+00, 2.851449251039256e-02}}, + {{ 2.165574780684495e-06, 3.102770681707372e+00, 3.034874722020547e-02}}, + {{-2.086152830538867e-06, 2.139204531449687e+00, 1.174377175824247e-01}}, + {{ 1.758820758802031e-06, 2.435682350271240e+00, 9.835176321817914e-03}}, + {{-1.729303956187257e-06, 2.352945475936649e+00, 9.785903588381428e-03}}, + {{ 1.628729863936739e-06, 5.684298570350299e+00, 5.949160520673310e-02}}, + {{-1.424540056085036e-06, 4.915380737914367e+00, 8.880960902160362e-02}}, + {{ 1.386736928659767e-06, 1.969543959871211e+00, 8.903684112246060e-02}}, + {{ 1.373772890937228e-06, 4.749864788991031e-01, 1.086579210326600e-01}}, + {{-1.342309573473890e-06, 3.420823256942400e+00, 1.084306889318030e-01}}, +}; + +static const struct Tass17MultiTerm HYPERION_0[1] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0},109,HYPERION_0_0}, +}; + +static const struct Tass17Term HYPERION_1_0[227] = { + {{ 1.591300460227652e-01, 5.535906566693734e+00, 9.810539955099672e-03}}, + {{ 4.042489669732959e-03, 1.912996635287834e-01, 8.893412600193221e-03}}, + {{-3.674456394728999e-03, 4.597328162679121e+00, 1.072766731000612e-02}}, + {{ 2.477704948047725e-03, 5.390367216813617e+00, 1.974675300542636e-01}}, + {{ 1.876329764520020e-03, 2.695183608406955e+00, 9.873376502713178e-02}}, + {{-1.559041896665946e-03, 3.442462348892786e+00, 8.892322507203211e-02}}, + {{ 1.534084173919484e-03, 5.344606903164943e+00, 9.171273549064512e-04}}, + {{ 1.177430869304958e-03, 1.802365518040839e+00, 2.962012950813954e-01}}, + {{ 1.132234522571428e-03, 1.947904867920752e+00, 1.085443049822315e-01}}, + {{ 7.097516189849207e-04, 4.497549126447647e+00, 3.949350601085272e-01}}, + {{ 4.276809299095375e-04, 9.095474276756056e-01, 4.936688251356589e-01}}, + {{-3.898971540977004e-04, 7.256396485357081e-01, 9.696923904671184e-03}}, + {{ 3.851351224149008e-04, 4.062988177672174e+00, 9.924156005528160e-03}}, + {{-3.602762810400590e-04, 4.810266918158017e+00, 1.136160504284885e-04}}, + {{-3.108861291415183e-04, 4.189741089378624e+00, 7.911268511693244e-02}}, + {{-3.036800061325884e-04, 4.041349085722073e+00, 2.943161986529901e-02}}, + {{ 2.883086646474427e-04, 3.604731036082414e+00, 5.924025901627907e-01}}, + {{ 2.741386484621230e-04, 2.880428915709079e+00, 1.167962290513110e-03}}, + {{ 2.445211406069563e-04, 6.137645957299674e+00, 1.876569900991639e-01}}, + {{ 2.397418179235776e-04, 4.432376484564475e+00, 5.839811452565560e-04}}, + {{ 2.079619720142985e-04, 2.549644258526895e+00, 2.863907551262957e-01}}, + {{ 1.997665368454137e-04, 1.672933731036699e-02, 6.911363551899224e-01}}, + {{-1.967051700749114e-04, 3.182961090757090e+00, 2.463636671824243e-05}}, + {{ 1.584700380869004e-04, 4.788627826207911e+00, 1.962107991019934e-02}}, + {{ 1.532039999508838e-04, 5.244827866933704e+00, 3.851245201534275e-01}}, + {{ 1.443751571550919e-04, 3.385115638127897e+00, 8.252809808927092e-03}}, + {{ 1.391797303858132e-04, 2.711912945716443e+00, 7.898701202170543e-01}}, + {{ 1.354323755526581e-04, 3.908600739292801e+00, 9.721560271389426e-03}}, + {{-1.347079373955693e-04, 1.055086777554782e+00, 3.060118350364951e-01}}, + {{-1.344254972843197e-04, 8.800270869150743e-01, 9.899519638809918e-03}}, + {{-1.336552626452528e-04, 1.200626127435425e+00, 1.183548449373311e-01}}, + {{-1.248289604761352e-04, 1.403512188080000e+00, 1.136827010127225e-02}}, + {{-1.168617638452060e-04, 4.643088476327559e+00, 2.072780700093633e-01}}, + {{ 1.158407408725238e-04, 1.656826168161656e+00, 4.838582851805592e-01}}, + {{-1.110204610592649e-04, 3.750270385962327e+00, 4.047456000636268e-01}}, + {{ 9.876297087120832e-05, 5.407096554123251e+00, 8.886038852441861e-01}}, + {{ 9.360835142429720e-05, 4.352009776567740e+00, 5.825920502076911e-01}}, + {{-9.343384687595748e-05, 2.150790928565845e+00, 1.557730146172579e-03}}, + {{-8.787340150688395e-05, 1.622686871902795e-01, 5.034793650907585e-01}}, + {{ 8.558910102815169e-05, 1.627305827400927e+00, 8.897968371024604e-05}}, + {{ 7.626783708559587e-05, 7.640080777956939e-01, 6.813258152348228e-01}}, + {{-7.423412446912493e-05, 2.857452295597089e+00, 6.022131301178903e-01}}, + {{ 7.224202068094286e-05, 3.658749758664493e+00, 1.164479466491257e-02}}, + {{ 7.068861066099871e-05, 1.819094855351211e+00, 9.873376502713178e-01}}, + {{-6.947176438271949e-05, 4.576031364902324e-02, 1.965504026993571e-01}}, + {{-6.514978275214879e-05, 6.017393906061373e-01, 1.778464501440642e-01}}, + {{-6.245521353308536e-05, 5.552635904003895e+00, 7.009468951450221e-01}}, + {{ 6.236351497568400e-05, 3.459191686201771e+00, 7.800595802619547e-01}}, + {{ 5.296941292250232e-05, 2.435682350271240e+00, 9.835176321817914e-03}}, + {{-5.247540827620734e-05, 2.352945475936649e+00, 9.785903588381428e-03}}, + {{-5.211914123734037e-05, 1.964634205231123e+00, 7.996806601721539e-01}}, + {{ 5.087526477014214e-05, 4.514278463755098e+00, 1.086071415298450e+00}}, + {{ 5.058590687048317e-05, 6.154375294608579e+00, 8.787933452890865e-01}}, + {{-4.813389965573155e-05, 3.895809735842240e+00, 2.170886099644629e-01}}, + {{-4.301007833478336e-05, 4.659817813637930e+00, 8.984144251992857e-01}}, + {{ 4.189085863844754e-05, 1.756605204392253e+00, 9.965089238203824e-02}}, + {{ 4.104292740965665e-05, 2.566373595836530e+00, 9.775271103162182e-01}}, + {{ 4.098739653872672e-05, 4.381040752907420e+00, 8.800609771712566e-02}}, + {{-4.092616660610000e-05, 9.897290504821536e-01, 1.751943435769670e-03}}, + {{ 3.764144636960646e-05, 4.406028499150309e+00, 1.834254709812902e-03}}, + {{ 3.665390355309391e-05, 9.262767649808578e-01, 1.184805180325582e+00}}, + {{-3.538628961664771e-05, 1.071816114865886e+00, 9.971481902264174e-01}}, + {{-3.531748699358457e-05, 1.009326463906489e+00, 1.094614323371379e-01}}, + {{ 3.326628366799721e-05, 5.261557204243347e+00, 1.076260875343350e+00}}, + {{-2.947898798731622e-05, 4.858034027149458e+00, 8.139193758498604e-03}}, + {{-2.902403206479552e-05, 3.766999723274154e+00, 1.095881955253549e+00}}, + {{ 2.841090381393687e-05, 2.886483271935745e+00, 1.076271776273250e-01}}, + {{ 2.693554901487583e-05, 1.673555505469107e+00, 1.174994640370482e+00}}, + {{ 2.676761780821079e-05, 4.937019829864389e+00, 6.930214516183278e-02}}, + {{ 2.669007886238697e-05, 5.436127530462639e+00, 3.940179327536207e-01}}, + {{ 2.640617243698899e-05, 3.621460373393509e+00, 1.283538945352713e+00}}, + {{ 2.465038854019734e-05, 6.213779106238012e+00, 1.148188615170074e-02}}, + {{ 2.383157781622512e-05, 6.778725395442773e-01, 1.671346196601068e-03}}, + {{-2.373722745643357e-05, 1.789980244999149e-01, 1.194615720280681e+00}}, + {{-2.358765186013457e-05, 2.503883944878085e+00, 8.984035242693857e-02}}, + {{-2.328181620162680e-05, 5.210323605092877e+00, 2.952860072513110e-03}}, + {{-2.308684467527070e-05, 4.979927489736701e+00, 2.851449251039256e-02}}, + {{ 2.176062809432465e-05, 4.368739113874453e+00, 1.273728405397614e+00}}, + {{ 2.173788459895790e-05, 3.102770681707372e+00, 3.034874722020547e-02}}, + {{-1.934646504415605e-05, 2.874181632905266e+00, 1.293349485307813e+00}}, + {{ 1.897373895483440e-05, 3.345867461927939e-02, 1.382272710379845e+00}}, + {{ 1.754329413716687e-05, 7.807374151075219e-01, 1.372462170424745e+00}}, + {{ 1.642710507186450e-05, 1.129878067543419e+00, 7.976285245286770e-03}}, + {{-1.600410709697660e-05, 6.149453095252681e+00, 2.035764949513110e-03}}, + {{ 1.572430747504168e-05, 4.451788812799354e+00, 1.983846574091700e-01}}, + {{-1.571827863857085e-05, 5.569365241310616e+00, 1.392083250334945e+00}}, + {{ 1.553609418389716e-05, 5.128319493393325e+00, 7.819555776202598e-02}}, + {{-1.539945531353985e-05, 3.078080370694616e-01, 3.158223749915947e-01}}, + {{ 1.460196299297440e-05, 4.914148009431628e+00, 2.962012605910000e-01}}, + {{ 1.410585893877412e-05, 3.475921023512875e+00, 1.471195935451877e+00}}, + {{ 1.357189445488529e-05, 2.728642283024626e+00, 1.481006475406977e+00}}, + {{ 1.339823501057820e-05, 3.971018944640962e+00, 1.095544904247980e+00}}, + {{-1.337650472587841e-05, 3.251162685363996e+00, 8.002981247183889e-02}}, + {{ 1.288836483864210e-05, 4.542301028988324e+00, 1.281578356513110e-03}}, + {{-1.273330553828309e-05, 1.981363542543681e+00, 1.490817015362076e+00}}, + {{ 1.163556995976533e-05, 1.511286818281744e+00, 6.715152752797231e-01}}, + {{ 1.139577901854967e-05, 5.099288517053791e+00, 5.727815102525914e-01}}, + {{ 1.139366110710306e-05, 4.206470426688558e+00, 7.702490403068549e-01}}, + {{ 1.135306132914049e-05, 2.740943922055832e+00, 2.952841677264889e-01}}, + {{-1.132855895484880e-05, 3.124409773657545e+00, 1.084128336043461e-02}}, + {{ 1.131587409293219e-05, 6.171104631918221e+00, 1.569929700479009e+00}}, + {{ 1.088679752730659e-05, 6.070246551700696e+00, 1.061405125957763e-02}}, + {{ 1.085425461534599e-05, 6.184687279150488e-01, 8.689828053339868e-01}}, + {{-1.056787968358008e-05, 3.296922999012952e+00, 2.765802151711960e-01}}, + {{ 1.037117124427068e-05, 2.404104908646983e+00, 4.740477452254596e-01}}, + {{-1.027660284731680e-05, 4.676547150949028e+00, 1.589550780389208e+00}}, + {{ 1.027273355964679e-05, 5.199067553284680e+00, 1.885741174540704e-01}}, + {{-1.024878235180840e-05, 4.617972413769575e+00, 5.894496611094870e-01}}, + {{ 1.006767559393374e-05, 3.313652336323319e+00, 9.677165703611184e-01}}, + {{-1.000802392783223e-05, 4.533473869493745e-01, 1.281653848924308e-01}}, + {{ 9.633989740567134e-06, 5.423825891429972e+00, 1.579740240434109e+00}}, + {{ 9.178075378506732e-06, 6.008835944731589e+00, 1.066450335388250e+00}}, + {{ 9.065206170156284e-06, 2.583102933143981e+00, 1.668663465506141e+00}}, + {{ 8.851132878153258e-06, 8.637871140265755e-01, 2.971184224363018e-01}}, + {{ 8.798422861268053e-06, 5.684298570350299e+00, 5.949160520673310e-02}}, + {{-8.257707350863237e-06, 1.088545452174794e+00, 1.688284545416340e+00}}, + {{ 8.253549910000110e-06, 2.420834245957355e+00, 1.165184100415382e+00}}, + {{ 8.204317973862647e-06, 1.757809810726964e+00, 8.163830125216846e-03}}, + {{ 7.905521775023910e-06, 1.611065854511902e+00, 2.873078824812022e-01}}, + {{-7.853735166683912e-06, 5.581666880342553e+00, 2.063609426544568e-01}}, + {{ 7.724851326708509e-06, 5.001566581686802e+00, 9.007028650621710e-03}}, + {{ 7.341396041786271e-06, 5.116017854362701e+00, 1.263917865442514e+00}}, + {{ 7.254032016403240e-06, 6.027455951817885e+00, 2.000408834733950e+00}}, + {{ 7.228880718926971e-06, 5.278286541549328e+00, 1.767397230533273e+00}}, + {{-7.215481275780168e-06, 1.664218052550344e+00, 8.779796549764733e-03}}, + {{-6.984482201975051e-06, 2.342090592094629e+00, 1.045114274636580e-02}}, + {{-6.882066002549454e-06, 3.030818015480898e+00, 1.145724978498250e-02}}, + {{ 6.764635964795921e-06, 1.835824192663037e+00, 1.678474005461240e+00}}, + {{ 6.650438793970224e-06, 2.620477234204319e-01, 1.192719722922376e-01}}, + {{-6.615254376434763e-06, 3.783729060580140e+00, 1.787018310443472e+00}}, + {{ 6.543758079294575e-06, 3.912539073151877e+00, 9.082249651543854e-01}}, + {{ 6.469301087553129e-06, 1.528016155588465e+00, 1.362651630469646e+00}}, + {{ 6.431124552019571e-06, 3.245373743805582e-01, 1.006958730181517e+00}}, + {{-6.344479273710200e-06, 3.488222662541158e+00, 2.854736277713893e-01}}, + {{ 6.326716714869053e-06, 1.217355464745067e+00, 8.094912001272536e-01}}, + {{-6.296309881986443e-06, 2.139204531449687e+00, 1.174377175824247e-01}}, + {{ 6.126061421202252e-06, 3.019720982785904e+00, 1.105692495208649e+00}}, + {{ 6.110229923833445e-06, 3.633762012421656e+00, 9.781663767222532e-02}}, + {{ 6.015743140846809e-06, 3.089369332580482e+00, 6.406027912661278e-04}}, + {{ 5.753474696726435e-06, 4.306249462919441e+00, 3.860416475083339e-01}}, + {{ 5.748353093941175e-06, 1.690284842782397e+00, 1.866130995560404e+00}}, + {{ 5.708428891129938e-06, 5.714904591191261e+00, 1.204426260235781e+00}}, + {{ 5.649105509135010e-06, 4.223199763993809e+00, 1.461385395496778e+00}}, + {{ 5.648928770703093e-06, 4.805357163517846e+00, 7.107574351001218e-01}}, + {{-5.558326355997969e-06, 3.778096755966772e+00, 1.646709829882825e-03}}, + {{ 5.443666713560605e-06, 4.649337840653702e-01, 1.228539745617870e-02}}, + {{ 5.432340482357107e-06, 5.992106607419760e+00, 3.753139801983278e-01}}, + {{ 5.352373966360052e-06, 3.558970722433383e+00, 3.958521874634336e-01}}, + {{-5.276359293355092e-06, 1.957273618059048e-01, 1.885752075470604e+00}}, + {{ 5.250152718378343e-06, 1.848125831689869e+00, 4.927516977807525e-01}}, + {{ 5.229887464078713e-06, 2.126902892417018e+00, 1.303160025262913e+00}}, + {{ 4.890118052517932e-06, 6.351980652268782e-01, 1.560119160523909e+00}}, + {{ 4.723632226316384e-06, 4.822086500829672e+00, 1.401893790290044e+00}}, + {{ 4.693369092482988e-06, 4.531007801068383e+00, 1.777207770488372e+00}}, + {{ 4.561946954009516e-06, 4.385468451187749e+00, 1.964864760587536e+00}}, + {{-4.420710568728507e-06, 4.044201739498272e+00, 2.667696752160964e-01}}, + {{-4.380976601809811e-06, 1.349018131091464e+00, 1.680359101889646e-01}}, + {{ 4.337634584565960e-06, 2.110173555110300e+00, 6.120236700729901e-01}}, + {{ 4.289012976116846e-06, 7.182477641466621e-01, 4.847754125354657e-01}}, + {{ 4.260384871171156e-06, 3.330381673632227e+00, 1.658852925551041e+00}}, + {{ 4.220548662286636e-06, 1.234084802055436e+00, 1.500627555317176e+00}}, + {{-4.199363160735397e-06, 2.890910970218556e+00, 1.984485840497735e+00}}, + {{-3.958927857591537e-06, 2.637836897642000e+00, 1.806334976402677e-02}}, + {{ 3.941866401660965e-06, 6.224633990080018e+00, 1.081664699371637e-02}}, + {{-3.779778844595939e-06, 2.970022335278144e+00, 1.063868762629588e-02}}, + {{ 3.732023312137390e-06, 3.929268410460785e+00, 1.599361320344308e+00}}, + {{ 3.704937010630530e-06, 2.931053342080318e+00, 1.192598652513110e-03}}, + {{ 3.635875031439811e-06, 7.974667524135091e-01, 2.063598525614668e+00}}, + {{-3.613554557427136e-06, 4.915380737914367e+00, 8.880960902160362e-02}}, + {{ 3.510914428131760e-06, 1.969543959871211e+00, 8.903684112246060e-02}}, + {{-3.500526370624341e-06, 6.183406270948697e+00, 3.842073927985210e-01}}, + {{ 3.460035905216260e-06, 5.853277499591428e+00, 2.952841654680000e-01}}, + {{ 3.455891490801950e-06, 3.413431372552740e+00, 5.835091775625976e-01}}, + {{-3.450615143245680e-06, 8.053972782328979e-01, 1.118669826513110e-03}}, + {{ 3.406532781873487e-06, 6.254154330840199e+00, 4.945859524905654e-01}}, + {{ 2.958781539525876e-06, 4.749864788991031e-01, 1.086579210326600e-01}}, + {{-2.877066321058344e-06, 3.420823256942400e+00, 1.084306889318030e-01}}, + {{-2.684534114394913e-06, 1.818605490929709e+00, 8.982392283903467e-03}}, + {{ 2.527885180883367e-06, 4.847179143307436e+00, 8.804432916482976e-03}}, + {{-2.228949169524294e-06, 2.568430696700499e+00, 2.954523591572750e-02}}, + {{ 2.203418048212828e-06, 5.514267474743575e+00, 2.931800381487053e-02}}, + {{ 2.084495541017897e-06, 2.546791604750330e+00, 4.905269977549836e-02}}, + {{-2.078328653497296e-06, 5.875598233879090e+00, 6.838501780692632e-02}}, + {{ 2.053262782839373e-06, 1.212212524551202e+00, 2.474857501079031e-03}}, + {{ 1.926895597615764e-06, 3.998441425849760e+00, 7.021927251673923e-02}}, + {{ 1.866581488955838e-06, 3.825993270575803e-01, 1.778682520038644e-02}}, + {{ 1.793161742446505e-06, 1.291671420326874e+00, 8.736549492585954e-02}}, + {{ 1.728658611291661e-06, 5.989253953642903e+00, 1.379759248475305e-01}}, + {{ 1.676857763913550e-06, 6.562334475941619e-01, 2.117881005637192e-02}}, + {{ 1.535772080970505e-06, 4.776710899143922e-02, 8.025577708070115e-03}}, + {{-1.524956909904084e-06, 1.497103946256642e+00, 1.075230367672436e-02}}, + {{-1.522980567370601e-06, 5.662659478400199e+00, 7.899906906650395e-02}}, + {{-1.495199523539624e-06, 5.488139457702296e+00, 1.784962247029556e-03}}, + {{ 1.487447331838316e-06, 1.414367071922007e+00, 1.070303094328788e-02}}, + {{ 1.476058477371991e-06, 2.716822700357048e+00, 7.922630116736093e-02}}, + {{ 1.450002439077977e-06, 8.691722030730533e-01, 1.056475879679429e-02}}, + {{-1.242111402697583e-06, 4.740860717216437e+00, 1.159550220212923e-02}}, + {{ 1.240886283959093e-06, 1.815156521491816e+00, 8.883424538832187e-02}}, + {{-1.224261037265257e-06, 2.720171354649790e+00, 1.256192201981903e-02}}, + {{-1.221915897644608e-06, 5.069768176293690e+00, 8.901220475574236e-02}}, + {{-1.201215374450881e-06, 4.098695796487174e+00, 1.101020351284040e-01}}, + {{-1.186953182299199e-06, 2.911471018178655e+00, 2.145533462001224e-02}}, + {{-1.129771140532139e-06, 5.319619156922048e+00, 8.708897036221921e-02}}, + {{-1.097793441792323e-06, 5.275200702223381e+00, 1.239901350660719e-02}}, + {{-1.056701003062998e-06, 1.483920036565450e-01, 4.968106525163343e-02}}, + {{ 1.028753109593422e-06, 3.374260754285869e+00, 8.918048966911464e-03}}, + {{-1.020891709037016e-06, 3.575210695322014e+00, 1.086332846659417e-01}}, + {{-1.012670463985482e-06, 3.291523879951270e+00, 8.868776233474979e-03}}, + {{ 1.000328987513614e-06, 3.205990405202193e-01, 1.084553252985212e-01}}, + {{ 9.414415383367402e-07, 4.110755286663576e+00, 1.794973371359828e-02}}, + {{-9.256226899654040e-07, 2.164192277692745e+00, 3.126587457511192e-02}}, + {{-8.873327693660700e-07, 3.396916671853406e-01, 5.857447785182665e-02}}, + {{-8.599515368071076e-07, 3.230728199748524e+00, 8.050214074788358e-03}}, + {{-8.578646315557892e-07, 1.890558157156235e+00, 2.787388971912643e-02}}, + {{ 8.458120789255400e-07, 3.315709437186336e+00, 1.973469596062783e-02}}, + {{-8.217941676205146e-07, 5.593253277458703e+00, 9.048095521820468e-02}}, + {{ 7.998618448176001e-07, 2.446537234113254e+00, 9.169937163833544e-03}}, + {{ 7.948809078699551e-07, 6.192140014287844e+00, 3.098935001147160e-02}}, + {{ 7.924651953382082e-07, 4.745720166335665e+00, 6.040873256163955e-02}}, + {{-7.833211544506204e-07, 1.391925790964367e+00, 1.272482575375243e-01}}, + {{ 7.730107483777507e-07, 5.668654913122977e+00, 2.952059954900926e-02}}, + {{-7.622738839419112e-07, 2.414043258321102e+00, 2.934264018158877e-02}}, + {{ 7.622712310485859e-07, 7.074805989149507e-02, 1.103785596920444e-01}}, + {{ 7.575143203880983e-07, 6.080299246534646e+00, 1.069865748360589e-01}}, + {{-7.315354488166669e-07, 6.261546215229414e+00, 1.950746385977086e-02}}, + {{ 7.005448425844999e-07, 1.616450943558919e+00, 7.542188416946162e-04}}, + {{-6.870417571431780e-07, 6.010893045593364e+00, 1.184684609877596e-01}}, +}; + +static const struct Tass17MultiTerm HYPERION_1[1] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0},227,HYPERION_1_0}, +}; + +static const struct Tass17Term HYPERION_2_0[195] = { + {{ 1.030661479148230e-01, 3.619080362792600e+00,-8.924811235147779e-04}}, + {{ 2.448184191185018e-02, 2.680501958777963e+00, 2.464623139167320e-05}}, + {{-2.500610695618523e-03, 2.871801622306748e+00, 8.918058831584894e-03}}, + {{-1.653120911968409e-03, 4.366359103278453e+00,-1.070302107861445e-02}}, + {{-1.121964769453605e-03, 3.107866401998293e-02, 9.784128390361700e-02}}, + {{ 7.518101576911162e-04, 9.238967543856604e-01,-9.962624615064656e-02}}, + {{ 3.778282825702326e-04, 4.511898453158731e+00,-1.983600111777784e-01}}, + {{-3.775434250722031e-04, 2.726262272426791e+00, 1.965750489307488e-01}}, + {{-3.597821116452316e-04, 1.833444182060827e+00, 3.940425789850124e-01}}, + {{-2.927952161795262e-04, 5.421445880833606e+00, 2.953088139578806e-01}}, + {{ 2.580134073493171e-04, 1.766180138998234e-01,-8.981570619554689e-02}}, + {{ 2.216814079711899e-04, 1.816714844751185e+00,-2.970937762049101e-01}}, + {{ 1.927636081642950e-04, 2.546497551037094e+00, 2.060411181513110e-03}}, + {{-1.702244907149874e-04, 1.671175494871279e+00,-1.094367861057462e-01}}, + {{-1.630491456609473e-04, 5.566985230713519e+00, 1.076518238587167e-01}}, + {{ 1.502092233208532e-04, 7.783574045058210e-01, 8.803074394851733e-02}}, + {{ 1.403880753848180e-04, 5.404716543523964e+00,-3.958275412320419e-01}}, + {{ 1.282680047161120e-04, 3.764619712672674e+00,-1.885494712226787e-01}}, + {{ 1.080722389283692e-04, 1.933223218292120e+00, 9.835186186491344e-03}}, + {{-9.843461962138636e-05, 5.259177193644051e+00,-2.081705511328780e-01}}, + {{ 9.302812855413870e-05, 2.709532935117156e+00,-4.945613062591737e-01}}, + {{ 8.608901766955960e-05, 1.069436104265866e+00,-2.872832362498105e-01}}, + {{ 8.563197359093362e-05, 4.557658766807236e+00,-1.809608478421229e-03}}, + {{ 8.231557260635240e-05, 3.485627041196898e+00, 1.143316058513110e-03}}, + {{-7.641879996400636e-05, 3.810380026321384e+00, 8.000931476678443e-03}}, + {{-6.976234551437248e-05, 2.563993585237243e+00,-3.069043161600098e-01}}, + {{ 6.410167941575658e-05, 5.091998751814161e+00,-1.006097173943266e-03}}, + {{ 6.394074317345045e-05, 4.657437803037907e+00,-3.860170012769422e-01}}, + {{ 6.387046194265387e-05, 1.434932671034752e-02,-5.932950712863055e-01}}, + {{-6.379700394998453e-05, 2.146161973771036e+00,-7.788650730862894e-04}}, + {{-5.338815029861825e-05, 6.151995284010021e+00,-4.056380811871416e-01}}, + {{ 5.173543661985320e-05, 3.342022422925534e+00, 2.755133995131110e-04}}, + {{ 4.908475624063901e-05, 1.962254194631099e+00,-4.847507663040740e-01}}, + {{ 4.811302148563021e-05, 4.528627790467636e+00, 4.927763440121442e-01}}, + {{ 4.486679433374308e-05, 3.602351025483124e+00,-6.920288363134373e-01}}, + {{-4.178177074434045e-05, 3.456811675602482e+00,-5.043718462142733e-01}}, + {{ 4.042027917523730e-05, 2.250321955375842e+00, 2.953088117000000e-01}}, + {{-3.880672848400252e-05, 2.580722922546885e+00, 3.842320390299127e-01}}, + {{ 3.819239194924841e-05, 5.550255893404608e+00,-5.834845313312059e-01}}, + {{-3.738690787954837e-05, 2.124522881820873e+00, 1.872859878668457e-02}}, + {{-3.553990230264197e-05, 6.168724621318925e+00, 2.854982740027810e-01}}, + {{ 3.415645857185234e-05, 9.406260916955893e-01, 5.915101090392759e-01}}, + {{ 3.339668674029588e-05, 1.086165441574771e+00, 4.038531189401121e-01}}, + {{-3.301162776329309e-05, 7.616280671963972e-01,-6.031056112414052e-01}}, + {{ 3.269372364602020e-05, 3.813563431717510e+00, 2.644392326769670e-03}}, + {{ 3.180628253542403e-05, 9.071674170763108e-01,-7.907626013405691e-01}}, + {{ 3.177451875567787e-05, 5.375685567184869e+00, 9.875841125852346e-02}}, + {{ 3.067833613233151e-05, 5.304937507293081e+00,-1.162014843352090e-02}}, + {{ 3.003432659990370e-05, 2.855072284997068e+00,-6.822182963583376e-01}}, + {{ 2.732958451060629e-05, 5.769871291358446e+00, 6.652490226578010e-04}}, + {{ 2.729633446248457e-05, 3.573320049143738e+00,-1.974428838228719e-01}}, + {{-2.629885713884026e-05, 4.349629765968445e+00,-7.018393762685369e-01}}, + {{ 2.559468055750869e-05, 5.712524580593572e+00,-8.000516624044722e-02}}, + {{ 2.473774782254921e-05, 4.674167140347548e+00, 3.051193539129803e-01}}, + {{-2.417336169407593e-05, 3.473541012912848e+00, 1.867645089756491e-01}}, + {{ 2.384156418867662e-05, 1.598886765909899e-01,-7.809520613854695e-01}}, + {{ 2.259673699575893e-05, 4.495169115849089e+00,-8.894963663677009e-01}}, + {{-2.109852115260203e-05, 1.654446157561637e+00,-8.005731412956687e-01}}, + {{ 2.024562165367701e-05, 1.525636144991658e+00, 7.822020399341766e-02}}, + {{-2.019380769983444e-05, 1.991774535391674e+00,-9.814608072250240e-04}}, + {{ 2.008621003222866e-05, 5.246386190193526e+00,-8.035014398045319e-04}}, + {{ 1.902408812662748e-05, 3.747890375363762e+00,-8.796858264126013e-01}}, + {{-1.811127409136190e-05, 5.113637843764284e+00,-2.051356103371412e-02}}, + {{ 1.706204149397460e-05, 3.017340972186618e+00,-1.787389312675790e-01}}, + {{-1.698064243423227e-05, 5.242447856334416e+00,-8.993069063228005e-01}}, + {{ 1.679462249970688e-05, 4.220819753398175e+00, 1.769539690205495e-01}}, + {{-1.632299947318510e-05, 4.886425133804248e+00,-3.084677457434440e-04}}, + {{ 1.603779600347512e-05, 1.799985507441551e+00,-9.882301313948326e-01}}, + {{ 1.519891681318009e-05, 1.052706766956224e+00,-9.784195914397330e-01}}, + {{ 1.379512640799549e-05, 3.221573637798089e-01,-2.774726962947108e-01}}, + {{-1.366561535006994e-05, 2.547264247926875e+00,-9.980406713499322e-01}}, + {{ 1.283396500574140e-05, 1.556768500554912e+00, 3.084677457434440e-04}}, + {{ 1.279090832954947e-05, 5.438175218143973e+00, 9.864451691478030e-01}}, + {{ 1.243806749353366e-05, 1.231704791455413e+00, 2.161961288409481e-01}}, + {{ 1.235958412008419e-05, 3.427780699263810e+00,-9.785893723707998e-03}}, + {{ 1.225443721836814e-05, 9.863864053438862e-01, 7.880605117386331e-01}}, + {{ 1.225216491402911e-05, 2.742991609736432e+00, 8.877114041206713e-01}}, + {{-1.221520345313342e-05, 5.275906530953691e+00, 4.829658040570445e-01}}, + {{ 1.213225148001182e-05, 4.640708465730461e+00,-1.077153356466865e+00}}, + {{ 1.198327722769453e-05, 3.910159062552588e+00,-3.762064613218426e-01}}, + {{ 1.186021515881310e-05, 4.752692921877314e+00, 1.727297203769670e-03}}, + {{ 1.166603449799361e-05, 1.377244141335036e+00, 2.853913874178424e-02}}, + {{ 1.135648805958188e-05, 5.387987206211405e+00,-1.086963896421964e+00}}, + {{ 1.108533869996140e-05, 6.221340900016817e+00, 1.390853715947980e+00}}, + {{-1.098010740280340e-05, 6.135265946699647e+00,-1.096774436377064e+00}}, + {{ 1.086995985899863e-05, 5.860916584250122e+00,-3.032410098881379e-02}}, + {{ 1.069580937462716e-05, 1.214975454145048e+00,-4.749402263489743e-01}}, + {{ 1.067386083025773e-05, 3.781349049983041e+00, 5.025868839672437e-01}}, + {{-1.043068210990957e-05, 5.521224917064781e+00,-8.889857884064044e-02}}, + {{ 9.693581297810074e-06, 1.850173519369733e+00, 1.085178934174935e+00}}, + {{ 9.678835539512692e-06, 1.945524857325114e+00,-1.175887121493997e+00}}, + {{ 9.562800946711422e-06, 4.802977152918551e+00,-5.736739913761062e-01}}, + {{ 9.468784690060410e-06, 4.780800132962380e-02, 7.889776390935395e-01}}, + {{ 8.801022040147010e-06, 3.915534848785861e+00,-2.941408494094870e-01}}, + {{-8.797753682670658e-06, 3.440082338294301e+00,-1.195508201404196e+00}}, + {{ 8.599214007703230e-06, 1.787683868411798e+00, 1.974921762856553e-01}}, + {{ 8.485093197565512e-06, 2.107793544511012e+00,-6.724077564032379e-01}}, + {{-8.365240462865090e-06, 1.279431670356606e+00, 1.476430036256560e-03}}, + {{ 8.240909734627314e-06, 4.361192720355115e-01,-9.171174902330204e-04}}, + {{-8.205019885615929e-06, 5.188561463701097e-01,-8.678447567965355e-04}}, + {{ 7.999837192197997e-06, 6.268503657550692e+00,-9.870911879574012e-02}}, + {{ 7.994800633732257e-06, 2.692803597806052e+00,-1.185697661449096e+00}}, + {{ 7.964077512935541e-06, 4.819706490227462e+00, 1.174623638138164e-01}}, + {{ 7.702743188457386e-06, 5.533526556092043e+00,-1.274620886521128e+00}}, + {{ 7.473079103968928e-06, 5.695795243283790e+00,-7.711415214303697e-01}}, + {{ 7.388692911769633e-06, 6.328180546253961e-01, 2.756877340476813e-01}}, + {{ 7.270826776415052e-06, 1.468289434226756e+00,-2.450211269687357e-03}}, + {{ 7.236960740797404e-06, 4.628406826699250e+00, 1.085689512136231e-01}}, + {{ 7.144251731442444e-06, 4.545357127775086e+00, 1.183912699202067e+00}}, + {{-7.043838984557596e-06, 7.448987298889554e-01,-1.294241966431328e+00}}, + {{-6.917942470086600e-06, 3.896696083322066e+00,-2.060411181513110e-03}}, + {{ 6.782083637837408e-06, 3.311272325723300e+00,-3.167148561151095e-01}}, + {{ 6.750671838792509e-06, 6.160887173164911e-01,-4.154486211422413e-01}}, + {{ 6.736625416531154e-06, 4.252643881934955e-01,-2.518783322486501e-04}}, + {{ 6.716695065274547e-06, 1.115196417914451e+00,-9.073283355045334e-02}}, + {{ 6.651880335792781e-06, 6.006455934130108e+00,-2.179810910879777e-01}}, + {{ 6.570135525528793e-06, 4.204090416089263e+00,-5.141823861693731e-01}}, + {{ 6.551076448609189e-06, 3.000611634877713e+00,-8.698752864575016e-01}}, + {{ 6.445693456193227e-06, 3.926888399861492e+00, 3.149298938680800e-01}}, + {{ 6.221700343295405e-06, 1.508906807682454e+00,-6.129161511965049e-01}}, + {{-6.210141308502555e-06, 5.467206194483361e+00, 4.918592166572376e-01}}, + {{ 6.128034935351225e-06, 2.838342947686692e+00,-1.373354651548260e+00}}, + {{ 5.752222076851271e-06, 5.096908506454503e+00,-7.116499162236366e-01}}, + {{ 5.720920731236437e-06, 3.054280264694361e-01,-9.686090514846332e-01}}, + {{ 5.708438487292833e-06, 4.383088440588454e+00, 6.804333341113080e-01}}, + {{-5.618758010321190e-06, 4.332900428655887e+00,-1.392975731458459e+00}}, + {{ 5.586433308293342e-06, 6.280805296580291e+00,-1.284431426476228e+00}}, + {{ 5.455429436394752e-06, 9.573554290008455e-01, 1.282646464229199e+00}}, + {{ 5.234563142340540e-06, 2.401724898047694e+00,-8.103836812507684e-01}}, + {{-5.207388474970705e-06, 4.296952902336882e+00, 7.788650730862894e-04}}, + {{ 5.204438871550596e-06, 2.418454235357329e+00,-1.192473260608459e-01}}, + {{ 5.046334690770730e-06, 2.893440714256877e+00,-1.058940502818596e-02}}, + {{-5.035619025711394e-06, 5.839277492300028e+00,-1.081663712904294e-02}}, + {{ 4.976902542853610e-06, 3.893429725242215e+00,-1.067342816511765e+00}}, + {{ 4.951970227904307e-06, 1.978983531940741e+00, 2.063855888858485e-01}}, + {{-4.950572722250481e-06, 4.320598789629788e+00,-2.072534237779716e-01}}, + {{ 4.864691847876214e-06, 1.431593392813457e-01,-1.472088416575392e+00}}, + {{-4.835154150013290e-06, 2.223783275489257e-01, 1.067346965038102e-01}}, + {{ 4.711996026340074e-06, 5.989726596820463e+00,-9.091174462779002e-01}}, + {{ 4.647700174472706e-06, 8.781364407369228e-01,-2.961766488500037e-01}}, + {{-4.611548111165785e-06, 1.398883233285187e+00, 9.031674882013382e-03}}, + {{-4.463536929701217e-06, 1.637716820250533e+00,-1.491709496485591e+00}}, + {{ 4.448389546383381e-06, 4.344720011328309e+00, 8.804442781156406e-03}}, + {{ 4.423835447429758e-06, 3.652539037413501e+00, 1.381380229256330e+00}}, + {{ 4.297419749912965e-06, 1.198246116836868e+00,-1.166076581538897e+00}}, + {{ 4.206030088019200e-06, 3.294542988413657e+00,-1.007851211305032e+00}}, + {{-4.153052701221075e-06, 7.210106937409027e-01, 7.360328685412315e-03}}, + {{-4.097668847161432e-06, 2.888530959617075e+00, 7.000544140215073e-01}}, + {{ 3.894866749084315e-06, 3.635809700103133e+00, 6.902438740664076e-01}}, + {{-3.876996622725754e-06, 2.272914885477417e+00, 6.840966403831800e-02}}, + {{ 3.843534248051829e-06, 3.585621688174942e+00,-1.383165191503360e+00}}, + {{ 3.842326107820616e-06, 3.731161038055586e+00,-1.570822181602524e+00}}, + {{ 3.724216491694377e-06, 5.993593800083099e-01,-1.106584976332164e+00}}, + {{ 3.699201962974299e-06, 4.786247815611109e+00,-1.264810346566029e+00}}, + {{ 3.608611557983843e-06, 2.609753898886272e+00,-1.103539134606527e-01}}, + {{-3.538397263248576e-06, 5.225718519024773e+00,-1.590443261512723e+00}}, + {{ 3.531502882337352e-06, 6.453733863926071e-02, 1.480113994283462e+00}}, + {{ 3.397352921611207e-06, 4.482867476818612e+00, 2.962259413127871e-01}}, + {{-3.113267226101596e-06, 4.965245840107813e+00,-7.019462628534756e-02}}, + {{-2.954159247722890e-06, 2.957566593162261e+00,-1.143316058513110e-03}}, + {{ 2.885109484385860e-06, 3.947295643644445e+00, 6.086273772565560e-04}}, + {{ 2.832059006428450e-06, 2.402892932765738e+00, 1.192608522513110e-03}}, + {{-2.683799905115401e-06, 1.716935808520376e+00, 8.711361659361089e-02}}, + {{ 2.540204369555767e-06, 4.072427749742135e+00, 1.272729037689160e-01}}, + {{-2.530442498805404e-06, 9.696570680345386e-01, 9.692415654871056e-02}}, + {{ 2.471798836623408e-06, 1.185944477806245e+00, 1.964572614159102e-02}}, + {{-2.393809826972641e-06, 3.063101285835501e+00, 1.781147143177812e-02}}, + {{ 2.322013871583706e-06, 3.165732975843386e+00,-1.290578660159456e-01}}, + {{-2.252919673323646e-06, 9.946448142775208e-01, 1.075231354139779e-02}}, + {{-2.040203000028772e-06, 4.773946176578943e+00,-7.908803888554077e-02}}, + {{ 1.978250600690922e-06, 5.022592550872615e+00, 1.047578897775747e-02}}, + {{-1.817067803131338e-06, 2.941207823248317e+00,-2.563827320115845e-03}}, + {{-1.760241959810971e-06, 5.496237170821872e+00,-2.726735833327680e-03}}, + {{ 1.708248552006820e-06, 2.739053275877476e+00,-1.079200076232469e-02}}, + {{-1.707373996050395e-06, 5.993664930679350e+00,-1.061404139490420e-02}}, + {{ 1.638819397704571e-06, 4.499107449707681e+00, 9.007038515295140e-03}}, + {{-1.594635824936384e-06, 1.244495794905822e+00, 8.829079147874648e-03}}, + {{-1.549153538011889e-06, 4.175059439749656e+00,-1.959643367880767e-02}}, + {{-1.541304650138550e-06, 2.495897990714715e+00,-6.086273772565560e-04}}, + {{ 1.506189225615625e-06, 1.113991811579792e+00, 7.542287063680470e-04}}, + {{ 1.387762233686380e-06, 4.153420347799528e+00,-8.896981903681528e-05}}, + {{-1.337929891212176e-06, 2.339647246647041e-01,-9.145290932441870e-03}}, + {{ 1.284796105929756e-06, 3.679176774285410e-01,-8.092229359535366e-02}}, + {{ 1.274183971113668e-06, 2.489202295249182e+00,-8.868766368801548e-03}}, + {{-1.083761451668346e-06, 2.464214549006287e+00, 7.730307663851121e-02}}, + {{-1.082213439029503e-06, 4.386657373204058e-01, 2.945626609669069e-02}}, + {{ 1.074660210279234e-06, 6.052216247778919e+00,-2.143068838862057e-02}}, + {{-1.060143973086585e-06, 5.235531306351518e+00,-1.382622818201617e-04}}, + {{-1.050457836219505e-06, 5.297110302121204e-01,-1.533083914780906e-03}}, + {{ 1.016870649805557e-06, 1.862475158400216e+00,-1.005433735055530e-01}}, + {{ 9.272030248231280e-07, 2.193929082762471e+00, 7.246712634983826e-03}}, + {{ 8.522968078631408e-07, 2.315822545349735e+00, 2.762201138687778e-02}}, + {{-7.513552848257232e-07, 5.163096810852366e-01,-3.124122834372025e-02}}, + {{-7.452690477984808e-07, 4.217967099621830e+00,-6.038408633024787e-02}}, + {{-6.901926058355343e-07, 6.122964307670780e+00, 8.894787130342378e-02}}, +}; + +static const struct Tass17MultiTerm HYPERION_2[1] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0},195,HYPERION_2_0}, +}; + +static const struct Tass17Term HYPERION_3_0[58] = { + {{ 5.948511882002843e-03, 4.694475827075523e+00,-1.136160504284885e-04}}, + {{ 1.535891024624297e-03, 3.859634729686247e-02,-2.463636671824243e-05}}, + {{ 1.572522677808419e-04, 6.085851736842245e+00, 1.167962290513110e-03}}, + {{-1.497345442720214e-04, 2.543684898509682e+00,-1.671346196601068e-03}}, + {{-4.911846033201391e-05, 1.605106494495041e+00,-7.542188416946162e-04}}, + {{-2.465654101797190e-05, 1.954530936499135e+00,-5.839811452565560e-04}}, + {{-2.213337603547740e-05, 4.211325867661734e+00, 1.751943435769670e-03}}, + {{ 2.189031408512060e-05, 5.633054231090162e+00,-1.030743405334940e-03}}, + {{ 1.598165380887390e-05, 4.295054520089123e+00, 5.839811452565560e-04}}, + {{ 1.496627946379793e-05, 4.016603287531243e+00,-1.784962247029556e-03}}, + {{ 1.404188064697451e-05, 1.796406158023830e+00, 8.139193758498604e-03}}, + {{-1.314294835383983e-05, 3.755897423060887e+00, 8.035113044779626e-04}}, + {{-9.122789187630200e-06, 3.498933647377842e+00,-1.167962290513110e-03}}, + {{ 8.389523097875214e-06, 3.290963638995533e+00,-1.148188615170074e-02}}, + {{ 7.467530692297956e-06, 6.665280904804041e-01, 1.629085132118349e-04}}, + {{-4.916203322979170e-06, 1.106474128302829e+00, 9.862014897670330e-02}}, + {{ 4.509531977488889e-06, 3.078024883516604e+00,-8.678348921231047e-04}}, + {{-4.145588215282021e-06, 9.163790711087549e-01,-1.760325880311314e-03}}, + {{ 3.982965022125390e-06, 1.480712538988318e+00, 1.281578356513110e-03}}, + {{ 3.839542395242535e-06, 1.999292218668653e+00,-9.884738107756028e-02}}, + {{ 3.566024262476873e-06, 5.441754567561372e+00,-9.924156005528160e-03}}, + {{ 3.148398194156444e-06, 5.587293917441577e+00,-1.975811461046921e-01}}, + {{ 3.030592492776347e-06, 5.238868506916578e+00, 9.706241883053072e-02}}, + {{-2.682452719829683e-06, 4.160135842068596e+00,-9.171273549064512e-04}}, + {{-2.169784851229061e-06, 3.801657736709643e+00, 1.973539140038351e-01}}, + {{-2.004460730134680e-06, 6.131686597281963e+00,-1.004051112237328e-01}}, + {{ 1.834573960516513e-06, 1.650866808143945e+00, 1.957961838576625e-01}}, + {{ 1.780425037193046e-06, 2.892110309034762e+00,-2.963149111318239e-01}}, + {{-1.562250771899869e-06, 3.269324547045398e+00, 8.025577708070115e-03}}, + {{-1.398643272650284e-06, 2.139446479501969e+00, 4.929246278334639e-05}}, + {{-1.272802367749216e-06, 6.260985974273701e+00,-8.431985254048623e-04}}, + {{ 1.255563077270305e-06, 2.282979034039322e+00, 9.171273549064512e-04}}, + {{ 1.221711462471724e-06, 1.049127417537954e+00, 1.794973371359828e-02}}, + {{-1.189056338328650e-06, 5.384407856796491e+00,-9.059457126863318e-02}}, + {{ 1.144957852083430e-06, 6.152650159259904e+00, 1.192598652513110e-03}}, + {{-1.121833101144503e-06, 5.986147247402415e+00, 8.725187887543105e-02}}, + {{ 1.116583047991100e-06, 4.491589766430666e+00, 1.068729587856304e-01}}, + {{-8.876506818660424e-07, 4.763882028017109e+00,-1.159550220212923e-02}}, + {{ 8.308837128254335e-07, 2.352385234980906e+00,-1.056475879679429e-02}}, + {{ 8.288384247459950e-07, 5.957800305884270e-01,-1.102156511788325e-01}}, + {{ 7.816180007614254e-07, 6.167394216097088e+00,-2.272321008569770e-04}}, + {{-7.628434629767395e-07, 1.853752868788740e+00, 8.880960902160362e-02}}, + {{ 7.436509468905391e-07, 3.199918346103792e+00, 1.950746385977086e-02}}, + {{-7.276927363562636e-07, 6.189033308047209e+00,-1.973469596062783e-02}}, + {{ 7.144299265706248e-07, 9.771747513115055e-01,-9.417637216246936e-04}}, + {{ 6.925549696724206e-07, 8.578277540091867e-01, 9.056321113405056e-03}}, + {{ 6.584378044173228e-07, 3.482263302524318e+00,-2.588473551507519e-03}}, + {{-6.290271131270627e-07, 4.885775490604302e+00, 8.779796549764733e-03}}, + {{-5.558619276909469e-07, 4.038242379481365e+00,-2.129242610680041e-02}}, + {{ 5.420684261778156e-07, 5.916741046460914e+00, 9.873376502713178e-02}}, + {{-4.533375266393237e-07, 9.714766439641385e-02,-1.084128336043461e-02}}, + {{ 4.270467112203478e-07, 1.691003306229041e-01, 8.050214074788358e-03}}, + {{-4.241248416918695e-07, 5.263738296470040e-01,-9.873376502713178e-02}}, + {{ 4.217192739334928e-07, 4.300290102902023e+00, 9.797954618543716e-02}}, + {{-4.111285058745586e-07, 3.968836178539811e+00,-9.810539955099672e-03}}, + {{ 3.911603306295834e-07, 4.503176163546744e+00,-9.007028650621710e-03}}, + {{ 3.588448340600037e-07, 1.252013478182742e+00,-8.903684112246060e-02}}, + {{-3.517973623230076e-07, 5.383203250461813e+00, 8.924909881882087e-04}}, +}; + +static const struct Tass17MultiTerm HYPERION_3[1] = { + {{ 0, 0, 0, 0, 0, 0, 0, 0}, 58,HYPERION_3_0}, +}; + +//static const int nr_of_tass17bodies = 8; +static const struct Tass17Body tass17bodies[8] = { + { "MIMAS", + 8.457558957423141e-08, + 6.667061728781588e+00, + {-5.196910356411064e-03, + 1.822484926062486e-01, + 0.000000000000000e+00, + 0.000000000000000e+00, + 0.000000000000000e+00, + 0.000000000000000e+00}, + { + {2,MIMAS_0}, + {3,MIMAS_1}, + {4,MIMAS_2}, + {2,MIMAS_3}, + } + }, + { "ENCELADUS", + 8.457559689847700e-08, + 4.585536751533733e+00, + {-3.147075653259473e-03, + 7.997716657090215e-01, + 0.000000000000000e+00, + 0.000000000000000e+00, + -4.817894243161427e-06, + -3.858288993746540e-07}, + { + {2,ENCELADUS_0}, + {10,ENCELADUS_1}, + {9,ENCELADUS_2}, + {2,ENCELADUS_3}, + } + }, + { "TETHYS", + 8.457567386225863e-08, + 3.328306445054557e+00, + {-2.047958691903563e-03, + 5.239109365414447e+00, + 0.000000000000000e+00, + 0.000000000000000e+00, + -1.603681402396474e-05, + -1.284293647967145e-06}, + { + {3,TETHYS_0}, + {13,TETHYS_1}, + {12,TETHYS_2}, + {3,TETHYS_3}, + } + }, + { "DIONE", + 8.457575023401118e-08, + 2.295717646432711e+00, + {-1.245046723085128e-03, + 1.994592585279060e+00, + 0.000000000000000e+00, + 0.000000000000000e+00, + -5.892691888978987e-05, + -4.719091057203836e-06}, + { + {9,DIONE_0}, + {17,DIONE_1}, + {17,DIONE_2}, + {3,DIONE_3}, + } + }, + { "RHEA", + 8.457594957866317e-08, + 1.390853715957114e+00, + {-6.263338154589970e-04, + 6.221340947932125e+00, + 0.000000000000000e+00, + 0.000000000000000e+00, + -4.193141432895800e-04, + -3.357667186781713e-05}, + { + {10,RHEA_0}, + {17,RHEA_1}, + {18,RHEA_2}, + {1,RHEA_3}, + } + }, + { "TITAN", + 8.459559800923616e-08, + 3.940425676910059e-01, + {-1.348089930929860e-04, + 4.936792168079816e+00, + -1.249553518183080e-06, + 2.792373338061224e-06, + -5.584488311754492e-03, + -4.471842487301890e-04}, + { + {6,TITAN_0}, + {9,TITAN_1}, + {10,TITAN_2}, + {1,TITAN_3}, + } + }, + { "IAPETUS", + 8.457584639645043e-08, + 7.920197763192791e-02, + {-4.931880677088688e-04, + 1.661250302251527e-01, + 3.904890046320212e-04, + -9.380651872794318e-04, + -1.315950341063651e-01, + -1.054097030879299e-02}, + { + {26,IAPETUS_0}, + {29,IAPETUS_1}, + {38,IAPETUS_2}, + {19,IAPETUS_3}, + } + }, + { "HYPERION", + 8.457558674940690e-08, + 2.953088138695055e-01, + {-1.574686065780747e-03, + 2.250358656361423e+00, + 0.000000000000000e+00, + 0.000000000000000e+00, + -4.939409467982673e-03, + -3.958228521883369e-04}, + { + {1,HYPERION_0}, + {1,HYPERION_1}, + {1,HYPERION_2}, + {1,HYPERION_3}, + } + }, +}; +static void CalcLon(double t,double lon[7]) +{ + int i; + for (i=0;i<7;i++,lon++) + { + const struct Tass17MultiTerm *const tmt_begin = tass17bodies[i].series[1].multi_terms; + const struct Tass17Term *const tt_begin = tmt_begin->terms; + const struct Tass17Term *tt = tt_begin + tmt_begin->nr_of_terms; + *lon = 0; + while (--tt >= tt_begin) + { + *lon += tt->s[0]*sin(tt->s[1]+tt->s[2]*t); + } + } +} + +static void CalcTass17Elem(double t,const double lon[7],int body,double elem[6]) +{ + const struct Tass17MultiTerm *tmt_begin,*tmt; + int i; + for (i=0;i<6;i++) elem[i] = tass17bodies[body].s0[i]; + + tmt_begin = tass17bodies[body].series[0].multi_terms; + tmt = tmt_begin + tass17bodies[body].series[0].nr_of_multi_terms; + while (--tmt >= tmt_begin) + { + const struct Tass17Term *const tt_begin = tmt->terms; + const struct Tass17Term *tt = tt_begin + tmt->nr_of_terms; + double arg = 0; + for (i=0;i<7;i++) arg += tmt->i[i]*lon[i]; + while (--tt >= tt_begin) elem[0] += tt->s[0]*cos(tt->s[1]+tt->s[2]*t+arg); + } + elem[0] = tass17bodies[body].aam * (1.0 + elem[0]); + + tmt_begin = tass17bodies[body].series[1].multi_terms; + tmt = tmt_begin + tass17bodies[body].series[1].nr_of_multi_terms; + if (body != 7) + { /* first multiterm already calculated: lon[body];*/ + tmt_begin++; + elem[1] += lon[body]; + } + while (--tmt >= tmt_begin) + { + const struct Tass17Term *const tt_begin = tmt->terms; + const struct Tass17Term *tt = tt_begin + tmt->nr_of_terms; + double arg = 0; + for (i=0;i<7;i++) arg += tmt->i[i]*lon[i]; + while (--tt >= tt_begin) elem[1] += tt->s[0]*sin(tt->s[1]+tt->s[2]*t+arg); + } + elem[1] += tass17bodies[body].aam * t; + + tmt_begin = tass17bodies[body].series[2].multi_terms; + tmt = tmt_begin + tass17bodies[body].series[2].nr_of_multi_terms; + while (--tmt >= tmt_begin) + { + const struct Tass17Term *const tt_begin = tmt->terms; + const struct Tass17Term *tt = tt_begin + tmt->nr_of_terms; + double arg = 0; + for (i=0;i<7;i++) arg += tmt->i[i]*lon[i]; + while (--tt >= tt_begin) + { + const double x = tt->s[1] + tt->s[2]*t + arg; + elem[2] += tt->s[0]*cos(x); + elem[3] += tt->s[0]*sin(x); + } + } + + tmt_begin = tass17bodies[body].series[3].multi_terms; + tmt = tmt_begin + tass17bodies[body].series[3].nr_of_multi_terms; + while (--tmt >= tmt_begin) + { + const struct Tass17Term *const tt_begin = tmt->terms; + const struct Tass17Term *tt = tt_begin + tmt->nr_of_terms; + double arg = 0; + for (i=0;i<7;i++) arg += tmt->i[i]*lon[i]; + while (--tt >= tt_begin) + { + const double x = tt->s[1] + tt->s[2]*t + arg; + elem[4] += tt->s[0]*cos(x); + elem[5] += tt->s[0]*sin(x); + } + } +} + +static +const double TASS17toVSOP87[9] = { + -9.833473364922412278e-01,-1.603871593615649693e-01, 8.546329577978411975e-02, + 1.817361158757799129e-01,-8.678312794665074866e-01, 4.624292968291581735e-01, + 0.000000000000000000e+00, 4.702603847778936010e-01, 8.825277165667645230e-01 +}; + +void GetTass17Coor(double jd, int body, double *xyz, double *xyzdot) +{ + double t; + double lon[8]; + double elem[6]; + double x[6]; + + t = jd - 2444240.0; + + CalcLon(t, lon); + CalcTass17Elem(t, lon, body, elem); + EllipticToRectangularN(tass17bodies[body].mu, elem, 0.0, x); + + xyz[0] = TASS17toVSOP87[0]*x[0]+TASS17toVSOP87[1]*x[1]+TASS17toVSOP87[2]*x[2]; + xyz[1] = TASS17toVSOP87[3]*x[0]+TASS17toVSOP87[4]*x[1]+TASS17toVSOP87[5]*x[2]; + xyz[2] = TASS17toVSOP87[6]*x[0]+TASS17toVSOP87[7]*x[1]+TASS17toVSOP87[8]*x[2]; + + if (xyzdot) + { + xyzdot[0] = TASS17toVSOP87[0]*x[3]+TASS17toVSOP87[1]*x[4]+TASS17toVSOP87[2]*x[5]; + xyzdot[1] = TASS17toVSOP87[3]*x[3]+TASS17toVSOP87[4]*x[4]+TASS17toVSOP87[5]*x[5]; + xyzdot[2] = TASS17toVSOP87[6]*x[3]+TASS17toVSOP87[7]*x[4]+TASS17toVSOP87[8]*x[5]; + } +} diff --git a/src/tass17.h b/src/tass17.h new file mode 100644 index 0000000..7530045 --- /dev/null +++ b/src/tass17.h @@ -0,0 +1,71 @@ +/************************************************************************ + +The TASS 1.7 theory of the Saturnian satellites including HYPERION +by Alain VIENNE and Luc DURIEZ can be found at +ftp://ftp.imcce.fr/pub/ephem/satel/tass17 + +I (Johannes Gajdosik) have just taken the Fortran code and data +obtained from above and rearranged it into this piece of software. + +I can neither allow nor forbid the usage of the TASS 1.7 theory. +The copyright notice below covers not the work of Alain VIENNE and Luc DURIEZ +but just my work, that is the compilation of the TASS 1.7 theory +into the software supplied in this file. + + +Copyright (c) 2005 Johannes Gajdosik + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Adapted for pg_orbit: removed static mutable state for thread safety +(PostgreSQL PARALLEL SAFE). + +****************************************************************/ + +#ifndef PG_ORBIT_TASS17_H +#define PG_ORBIT_TASS17_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define TASS17_MIMAS 0 +#define TASS17_ENCELADUS 1 +#define TASS17_TETHYS 2 +#define TASS17_DIONE 3 +#define TASS17_RHEA 4 +#define TASS17_TITAN 5 +#define TASS17_HYPERION 7 +#define TASS17_IAPETUS 6 + +/* + * Compute Saturn moon position and velocity in VSOP87 ecliptic J2000 + * coordinates, relative to Saturn center, in AU and AU/day. + * + * body: 0-7 (see defines above; note Hyperion=7, Iapetus=6) + * xyz[3]: output position (AU) + * xyzdot[3]: output velocity (AU/day), may be NULL + */ +void GetTass17Coor(double jd, int body, double *xyz, double *xyzdot); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/test/expected/moon_observe.out b/test/expected/moon_observe.out new file mode 100644 index 0000000..813b3a9 --- /dev/null +++ b/test/expected/moon_observe.out @@ -0,0 +1,226 @@ +-- moon_observe regression tests +-- +-- Tests planetary moon observation (Galilean, Saturn, Uranus, Mars) +-- and Jupiter decametric radio burst prediction functions. +-- Reference distances from JPL/NASA fact sheets. +\set boulder '''40.015N 105.270W 1655m'''::observer +-- ============================================================ +-- Test 1: Galilean moon observation - all four from Boulder +-- Io, Europa, Ganymede, Callisto should return valid topocentric. +-- ============================================================ +SELECT 'galilean_io' AS test, + round(topo_azimuth(galilean_observe(0, :boulder, + '2024-03-15 03:00:00+00'))::numeric, 0) AS az_deg, + round(topo_elevation(galilean_observe(0, :boulder, + '2024-03-15 03:00:00+00'))::numeric, 0) AS el_deg; + test | az_deg | el_deg +-------------+--------+-------- + galilean_io | 270 | 24 +(1 row) + +SELECT 'galilean_europa' AS test, + round(topo_azimuth(galilean_observe(1, :boulder, + '2024-03-15 03:00:00+00'))::numeric, 0) AS az_deg, + round(topo_elevation(galilean_observe(1, :boulder, + '2024-03-15 03:00:00+00'))::numeric, 0) AS el_deg; + test | az_deg | el_deg +-----------------+--------+-------- + galilean_europa | 270 | 24 +(1 row) + +SELECT 'galilean_ganymede' AS test, + round(topo_azimuth(galilean_observe(2, :boulder, + '2024-03-15 03:00:00+00'))::numeric, 0) AS az_deg, + round(topo_elevation(galilean_observe(2, :boulder, + '2024-03-15 03:00:00+00'))::numeric, 0) AS el_deg; + test | az_deg | el_deg +-------------------+--------+-------- + galilean_ganymede | 270 | 24 +(1 row) + +SELECT 'galilean_callisto' AS test, + round(topo_azimuth(galilean_observe(3, :boulder, + '2024-03-15 03:00:00+00'))::numeric, 0) AS az_deg, + round(topo_elevation(galilean_observe(3, :boulder, + '2024-03-15 03:00:00+00'))::numeric, 0) AS el_deg; + test | az_deg | el_deg +-------------------+--------+-------- + galilean_callisto | 270 | 24 +(1 row) + +-- ============================================================ +-- Test 2: Galilean moons should be very close to Jupiter +-- All four should have ranges within ~0.05 AU of Jupiter's range. +-- Jupiter is ~4-6 AU from Earth; moons orbit within 0.013 AU. +-- ============================================================ +SELECT 'galilean_near_jupiter' AS test, + round(topo_range(planet_observe(5, :boulder, + '2024-03-15 03:00:00+00'))::numeric, -4) AS jupiter_km, + round(topo_range(galilean_observe(0, :boulder, + '2024-03-15 03:00:00+00'))::numeric, -4) AS io_km, + round(topo_range(galilean_observe(3, :boulder, + '2024-03-15 03:00:00+00'))::numeric, -4) AS callisto_km; + test | jupiter_km | io_km | callisto_km +-----------------------+------------+-----------+------------- + galilean_near_jupiter | 837420000 | 837000000 | 837600000 +(1 row) + +-- ============================================================ +-- Test 3: Saturn moon observation - Titan (body_id=5) +-- Titan is Saturn's largest moon, should be near Saturn. +-- ============================================================ +SELECT 'saturn_titan' AS test, + round(topo_azimuth(saturn_moon_observe(5, :boulder, + '2024-06-15 03:00:00+00'))::numeric, 0) AS az_deg, + round(topo_elevation(saturn_moon_observe(5, :boulder, + '2024-06-15 03:00:00+00'))::numeric, 0) AS el_deg; + test | az_deg | el_deg +--------------+--------+-------- + saturn_titan | 50 | -45 +(1 row) + +-- ============================================================ +-- Test 4: Saturn moons - Mimas through Iapetus all return results +-- ============================================================ +SELECT 'saturn_moons' AS test, + body_id, + round(topo_range(saturn_moon_observe(body_id, :boulder, + '2024-06-15 03:00:00+00'))::numeric, -4) AS range_km +FROM generate_series(0, 7) AS body_id; + test | body_id | range_km +--------------+---------+------------ + saturn_moons | 0 | 1427920000 + saturn_moons | 1 | 1427670000 + saturn_moons | 2 | 1427910000 + saturn_moons | 3 | 1427680000 + saturn_moons | 4 | 1427420000 + saturn_moons | 5 | 1426520000 + saturn_moons | 6 | 1428150000 + saturn_moons | 7 | 1429140000 +(8 rows) + +-- ============================================================ +-- Test 5: Uranus moon observation - Titania (body_id=3) +-- ============================================================ +SELECT 'uranus_titania' AS test, + round(topo_azimuth(uranus_moon_observe(3, :boulder, + '2024-06-15 03:00:00+00'))::numeric, 0) AS az_deg, + round(topo_elevation(uranus_moon_observe(3, :boulder, + '2024-06-15 03:00:00+00'))::numeric, 0) AS el_deg; + test | az_deg | el_deg +----------------+--------+-------- + uranus_titania | 329 | -25 +(1 row) + +-- ============================================================ +-- Test 6: All Uranus moons return valid results +-- ============================================================ +SELECT 'uranus_moons' AS test, + body_id, + round(topo_range(uranus_moon_observe(body_id, :boulder, + '2024-06-15 03:00:00+00'))::numeric, -4) AS range_km +FROM generate_series(0, 4) AS body_id; + test | body_id | range_km +--------------+---------+------------ + uranus_moons | 0 | 3061280000 + uranus_moons | 1 | 3061360000 + uranus_moons | 2 | 3061200000 + uranus_moons | 3 | 3061310000 + uranus_moons | 4 | 3061520000 +(5 rows) + +-- ============================================================ +-- Test 7: Mars moons - Phobos and Deimos +-- ============================================================ +SELECT 'mars_phobos' AS test, + round(topo_azimuth(mars_moon_observe(0, :boulder, + '2024-01-15 06:00:00+00'))::numeric, 0) AS az_deg, + round(topo_elevation(mars_moon_observe(0, :boulder, + '2024-01-15 06:00:00+00'))::numeric, 0) AS el_deg; + test | az_deg | el_deg +-------------+--------+-------- + mars_phobos | 1 | -74 +(1 row) + +SELECT 'mars_deimos' AS test, + round(topo_azimuth(mars_moon_observe(1, :boulder, + '2024-01-15 06:00:00+00'))::numeric, 0) AS az_deg, + round(topo_elevation(mars_moon_observe(1, :boulder, + '2024-01-15 06:00:00+00'))::numeric, 0) AS el_deg; + test | az_deg | el_deg +-------------+--------+-------- + mars_deimos | 1 | -74 +(1 row) + +-- ============================================================ +-- Test 8: Io phase angle - should be [0, 360) +-- ============================================================ +SELECT 'io_phase' AS test, + round(io_phase_angle('2024-03-15 03:00:00+00')::numeric, 1) AS phase_deg, + io_phase_angle('2024-03-15 03:00:00+00') >= 0.0 + AND io_phase_angle('2024-03-15 03:00:00+00') < 360.0 AS in_range; + test | phase_deg | in_range +----------+-----------+---------- + io_phase | 179.7 | t +(1 row) + +-- ============================================================ +-- Test 9: Jupiter CML (System III) - should be [0, 360) +-- ============================================================ +SELECT 'jupiter_cml' AS test, + round(jupiter_cml(:boulder, '2024-03-15 03:00:00+00')::numeric, 1) AS cml_deg, + jupiter_cml(:boulder, '2024-03-15 03:00:00+00') >= 0.0 + AND jupiter_cml(:boulder, '2024-03-15 03:00:00+00') < 360.0 AS in_range; + test | cml_deg | in_range +-------------+---------+---------- + jupiter_cml | 306.0 | t +(1 row) + +-- ============================================================ +-- Test 10: Jupiter burst probability - known high probability zone +-- Source A: CML 200-260, Io phase 195-265 => p=0.8 +-- ============================================================ +SELECT 'burst_source_a' AS test, + jupiter_burst_probability(230.0, 230.0) AS p_source_a; + test | p_source_a +----------------+------------ + burst_source_a | 0.8 +(1 row) + +-- ============================================================ +-- Test 11: Jupiter burst probability - known zones +-- ============================================================ +SELECT 'burst_zones' AS test, + jupiter_burst_probability(90.0, 150.0) AS p_source_b, + jupiter_burst_probability(240.0, 350.0) AS p_source_c, + jupiter_burst_probability(100.0, 25.0) AS p_source_d, + jupiter_burst_probability(0.0, 130.0) AS p_quiet; + test | p_source_b | p_source_c | p_source_d | p_quiet +-------------+------------+------------+------------+--------- + burst_zones | 0.6 | 0.5 | 0.15 | 0 +(1 row) + +-- ============================================================ +-- Test 12: Io phase changes over time (Io orbits in ~1.77 days) +-- Two times 12 hours apart should show significant phase change. +-- ============================================================ +SELECT 'io_phase_changes' AS test, + round(io_phase_angle('2024-03-15 00:00:00+00')::numeric, 1) AS phase_0h, + round(io_phase_angle('2024-03-15 12:00:00+00')::numeric, 1) AS phase_12h, + abs(io_phase_angle('2024-03-15 00:00:00+00') - + io_phase_angle('2024-03-15 12:00:00+00')) > 10.0 AS changed; + test | phase_0h | phase_12h | changed +------------------+----------+-----------+--------- + io_phase_changes | 205.0 | 103.4 | t +(1 row) + +-- ============================================================ +-- Test 13: Error handling - invalid Galilean moon body_id +-- ============================================================ +SELECT 'invalid_galilean' AS test, galilean_observe(4, :boulder, now()); +ERROR: galilean_observe: body_id 4 must be 0-3 (Io, Europa, Ganymede, Callisto) +-- ============================================================ +-- Test 14: Error handling - invalid Saturn moon body_id +-- ============================================================ +SELECT 'invalid_saturn' AS test, saturn_moon_observe(8, :boulder, now()); +ERROR: saturn_moon_observe: body_id 8 must be 0-7 (Mimas-Hyperion) diff --git a/test/sql/moon_observe.sql b/test/sql/moon_observe.sql new file mode 100644 index 0000000..01dcbf9 --- /dev/null +++ b/test/sql/moon_observe.sql @@ -0,0 +1,152 @@ +-- moon_observe regression tests +-- +-- Tests planetary moon observation (Galilean, Saturn, Uranus, Mars) +-- and Jupiter decametric radio burst prediction functions. +-- Reference distances from JPL/NASA fact sheets. + +\set boulder '''40.015N 105.270W 1655m'''::observer + +-- ============================================================ +-- Test 1: Galilean moon observation - all four from Boulder +-- Io, Europa, Ganymede, Callisto should return valid topocentric. +-- ============================================================ +SELECT 'galilean_io' AS test, + round(topo_azimuth(galilean_observe(0, :boulder, + '2024-03-15 03:00:00+00'))::numeric, 0) AS az_deg, + round(topo_elevation(galilean_observe(0, :boulder, + '2024-03-15 03:00:00+00'))::numeric, 0) AS el_deg; + +SELECT 'galilean_europa' AS test, + round(topo_azimuth(galilean_observe(1, :boulder, + '2024-03-15 03:00:00+00'))::numeric, 0) AS az_deg, + round(topo_elevation(galilean_observe(1, :boulder, + '2024-03-15 03:00:00+00'))::numeric, 0) AS el_deg; + +SELECT 'galilean_ganymede' AS test, + round(topo_azimuth(galilean_observe(2, :boulder, + '2024-03-15 03:00:00+00'))::numeric, 0) AS az_deg, + round(topo_elevation(galilean_observe(2, :boulder, + '2024-03-15 03:00:00+00'))::numeric, 0) AS el_deg; + +SELECT 'galilean_callisto' AS test, + round(topo_azimuth(galilean_observe(3, :boulder, + '2024-03-15 03:00:00+00'))::numeric, 0) AS az_deg, + round(topo_elevation(galilean_observe(3, :boulder, + '2024-03-15 03:00:00+00'))::numeric, 0) AS el_deg; + +-- ============================================================ +-- Test 2: Galilean moons should be very close to Jupiter +-- All four should have ranges within ~0.05 AU of Jupiter's range. +-- Jupiter is ~4-6 AU from Earth; moons orbit within 0.013 AU. +-- ============================================================ +SELECT 'galilean_near_jupiter' AS test, + round(topo_range(planet_observe(5, :boulder, + '2024-03-15 03:00:00+00'))::numeric, -4) AS jupiter_km, + round(topo_range(galilean_observe(0, :boulder, + '2024-03-15 03:00:00+00'))::numeric, -4) AS io_km, + round(topo_range(galilean_observe(3, :boulder, + '2024-03-15 03:00:00+00'))::numeric, -4) AS callisto_km; + +-- ============================================================ +-- Test 3: Saturn moon observation - Titan (body_id=5) +-- Titan is Saturn's largest moon, should be near Saturn. +-- ============================================================ +SELECT 'saturn_titan' AS test, + round(topo_azimuth(saturn_moon_observe(5, :boulder, + '2024-06-15 03:00:00+00'))::numeric, 0) AS az_deg, + round(topo_elevation(saturn_moon_observe(5, :boulder, + '2024-06-15 03:00:00+00'))::numeric, 0) AS el_deg; + +-- ============================================================ +-- Test 4: Saturn moons - Mimas through Iapetus all return results +-- ============================================================ +SELECT 'saturn_moons' AS test, + body_id, + round(topo_range(saturn_moon_observe(body_id, :boulder, + '2024-06-15 03:00:00+00'))::numeric, -4) AS range_km +FROM generate_series(0, 7) AS body_id; + +-- ============================================================ +-- Test 5: Uranus moon observation - Titania (body_id=3) +-- ============================================================ +SELECT 'uranus_titania' AS test, + round(topo_azimuth(uranus_moon_observe(3, :boulder, + '2024-06-15 03:00:00+00'))::numeric, 0) AS az_deg, + round(topo_elevation(uranus_moon_observe(3, :boulder, + '2024-06-15 03:00:00+00'))::numeric, 0) AS el_deg; + +-- ============================================================ +-- Test 6: All Uranus moons return valid results +-- ============================================================ +SELECT 'uranus_moons' AS test, + body_id, + round(topo_range(uranus_moon_observe(body_id, :boulder, + '2024-06-15 03:00:00+00'))::numeric, -4) AS range_km +FROM generate_series(0, 4) AS body_id; + +-- ============================================================ +-- Test 7: Mars moons - Phobos and Deimos +-- ============================================================ +SELECT 'mars_phobos' AS test, + round(topo_azimuth(mars_moon_observe(0, :boulder, + '2024-01-15 06:00:00+00'))::numeric, 0) AS az_deg, + round(topo_elevation(mars_moon_observe(0, :boulder, + '2024-01-15 06:00:00+00'))::numeric, 0) AS el_deg; + +SELECT 'mars_deimos' AS test, + round(topo_azimuth(mars_moon_observe(1, :boulder, + '2024-01-15 06:00:00+00'))::numeric, 0) AS az_deg, + round(topo_elevation(mars_moon_observe(1, :boulder, + '2024-01-15 06:00:00+00'))::numeric, 0) AS el_deg; + +-- ============================================================ +-- Test 8: Io phase angle - should be [0, 360) +-- ============================================================ +SELECT 'io_phase' AS test, + round(io_phase_angle('2024-03-15 03:00:00+00')::numeric, 1) AS phase_deg, + io_phase_angle('2024-03-15 03:00:00+00') >= 0.0 + AND io_phase_angle('2024-03-15 03:00:00+00') < 360.0 AS in_range; + +-- ============================================================ +-- Test 9: Jupiter CML (System III) - should be [0, 360) +-- ============================================================ +SELECT 'jupiter_cml' AS test, + round(jupiter_cml(:boulder, '2024-03-15 03:00:00+00')::numeric, 1) AS cml_deg, + jupiter_cml(:boulder, '2024-03-15 03:00:00+00') >= 0.0 + AND jupiter_cml(:boulder, '2024-03-15 03:00:00+00') < 360.0 AS in_range; + +-- ============================================================ +-- Test 10: Jupiter burst probability - known high probability zone +-- Source A: CML 200-260, Io phase 195-265 => p=0.8 +-- ============================================================ +SELECT 'burst_source_a' AS test, + jupiter_burst_probability(230.0, 230.0) AS p_source_a; + +-- ============================================================ +-- Test 11: Jupiter burst probability - known zones +-- ============================================================ +SELECT 'burst_zones' AS test, + jupiter_burst_probability(90.0, 150.0) AS p_source_b, + jupiter_burst_probability(240.0, 350.0) AS p_source_c, + jupiter_burst_probability(100.0, 25.0) AS p_source_d, + jupiter_burst_probability(0.0, 130.0) AS p_quiet; + +-- ============================================================ +-- Test 12: Io phase changes over time (Io orbits in ~1.77 days) +-- Two times 12 hours apart should show significant phase change. +-- ============================================================ +SELECT 'io_phase_changes' AS test, + round(io_phase_angle('2024-03-15 00:00:00+00')::numeric, 1) AS phase_0h, + round(io_phase_angle('2024-03-15 12:00:00+00')::numeric, 1) AS phase_12h, + abs(io_phase_angle('2024-03-15 00:00:00+00') - + io_phase_angle('2024-03-15 12:00:00+00')) > 10.0 AS changed; + +-- ============================================================ +-- Test 13: Error handling - invalid Galilean moon body_id +-- ============================================================ +SELECT 'invalid_galilean' AS test, galilean_observe(4, :boulder, now()); + +-- ============================================================ +-- Test 14: Error handling - invalid Saturn moon body_id +-- ============================================================ +SELECT 'invalid_saturn' AS test, saturn_moon_observe(8, :boulder, now());