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