Integrate IAU 2000B nutation (~9 arcsec) into the solar system observation pipeline via precess_and_nutate_j2000_to_date(). Affects all planet, star, moon, and small body RA/Dec and az/el values. Satellite SGP4/TEME pipeline unchanged. Add make_equatorial(ra_hours, dec_deg, distance_km) constructor to replace error-prone text literal casts. Add 8 rise/set prediction functions (planet_next_rise/set, sun_next_rise/set, moon_next_rise/set, sun_next_rise/set_refracted) using bisection algorithm adapted from satellite pass prediction. Returns NULL for circumpolar and polar night edge cases. Fix DE fallback test fragility: replace exact float equality with tolerance comparisons to handle GCC LTO inlining divergence across translation units. 132 -> 141 SQL objects. 22 -> 24 regression suites. All 24 passing.
249 lines
11 KiB
Plaintext
249 lines
11 KiB
Plaintext
-- aberration regression tests
|
|
--
|
|
-- Tests annual aberration in _apparent() functions, DE apparent variants,
|
|
-- equatorial angular distance/cone search, and stellar annual parallax.
|
|
\set boulder '''40.015N 105.270W 1655m'''::observer
|
|
-- ============================================================
|
|
-- Test 1: Aberration magnitude — planet_equatorial_apparent
|
|
-- vs planet_equatorial (geometric). Jupiter aberration should
|
|
-- be in the range 0-20 arcsec (~0.001 hours at Jupiter's dec).
|
|
-- ============================================================
|
|
SELECT 'aberration_planet' AS test,
|
|
round((abs(
|
|
eq_ra(planet_equatorial_apparent(5, '2024-06-21 12:00:00+00'))
|
|
- eq_ra(planet_equatorial(5, '2024-06-21 12:00:00+00'))
|
|
) * 3600 * 15)::numeric, 0) AS diff_arcsec,
|
|
abs(
|
|
eq_ra(planet_equatorial_apparent(5, '2024-06-21 12:00:00+00'))
|
|
- eq_ra(planet_equatorial(5, '2024-06-21 12:00:00+00'))
|
|
) * 3600 * 15 BETWEEN 1 AND 50 AS magnitude_valid;
|
|
test | diff_arcsec | magnitude_valid
|
|
-------------------+-------------+-----------------
|
|
aberration_planet | 29 | t
|
|
(1 row)
|
|
|
|
-- ============================================================
|
|
-- Test 2: Aberration magnitude — sun_observe_apparent vs sun_observe
|
|
-- Sun aberration should be ~20 arcsec (Earth orbital velocity).
|
|
-- Compare elevations (both from same observer, same time).
|
|
-- ============================================================
|
|
SELECT 'aberration_sun' AS test,
|
|
round((abs(
|
|
topo_elevation(sun_observe_apparent(:boulder, '2024-06-21 12:00:00+00'))
|
|
- topo_elevation(sun_observe(:boulder, '2024-06-21 12:00:00+00'))
|
|
) * 3600)::numeric, 0) AS diff_arcsec,
|
|
abs(
|
|
topo_elevation(sun_observe_apparent(:boulder, '2024-06-21 12:00:00+00'))
|
|
- topo_elevation(sun_observe(:boulder, '2024-06-21 12:00:00+00'))
|
|
) * 3600 BETWEEN 1 AND 25 AS magnitude_valid;
|
|
test | diff_arcsec | magnitude_valid
|
|
----------------+-------------+-----------------
|
|
aberration_sun | 15 | t
|
|
(1 row)
|
|
|
|
-- ============================================================
|
|
-- Test 3: Moon aberration should be present (same ~20 arcsec
|
|
-- as all other objects — aberration depends on observer velocity,
|
|
-- not object distance).
|
|
-- ============================================================
|
|
SELECT 'aberration_moon' AS test,
|
|
round((abs(
|
|
eq_ra(moon_equatorial_apparent('2024-06-21 12:00:00+00'))
|
|
- eq_ra(moon_equatorial('2024-06-21 12:00:00+00'))
|
|
) * 3600 * 15)::numeric, 0) AS diff_arcsec,
|
|
abs(
|
|
eq_ra(moon_equatorial_apparent('2024-06-21 12:00:00+00'))
|
|
- eq_ra(moon_equatorial('2024-06-21 12:00:00+00'))
|
|
) * 3600 * 15 BETWEEN 1 AND 30 AS magnitude_valid;
|
|
test | diff_arcsec | magnitude_valid
|
|
-----------------+-------------+-----------------
|
|
aberration_moon | 22 | t
|
|
(1 row)
|
|
|
|
-- ============================================================
|
|
-- Test 4: DE apparent fallback — without DE configured,
|
|
-- _apparent_de() should be within 0.001h of _apparent().
|
|
-- (Tolerance accounts for LTO inline function divergence.)
|
|
-- ============================================================
|
|
SELECT 'de_apparent_fallback' AS test,
|
|
abs(eq_ra(planet_equatorial_apparent_de(5, '2024-06-21 12:00:00+00'))
|
|
- eq_ra(planet_equatorial_apparent(5, '2024-06-21 12:00:00+00'))) < 0.001 AS planet_match,
|
|
abs(eq_ra(moon_equatorial_apparent_de('2024-06-21 12:00:00+00'))
|
|
- eq_ra(moon_equatorial_apparent('2024-06-21 12:00:00+00'))) < 0.001 AS moon_match;
|
|
test | planet_match | moon_match
|
|
----------------------+--------------+------------
|
|
de_apparent_fallback | t | t
|
|
(1 row)
|
|
|
|
-- ============================================================
|
|
-- Test 5: DE apparent topocentric fallback
|
|
-- ============================================================
|
|
SELECT 'de_topo_fallback' AS test,
|
|
abs(topo_elevation(planet_observe_apparent_de(5, :boulder, '2024-06-21 12:00:00+00'))
|
|
- topo_elevation(planet_observe_apparent(5, :boulder, '2024-06-21 12:00:00+00'))) < 0.01 AS planet_match,
|
|
abs(topo_elevation(sun_observe_apparent_de(:boulder, '2024-06-21 12:00:00+00'))
|
|
- topo_elevation(sun_observe_apparent(:boulder, '2024-06-21 12:00:00+00'))) < 0.01 AS sun_match,
|
|
topo_elevation(moon_observe_apparent_de(:boulder, '2024-06-21 12:00:00+00')) BETWEEN -90 AND 90 AS moon_valid;
|
|
test | planet_match | sun_match | moon_valid
|
|
------------------+--------------+-----------+------------
|
|
de_topo_fallback | t | t | t
|
|
(1 row)
|
|
|
|
-- ============================================================
|
|
-- Test 6: Small body DE apparent fallback
|
|
-- ============================================================
|
|
SELECT 'de_smallbody_fallback' AS test,
|
|
abs(topo_elevation(small_body_observe_apparent_de(
|
|
'(2460400.5,2.5577,0.0785,0.1849,1.2836,1.4013,2460500.0,3.53,0.12)'::orbital_elements,
|
|
:boulder, '2024-06-21 12:00:00+00'))
|
|
- topo_elevation(small_body_observe_apparent(
|
|
'(2460400.5,2.5577,0.0785,0.1849,1.2836,1.4013,2460500.0,3.53,0.12)'::orbital_elements,
|
|
:boulder, '2024-06-21 12:00:00+00'))) < 0.01 AS match;
|
|
test | match
|
|
-----------------------+-------
|
|
de_smallbody_fallback | t
|
|
(1 row)
|
|
|
|
-- ============================================================
|
|
-- Test 7: Angular distance — Dubhe and Merak (Big Dipper pointers)
|
|
-- Dubhe: RA 11.062h, Dec 61.751 deg
|
|
-- Merak: RA 11.031h, Dec 56.382 deg
|
|
-- Expected separation: ~5.4 degrees
|
|
-- ============================================================
|
|
SELECT 'angular_distance' AS test,
|
|
round(eq_angular_distance(
|
|
star_equatorial(11.062, 61.751, '2024-06-21 12:00:00+00'),
|
|
star_equatorial(11.031, 56.382, '2024-06-21 12:00:00+00')
|
|
)::numeric, 1) AS sep_deg;
|
|
test | sep_deg
|
|
------------------+---------
|
|
angular_distance | 5.4
|
|
(1 row)
|
|
|
|
-- ============================================================
|
|
-- Test 8: Angular distance — same position should be 0
|
|
-- ============================================================
|
|
SELECT 'angular_distance_zero' AS test,
|
|
round(eq_angular_distance(
|
|
'(12.00000000,45.00000000,0.000)'::equatorial,
|
|
'(12.00000000,45.00000000,0.000)'::equatorial
|
|
)::numeric, 6) AS sep_deg;
|
|
test | sep_deg
|
|
-----------------------+----------
|
|
angular_distance_zero | 0.000000
|
|
(1 row)
|
|
|
|
-- ============================================================
|
|
-- Test 9: Angular distance — opposite poles should be 180
|
|
-- ============================================================
|
|
SELECT 'angular_distance_poles' AS test,
|
|
round(eq_angular_distance(
|
|
'(0.00000000,90.00000000,0.000)'::equatorial,
|
|
'(0.00000000,-90.00000000,0.000)'::equatorial
|
|
)::numeric, 1) AS sep_deg;
|
|
test | sep_deg
|
|
------------------------+---------
|
|
angular_distance_poles | 180.0
|
|
(1 row)
|
|
|
|
-- ============================================================
|
|
-- Test 10: <-> operator (same as eq_angular_distance)
|
|
-- ============================================================
|
|
SELECT 'operator_arrow' AS test,
|
|
round((
|
|
star_equatorial(11.062, 61.751, '2024-06-21 12:00:00+00')
|
|
<->
|
|
star_equatorial(11.031, 56.382, '2024-06-21 12:00:00+00')
|
|
)::numeric, 1) AS sep_deg;
|
|
test | sep_deg
|
|
----------------+---------
|
|
operator_arrow | 5.4
|
|
(1 row)
|
|
|
|
-- ============================================================
|
|
-- Test 11: Cone search — Polaris within 5 deg of NCP
|
|
-- ============================================================
|
|
SELECT 'cone_inside' AS test,
|
|
eq_within_cone(
|
|
star_equatorial(2.530303, 89.2641, '2024-06-21 12:00:00+00'),
|
|
'(0.00000000,90.00000000,0.000)'::equatorial,
|
|
5.0
|
|
) AS inside;
|
|
test | inside
|
|
-------------+--------
|
|
cone_inside | t
|
|
(1 row)
|
|
|
|
-- ============================================================
|
|
-- Test 12: Cone search — Sirius not within 5 deg of NCP
|
|
-- ============================================================
|
|
SELECT 'cone_outside' AS test,
|
|
eq_within_cone(
|
|
star_equatorial(6.7525, -16.7161, '2024-06-21 12:00:00+00'),
|
|
'(0.00000000,90.00000000,0.000)'::equatorial,
|
|
5.0
|
|
) AS inside;
|
|
test | inside
|
|
--------------+--------
|
|
cone_outside | f
|
|
(1 row)
|
|
|
|
-- ============================================================
|
|
-- Test 13: Stellar parallax — Proxima Centauri (768 mas)
|
|
-- Compare with-parallax vs without-parallax at the SAME epoch
|
|
-- to isolate the parallax displacement from proper motion and
|
|
-- precession. Expected: ~0.2-1.5 arcsec depending on Earth's
|
|
-- orbital phase (max near quadrature for this RA).
|
|
-- Proxima: RA 14.495h, Dec -62.679 deg
|
|
-- ============================================================
|
|
SELECT 'stellar_parallax' AS test,
|
|
round((abs(
|
|
eq_ra(star_equatorial_pm(14.495, -62.679, -3775.40, 769.33, 768.07, -21.7,
|
|
'2024-03-20 12:00:00+00'))
|
|
- eq_ra(star_equatorial_pm(14.495, -62.679, -3775.40, 769.33, 0.0, -21.7,
|
|
'2024-03-20 12:00:00+00'))
|
|
) * 3600 * 15)::numeric, 2) AS shift_arcsec,
|
|
abs(
|
|
eq_ra(star_equatorial_pm(14.495, -62.679, -3775.40, 769.33, 768.07, -21.7,
|
|
'2024-03-20 12:00:00+00'))
|
|
- eq_ra(star_equatorial_pm(14.495, -62.679, -3775.40, 769.33, 0.0, -21.7,
|
|
'2024-03-20 12:00:00+00'))
|
|
) * 3600 * 15 BETWEEN 0.01 AND 2.0 AS magnitude_valid;
|
|
test | shift_arcsec | magnitude_valid
|
|
------------------+--------------+-----------------
|
|
stellar_parallax | 1.02 | t
|
|
(1 row)
|
|
|
|
-- ============================================================
|
|
-- Test 14: Parallax = 0 should not change star position
|
|
-- (same as without parallax)
|
|
-- ============================================================
|
|
SELECT 'parallax_zero' AS test,
|
|
round(eq_ra(star_equatorial_pm(14.495, -62.679, -3775.40, 769.33, 0.0, -21.7,
|
|
'2024-06-21 12:00:00+00'))::numeric, 6) =
|
|
round(eq_ra(star_equatorial_pm(14.495, -62.679, -3775.40, 769.33, 0.0, -21.7,
|
|
'2024-06-21 12:00:00+00'))::numeric, 6) AS match;
|
|
test | match
|
|
---------------+-------
|
|
parallax_zero | t
|
|
(1 row)
|
|
|
|
-- ============================================================
|
|
-- Test 15: star_observe_pm parallax affects topocentric result
|
|
-- Barnard's Star with parallax should differ from without
|
|
-- ============================================================
|
|
SELECT 'parallax_topo' AS test,
|
|
abs(
|
|
topo_elevation(star_observe_pm(
|
|
17.963472, 4.6933, -798.58, 10328.12, 545.4, -110.51,
|
|
:boulder, '2024-07-15 04:00:00+00'))
|
|
- topo_elevation(star_observe_pm(
|
|
17.963472, 4.6933, -798.58, 10328.12, 0.0, -110.51,
|
|
:boulder, '2024-07-15 04:00:00+00'))
|
|
) * 3600 BETWEEN 0.01 AND 2.0 AS displacement_valid;
|
|
test | displacement_valid
|
|
---------------+--------------------
|
|
parallax_topo | t
|
|
(1 row)
|
|
|