1 /*
2 Copyright (C) 2003 Fabien Chereau
3 Copyright (C) 2015 Holger Niessner
4 Copyright (C) 2015 Georg Zotti
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Library General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
19 */
20
21 #include "EphemWrapper.hpp"
22 #include "StelApp.hpp"
23 #include "StelCore.hpp"
24 #include "vsop87.h"
25 #include "elp82b.h"
26 #include "marssat.h"
27 #include "l12.h"
28 #include "tass17.h"
29 #include "gust86.h"
30 #include "de431.hpp"
31 #include "de430.hpp"
32 #include "de441.hpp"
33 #include "de440.hpp"
34 #include "pluto.h"
35 #include "htc20b.hpp"
36 #include "StelUtils.hpp"
37
38 #define EPHEM_MERCURY_ID 0
39 #define EPHEM_VENUS_ID 1
40 #define EPHEM_EMB_ID 2
41 #define EPHEM_MARS_ID 3
42 #define EPHEM_JUPITER_ID 4
43 #define EPHEM_SATURN_ID 5
44 #define EPHEM_URANUS_ID 6
45 #define EPHEM_NEPTUNE_ID 7
46 #define EPHEM_PLUTO_ID 8
47
48 // GZ No idea what IMD stands for?
49 //#define EPHEM_IMD_EARTH_ID 2
50 #define EPHEM_JPL_EARTH_ID 3
51 #define EPHEM_JPL_PLUTO_ID 9
52 #define EPHEM_JPL_MOON_ID 10
53 #define EPHEM_JPL_SUN_ID 11
54
55 /** JPL PLANET ID LIST
56 ** 1 = mercury 8 = neptune **
57 ** 2 = venus 9 = pluto **
58 ** 3 = earth 10 = moon **
59 ** 4 = mars 11 = sun **
60 ** 5 = jupiter 12 = solar-system barycenter **
61 ** 6 = saturn 13 = earth-moon barycenter **
62 ** 7 = uranus
63 **/
64
init_de430(const char * filepath)65 void EphemWrapper::init_de430(const char* filepath)
66 {
67 InitDE430(filepath);
68 }
69
init_de431(const char * filepath)70 void EphemWrapper::init_de431(const char* filepath)
71 {
72 InitDE431(filepath);
73 }
74
init_de440(const char * filepath)75 void EphemWrapper::init_de440(const char* filepath)
76 {
77 InitDE440(filepath);
78 }
79
init_de441(const char * filepath)80 void EphemWrapper::init_de441(const char* filepath)
81 {
82 InitDE441(filepath);
83 }
84
jd_fits_de431(const double jd)85 bool EphemWrapper::jd_fits_de431(const double jd)
86 {
87 //Correct limits found via jpl_get_double(). Limits hardcoded to avoid calls each time.
88 //return !(jd < -3027215.5 || jd > 7930192.5);
89 //This limits inside those where sun can jump between ecliptic of date and ecliptic2000.
90 // We lose a month in -13000 and a few months in +17000, this should not matter.
91 return ((jd > -3027188.25 ) && (jd < 7930056.87916));
92 }
93
jd_fits_de430(const double jd)94 bool EphemWrapper::jd_fits_de430(const double jd)
95 {
96 return ((jd > 2287184.5) && (jd < 2688976.5));
97 }
98
jd_fits_de441(const double jd)99 bool EphemWrapper::jd_fits_de441(const double jd)
100 {
101 //Correct limits found via jpl_get_double(). Limits hardcoded to avoid calls each time.
102 //return !(jd < -3027215.5 || jd > 7930192.5);
103 //This limits inside those where sun can jump between ecliptic of date and ecliptic2000.
104 // We lose a month in -13000 and a few months in +17000, this should not matter.
105 return ((jd > -3027188.25 ) && (jd < 7930056.87916));
106 }
107
jd_fits_de440(const double jd)108 bool EphemWrapper::jd_fits_de440(const double jd)
109 {
110 return ((jd > 2287184.5) && (jd < 2688976.5));
111 }
112
use_de430(const double jd)113 bool EphemWrapper::use_de430(const double jd)
114 {
115 return StelApp::getInstance().getCore()->de430IsActive() && EphemWrapper::jd_fits_de430(jd);
116 }
117
use_de431(const double jd)118 bool EphemWrapper::use_de431(const double jd)
119 {
120 return StelApp::getInstance().getCore()->de431IsActive() && EphemWrapper::jd_fits_de431(jd);
121 }
122
use_de440(const double jd)123 bool EphemWrapper::use_de440(const double jd)
124 {
125 return StelApp::getInstance().getCore()->de440IsActive() && EphemWrapper::jd_fits_de440(jd);
126 }
127
use_de441(const double jd)128 bool EphemWrapper::use_de441(const double jd)
129 {
130 return StelApp::getInstance().getCore()->de441IsActive() && EphemWrapper::jd_fits_de441(jd);
131 }
132
133 // planet_id is ONLY one of the #defined values 0..8 above.
get_planet_helio_coordsv(const double jd,double xyz[3],double xyzdot[3],const int planet_id)134 void get_planet_helio_coordsv(const double jd, double xyz[3], double xyzdot[3], const int planet_id)
135 {
136 bool deOk=false;
137 double xyz6[6];
138 if(!std::isfinite(jd))
139 {
140 qDebug() << "get_planet_helio_coordsv(): SKIPPED CoordCalc, jd is infinite/nan: " << jd;
141 return;
142 }
143
144 if(EphemWrapper::use_de440(jd))
145 {
146 deOk=GetDe440Coor(jd, planet_id + 1, xyz6);
147 }
148 else if(EphemWrapper::use_de441(jd))
149 {
150 deOk=GetDe441Coor(jd, planet_id + 1, xyz6);
151 }
152 else if(EphemWrapper::use_de430(jd))
153 {
154 deOk=GetDe430Coor(jd, planet_id + 1, xyz6);
155 }
156 else if(EphemWrapper::use_de431(jd))
157 {
158 deOk=GetDe431Coor(jd, planet_id + 1, xyz6);
159 }
160 if (!deOk) //VSOP87 as fallback
161 {
162 GetVsop87Coor(jd, planet_id, xyz6);
163 }
164 xyz[0] =xyz6[0]; xyz[1] =xyz6[1]; xyz[2] =xyz6[2];
165 xyzdot[0]=xyz6[3]; xyzdot[1]=xyz6[4]; xyzdot[2]=xyz6[5];
166 }
167
168 // Osculating positions for time JDE in elements for JDE0, if possible by the theory used (e.g. VSOP87).
169 // For ephemerides like DE4xx, JDE0 is irrelevant.
get_planet_helio_osculating_coordsv(double jd0,double jd,double xyz[3],double xyzdot[3],int planet_id)170 void get_planet_helio_osculating_coordsv(double jd0, double jd, double xyz[3], double xyzdot[3], int planet_id)
171 {
172 bool deOk=false;
173 double xyz6[6];
174 if(!(std::isfinite(jd) && std::isfinite(jd0)))
175 {
176 qDebug() << "get_planet_helio_osculating_coordsv(): SKIPPED CoordCalc, jd0 or jd is infinite/nan. jd0:" << jd0 << "jd: "<< jd;
177 return;
178 }
179
180 if(EphemWrapper::use_de440(jd))
181 {
182 deOk=GetDe440Coor(jd, planet_id + 1, xyz6);
183 }
184 else if(EphemWrapper::use_de441(jd))
185 {
186 deOk=GetDe441Coor(jd, planet_id + 1, xyz6);
187 }
188 else if(EphemWrapper::use_de430(jd))
189 {
190 deOk=GetDe430Coor(jd, planet_id + 1, xyz6);
191 }
192 else if(EphemWrapper::use_de431(jd))
193 {
194 deOk=GetDe431Coor(jd, planet_id + 1, xyz6);
195 }
196 if (!deOk) //VSOP87 as fallback
197 {
198 GetVsop87OsculatingCoor(jd0, jd, planet_id, xyz6);
199 }
200 xyz[0] =xyz6[0]; xyz[1] =xyz6[1]; xyz[2] =xyz6[2];
201 xyzdot[0]=xyz6[3]; xyzdot[1]=xyz6[4]; xyzdot[2]=xyz6[5];
202 }
203
204 /* Chapter 31 Pg 206-207 Equ 31.1 31.2, 31.3 using VSOP 87
205 * Calculate Pluto's rectangular heliocentric ecliptical coordinates
206 * for given Julian Day. Values are in AU.
207 * params : Julian day, rect coords */
208
get_pluto_helio_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)209 void get_pluto_helio_coordsv(double jd,double xyz[3], double xyzdot[3], void* unused)
210 {
211 Q_UNUSED(unused);
212 bool deOk=false;
213 double xyz6[6];
214 if(!std::isfinite(jd))
215 {
216 qDebug() << "get_pluto_helio_coordsv(): SKIPPED PlutoCoordCalc, jd is infinite/nan:" << jd;
217 return;
218 }
219
220 if(EphemWrapper::use_de440(jd))
221 {
222 deOk=GetDe440Coor(jd, EPHEM_JPL_PLUTO_ID, xyz6);
223 }
224 else if(EphemWrapper::use_de441(jd))
225 {
226 deOk=GetDe441Coor(jd, EPHEM_JPL_PLUTO_ID, xyz6);
227 }
228 else if(EphemWrapper::use_de430(jd))
229 {
230 deOk=GetDe430Coor(jd, EPHEM_JPL_PLUTO_ID, xyz6);
231 }
232 else if(EphemWrapper::use_de431(jd))
233 {
234 deOk=GetDe431Coor(jd, EPHEM_JPL_PLUTO_ID, xyz6);
235 }
236
237 if (deOk)
238 {
239 xyz[0] =xyz6[0]; xyz[1] =xyz6[1]; xyz[2] =xyz6[2];
240 xyzdot[0]=xyz6[3]; xyzdot[1]=xyz6[4]; xyzdot[2]=xyz6[5];
241 }
242 else // fallback to previous solution
243 {
244 get_pluto_helio_coords(jd, &xyz[0], &xyz[1], &xyz[2]);
245 xyzdot[0]=xyzdot[1]=xyzdot[2]=0.0; // TODO: Some meaningful way to get speed?
246 }
247 }
248
249 /* Return 0 for the sun */
get_sun_helio_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)250 void get_sun_helio_coordsv(double jd,double xyz[3], double xyzdot[3], void* unused)
251 {
252 Q_UNUSED(jd);
253 Q_UNUSED(unused);
254 xyz[0] =0.; xyz[1] =0.; xyz[2] =0.;
255 xyzdot[0]=0.; xyzdot[1]=0.; xyzdot[2]=0.;
256 }
257
get_mercury_helio_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)258 void get_mercury_helio_coordsv(double jd,double xyz[3], double xyzdot[3], void* unused)
259 {
260 Q_UNUSED(unused);
261 get_planet_helio_coordsv(jd, xyz, xyzdot, EPHEM_MERCURY_ID);
262 }
get_venus_helio_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)263 void get_venus_helio_coordsv(double jd,double xyz[3], double xyzdot[3], void* unused)
264 {
265 Q_UNUSED(unused);
266 get_planet_helio_coordsv(jd, xyz, xyzdot, EPHEM_VENUS_ID);
267 }
268
get_earth_helio_coordsv(const double jd,double xyz[3],double xyzdot[3],void * unused)269 void get_earth_helio_coordsv(const double jd,double xyz[3], double xyzdot[3], void* unused)
270 {
271 Q_UNUSED(unused);
272 bool deOk=false;
273 double xyz6[6];
274 if(!std::isfinite(jd))
275 {
276 qDebug() << "get_earth_helio_coordsv(): SKIPPED EarthCoordCalc, jd is infinite/nan:" << jd;
277 return;
278 }
279
280 if(EphemWrapper::use_de440(jd))
281 {
282 deOk=GetDe440Coor(jd, EPHEM_JPL_EARTH_ID, xyz6);
283 }
284 else if(EphemWrapper::use_de441(jd))
285 {
286 deOk=GetDe441Coor(jd, EPHEM_JPL_EARTH_ID, xyz6);
287 }
288 else if(EphemWrapper::use_de430(jd))
289 {
290 deOk=GetDe430Coor(jd, EPHEM_JPL_EARTH_ID, xyz6);
291 }
292 else if(EphemWrapper::use_de431(jd))
293 {
294 deOk=GetDe431Coor(jd, EPHEM_JPL_EARTH_ID, xyz6);
295 }
296 if (!deOk) //VSOP87 as fallback
297 {
298 double moon[3];
299 GetVsop87Coor(jd,EPHEM_EMB_ID,xyz6);
300 GetElp82bCoor(jd,moon);
301 /* Earth != EMB:
302 0.0121505677733761 = mu_m/(1+mu_m),
303 mu_m = mass(moon)/mass(earth) = 0.01230002 */
304 xyz6[0] -= 0.0121505677733761 * moon[0];
305 xyz6[1] -= 0.0121505677733761 * moon[1];
306 xyz6[2] -= 0.0121505677733761 * moon[2];
307 // TODO: HOW TO FIX EARTH SPEED?
308 }
309 xyz[0] =xyz6[0]; xyz[1] =xyz6[1]; xyz[2] =xyz6[2];
310 xyzdot[0]=xyz6[3]; xyzdot[1]=xyz6[4]; xyzdot[2]=xyz6[5];
311 }
312
get_mars_helio_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)313 void get_mars_helio_coordsv(double jd,double xyz[3], double xyzdot[3], void* unused)
314 {
315 Q_UNUSED(unused);
316 get_planet_helio_coordsv(jd, xyz, xyzdot, EPHEM_MARS_ID);
317 }
318
get_jupiter_helio_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)319 void get_jupiter_helio_coordsv(double jd,double xyz[3], double xyzdot[3], void* unused)
320 {
321 Q_UNUSED(unused);
322 get_planet_helio_coordsv(jd, xyz, xyzdot, EPHEM_JUPITER_ID);
323 }
324
get_saturn_helio_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)325 void get_saturn_helio_coordsv(double jd,double xyz[3], double xyzdot[3], void* unused)
326 {
327 Q_UNUSED(unused);
328 get_planet_helio_coordsv(jd, xyz, xyzdot, EPHEM_SATURN_ID);
329 }
330
get_uranus_helio_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)331 void get_uranus_helio_coordsv(double jd,double xyz[3], double xyzdot[3], void* unused)
332 {
333 Q_UNUSED(unused);
334 get_planet_helio_coordsv(jd, xyz, xyzdot, EPHEM_URANUS_ID);
335 }
336
get_neptune_helio_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)337 void get_neptune_helio_coordsv(double jd,double xyz[3], double xyzdot[3], void* unused)
338 {
339 Q_UNUSED(unused);
340 get_planet_helio_coordsv(jd, xyz, xyzdot, EPHEM_NEPTUNE_ID);
341 }
342
get_mercury_helio_osculating_coords(double jd0,double jd,double xyz[3],double xyzdot[3])343 void get_mercury_helio_osculating_coords(double jd0,double jd,double xyz[3], double xyzdot[3])
344 {
345 get_planet_helio_osculating_coordsv(jd0, jd, xyz, xyzdot, EPHEM_MERCURY_ID);
346 }
347
get_venus_helio_osculating_coords(double jd0,double jd,double xyz[3],double xyzdot[3])348 void get_venus_helio_osculating_coords(double jd0,double jd,double xyz[3], double xyzdot[3])
349 {
350 get_planet_helio_osculating_coordsv(jd0, jd, xyz, xyzdot, EPHEM_VENUS_ID);
351 }
352
get_earth_helio_osculating_coords(double jd0,double jd,double xyz[3],double xyzdot[3])353 void get_earth_helio_osculating_coords(double jd0,double jd,double xyz[3], double xyzdot[3])
354 {
355 get_planet_helio_osculating_coordsv(jd0, jd, xyz, xyzdot, EPHEM_EMB_ID);
356 }
357
get_mars_helio_osculating_coords(double jd0,double jd,double xyz[3],double xyzdot[3])358 void get_mars_helio_osculating_coords(double jd0,double jd,double xyz[3], double xyzdot[3])
359 {
360 get_planet_helio_osculating_coordsv(jd0, jd, xyz, xyzdot, EPHEM_MARS_ID);
361 }
362
get_jupiter_helio_osculating_coords(double jd0,double jd,double xyz[3],double xyzdot[3])363 void get_jupiter_helio_osculating_coords(double jd0,double jd,double xyz[3], double xyzdot[3])
364 {
365 get_planet_helio_osculating_coordsv(jd0, jd, xyz, xyzdot, EPHEM_JUPITER_ID);
366 }
367
get_saturn_helio_osculating_coords(double jd0,double jd,double xyz[3],double xyzdot[3])368 void get_saturn_helio_osculating_coords(double jd0,double jd,double xyz[3], double xyzdot[3])
369 {
370 get_planet_helio_osculating_coordsv(jd0, jd, xyz, xyzdot, EPHEM_SATURN_ID);
371 }
372
get_uranus_helio_osculating_coords(double jd0,double jd,double xyz[3],double xyzdot[3])373 void get_uranus_helio_osculating_coords(double jd0,double jd,double xyz[3], double xyzdot[3])
374 {
375 get_planet_helio_osculating_coordsv(jd0, jd, xyz, xyzdot, EPHEM_URANUS_ID);
376 }
377
get_neptune_helio_osculating_coords(double jd0,double jd,double xyz[3],double xyzdot[3])378 void get_neptune_helio_osculating_coords(double jd0,double jd,double xyz[3], double xyzdot[3])
379 {
380 get_planet_helio_osculating_coordsv(jd0, jd, xyz, xyzdot, EPHEM_NEPTUNE_ID);
381 }
382
383 /* Calculate the rectangular geocentric lunar coordinates to the inertial mean
384 * ecliptic and equinox of J2000.
385 * The geocentric coordinates returned are in units of AU.
386 * This function is based upon the Lunar Solution ELP2000-82B by
387 * Michelle Chapront-Touze and Jean Chapront of the Bureau des Longitudes,
388 * Paris. ELP 2000-82B theory
389 * param jd Julian day, rect pos */
get_lunar_parent_coordsv(double jde,double xyz[3],double xyzdot[3],void * unused)390 void get_lunar_parent_coordsv(double jde, double xyz[3], double xyzdot[3], void* unused)
391 {
392 Q_UNUSED(unused);
393 double xyz6[6];
394 bool deOk=false;
395 if(EphemWrapper::use_de440(jde))
396 deOk=GetDe440Coor(jde, EPHEM_JPL_MOON_ID, xyz6, EPHEM_JPL_EARTH_ID);
397 else if(EphemWrapper::use_de441(jde))
398 deOk=GetDe441Coor(jde, EPHEM_JPL_MOON_ID, xyz6, EPHEM_JPL_EARTH_ID);
399 else if(EphemWrapper::use_de430(jde))
400 deOk=GetDe430Coor(jde, EPHEM_JPL_MOON_ID, xyz6, EPHEM_JPL_EARTH_ID);
401 else if(EphemWrapper::use_de431(jde))
402 deOk=GetDe431Coor(jde, EPHEM_JPL_MOON_ID, xyz6, EPHEM_JPL_EARTH_ID);
403
404 if (deOk)
405 {
406 xyz[0] =xyz6[0]; xyz[1] =xyz6[1]; xyz[2] =xyz6[2];
407 xyzdot[0]=xyz6[3]; xyzdot[1]=xyz6[4]; xyzdot[2]=xyz6[5];
408 }
409 else
410 { // fallback to DE-less solution.
411 // Compute speed from positional difference within 10 seconds.
412 GetElp82bCoor(jde+10.*StelCore::JD_SECOND, xyzdot);
413 GetElp82bCoor(jde,xyz);
414 xyzdot[0]-=xyz[0]; xyzdot[1]-=xyz[1]; xyzdot[2]-=xyz[2];
415 const double factor=8640.; // 86400/10 seconds
416 xyzdot[0]*=factor; xyzdot[1]*=factor; xyzdot[2]*=factor;
417 }
418 // Apply a tiny sub-arcsecond correction to compensate for the difference between figure centre (visible) and centre of gravity (ephemeris position).
419 // This is important for eclipse and occultation observations.
420 // See note in "Astronomical Phenomena for the year 2017", Naut.Alm.Office, USNO and HM Naut. Alm. Office, UK Hydrographic Office, 2014, p.69
421 // TBD: Find a better reference for this!
422 Vec3d XYZ(xyz);
423 double lng, lat, r;
424 StelUtils::rectToSphe(&lng, &lat, &r, XYZ);
425 lng+= 0.50/3600. * M_PI_180;
426 lat+=-0.25/3600. * M_PI_180;
427 StelUtils::spheToRect(lng, lat, r, XYZ);
428 xyz[0]=XYZ.v[0]; xyz[1]=XYZ.v[1]; xyz[2]=XYZ.v[2];
429
430 }
431
get_phobos_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)432 void get_phobos_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
433 {
434 Q_UNUSED(unused);
435 GetMarsSatCoor(jd, MARS_SAT_PHOBOS, xyz, xyzdot);
436 }
437
get_deimos_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)438 void get_deimos_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
439 {
440 Q_UNUSED(unused);
441 GetMarsSatCoor(jd, MARS_SAT_DEIMOS, xyz, xyzdot);
442 }
443
get_io_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)444 void get_io_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
445 {
446 Q_UNUSED(unused);
447 GetL12Coor(jd, L12_IO, xyz, xyzdot);
448 }
449
get_europa_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)450 void get_europa_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
451 {
452 Q_UNUSED(unused);
453 GetL12Coor(jd, L12_EUROPA, xyz, xyzdot);
454 }
455
get_ganymede_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)456 void get_ganymede_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
457 {
458 Q_UNUSED(unused);
459 GetL12Coor(jd, L12_GANYMEDE, xyz, xyzdot);
460 }
461
get_callisto_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)462 void get_callisto_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
463 {
464 Q_UNUSED(unused);
465 GetL12Coor(jd, L12_CALLISTO, xyz, xyzdot);
466 }
467
get_mimas_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)468 void get_mimas_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
469 {
470 Q_UNUSED(unused);
471 GetTass17Coor(jd, TASS17_MIMAS, xyz, xyzdot);
472 }
473
get_enceladus_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)474 void get_enceladus_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
475 {
476 Q_UNUSED(unused);
477 GetTass17Coor(jd, TASS17_ENCELADUS, xyz, xyzdot);
478 }
479
get_tethys_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)480 void get_tethys_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
481 {
482 Q_UNUSED(unused);
483 GetTass17Coor(jd, TASS17_TETHYS, xyz, xyzdot);
484 }
485
get_dione_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)486 void get_dione_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
487 {
488 Q_UNUSED(unused);
489 GetTass17Coor(jd, TASS17_DIONE, xyz, xyzdot);
490 }
491
get_rhea_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)492 void get_rhea_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
493 {
494 Q_UNUSED(unused);
495 GetTass17Coor(jd, TASS17_RHEA, xyz, xyzdot);
496 }
497
get_titan_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)498 void get_titan_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
499 {
500 Q_UNUSED(unused);
501 GetTass17Coor(jd, TASS17_TITAN, xyz, xyzdot);
502 }
503
get_hyperion_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)504 void get_hyperion_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
505 {
506 Q_UNUSED(unused);
507 GetTass17Coor(jd, TASS17_HYPERION, xyz, xyzdot);
508 }
509
get_iapetus_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)510 void get_iapetus_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
511 {
512 Q_UNUSED(unused);
513 GetTass17Coor(jd, TASS17_IAPETUS, xyz, xyzdot);
514 }
515
get_miranda_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)516 void get_miranda_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
517 {
518 Q_UNUSED(unused);
519 GetGust86Coor(jd, GUST86_MIRANDA, xyz, xyzdot);
520 }
521
get_ariel_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)522 void get_ariel_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
523 {
524 Q_UNUSED(unused);
525 GetGust86Coor(jd, GUST86_ARIEL, xyz, xyzdot);
526 }
527
get_umbriel_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)528 void get_umbriel_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
529 {
530 Q_UNUSED(unused);
531 GetGust86Coor(jd, GUST86_UMBRIEL, xyz, xyzdot);
532 }
533
get_titania_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)534 void get_titania_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
535 {
536 Q_UNUSED(unused);
537 GetGust86Coor(jd, GUST86_TITANIA, xyz, xyzdot);
538 }
539
get_oberon_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)540 void get_oberon_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
541 {
542 Q_UNUSED(unused);
543 GetGust86Coor(jd, GUST86_OBERON, xyz, xyzdot);
544 }
545
get_helene_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)546 void get_helene_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
547 {
548 Q_UNUSED(unused)
549 int r = htc20(jd, HTC2_HELENE, xyz, xyzdot);
550 Q_UNUSED(r)
551 }
552
get_telesto_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)553 void get_telesto_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
554 {
555 Q_UNUSED(unused)
556 int r = htc20(jd, HTC2_TELESTO, xyz, xyzdot);
557 Q_UNUSED(r)
558 }
559
get_calypso_parent_coordsv(double jd,double xyz[3],double xyzdot[3],void * unused)560 void get_calypso_parent_coordsv(double jd, double xyz[3], double xyzdot[3], void* unused)
561 {
562 Q_UNUSED(unused)
563 int r = htc20(jd, HTC2_CALYPSO, xyz, xyzdot);
564 Q_UNUSED(r)
565 }
566