/*  
 *  - - - - - - - - - - - 
 *   g a l _ v s o p 8 7  
 *  - - - - - - - - - - - 
 *  
 *  This routine is part of the General Astrodynamics Library  
 *  
 *  Description: 
 *  
 *  Body position and velocity, with respect to the 
 *  FK5 Reference Frame.  
 *  
 *  Status:
 *  
 *     internal support routine.  
 *  
 *  Given:
 *  
 *     *terms       gal_vsop_table_t    Series terms table for body
 *     tt1                 d            TT epoch part 1 (Note 1)  
 *     tt2                 d            TT epoch part 2 (Note 1) 
 *     ref                 i            Reference frame
 *                                        0 = dynamical equinox and ecliptic J2000.
 *                                        1 = FK5 (VSOP87)
 *  
 *  Returned:
 *  
 *     pv               d[2][3]         position/velocity (AU, AU/day)  
 *      
 *  Notes:  
 *  
 *  1) The epoch tt1+tt2 is a Julian Date, apportioned in  
 *     any convenient way between the two arguments.  For example,  
 *     JD(TDB)=2450123.7 could be expressed in any of these ways,  
 *     among others:  
 *  
 *               tt1          tt2
 *  
 *         2450123.7          0.0       (JD method)  
 *         2451545.0      -1421.3       (J2000 method)  
 *         2400000.5      50123.2       (MJD method)  
 *         2450123.5          0.2       (date & time method)  
 *  
 *     The JD method is the most natural and convenient to use in  
 *     cases where the loss of several decimal digits of resolution  
 *     is acceptable.  The J2000 method is best matched to the way  
 *     the argument is handled internally and will deliver the  
 *     optimum resolution.  The MJD method and the date & time methods  
 *     are both good compromises between resolution and convenience.  
 *     However, the accuracy of the result is more likely to be  
 *     limited by the algorithm itself than the way the epoch has been  
 *     expressed.  
 *  
 *  2) On return, the arrays pvh and pvb contain the following:  
 *  
 *        pv[0][0]  x       }  
 *        pv[0][1]  y       } position, AU  
 *        pv[0][2]  z       }  
 *  
 *        pv[1][0]  xdot    }  
 *        pv[1][1]  ydot    } velocity, AU/day  
 *        pv[1][2]  zdot    }  
 *  
 *     The vectors are with respect to the FK5 Reference Frame.  
 *     The time unit is one day in TT  
 *  
 *  3) The routine is a soution from the planetary theory VSOP87 
 *  
 *  4) The main version of VSOP87 is similar to the previous theory VSOP82.
 *     In the both cases the constants of integration have been determined by
 *     fitting to the numerical integration DE200 of the Jet Propulsion Laboratory.
 *
 *     The differences between VSOP87 and VSOP82 mainly improve the validity time-span
 *     for Mercury, Venus, Earth-Moon barycenter and Mars with a precision of 1" for
 *     4000 years before and after J2000.
 *     The same precision is ensured for Jupiter and Saturn over 2000 years and for
 *     Uranus and Neptune over 6000 years before and after J2000.
 *     
 *     The size of the relative precision p0 of VSOP87 solutions is given hereunder.
 *     That means that the actual precision is close by p0*a0 au for the distances
 *     (a0 being the semi-major axis) and close by p0 radian for the other variables.
 *     By derivation with respect to time expressed in day (d), the precision of the
 *     velocities is close by p0*a0 au/d for the distances and close by p0 radian/d
 *     for the other variables.
 *     
 *     Body          a0 (au)      p0 (10**-8)
 *     ----          -------      -----------
 *     Mercury        0.3871          0.6
 *     Venus          0.7233          2.5
 *     Earth          1.0000          2.5
 *     Mars           1.5237         10.0
 *     Jupiter        5.2026         35.0
 *     Saturn         9.5547         70.0
 *     Uranus        19.2181          8.0
 *     Neptune       30.1096         42.0
 *  
 *  5) This is code is based upon the VSOP87 files of Pierre Bretagnon & Gerard Francou.
 *     The raw data files, fortran source code, documentation & test cases can be 
 *     downloaded from here:
 *
 *     ftp://ftp.imcce.fr/pub/ephem/planets/vsop87
 *
 *     The VSOP87 implementation here contained is self contained and does not require 
 *     any external files at run-time.
 *
 *     VSOP87 is an analytical solution of the motion of the planets Mercury, Venus, 
 *     Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Sun and the Earth-Moon Barycenter.
 * 
 *     There are six different versions of the theory VSOP87 which vary by type of 
 *     coordinates and reference frame. The main version VSOP87 consists of a series of 
 *     elliptic elements, versions A, C, E are rectangular variables, and versions B & D 
 *     are spherical variables. GAL uses the A series for the helocentric, and E for the 
 *     baryocentric coordinates.
 *
 *     The reference frame is defined as the dynamical equinox and ecliptic J2000 for the 
 *     main version and versions A, B, & E, and as the dynamical equinox and ecliptic of 
 *     date for versions C & D.
 *
 *     The terms are a trigonometric series which represent the coordinates of the body: 
 *     elliptic, rectangular or spherical coordinates depending upon the theory version.
 *
 *     The coordinates are functions of time Poisson series (the original VSOP87 files 
 *     also included periodic series, these are not implemented in this library). 
 *     The coordinates are given in this form:
 *
 *     T**alpha * A * Cos(B + CT)
 *
 *     where T = time expressed in thousands of Julian years elapsed from J2000 
 *     (JD2451545.0) (tjy)
 *
 *			 alpha = degree of time between 0 and 5
 *
 *			 A in au / (tjy**alpha)
 *			 B in radians
 *			 C in rad/tjy
 *
 *     The time used in VSOP87 theory is Terrestial Time (TT) defined as International 
 *     Atomic Time (TAI) plus 32.184s
 *
 *     VSOP87 constants were determined by fitting to the numerical integration DE200 
 *     of the Jet Propulsion Laboratory (JPL).
 *
 *     Mercury, Venus, EMB & Mars precision 1" for 4000 years before and after J2000. 
 *     The same precision for Jupiter and Saturn over 2000 years and for Uranus and 
 *     Neptune over 6000 years before and after J2000.
 *
 *  6) REFERENCE SYSTEM
 *
 *     The coordinates of the main version VSOP87 and of the version A, B, and E are
 *     are given in the inertial frame defined by the dynamical equinox and ecliptic
 *     J2000 (JD2451545.0).
 *     
 *     The coordinates of the version C an D are given in the frame defined by the
 *     mean equinox and ecliptic of the date. This frame is deduced from the previous
 *     one by precessional moving between J2000 and the epoch of the date.
 *     
 *     The rectangular coordinates of VSOP87A and VSOP87E defined in dynamical ecliptic
 *     frame J2000 can be connected to the equatorial frame FK5 J2000 with the
 *     following rotation :
 *     
 *       X        +1.000000000000  +0.000000440360  -0.000000190919   X
 *       Y     =  -0.000000479966  +0.917482137087  -0.397776982902   Y
 *       Z FK5     0.000000000000  +0.397776982902  +0.917482137087   Z VSOP87A
 * 
 *
 *  Called:
 *
 *     gal_rxpv              Multiply a pv-vector by an r-matrix.
 *    
 *  References:
 *
 *     Bretagnon P., Francou G., : 1988, Astron. Astrophys., 202, 309.
 *
 *  This revision:
 *  
 *     2008 June 28  
 *  
 *  Copyright (C) 2008 Paul C. L. Willmott. See notes at end.  
 *  
 *-----------------------------------------------------------------------  
 */  
  
#ifndef _GAL_VSOP87_H_  
#define _GAL_VSOP87_H_ 1  

#undef __BEGIN_DECLS  
#undef __END_DECLS  
#ifdef __cplusplus  
#define __BEGIN_DECLS extern "C" {  
#define __END_DECLS }  
#else  
#define __BEGIN_DECLS /* empty */  
#define __END_DECLS   /* empty */  
#endif
  
__BEGIN_DECLS  

/*
 * Constants for the lookup tables
 */
  
 #define GAL_VSOP87_MAX_VAR		3
 #define GAL_VSOP87_MAX_ORDER	6

/*
 * Structure used to store the order terms.
 */
 
 typedef struct {
	double a ;
	double b ;
	double c ;
 } gal_vsop87_terms ;

/*
 * Structure used to store the lookup table definitions
 */
 
 typedef struct {
	int terms ;
	gal_vsop87_terms *table ;
 } gal_vsop87_table_t ;
  
void 
gal_vsop87  
 (  
    gal_vsop87_table_t terms[GAL_VSOP87_MAX_VAR][GAL_VSOP87_MAX_ORDER],    
    double tt1,  
    double tt2, 
    int ref, 
    double pv[2][3]
 ) ;  
  
__END_DECLS  
  
#endif /* !_GAL_VSOP87_H_ */  

/*  
 *  gal - General Astrodynamics Library  
 *  Copyright (C) 2008 Paul C. L. Willmott  
 *  
 *  This program is free software; you can redistribute it and/or modify  
 *  it under the terms of the GNU General Public License as published by  
 *  the Free Software Foundation; either version 2 of the License, or  
 *  (at your option) any later version.  
 *  
 *  This program is distributed in the hope that it will be useful,  
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of  
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  
 *  GNU General Public License for more details.  
 *  
 *  You should have received a copy of the GNU General Public License along  
 *  with this program; if not, write to the Free Software Foundation, Inc.,  
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.  
 *  
 *  Contact:  
 *  
 *  Paul Willmott  
 *  vp9mu@amsat.org  
 */  
