Releases: Smithsonian/SuperNOVAS
v1.1.1 (re-release)
Bug fix release. Nothing too scary, mainly just a collection of smaller fixes and improvements. The re-release addresses the excessive precision in tests, which caused testing failure on some platforms for the original #82 release. Otherwise, the library itself is identical to the earlier v1.1.1 release.
Fixed
-
#55: Relativistic corrections to radial velocity were still not applied correctly. The revised calculation now uses the actual relativistic velocity differential between the source and observer to apply the appropriate time dilation factor, and applies gravitational corrections for Sun and Earth consistently at source and observer alike.
-
#64:
NOVAS_TAI_TO_TT
definition had wrong decimal in last place, thus was 3 ms off from what it should have been. (thanks to @kiranshila) -
#68:
readeph_dummy()
dummy implementation inreadeph0.c
called non existing error handler function.
Changed
-
#59: For observing major planets (and Sun and Moon)
rad_vel()
,rad_vel2()
,place()
, andnovas_sky_pos()
will include gravitational corrections to radial velocity for light originating at the surface, and observed near Earth or else at a large distance away. These corrections, along with those for the Solar potential at the source, may be skipped forrad_vel()
/rad_vel2()
by settingd_src_sun
negative. -
#55: Use relativistic formulae to add/difference velocities (i.e. change velocity reference frame).
-
#60: Moved SuperNOVAS-only functions to a separate
super.c
module to alleviate the bloating ofnovas.c
, which can still be used as a self-contained, standalone, NOVAS C replacement for legacy applications if need be. -
#62: Improve debug mode error tracing when NAN values are returned, so the trace indicates NAN rather than a bogus integer return value before.
-
#66: Various tweaks for C/C++ best practices (by @kiranshila)
-
#67: Use accuracy argument in
tod_to_cirs()
. (thanks to @kiranshila) -
#68: Various improvements to debug error tracing.
-
#73: Initializer macros (primarily for internal use), forced 'use' of unused variables after declarations, and no order-only-dependencies in Makefiles -- in order to cure warnings and to conform with older compilers and make.
-
Slight tweaks to
Makefile
, and.mk
snippets, with addedmake
configurability.
v1.1.1
Bug fix release. Nothing too scary, mainly just a collection of smaller fixes and improvements.
Fixed
-
#55: Relativistic corrections to radial velocity were still not applied correctly. The revised calculation now uses the actual relativistic velocity differential between the source and observer to apply the appropriate time dilation factor, and applies gravitational corrections for Sun and Earth consistently at source and observer alike.
-
#64:
NOVAS_TAI_TO_TT
definition had wrong decimal in last place, thus was 3 ms off from what it should have been. (thanks to @kiranshila) -
#68:
readeph_dummy()
dummy implementation inreadeph0.c
called non existing error handler function.
Changed
-
#59: For observing major planets (and Sun and Moon)
rad_vel()
,rad_vel2()
,place()
, andnovas_sky_pos()
will include gravitational corrections to radial velocity for light originating at the surface, and observed near Earth or else at a large distance away. These corrections, along with those for the Solar potential at the source, may be skipped forrad_vel()
/rad_vel2()
by settingd_src_sun
negative. -
#55: Use relativistic formulae to add/difference velocities (i.e. change velocity reference frame).
-
#60: Moved SuperNOVAS-only functions to a separate
super.c
module to alleviate the bloating ofnovas.c
, which can still be used as a self-contained, standalone, NOVAS C replacement for legacy applications if need be. -
#62: Improve debug mode error tracing when NAN values are returned, so the trace indicates NAN rather than a bogus integer return value before.
-
#66: Various tweaks for C/C++ best practices (by @kiranshila)
-
#67: Use accuracy argument in
tod_to_cirs()
. (thanks to @kiranshila) -
#68: Various improvements to debug error tracing.
-
#73: Initializer macros (primarily for internal use), forced 'use' of unused variables after declarations, and no order-only-dependencies in Makefiles -- in order to cure warnings and to conform with older compilers and make.
-
Slight tweaks to
Makefile
, and.mk
snippets, with addedmake
configurability.
v1.1.0
Feature release. Introducing a more efficient and elegant approach to position and velocity calculations using observer frames; versatile handling of astronomical timescales; and support for further observer locations, coordinate reference systems, and atmospheric refraction models. The release also fixes a number of bugs, of varying severity, which affected prior SuperNOVAS (and NOVAS C) releases.
Fixed
-
#29: Fix portability to non-Intel platforms. Previously, SuperNOVAS used
char
for storing small integer coefficients, assumingchar
was signed. However, on some platforms like ARM and PowerPCchar
is unsigned, which broke calculations badly. As of now, we use the explicit platform independent signedint8_t
storage type for these coefficients. -
#38:
gcrs_to_j2000()
transformed in the wrong direction in v1.0. -
#39:
tod_to_itrs()
used wrong Earth rotation measure (NOVAS_ERA
instead ofNOVAS_GST
) in v1.0. -
#45:
cel2ter()
invalid output in v1.0 with CIRS input coordinates (erot
=EROT_ERA
andclass
=NOVAS_DYNAMICAL_CLASS
) if output vector was distinct from input vector. Affectscirs_to_itrs()
also. -
#36:
tt2tdb()
Had a wrong scaling in sinusoidal period in v1.0, resulting in an error of up to +/- 1.7 ms. -
#37:
gcrs_to_cirs()
did not handle well if input and output vectors were the same in v1.0. -
#28: Division by zero bug in
d_light()
(since NOVAS C 3.1) if the first position argument is the ephemeris reference position (e.g. the Sun forsolsys3.c
). The bug affects for examplegrav_def()
, where it effectively results in the gravitational deflection due to the Sun being skipped. See Issue #28. -
#41:
grav_def()
gravitating body position antedated somewhat incorrectly (in v1.0) when observed source is a Solar-system object between the observer and the gravitating body. The resulting positional error is typically small at below 10 uas. -
#50: The NOVAS C 3.1 implementation of
rad_vel()
applied relativistic corrections for a moving observer conditional on applying relativistic gravitational corrections (for Sun and/or Earth potential) for the observer. However, it seems more reasonable that the corrections for a moving observer should be applied always and independently of the (optional) gravitational corrections. -
#34:
place()
radial velocities were not quite correct in prior SuperNOVAS releases. The radial velocity calculation now precedes aberration, since the radial velocity that is observed is in the geometric direction towards the source (unaffected by aberration). As for gravitational deflection, the geometric direction is the correct direction in which light was emitted from the source for sidereal objects. For Solar system sources we now reverse trace the deflected light to calculate the direction in which it was emitted from the source. As such, the radial velocities calculated should now be precise under all conditions. The typical errors of the old calculations were up to tens of m/s because of aberration, and a few m/s due to the wrong gravitational deflection calculation. -
#24: Bungled definition of
SUPERNOVAS_VERSION_STRING
innovas.h
in v1.0. -
Bungled definition of
NOVAS_OBSERVER_PLACES
innovas.h
in v1.0.
Added
-
#33: New observing-frame based approach for calculations (
frames.c
). Anovas_frame
object uniquely defines both the place and time of observation, with a set of pre-calculated transformations and constants. Once the frame is defined it can be used very efficiently to calculate positions for multiple celestial objects with minimum additional computational cost. The frames API is also more elegant and more versatile than the low-level NOVAS C approach for performing the same kind of calculations. And, frames are inherently thread-safe since post-creation their internal state is never modified during the calculations. The following new functions were added:novas_make_frame()
,novas_change_observer()
,novas_geom_posvel()
,novas_geom_to_app()
,novas_sky_pos()
,novas_app_to_hor()
,novas_app_to_geom()
,novas_hor_to_app()
,novas_make_transform()
,novas_invert_transform()
,novas_transform_vector()
, andnovas_transform_sky_pos()
. -
#33: New
novas_timespec
structure for the self-contained definition of precise astronomical time (timescale.c
). You can set the time vianovas_set_time()
ornovas_set_split_time()
to a JD date in the timescale of choice (UTC, UT1, GPS, TAI, TT, TCG, TDB, or TCB), or to a UNIX time withnovas_set_unix_time()
. Once set, you can obtain an expression of that time in any timescale of choice vianovas_get_time()
,novas_get_split_time()
ornovas_get_unix_time()
. And, you can create a new time specification by incrementing an existing one, usingnovas_increment_time()
, or measure time differences vianovas_diff_time()
,novas_diff_tcg()
, ornovas_diff_tcb()
. -
Added
novas_planet_bundle
structure to handle planet positions and velocities more elegantly (e.g. for gravitational deflection calculations). -
#32: Added
grav_undef()
to undo gravitational bending of the observed light to obtain geometric positions from observed ones. -
Added
obs_posvel()
to calculate the observer position and velocity relative to the Solar System Barycenter (SSB). -
Added
obs_planets()
to calculate apparent planet positions (relative to observer) and velocities (w.r.t. SSB). -
Added new observer locations
NOVAS_AIRBORNE_OBSERVER
for an observer moving relative to the surface of Earth e.g. in an aircraft or balloon based telescope platform, andNOVAS_SOLAR_SYSTEM_OBSERVER
for spacecraft orbiting the Sun. Both of these use theobserver.near_earth
strcture to define (positions and) velocities as appropriate. Hence the'near_earth
name is a bit misleading, but sticks for back compatibility. -
Added coordinate reference systems
NOVAS_MOD
(Mean of Date) which includes precession by not nutation andNOVAS_J2000
for the J2000 dynamical reference system. -
New observer locations
NOVAS_AIRBORNE_OBSERVER
andNOVAS_SOLAR_SYSTEM_OBSERVER
, and correspondingmake_airborne_observer()
andmake_solar_system_observer()
functions. Airborne observers have an Earth-fixed momentary location, defined by longitude, latitude, and altitude, the same way as for a stationary observer on Earth, but are moving relative to the surface, such as in an aircraft or balloon based observatory. Solar-system observers are similar to observers in Earth-orbit but their momentary position and velocity is defined relative to the Solar System Barycenter (SSB), instead of the geocenter. -
Added humidity field to
on_surface
structure, e.g. for refraction calculations at radio wavelengths. Themake_on_surface()
function will set humidity to 0.0, but the user can set the field appropriately afterwards. -
New set of built-in refraction models to use with the frame-based
novas_app_to_hor()
/novas_hor_to_app()
functions. The modelsnovas_standard_refraction()
andnovas_optical_refraction()
implement the same refraction model asrefract()
in NOVAS C 3.1, withNOVAS_STANDARD_ATMOSPHERE
andNOVAS_WEATHER_AT_LOCATION
respectively, including the reversed direction provided byrefract_astro()
. The user may supply their own custom refraction also, and may make use of the generic reversal functionnovas_inv_refract()
to calculate refraction in the reverse direction (observer vs astrometric elevations) as needed. -
Added radio refraction model
novas_radio_refraction()
based on the formulae by Berman & Rockwell 1976. -
Added
cirs_to_tod()
andtod_to_cirs()
functions for efficient tranformation between True of Date (TOD) and Celestial Intermediate Reference System (CIRS), and vice versa. -
Added
make_cat_object()
function to create a NOVAS celestialobject
structure from existingcat_entry
data. -
Added
rad_vel2()
to calculate radial velocities precisely in the presense of gravitational deflection i.e., when the direction in which light was emitted is different from the direction it is detected by the observer. This new function is now used by bothplace()
andnovas_sky_pos()
. -
make help
to provide a brief list and explanation of the available build targets. (Thanks to@teuben
for suggesting this.) -
Added GitHub CI regression testing for non-x86 platforms:
armv7
,aarch64
,riscv64
,ppc64le
. Thus, we should avoid misphaps, like the platform specific bug Issue #29, in the future.
Changed
-
#42:
cio_array()
can now parse the original ASCII CIO locator data file (data/CIO_RA.TXT
) efficiently also, thus no longer requiring a platform-specific binary translation via thecio_file
tool. -
#51: The NOVAS C implementation of
rad_vel()
has ignored this redshifting when the Sun was being observed. From now on, we shall gravitationally reference radial velocities when observing the Sun to its photosphere. -
cio_file
tool parses interval from header rather than the less precise differencing of the first two record timestamps. This leads tocio_array()
being more accurately centered on matching date entries, e.g. J2000. -
grav_def()
estimation of light time to where light passes nearest to gravitating body is improved by starting with the body position already antedated for light-time for the gravitating mass. The change typically improves the grativational deflection calculations at the few uas level. -
grav_def()
is simplified. It no longer uses the location type argument. Instead it will skip deflections due to any body, if the observer is within ~1500 km of its center. -
place()
now returns an error 3 if and only if the observer is at (or very close, to within ~1.5m) of the observed Solar-system object. -
Improved precision of some calculations, like
era()
, `...
v1.0.1
Bug fix release
Known Issues
This release is affected by many of the same issues as the original 1.0 release, except what is explicitly listed below as fixed for this version.
Fixed
- #15 --
cirs_to_itrs()
,itrs_to_cirs()
,tod_to_itrs()
, anditrs_to_tod()
all had a unit conversion bug in using theut1_to_tt
argument [s] when converting TT-based Julian date to UT1-based JD [day] internally. (thanks to @hannorein) - #17 -- Fixes to included
examples.c
Added
- Added
cirs_to_app_ra()
andapp_to_cirs_ra()
for convenience to convert between right ascensions measured from the CIO (for CIRS) vs measured from the true equinox of date, on the same true equator of date.
Changed
- #18 -- Changed definition of
NOVAS_AU
to the IAU definition of exactly 149597870.7 km (a <10 m change from the previously defined value, which has been renamed toDE405_AU
). (thanks to @hannorein) - Various corrections and changes to documentation.
v1.0
[1.0.0] - 2024-03-01
This is the initial release of the SuperNOVAS library. Changes are indicated w.r.t. the upstream NOVAS C 3.1 library
from which SuperNOVAS is forked from.
Known Issues
- #15 --
cirs_to_itrs()
,itrs_to_cirs()
,tod_to_itrs()
, anditrs_to_tod()
all have a unit conversion bug in using theut1_to_tt
argument [s] when converting TT-based Julian date to UT1-based JD [day] internally. A fix for this bug is included in themain
branch and thev1.0.1
bug fix release. - #28 --
d_light()
divide by zero if called withpos
argument is a zero vector (e.g. Sun or SSB, depending on the solar-system calculator type). Fix available on themain
branch and will be included in thev1.0.2
bug fix release. - #29 -- [CRITICAL] All calculations in this release involving the IAU2000 nutation or
ee_ct()
yield invalid results on non-Intel x86 platforms, such as ARMv7 or PowerPC, due to a different signedness of thechar
integer type on these platforms. Fix available on themain
branch and will be included in thev1.0.2
bug fix release. - #35 --
tt2tdb()
had the wrong scaling in the period, resulting in an error up to ~3.4 ms. A fix will be included in thev1.1.0
release and is available on themain
branch. - #38 --
gcrs_to_j2000()
applied transformation in the wrong direction, resulting in an error up to 44 mas whenplace()
was called withNOVAS_TOD
as the desired output system (1). A fix will be included in thev1.1.0
release and is available on themain
branch. - #39 --
tod_to_itrs()
used the wrong Earth rotation measure (NOVAS_ERA
instead ofNOVAS_GST
). A fix will be included in thev1.1.0
release and is available on themain
branch. - #41:
grav_def()
gravitating body position antedated somewhat incorrectly (in v1.0) when observed source is a Solar-system object between the observer and the gravitating body. The resulting positional error is typically small at below 10 uas. A fix will be included in thev1.1.0
release and is available on themain
branch. - #45:
cel2ter()
invalid output with CIRS input coordinates (erot
=EROT_ERA
andclass
=NOVAS_DYNAMICAL_CLASS
) if output vector was distinct from input vector. Affects prior SuperNOVAS releases. A fix will be included in thev1.1.0
release and is available on themain
branch.
Fixed
-
Fixes the sidereal_time bug, whereby the
sidereal_time()
function had
an incorrect unit cast. This is a known issue of NOVAS C 3.1. -
Some remainder calculations in NOVAS C 3.1 used the result from
fmod()
unchecked, which led to the wrong results
when the numerator was negative. This affected the calculation of the mean anomaly insolsys3.c
(line 261) and
the fundamental arguments calculated infund_args()
andee_ct()
for dates prior to J2000. Less critically, it
also was the reasoncal_date()
did not work for negative JD values. -
Fixes antedating velocities and distances for light travel time in
ephemeris()
. When getting positions and
velocities for Solar-system sources, it is important to use the values from the time light originated from the
observed body rather than at the time that light arrives to the observer. This correction was done properly for
positions, but not for velocities or distances, resulting in incorrect observed radial velocities or apparent
distances being reported for spectroscopic observations or for angular-physical size conversions. -
Fixes bug in
ira_equinox()
which may return the result for the wrong type of equinox (mean vs. true) if the the
equinox
argument was changing from 1 to 0, and back to 1 again with the date being held the same. This affected
routines downstream also, such assidereal_time()
. -
Fixes accuracy switching bug in
cio_basis()
,cio_location()
,ecl2equ()
,equ2ecl_vec()
,ecl2equ_vec()
,
geo_posvel()
,place()
, andsidereal_time()
. All these functions returned a cached value for the other
accuracy if the other input parameters are the same as a prior call, except the accuracy. -
Fixes multiple bugs related to using cached values in
cio_basis()
with alternating CIO location reference
systems. -
Fixes bug in
equ2ecl_vec()
andecl2equ_vec()
whereby a query withcoord_sys = 2
(GCRS) has overwritten the
cached mean obliquity value forcoord_sys = 0
(mean equinox of date). As a result, a subsequent call with
coord_sys = 0
and the same date as before would return the results GCRS coordinates instead of the requested mean
equinox of date coordinates. -
Fixes
aberration()
returning NaN vectors if theve
argument is 0. It now returns the unmodified input vector
appropriately instead. -
Fixes unpopulated
az
output value inequ2hor()
at zenith. While any azimuth is acceptable really, it results in
unpredictable behavior. Hence, we setaz
to 0.0 for zenith to be consistent. -
Fixes potential string overflows and eliminates associated compiler warnings.
-
Fixes the ephem_close bug, whereby
ephem_close()
in
eph_manager.c
did not reset theEPHFILE
pointer to NULL. This is a known issue of NOVAS C 3.1. -
Supports calculations in parallel threads by making cached results thread-local.
Added
-
New debug mode and error traces. Simply call
novas_debug(NOVAS_DEBUG_ON)
ornovas_debug(NOVAS_DEBUG_EXTRA)
to enable. When enabled, any error conditions (such as NULL pointer arguments, or invalid input values etc.) will
be reported to the standard error, complete with call tracing within the SuperNOVAS library, s.t. users can have
a better idea of what exactly did not go to plan (and where). The debug messages can be disabled by passing
NOVAS_DEBUF_OFF
(0) as the argument to the same call. -
Added Doxygen markup of source code and header.
-
Added Makefile for GNU make.
-
Added continuous integration on GitHub, including regression testing, static analysis, and doxygen validation.
-
Added an number of precompiler constants and enums in
novas.h
to promote consistent usage and easier to read
code. -
New runtime configurability:
-
The planet position calculator function used by
ephemeris()
can be set at runtime viaset_planet_provider()
,
andset_planet_provider_hp()
(for high precision calculations). Similarly, ifplanet_ephem_provider()
or
planet_ephem_provider_hp()
(defined insolsys-ephem.c
) are set as the planet calculator functions, then
set_ephem_provider()
can set the user-specified function to use with these to actually read ephemeris data
(e.g. from a JPL ephemeris file). -
If CIO locations vs GSRS are important to the user, the user may call
set_cio_locator_file()
at runtime to
specify the location of the binary CIO interpolation table (e.g.cio_ra.bin
) to use, even if the library was
compiled with the different default CIO locator path. -
The default low-precision nutation calculator
nu2000k()
can be replaced by another suitable IAU 2006 nutation
approximation viaset_nutation_lp_provider()
. For example, the user may want to use theiau2000b()
model
instead or some custom algorithm instead.
-
-
New intutitive XYZ coordinate conversion functions:
- for GCRS - CIRS - ITRS (IAU 2000 standard):
gcrs_to_cirs()
,cirs_to_itrs()
, anditrs_to_cirs()
,
cirs_to_gcrs()
. - for GCRS - J2000 - TOD - ITRS (old methodology):
gcrs_to_j2000()
,j2000_to_tod()
,tod_to_itrs()
, and
itrs_to_tod()
,tod_to_j2000()
,j2000_to_gcrs()
.
- for GCRS - CIRS - ITRS (IAU 2000 standard):
-
New
itrs_to_hor()
andhor_to_itrs()
functions to convert Earth-fixed ITRS coordinates to astrometric azimuth
and elevation or back. Whereastod_to_itrs()
followed byitrs_to_hor()
is effectively a just a more explicit
2-step version of the existingequ2hor()
for converting from TOD to to local horizontal (old methodology), the
cirs_to_itrs()
followed byitrs_to_hor()
does the same from CIRS (new IAU standard methodology), and had no
prior equivalent in NOVAS C 3.1. -
New
ecl2equ()
for converting ecliptic coordinates to equatorial, complementing existingequ2ecl()
. -
New
gal2equ()
for converting galactic coordinates to ICRS equatorial, complementing existingequ2gal()
. -
New
refract_astro()
complements the existingrefract()
but takes an unrefracted (astrometric) zenith angle as
its argument. -
New convenience functions to wrap
place()
for simpler specific use:place_star()
,place_icrs()
,
place_gcrs()
,place_cirs()
, andplace_tod()
. -
New
radec_star()
andradec_planet()
as the common point for existing functions such asastro_star()
local_star()
,virtual_planet()
,topo_planet()
etc. -
New time conversion utilities
tt2tdb()
,get_utc_to_tt()
, andget_ut1_to_tt()
make it simpler to convert
between UTC, UT1, TT, and TDB time scales, and to supplyut1_to_tt
arguments toplace()
or topocentric
calculations. -
Co-existing
solarsystem()
variants. It is possible to use the differentsolarsystem()
implementations
provided bysolsys1.c
,solsys2.c
,solsys3.c
and/orsolsys-ephem.c
side-by-side, as they define their
functionalities with distinct, non-conflicting names, e.g.earth_sun_calc()
vsplanet_jplint()
vs
planet_eph_manager
vsplanet_ephem_provider()
. See the section on
Building and installation further above on including a selection of these in your library
build.) -
New
novas_case_sensitive(int)
to enable (or disable) case-sensitive processing of object names. (By default NOVAS
object
names were converted t...