An existing product called PG Orbit (a mobile PostgreSQL client) creates a naming conflict. pg_orrery — a database orrery built from Keplerian parameters and SQL instead of brass gears. Build system: control file, Makefile, Dockerfile, docker init script. C source: GUC prefix, PG_FUNCTION_INFO_V1 symbol, header guards, ereport prefixes, comments across ~30 files including vendored SGP4. SQL: all 5 install/migration scripts, function name pg_orrery_ephemeris_info. Tests: 9 SQL suites, 8 expected outputs, standalone DE reader test. Documentation: CLAUDE.md, README.md, DESIGN.md, Starlight site infra, 36 MDX pages, OG renderer, logo SVG, docker-compose, agent threads. All 13 regression suites pass. Docs site builds (37 pages).
84 lines
3.2 KiB
C
84 lines
3.2 KiB
C
/************************************************************************
|
|
|
|
Derived from Stellarium's VSOP87 implementation.
|
|
Modified for pg_orrery: removed static caching for thread safety
|
|
(PostgreSQL PARALLEL SAFE).
|
|
|
|
The PLANETARY SOLUTION VSOP87 by Bretagnon P. and Francou G. can be found at
|
|
ftp://ftp.imcce.fr/pub/ephem/planets/vsop87
|
|
|
|
I (Johannes Gajdosik) have just taken the data obtained from above
|
|
(VSOP87.mer,...,VSOP87.nep) and rearranged it into this piece of software.
|
|
|
|
I can neither allow nor forbid the usage of VSOP87.
|
|
The copyright notice below covers not the work of Bretagnon P. and Francou G.
|
|
but just my work, that is the compilation of the VSOP87 data
|
|
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.
|
|
|
|
This is my implementation of the VSOP87 planetary solution.
|
|
I tried to optimize for speed by rearranging the terms so that
|
|
for a given touple of (a[0],a[1],...,a[11]) the values
|
|
(cos,sin)(a[0]*lambda[0](T)+...a[11]*lambda[11](T))
|
|
have only to be calculated once.
|
|
Furthermore I used the addition formulas
|
|
(cos,sin)(x+y) = ...
|
|
so that for given T the functions cos and sin have only to be called 12 times.
|
|
|
|
Thread-safe: all functions are reentrant with no static mutable state.
|
|
|
|
****************************************************************/
|
|
|
|
|
|
#ifndef VSOP87_H
|
|
#define VSOP87_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
void GetVsop87Coor(double jde,int body,double *xyz);
|
|
/* Return the rectangular coordinates of the given planet
|
|
and the given julian date jd expressed in dynamical time (TAI+32.184s).
|
|
The origin of the xyz-coordinates is the center of the sun.
|
|
The reference frame is "dynamical equinox and ecliptic J2000",
|
|
which is the reference frame in VSOP87 and VSOP87A.
|
|
|
|
body: 0=Mercury, 1=Venus, 2=Earth, 3=Mars,
|
|
4=Jupiter, 5=Saturn, 6=Uranus, 7=Neptune
|
|
|
|
xyz must point to an array of at least 6 doubles:
|
|
xyz[0..2] = position (AU)
|
|
xyz[3..5] = velocity (AU/day)
|
|
*/
|
|
|
|
void GetVsop87OsculatingCoor(const double jde0,const double jde, const int body,double *xyz);
|
|
/* The osculating orbit of epoch jde0, evaluated at jde, is returned.
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|