![]() |
SuperNOVAS v1.3
The NOVAS C library, made better
|
Macros | |
#define | NOVAS_ID_TYPES (NOVAS_ID_CALCEPH + 1) |
Typedefs | |
typedef int(* | novas_ephem_provider) (const char *name, long id, double jd_tdb_high, double jd_tdb_low, enum novas_origin *restrict origin, double *restrict pos, double *restrict vel) |
typedef short(* | novas_planet_provider) (double jd_tdb, enum novas_planet body, enum novas_origin origin, double *restrict position, double *restrict velocity) |
typedef short(* | novas_planet_provider_hp) (const double jd_tdb[2], enum novas_planet body, enum novas_origin origin, double *restrict position, double *restrict velocity) |
Enumerations | |
enum | novas_id_type { NOVAS_ID_NAIF = 0 , NOVAS_ID_CALCEPH } |
Functions | |
short | earth_sun_calc (double jd_tdb, enum novas_planet body, enum novas_origin origin, double *restrict position, double *restrict velocity) |
short | earth_sun_calc_hp (const double jd_tdb[restrict 2], enum novas_planet body, enum novas_origin origin, double *restrict position, double *restrict velocity) |
void | enable_earth_sun_hp (int value) |
novas_ephem_provider | get_ephem_provider () |
novas_planet_provider | get_planet_provider () |
novas_planet_provider_hp | get_planet_provider_hp () |
int | make_orbital_object (const char *name, long num, const novas_orbital *orbit, object *body) |
enum novas_planet | naif_to_novas_planet (long id) |
int | novas_approx_heliocentric (enum novas_planet id, double jd_tdb, double *restrict pos, double *restrict vel) |
int | novas_approx_sky_pos (enum novas_planet id, const novas_frame *restrict frame, enum novas_reference_system sys, sky_pos *restrict out) |
double | novas_helio_dist (double jd_tdb, const object *restrict source, double *restrict rate) |
int | novas_make_moon_orbit (double jd_tdb, novas_orbital *restrict orbit) |
int | novas_make_planet_orbit (enum novas_planet id, double jd_tdb, novas_orbital *restrict orbit) |
double | novas_moon_angle (const object *restrict source, const novas_frame *restrict frame) |
double | novas_moon_phase (double jd_tdb) |
double | novas_next_moon_phase (double phase, double jd_tdb) |
int | novas_orbit_native_posvel (double jd_tdb, const novas_orbital *restrict orbit, double *restrict pos, double *restrict vel) |
int | novas_orbit_posvel (double jd_tdb, const novas_orbital *restrict orbit, enum novas_accuracy accuracy, double *restrict pos, double *restrict vel) |
enum novas_planet | novas_planet_for_name (const char *restrict name) |
int | novas_set_orbsys_pole (enum novas_reference_system type, double ra, double dec, novas_orbital_system *restrict sys) |
double | novas_solar_illum (const object *restrict source, const novas_frame *restrict frame) |
double | novas_solar_power (double jd_tdb, const object *restrict source) |
double | novas_sun_angle (const object *restrict source, const novas_frame *restrict frame) |
long | novas_to_dexxx_planet (enum novas_planet id) |
long | novas_to_naif_planet (enum novas_planet id) |
short | planet_eph_manager (double jd_tdb, enum novas_planet body, enum novas_origin origin, double *restrict position, double *restrict velocity) |
short | planet_eph_manager_hp (const double jd_tdb[restrict 2], enum novas_planet body, enum novas_origin origin, double *restrict position, double *restrict velocity) |
short | planet_ephem_provider (double jd_tdb, enum novas_planet body, enum novas_origin origin, double *restrict position, double *restrict velocity) |
short | planet_ephem_provider_hp (const double jd_tdb[restrict 2], enum novas_planet body, enum novas_origin origin, double *restrict position, double *restrict velocity) |
short | planet_jplint (double jd_tdb, enum novas_planet body, enum novas_origin origin, double *restrict position, double *restrict velocity) |
short | planet_jplint_hp (const double jd_tdb[restrict 2], enum novas_planet body, enum novas_origin origin, double *restrict position, double *restrict velocity) |
double * | readeph (int mp, const char *restrict name, double jd_tdb, int *restrict error) |
int | set_ephem_provider (novas_ephem_provider func) |
int | set_planet_provider (novas_planet_provider func) |
int | set_planet_provider_hp (novas_planet_provider_hp func) |
short | solarsystem (double jd_tdb, short body, short origin, double *restrict position, double *restrict velocity) |
short | solarsystem_hp (const double jd_tdb[restrict 2], short body, short origin, double *restrict position, double *restrict velocity) |
SuperNOVAS header for custom solar-system ephemeris calculations for major planets plus the Sun, Moon, and the Solar-system barycenter (and as of v1.2 also the Earth-Moon Barycenter and the barycenter of the Pluto system).
The source files solsys-calceph.c and solsys-cspice.c provide implementations that interface with the CALCEPH C library and the NAIF CSPICE Toolkit, respectively. CSPICE is the canocical library for handling JPL (SPK) ephemeris data, while CALCEPH is a more modern tool, which allows handling most types of JPL ephemerides, as well INPOP 2.0/3.0 format data files.
The source files solsys1.c, solsys2.c, solsys3.c and solsys-ephem.c provide various legacy implementations that users may use (some require additional sources, or user-specific implementations).
If the standard implementations are compiled with the DEFAULT_SOLSYS option set (see config.mk
), then the library is compiled with that version providing a built-in default implementation (the default is to use solsys3.c
, which is a self-contained orbital calculation for the Sun and Earth only).
Additionally, users may set their custom choice of major planet ephemeris handler at runtime via the set_planet_provider() and/or set_planet_provider_hp() functions. They may also define custom handlers for all other types of Solar-system objects (i.e. NOVAS_EPHEM_OBJECT
types) via set_ephem_provider().
Based on the NOVAS C Edition, Version 3.1:
U. S. Naval Observatory
Astronomical Applications Dept.
Washington, DC
http://www.usno.navy.mil/USNO/astronomical-applications
#define NOVAS_ID_TYPES (NOVAS_ID_CALCEPH + 1) |
typedef int(* novas_ephem_provider) (const char *name, long id, double jd_tdb_high, double jd_tdb_low, enum novas_origin *restrict origin, double *restrict pos, double *restrict vel) |
Function to obtain ephemeris data for minor planets, which are not handled by the solarsystem() type calls. The library does not provide a default implementation, but users can provide their own, either as a default statically compiled readeph() implementation, or else a dynamically defined one via ephemeris_set_reader().
Note, that implementations would typically use either the name or the ID argument to identify the object for which ephemeris data is requested. As such you only need to specify the one that is going to be used.
name | The name of the solar-system body (in case the ephemeris provider supports lookup by name), or NULL to force ID based lookup. | |
id | The ID number of the solar-system body for which the position in desired. (Typically a NAIF ID, or else an appropriate ID for the implementation – corresponding minor planet objects should be created with the same type of ID.). A value of -1 can be used to force name based lookups (provided the implementation supports it). | |
jd_tdb_high | [day] The high-order part of Barycentric Dynamical Time (TDB) based Julian date for which to find the position and velocity. Typically this may be the integer part of the Julian date for high-precision calculations, or else the entire Julian date for reduced precision. | |
jd_tdb_low | [day] The low-order part of Barycentric Dynamical Time (TDB) based Julian date for which to find the position and velocity. Typically this may be the fractional part of the Julian date for high-precision calculations, or else 0.0 if the date is defined entirely by the high-order component for reduced precision. | |
[out] | origin | Set to NOVAS_BARYCENTER or NOVAS_HELIOCENTER to indicate relative to which the ephemeris positions/velocities are reported. |
[out] | pos | [AU] position 3-vector to populate with rectangular equatorial coordinates in AU. It may be NULL if position is not required. |
[out] | vel | [AU/day] velocity 3-vector to populate in rectangular equatorial coordinates in AU/day. It may be NULL if velocities are not required. |
typedef short(* novas_planet_provider) (double jd_tdb, enum novas_planet body, enum novas_origin origin, double *restrict position, double *restrict velocity) |
Provides the position and velocity of major planets (as well as the Sun, Moon, Solar-system Barycenter, and other barycenters). This version provides positions and velocities at regular precision (see NOVAS_REDUCED_PRECISION).
Since this is a function that may be provided by existing custom user implementations, we keep the original argument types for compatibility, hence 'short' instead of the more informative enums).
jd_tdb | [day] Barycentric Dynamical Time (TDB) based Julian date | |
body | Major planet number (or that for the Sun, Moon, or an appropriate barycenter), as defined by enum novas_planet, e.g. NOVAS_MARS (4), NOVAS_SUN (10) or NOVAS_SSB (0). | |
origin | NOVAS_BARYCENTER (0) or NOVAS_HELIOCENTER (1) relative to which to return positions and velocities. (For compatibility with existing NOVAS C compatible user implementations, we keep the original NOVAS C argument type here). | |
[out] | position | [AU] Position vector of 'body' at 'tjd'; equatorial rectangular coordinates in AU referred to the mean equator and equinox of J2000.0. |
[out] | velocity | [AU/day] Velocity vector of 'body' at 'tjd'; equatorial rectangular system referred to the mean equator and equinox of J2000.0, in AU/Day. |
typedef short(* novas_planet_provider_hp) (const double jd_tdb[2], enum novas_planet body, enum novas_origin origin, double *restrict position, double *restrict velocity) |
Provides the position and velocity of major planets (as well as the Sun, Moon, Solar-system Barycenter, and other barycenters). This version provides positions and velocities at high precision (see NOVAS_FULL_PRECISION).
Since this is a function that may be provided by existing custom user implementations, we keep the original argument types for compatibility, hence 'short' instead of the more informative enums).
jd_tdb | [day] Barycentric Dynamical Time (TDB) based Julian date, broken into high and low order components, respectively. Typically, as the integer and fractional parts for the highest precision. | |
body | Major planet number (or that for the Sun, Moon, or an appropriate barycenter), as defined by enum novas_planet, e.g. NOVAS_MARS (4), NOVAS_SUN (10) or NOVAS_SSB (0). | |
origin | NOVAS_BARYCENTER (0) or NOVAS_HELIOCENTER (1) relative to which to return positions and velocities. (For compatibility with existing NOVAS C compatible user implementations, we keep the original NOVAS C argument type here). | |
[out] | position | [AU] Position vector of 'body' at 'tjd'; equatorial rectangular coordinates in AU referred to the mean equator and equinox of J2000.0. |
[out] | velocity | [AU/day] Velocity vector of 'body' at 'tjd'; equatorial rectangular system referred to the mean equator and equinox of J2000.0, in AU/Day. |
enum novas_id_type |
Solar-system body IDs to use as object.number with NOVAS_EPHEM_OBJECT types. JPL ephemerides use NAIF IDs to identify objects in the Solar-system, which is thus the most widely adopted convention for numbering Solar-system bodies. But other numbering systems also exists, for example the CALCEPH library uses its own convention for the numbering of asteroids.
Enumerator | |
---|---|
NOVAS_ID_NAIF | If the ephemeris provider should use NAIF IDs. |
NOVAS_ID_CALCEPH | If the ephemeris provider should use CALCEPH IDs. |
short earth_sun_calc | ( | double | jd_tdb, |
enum novas_planet | body, | ||
enum novas_origin | origin, | ||
double *restrict | position, | ||
double *restrict | velocity | ||
) |
Provides the position and velocity of the Earth and Sun only at epoch 'jd_tdb' by evaluating a closed-form theory without reference to an external file. This function can also provide the position and velocity of the Sun.
REFERENCES:
jd_tdb | [day] Barycentric Dynamical Time (TDB) based Julian date | |
body | NOVAS_EARTH (3) or NOVAS_SUN (10) only. | |
origin | NOVAS_BARYCENTER (0) or NOVAS_HELIOCENTER (1) relative to which to return positions and velocities. (For compatibility with existing NOVAS C compatible user implementations, we keep the original NOVAS C argument type here). | |
[out] | position | [AU] Position vector of 'body' at 'tjd'; equatorial rectangular coordinates in AU referred to the mean equator and equinox of J2000.0. |
[out] | velocity | [AU/day] Velocity vector of 'body' at 'tjd'; equatorial rectangular system referred to the mean equator and equinox of J2000.0, in AU/Day. |
References NOVAS_BARYCENTER, NOVAS_EARTH, NOVAS_PLANETS, NOVAS_SSB, NOVAS_SUN, precession(), radec2vector(), sun_eph(), and TWOPI.
short earth_sun_calc_hp | ( | const double | jd_tdb[restrict 2], |
enum novas_planet | body, | ||
enum novas_origin | origin, | ||
double *restrict | position, | ||
double *restrict | velocity | ||
) |
It may provide the position and velocity of the Earth and Sun, the same as solarsystem_earth_sun(), if enable_earth_sun_hp() is set to true (non-zero). Otherwise, it will return with an error code of 3, indicating that high-precision calculations are not provided by this implementation.
NOTES:
jd_tdb | [day] Barycentric Dynamical Time (TDB) based Julian date | |
body | NOVAS_EARTH (3) or NOVAS_SUN (10) only. | |
origin | NOVAS_BARYCENTER (0) or NOVAS_HELIOCENTER (1) relative to which to return positions and velocities. (For compatibility with existing NOVAS C compatible user implementations, we keep the original NOVAS C argument type here). | |
[out] | position | [AU] Position vector of 'body' at 'tjd'; equatorial rectangular coordinates in AU referred to the mean equator and equinox of J2000.0. |
[out] | velocity | [AU/day] Velocity vector of 'body' at 'tjd'; equatorial rectangular system referred to the mean equator and equinox of J2000.0, in AU/Day. |
References earth_sun_calc().
void enable_earth_sun_hp | ( | int | value | ) |
Specify whether the high-precision call is allowed to return a low-precision result. If set to 0 (false) solarsystem_earth_sun_hp() will return with an error code 3 indicating that a high-precision calculation is not possible. Otherise, a non-zero value (true) will let the function to be used without errors, returning the low-precison result of solarsystem_earth_sun() instead.
value | (boolean) A non-zero value enables the error-free use of the earth_sun_calc_hp() by allowing to return the low-precision result. Otherwise, earth_sun_calc_hp() will return an error code 3 indicating that the high-precision result is not available (this latter is the default behavior). |
novas_ephem_provider get_ephem_provider | ( | ) |
Returns the user-defined ephemeris accessor function.
novas_planet_provider get_planet_provider | ( | ) |
Returns the custom (low-precision) ephemeris provider function for major planets (and Sun, Moon, SSB...), if any.
novas_planet_provider_hp get_planet_provider_hp | ( | ) |
Returns the custom high-precision ephemeris provider function for major planets (and Sun, Moon, SSB...), if any.
int make_orbital_object | ( | const char * | name, |
long | num, | ||
const novas_orbital * | orbit, | ||
object * | body | ||
) |
Sets a celestial object to be a Solar-system orbital body. Typically this would be used to define minor planets, asteroids, comets, or even planetary satellites.
name | Name of object. It may be NULL if not relevant. | |
num | Solar-system body ID number (e.g. NAIF). It is not required and can be set e.g. to -1 if not relevant to the caller. | |
orbit | The orbital parameters to adopt. The data will be copied, not referenced. | |
[out] | body | Pointer to structure to populate. |
References make_object(), NOVAS_ORBITAL_OBJECT, and object::orbit.
enum novas_planet naif_to_novas_planet | ( | long | id | ) |
Converts a NAIF ID to a NOVAS major planet ID. It account for the different IDs used for Sun, Moon, SSB, EMB and the Pluto system. Otherwise NAIF planet barycenters are mapped to the corresponding bodies. NAIF body centers n99 (e.g. 399 for Earth) are mapped to the corresponding NOVAS planet number n. All other NAIF IDs will return -1, indicating no match to a NOVAS planet ID.
id | The NAIF ID of the major planet of interest |
References NOVAS_EMB, NOVAS_MERCURY, NOVAS_MOON, NOVAS_PLUTO, NOVAS_PLUTO_BARYCENTER, NOVAS_SSB, and NOVAS_SUN.
int novas_approx_heliocentric | ( | enum novas_planet | id, |
double | jd_tdb, | ||
double *restrict | pos, | ||
double *restrict | vel | ||
) |
Returns the approximate geometric heliocentric orbital positions and velocities for the major planets, Sun, or Earth-Moon Barycenter (EMB). The returned positions and velocities are not suitable for precise calculations. However, they may be used to provide rough guidance about the approximate locations of the planets, e.g. for determining approximate rise or set times or the approximate azimuth / elevation angles from an observing site.
The orbitals can provide planet positions to arcmin-level precision for the rocky inner planets, and to a fraction of a degree precision for the gas and ice giants and Pluto. The accuracies for Uranus, Neptune, and Pluto are significantly improved (to the arcmin level) if used in the time range of 1800 AD to 2050 AD. For a more detailed summary of the typical accuracies, see either of the top two references below.
For accurate positions, you should use planetary ephemerides (such as the JPL ephemerides via the CALCEPH or CSPICE plugins) and novas_geom_posvel()
instead.
While this function is generally similar to creating an orbital object with an orbit initialized with novas_make_planet_orbit()
or novas_make_moon_orbit()
, and then calling novas_geom_posvel()
, there are a few important differences:
novas_geom_posvel()
references the calculated positions to the Solar-system Barycenter (SSB). novas_make_planet_orbit()
does not provide orbitals for the Earth directly, and make_moot_orbit()
references the Moon's orbital to the Earth position returned by the currently configured planet calculator function (see set_planet_provider()
). NOTES:
earth_sun_calc()
. All other orbitals are also referenced to the Sun's position calculated that way. REFERENCES:
id | NOVAS major planet ID. All major planets, plus the Sun, Moon, Earth-Moon Barycenter (EMB), and Pluto system Barycenter are supported. (For Pluto, the Pluto System Barycenter value are returned.) | |
jd_tdb | [day] Barycentric Dynamical Time (TDB) based Julian Date. Dates between 3000 BC and 3000 AD are supported. For dates between 1800 AD and 2050 AD the returned positions are somewhat more accurate. | |
[out] | pos | [AU] Output Heliocentric ICRS position vector, or NULL if not required. |
[out] | vel | [AU/day] Output Heliocentric ICRS velocity vector, or NULL if not required. |
References NOVAS_EARTH, NOVAS_EMB, novas_make_moon_orbit(), novas_make_planet_orbit(), NOVAS_MOON, NOVAS_ORBIT_INIT, novas_orbit_posvel(), NOVAS_REDUCED_ACCURACY, and NOVAS_SUN.
int novas_approx_sky_pos | ( | enum novas_planet | id, |
const novas_frame *restrict | frame, | ||
enum novas_reference_system | sys, | ||
sky_pos *restrict | out | ||
) |
Calculates an approximate apparent location on sky for a major planet, Sun, Moon, Earth-Moon Barycenter (EMB) – typically to arcmin level accuracy – using Keplerian orbital elements. The returned position is antedated for light-travel time (for Solar-System bodies). It also applies an appropriate aberration correction (but not gravitational deflection).
The orbitals can provide planet positions to arcmin-level precision for the rocky inner planets, and to a fraction of a degree precision for the gas and ice giants and Pluto. The accuracies for Uranus, Neptune, and Pluto are significantly improved (to the arcmin level) if used in the time range of 1800 AD to 2050 AD. For a more detailed summary of the typical accuracies, see either of the top two references below.
For accurate positions, you should use planetary ephemerides (such as the JPL ephemerides via the CALCEPH or CSPICE plugins) and novas_sky_pos()
instead.
While this function is generally similar to creating an orbital object with an orbit initialized with novas_make_planet_orbit()
or novas_make_moon_orbit()
, and then calling novas_sky_pos()
, there are a few important differences to note:
novas_make_planet_orbit()
does not provide orbitals for the Earth directly, and make_moot_orbit()
references the Moon's orbital to the Earth position returned by the currently configured planet calculator function (see set_planet_provider()
). REFERENCES:
id | NOVAS major planet ID. All major planets, plus the Sun, Moon, Earth-Moon Barycenter (EMB), and Pluto system Barycenter are supported. (For Pluto, the Pluto System Barycenter values are returned.) | |
frame | The observer frame, defining the location and time of observation. | |
sys | The coordinate system in which to return the apparent sky location. | |
[out] | out | Pointer to the data structure which is populated with the calculated approximate apparent location in the designated coordinate system. |
References make_planet(), novas_approx_heliocentric(), novas_geom_to_app(), novas_get_time(), NOVAS_TDB, novas_vlen(), and rad_vel2().
double novas_helio_dist | ( | double | jd_tdb, |
const object *restrict | source, | ||
double *restrict | rate | ||
) |
Returns a Solar-system body's distance from the Sun, and optionally also the rate of recession. It may be useful, e.g. to calculate the body's heating from the Sun.
jd_tdb | [day] Barycentric Dynamical Time (TDB) based Julian date. You may want to use a time that is antedated to when the observed light originated from the source. | |
source | Observed Solar-system source | |
[out] | rate | [AU/day] (optional) Returned rate of recession from Sun |
References ephemeris(), NOVAS_CATALOG_OBJECT, NOVAS_HELIOCENTER, NOVAS_REDUCED_ACCURACY, and novas_vlen().
int novas_make_moon_orbit | ( | double | jd_tdb, |
novas_orbital *restrict | orbit | ||
) |
Gets the current orbital elements for the Moon relative to the geocenter for the specified epoch of observation.
REFERENCES:
jd_tdb | [day] Barycentric Dynamical Time (TDB) based Julian Date. | |
[out] | orbit | Orbital elements data structure to populate. |
errno
set to EINVAL
).References NOVAS_AU, NOVAS_EARTH, NOVAS_JD_J2000, NOVAS_ORBIT_INIT, and TWOPI.
int novas_make_planet_orbit | ( | enum novas_planet | id, |
double | jd_tdb, | ||
novas_orbital *restrict | orbit | ||
) |
Get approximate current heliocentric orbital elements for the major planets. These orbital elements are not suitable for precise position velocity calculations, but they may be useful to obtain approximate positions for the major planets, e.g. to estimate rise or set times, or apparent elevation angles from an observing site.
These orbitals can provide planet positions to arcmin-level precision for the rocky inner planets, and to a fraction of a degree precision for the gas and ice giants and Pluto. The accuracies for Uranus, Neptune, and Pluto are significantly improved (to the arcmin level) if used in the time range of 1800 AD to 2050 AD. For a more detailed summary of the typical accuracies, see either of the references below.
NOTES:
REFERENCES:
id | NOVAS major planet ID. All major planets, except Earth, are supported. The Earth-Moon Barycenter (EMB), and Pluto system Barycenter are supported also. (For Pluto, the Pluto System Barycenter values are returned.) | |
jd_tdb | [day] Barycentric Dynamical Time (TDB) based Julian Date. | |
[out] | orbit | Orbital elements data structure to populate. |
errno
set to EINVAL
).Keplerian orbital elements at J2000 from Table 8.10.2 of E.M. Standish and J.G. Williams 1992, valid for 1800 AD to 2050 AD.
Temporal evolution of the Keplerian orbital elements from Table 8.10.2 of E.M. Standish and J.G. Williams 1992, valid for 1800 AD to 2050 AD.
Keplerian orbital elements at J2000 from Table 8.10.3 of E.M. Standish and J.G. Williams 1992, valid for 3000 BC to 3000 AD.
Temporal evolution of the Keplerian orbital elements from Table 8.10.3 of E.M. Standish and J.G. Williams 1992, vaid for 3000 BC to 3000 AD.
Additional terms for computing M for the outer planets (Jupiter and beyond) from Table 8.10.4 of E.M. Standish and J.G. Williams 1992.
References NOVAS_EARTH, NOVAS_EMB, NOVAS_JD_J2000, NOVAS_JUPITER, NOVAS_ORBIT_INIT, NOVAS_PLUTO, NOVAS_PLUTO_BARYCENTER, and TWOPI.
double novas_moon_angle | ( | const object *restrict | source, |
const novas_frame *restrict | frame | ||
) |
Returns the apparent angular distance of a source from the Moon from the observer's point of view.
source | An observed source |
frame | Observing frame, defining the observer location and astronomical time of observation. |
References NOVAS_MOON_INIT, and novas_object_sep().
double novas_moon_phase | ( | double | jd_tdb | ) |
Calculates the Moon's phase at a given time. It uses orbital models for Earth (E.M. Standish and J.G. Williams 1992), and for the Moon (Chapront, J. et al., 2002), and takes into account the slightly eccentric nature of both orbits.
NOTES:
REFERENCES:
jd_tdb | [day] Barycentric Dynamical Time (TDB) based Julian Date. |
References NOVAS_EMB, novas_make_moon_orbit(), novas_make_planet_orbit(), NOVAS_ORBIT_INIT, novas_orbit_native_posvel(), and vector2radec().
double novas_next_moon_phase | ( | double | phase, |
double | jd_tdb | ||
) |
Calculates the date / time at which the Moon will reach the specified phase next, after the specified time. It uses orbital models for Earth (E.M. Standish and J.G. Williams 1992), and for the Moon (Chapront, J. et al., 2002), and takes into account the slightly eccentric nature of both orbits.
NOTES:
REFERENCES:
phase | [deg] The Moon's phase, or more precisely the ecliptic longitude difference between the Sun and the Moon, as seen from the geocenter. 0: New Moon, 90: 1st quarter, +/- 180 Full Moon, -90: 3rd quarter. |
jd_tdb | [day] The lower bound date for the phase, as a Barycentric Dynamical Time (TDB) based Julian Date. |
References novas_inv_max_iter, NOVAS_JD_J2000, and novas_moon_phase().
int novas_orbit_native_posvel | ( | double | jd_tdb, |
const novas_orbital *restrict | orbit, | ||
double *restrict | pos, | ||
double *restrict | vel | ||
) |
Calculates a rectangular equatorial position and velocity vector for the given orbital elements for the specified time of observation, in the native coordinate system in which the orbital is defined (e.g. ecliptic for heliocentric orbitals).
REFERENCES:
jd_tdb | [day] Barycentric Dynamic Time (TDB) based Julian date | |
orbit | Orbital parameters | |
[out] | pos | [AU] Output ICRS equatorial position vector around orbital center, or NULL if not required. |
[out] | vel | [AU/day] Output ICRS velocity vector rel. to orbital center, in the native system of the orbital, or NULL if not required. 0 if successful, or else -1 if the orbital parameters are NULL, or if the position and velocity output vectors are the same or the orbital system is ill defined (errno set to EINVAL), or if the calculation did not converge (errno set to ECANCELED), or |
References TWOPI.
int novas_orbit_posvel | ( | double | jd_tdb, |
const novas_orbital *restrict | orbit, | ||
enum novas_accuracy | accuracy, | ||
double *restrict | pos, | ||
double *restrict | vel | ||
) |
Calculates a rectangular equatorial position and velocity vector for the given orbital elements for the specified time of observation.
REFERENCES:
jd_tdb | [day] Barycentric Dynamic Time (TDB) based Julian date | |
orbit | Orbital parameters | |
accuracy | NOVAS_FULL_ACCURACY (0) or NOVAS_REDUCED_ACCURACY (1). | |
[out] | pos | [AU] Output ICRS equatorial position vector around orbital center, or NULL if not required. |
[out] | vel | [AU/day] Output ICRS equatorial velocity vector rel. to orbital center, or NULL if not required. |
References novas_orbit_native_posvel().
enum novas_planet novas_planet_for_name | ( | const char *restrict | name | ) |
Returns the NOVAS planet ID for a given name (case insensitive), or -1 if no match is found.
name | The planet name, or that for the "Sun", "Moon" or "SSB" (case insensitive). The spelled out "Solar System Barycenter" is also recognized with either spaces, hyphens ('-') or underscores ('_') separating the case insensitive words. |
References NOVAS_PLANET_NAMES_INIT, NOVAS_PLANETS, and NOVAS_SSB.
int novas_set_orbsys_pole | ( | enum novas_reference_system | type, |
double | ra, | ||
double | dec, | ||
novas_orbital_system *restrict | sys | ||
) |
Sets the orientation of an orbital system using the RA and DEC coordinates of the pole of the Laplace (or else equatorial) plane relative to which the orbital elements are defined. Orbital parameters of planetary satellites normally include the R.A. and declination of the pole of the local Laplace plane in which the Keplerian orbital elements are referenced.
The system will become referenced to the equatorial plane, the relative obliquity is set to (90° - dec
), while the argument of the ascending node ('Omega') is set to (90° + ra
).
NOTES:
type | Coordinate reference system in which ra and dec are defined (e.g. NOVAS_GCRS). | |
ra | [h] the R.A. of the pole of the oribtal reference plane. | |
dec | [deg] the declination of the pole of the oribtal reference plane. | |
[out] | sys | Orbital system |
sys
pointer is NULL.References NOVAS_EQUATORIAL_PLANE, and NOVAS_TIRS.
double novas_solar_illum | ( | const object *restrict | source, |
const novas_frame *restrict | frame | ||
) |
Returns the Solar illumination fraction of a source, assuming a spherical geometry for the observed body.
source | Observed source. Usually a Solar-system source. (For other source types, 1.0 is returned by default.) |
frame | Observing frame, defining the observer location and astronomical time of observation. |
References NOVAS_CATALOG_OBJECT, novas_geom_posvel(), NOVAS_ICRS, and novas_vlen().
double novas_solar_power | ( | double | jd_tdb, |
const object *restrict | source | ||
) |
Returns the typical incident Solar power on a Solar-system body at the time of observation.
jd_tdb | [day] Barycentric Dynamical Time (TDB) based Julian date. You may want to use a time that is antedated to when the observed light originated ( was reflected) from the source. |
source | Observed Solar-system source |
References novas_helio_dist(), and NOVAS_SOLAR_CONSTANT.
double novas_sun_angle | ( | const object *restrict | source, |
const novas_frame *restrict | frame | ||
) |
Returns the apparent angular distance of a source from the Sun from the observer's point of view.
source | An observed source |
frame | Observing frame, defining the observer location and astronomical time of observation. |
References novas_object_sep(), and NOVAS_SUN_INIT.
long novas_to_dexxx_planet | ( | enum novas_planet | id | ) |
Converts a NOVAS Solar-system body ID to a NAIF Solar-system body ID for DExxx ephemeris files. The DExxx (e.g. DE440) ephemeris files use NAIF IDs, but for most planets contain barycentric data only rather than that of the planet center. For Earth-based observations, it only really makes a difference whether the 3 is used for the Earth-Moon Barycenter (EMB) or 399 for the geocenter.
id | The NOVAS ID of the major planet of interest |
References NOVAS_EARTH, NOVAS_EMB, NOVAS_MERCURY, NOVAS_MOON, NOVAS_PLUTO, NOVAS_PLUTO_BARYCENTER, NOVAS_SSB, and NOVAS_SUN.
long novas_to_naif_planet | ( | enum novas_planet | id | ) |
Converts a NOVAS Solar-system body ID to a NAIF Solar-system body ID. NOVAS and NAIF use slightly different IDs for major planets, the Moon, SSB, EMB, and the Pluto system. In NOVAS, major planets are have IDs ranging from 1 through 9, but for NAIF 1–9 are the planetary barycenters and the planet centers have numbers in the hundreds ending with 99 (e.g. the center of Earth is NAIF 399; 3 is the NOVAS ID for Earth and the NAIF ID for the Earth-Moon Barycenter [EMB]). The Sun and Moon also have distinct IDs in NAIF vs NOVAS.
id | The NOVAS ID of the major planet of interest |
References NOVAS_EMB, NOVAS_MERCURY, NOVAS_MOON, NOVAS_PLUTO, NOVAS_PLUTO_BARYCENTER, NOVAS_SSB, and NOVAS_SUN.
short planet_eph_manager | ( | double | jd_tdb, |
enum novas_planet | body, | ||
enum novas_origin | origin, | ||
double *restrict | position, | ||
double *restrict | velocity | ||
) |
Provides an interface between the JPL direct-access solar system ephemerides and NOVAS-C for regular (reduced) precision applications.
This function and planet_eph_manager_hp() were designed to work with the 1997 version of the JPL ephemerides, as noted in the references.
The user must create the binary ephemeris files using software from JPL, and open the file using function ephem_open(), prior to calling this function.
REFERENCES:
jd_tdb | [day] Two-element array containing the Julian date, which may be split any way (although the first element is usually the "integer" part, and the second element is the "fractional" part). Julian date is on the TDB or "T_eph" time scale. | |
body | Major planet number (or that for Sun, Moon, SSB...) | |
origin | NOVAS_BARYCENTER (0) or NOVAS_HELIOCENTER (1), or 2 for Earth geocenter – relative to which to report positions and velocities. | |
[out] | position | [AU] Position vector of 'body' at jd_tdb; equatorial rectangular coordinates in AU referred to the ICRS. |
[out] | velocity | [AU/day] Velocity vector of 'body' at jd_tdb; equatorial rectangular system referred to the ICRS, in AU/day. |
References planet_eph_manager_hp().
short planet_eph_manager_hp | ( | const double | jd_tdb[restrict 2], |
enum novas_planet | body, | ||
enum novas_origin | origin, | ||
double *restrict | position, | ||
double *restrict | velocity | ||
) |
Provides an interface between the JPL direct-access solar system ephemerides and NOVAS-C for highest precision applications.
This function and planet_eph_manager() were designed to work with the 1997 version of the JPL ephemerides, as noted in the references.
The user must create the binary ephemeris files using software from JPL, and open the file using function ephem_open(), prior to calling this function.
REFERENCES:
jd_tdb | [day] Two-element array containing the Julian date, which may be split any way (although the first element is usually the "integer" part, and the second element is the "fractional" part). Julian date is on the TDB or "T_eph" time scale. | |
body | Major planet number (or that for Sun, Moon, SSB...) | |
origin | NOVAS_BARYCENTER (0) or NOVAS_HELIOCENTER (1), or 2 for Earth geocenter – relative to which to report positions and velocities. | |
[out] | position | [AU] Position vector of 'body' at jd_tdb; equatorial rectangular coordinates in AU referred to the ICRS. |
[out] | velocity | [AU/day] Velocity vector of 'body' at jd_tdb; equatorial rectangular system referred to the ICRS, in AU/day. |
References NOVAS_BARYCENTER, NOVAS_HELIOCENTER, NOVAS_MOON, NOVAS_PLANETS, NOVAS_SUN, and planet_ephemeris().
short planet_ephem_provider | ( | double | jd_tdb, |
enum novas_planet | body, | ||
enum novas_origin | origin, | ||
double *restrict | position, | ||
double *restrict | velocity | ||
) |
Major planet ephemeris data via the same generic ephemeris provider that is configured by set_ephem_provider() prior to calling this routine. This is the regular (reduced) precision version.
jd_tdb | [day] Barycentric Dynamical Time (TDB) based Julian date. | |
body | Major planet number (or that for Sun, Moon, SSB...) | |
origin | NOVAS_BARYCENTER (0) or NOVAS_HELIOCENTER (1) relative to which to report positions and velocities. | |
[out] | position | [AU] Position vector of 'body' at jd_tdb; equatorial rectangular coordinates in AU referred to the ICRS. |
[out] | velocity | [AU/day] Velocity vector of 'body' at jd_tdb; equatorial rectangular system referred to the ICRS, in AU/day. |
References planet_ephem_provider_hp().
short planet_ephem_provider_hp | ( | const double | jd_tdb[restrict 2], |
enum novas_planet | body, | ||
enum novas_origin | origin, | ||
double *restrict | position, | ||
double *restrict | velocity | ||
) |
Major planet ephemeris data via the same generic ephemeris provider that is configured by set_ephem_provider() prior to calling this routine. This is the highest precision version.
jd_tdb | [day] Barycentric Dynamical Time (TDB) based Julian date, split into high and low order components (e.g. integer and fractional parts) for high-precision calculations. | |
body | Major planet number (or that for Sun, Moon, SSB...) | |
origin | NOVAS_BARYCENTER (0) or NOVAS_HELIOCENTER (1) relative to which to report positions and velocities. | |
[out] | position | [AU] Position vector of 'body' at jd_tdb; equatorial rectangular coordinates in AU referred to the ICRS. |
[out] | velocity | [AU/day] Velocity vector of 'body' at jd_tdb; equatorial rectangular system referred to the ICRS, in AU/day. |
References get_ephem_provider(), NOVAS_BARYCENTER, NOVAS_HELIOCENTER, NOVAS_PLANET_NAMES_INIT, NOVAS_PLANETS, NOVAS_SSB, and NOVAS_SUN.
short planet_jplint | ( | double | jd_tdb, |
enum novas_planet | body, | ||
enum novas_origin | origin, | ||
double *restrict | position, | ||
double *restrict | velocity | ||
) |
Obtains planet positions via the JPL direct-access solar system ephemerides, wtih normal (reduced) precision – typically good to the milliarcsecond level.
It generalizes access to the JPL software by calling a Fortran interface subroutine, 'jplint', instead of making a direct call to the JPL subroutine 'pleph', whose arguments have changed several times throughout the years. This way, any future change to the arguments can be accommodated in 'jplint' rather than in this function.
For supporting JPL ephemerides more generally, including for satellites, asteroids, and comets, you are probably better off using planet_ephem_provider(), and provide an interface, e.g. to the CSPICE library, via novas_ephem_provider instead, which you can then activate dynamically with set_planet_provider().
REFERENCES:
jd_tdb | [day] Two-element array containing the Julian date, which may be split any way (although the first element is usually the "integer" part, and the second element is the "fractional" part). Julian date is on the TDB or "T_eph" time scale. | |
body | Major planet number (or that for Sun, Moon, SSB..) | |
origin | NOVAS_BARYCENTER (0) or NOVAS_HELIOCENTER (1), or 2 for Earth geocenter – relative to which to report positions and velocities. | |
[out] | position | [AU] Position vector of 'body' at jd_tdb; equatorial rectangular coordinates in AU referred to the ICRS. |
[out] | velocity | [AU/day] Velocity vector of 'body' at jd_tdb; equatorial rectangular system referred to the ICRS, in AU/day. |
References jplint_(), NOVAS_BARYCENTER, NOVAS_HELIOCENTER, NOVAS_MERCURY, NOVAS_MOON, and NOVAS_SUN.
short planet_jplint_hp | ( | const double | jd_tdb[restrict 2], |
enum novas_planet | body, | ||
enum novas_origin | origin, | ||
double *restrict | position, | ||
double *restrict | velocity | ||
) |
Obtains planet positions via the JPL direct-access solar system ephemerides, wtih high precision – typically good to below the microarcsecond level.
It generalizes access to the JPL software by calling a Fortran interface subroutine, 'jplint', instead of making a direct call to the JPL subroutine 'pleph', whose arguments have changed several times throughout the years. This way, any future change to the arguments can be accommodated in 'jplint' rather than in this function.
For supporting JPL ephemerides more generally, including for satellites, asteroids, and comets, you are probably better off using planet_ephem_provider(), and provide an interface, e.g. to the CSPICE library, via novas_ephem_provider instead, which you can then activate dynamically with set_planet_provider().
REFERENCES:
jd_tdb | [day] Two-element array containing the Julian date, which may be split any way (although the first element is usually the "integer" part, and the second element is the "fractional" part). Julian date is on the TDB or "T_eph" time scale. | |
body | Major planet number (or that for Sun, Moon, SSB...) | |
origin | NOVAS_BARYCENTER (0) or NOVAS_HELIOCENTER (1), or 2 for Earth geocenter – relative to which to report positions and velocities. | |
[out] | position | [AU] Position vector of 'body' at jd_tdb; equatorial rectangular coordinates in AU referred to the ICRS. |
[out] | velocity | [AU/day] Velocity vector of 'body' at jd_tdb; equatorial rectangular system referred to the ICRS, in AU/day. |
References jplihp_(), NOVAS_BARYCENTER, NOVAS_HELIOCENTER, NOVAS_MERCURY, NOVAS_MOON, and NOVAS_SUN.
double * readeph | ( | int | mp, |
const char *restrict | name, | ||
double | jd_tdb, | ||
int *restrict | error | ||
) |
Provides a default ephemeris implementation to handle position and velocity calculations for minor planets, which are not handled by the solarsystem() type calls. The library does not provide a default implementation, but users can provide their own, either as a default statically compiled readeph() implementation, or else a dynamically defined one via ephemeris_set_reader().
You can set the built-in implementation for the library at build time by setting the DEFAULT_READEPH variable in the config.mk
.
novas_ephem_provider
instead, which can provide dynamically configured implementations at runtime.mp | The ID number of the solar-system body for which the position are desired. An actual implementation might use this and/or the name to identify the object. | |
name | The name of the solar-system body (usually upper-case). An actual implementation might use this and/or mp to identify the object. | |
jd_tdb | [day] Barycentric Dynamical Time (TDB) based Julian date for which to find the position and velocity. | |
[out] | error | Pointer to integer to populate with the error status: 0 if successful, -1 if any of the pointer arguments are NULL, or some non-zero value if the was an error s.t. the position and velocity vector should not be used. |
set_ephem_provider()
instead to specify what function should be used to calculate ephemeris positions for Solar-system objects. This prototype is provided to extend support for legacy NOVAS C applications only. In NOVAS, the function had to be user defined, as a custom implementation.int set_ephem_provider | ( | novas_ephem_provider | func | ) |
Sets the function to use for obtaining position / velocity information for minor planets, or sattelites.
func | new function to use for accessing ephemeris data for minor planets or satellites. |
int set_planet_provider | ( | novas_planet_provider | func | ) |
Set a custom function to use for regular precision (see NOVAS_REDUCED_ACCURACY) ephemeris calculations instead of the default solarsystem() routine.
func | The function to use for solar system position/velocity calculations. See solarsystem() for further details on what is required of this function. |
int set_planet_provider_hp | ( | novas_planet_provider_hp | func | ) |
Set a custom function to use for high precision (see NOVAS_FULL_ACCURACY) ephemeris calculations instead of the default solarsystem_hp() routine.
func | The function to use for solar system position/velocity calculations. See solarsystem_hp() for further details on what is required of this function. |
short solarsystem | ( | double | jd_tdb, |
short | body, | ||
short | origin, | ||
double *restrict | position, | ||
double *restrict | velocity | ||
) |
A default implementation for regular (reduced) precision handling of major planets, Sun, Moon and the Solar-system barycenter. See DEFAULT_SOLSYS in Makefile to choose the implementation that is built into with the library as a default. Applications can define their own preferred implementations at runtime via set_planet_provider().
Since this is a function that may be provided by existing custom user implementations, we keep the original argument types for compatibility, hence 'short' instead of the more informative enums).
jd_tdb | [day] Barycentric Dynamical Time (TDB) based Julian date | |
body | Major planet number (or that for the Sun, Moon, or an appropriate barycenter), as defined by enum novas_planet, e.g. NOVAS_MARS (4), NOVAS_SUN (10) or NOVAS_SSB (0). (For compatibility with existing NOVAS C compatible user implementations, we keep the original NOVAS C argument type here). | |
origin | NOVAS_BARYCENTER (0) or NOVAS_HELIOCENTER (1) relative to which to return positions and velocities. (For compatibility with existing NOVAS C compatible user implementations, we keep the original NOVAS C argument type here). | |
[out] | position | [AU] Position vector of 'body' at 'tjd'; equatorial rectangular coordinates in AU referred to the mean equator and equinox of J2000.0. |
[out] | velocity | [AU/day] Velocity vector of 'body' at 'tjd'; equatorial rectangular system referred to the mean equator and equinox of J2000.0, in AU/Day. |
set_planet_provider()
instead to specify what function should be used to calculate ephemeris positions for major planets. This function is provided to extend support for legacy NOVAS C applications only. In NOVAS, the function had to be user defined, either by linking against a solsys[1-3].c
module, or by providing a custom user implementation.References planet_eph_manager(), and planet_jplint().
short solarsystem_hp | ( | const double | jd_tdb[restrict 2], |
short | body, | ||
short | origin, | ||
double *restrict | position, | ||
double *restrict | velocity | ||
) |
A default implementation for high precision handling of major planets, Sun, Moon and the Solar-system barycenter (and other barycenters). See DEFAULT_SOLSYS in Makefile to choose the implementation that is built into the library as a default. Applications can define their own preferred implementations at runtime via set_planet_provider_hp().
Since this is a function that may be provided by existing custom user implementations, we keep the original argument types for compatibility, hence 'short' instead of the more informative enums).
jd_tdb | [day] Barycentric Dynamical Time (TDB) based Julian date, broken into high and low order components, respectively. Typically, as the integer and fractional parts for the highest precision. | |
body | Major planet number (or that for the Sun, Moon, or an appropriate barycenter), as defined by enum novas_planet, e.g. NOVAS_MARS (4), NOVAS_SUN (10) or NOVAS_SSB (0). (For compatibility with existing NOVAS C compatible user implementations, we keep the original NOVAS C argument type here). | |
origin | NOVAS_BARYCENTER (0) or NOVAS_HELIOCENTER (1) relative to which to return positions and velocities. (For compatibility with existing NOVAS C compatible user implementations, we keep the original NOVAS C argument type here). | |
[out] | position | [AU] Position vector of 'body' at 'tjd'; equatorial rectangular coordinates in AU referred to the mean equator and equinox of J2000.0. |
[out] | velocity | [AU/day] Velocity vector of 'body' at 'tjd'; equatorial rectangular system referred to the mean equator and equinox of J2000.0, in AU/Day. |
set_planet_provider_hp()
instead to specify what function should be used to calculate high-precision ephemeris positions for major planets. This function is provided to extend support for legacy NOVAS C applications only. In NOVAS, the function had to be user defined, either by linking against a solsys[1-3].c
module, or by providing a custom user implementation.References planet_eph_manager_hp(), and planet_jplint_hp().