New equatorial type (24 bytes: RA/Dec/distance) captures apparent coordinates of date — what the observation pipeline computes at precession step 3 but was discarding before hour angle conversion. Matches telescope GoTo mount conventions. 24 new SQL functions (82 → 106 total): - equatorial type I/O + 3 accessors (eq_ra, eq_dec, eq_distance) - Satellite RA/Dec: eci_to_equatorial (topocentric), eci_to_equatorial_geo (geocentric) - Solar system equatorial: planet/sun/moon/small_body_equatorial - Atmospheric refraction: Bennett (1982) with domain clamp at -1 deg - Refracted pass prediction: predict_passes_refracted (horizon at -0.569 deg) - Stellar proper motion: star_observe_pm, star_equatorial_pm (Hipparcos/Gaia convention) - Light-time correction: planet/sun/small_body_observe_apparent, *_equatorial_apparent - DE equatorial variants: planet_equatorial_de, moon_equatorial_de Also includes v0.8.0 orbital_elements type (MPC parser, small_body_observe), GiST 0-based indexing fix, llms.txt updates, and doc improvements. All 18 regression suites pass. Zero build warnings (GCC + Clang).
110 lines
5.3 KiB
SQL
110 lines
5.3 KiB
SQL
-- pg_orrery 0.7.0 -> 0.8.0 migration
|
|
--
|
|
-- Adds orbital_elements type for comets/asteroids, MPC MPCORB.DAT parser,
|
|
-- and small_body_observe()/small_body_heliocentric() observation functions.
|
|
|
|
-- ============================================================
|
|
-- orbital_elements type
|
|
-- ============================================================
|
|
|
|
CREATE TYPE orbital_elements;
|
|
|
|
CREATE FUNCTION orbital_elements_in(cstring) RETURNS orbital_elements
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION orbital_elements_out(orbital_elements) RETURNS cstring
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION orbital_elements_recv(internal) RETURNS orbital_elements
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION orbital_elements_send(orbital_elements) RETURNS bytea
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
|
|
CREATE TYPE orbital_elements (
|
|
INPUT = orbital_elements_in,
|
|
OUTPUT = orbital_elements_out,
|
|
RECEIVE = orbital_elements_recv,
|
|
SEND = orbital_elements_send,
|
|
INTERNALLENGTH = 72,
|
|
ALIGNMENT = double,
|
|
STORAGE = plain
|
|
);
|
|
|
|
COMMENT ON TYPE orbital_elements IS
|
|
'Classical Keplerian orbital elements for comets and asteroids (epoch, q, e, inc, omega, Omega, tp, H, G). 72 bytes, fixed-size.';
|
|
|
|
|
|
-- ============================================================
|
|
-- Accessor functions
|
|
-- ============================================================
|
|
|
|
CREATE FUNCTION oe_epoch(orbital_elements) RETURNS float8
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
COMMENT ON FUNCTION oe_epoch(orbital_elements) IS 'Osculation epoch (Julian date)';
|
|
|
|
CREATE FUNCTION oe_perihelion(orbital_elements) RETURNS float8
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
COMMENT ON FUNCTION oe_perihelion(orbital_elements) IS 'Perihelion distance q (AU)';
|
|
|
|
CREATE FUNCTION oe_eccentricity(orbital_elements) RETURNS float8
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
COMMENT ON FUNCTION oe_eccentricity(orbital_elements) IS 'Eccentricity';
|
|
|
|
CREATE FUNCTION oe_inclination(orbital_elements) RETURNS float8
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
COMMENT ON FUNCTION oe_inclination(orbital_elements) IS 'Inclination (degrees)';
|
|
|
|
CREATE FUNCTION oe_arg_perihelion(orbital_elements) RETURNS float8
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
COMMENT ON FUNCTION oe_arg_perihelion(orbital_elements) IS 'Argument of perihelion (degrees)';
|
|
|
|
CREATE FUNCTION oe_raan(orbital_elements) RETURNS float8
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
COMMENT ON FUNCTION oe_raan(orbital_elements) IS 'Longitude of ascending node (degrees)';
|
|
|
|
CREATE FUNCTION oe_tp(orbital_elements) RETURNS float8
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
COMMENT ON FUNCTION oe_tp(orbital_elements) IS 'Time of perihelion passage (Julian date)';
|
|
|
|
CREATE FUNCTION oe_h_mag(orbital_elements) RETURNS float8
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
COMMENT ON FUNCTION oe_h_mag(orbital_elements) IS 'Absolute magnitude H (NaN if unknown)';
|
|
|
|
CREATE FUNCTION oe_g_slope(orbital_elements) RETURNS float8
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
COMMENT ON FUNCTION oe_g_slope(orbital_elements) IS 'Slope parameter G (NaN if unknown)';
|
|
|
|
CREATE FUNCTION oe_semi_major_axis(orbital_elements) RETURNS float8
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
COMMENT ON FUNCTION oe_semi_major_axis(orbital_elements) IS 'Semi-major axis a = q/(1-e) in AU. NULL for parabolic/hyperbolic orbits (e >= 1).';
|
|
|
|
CREATE FUNCTION oe_period_years(orbital_elements) RETURNS float8
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
COMMENT ON FUNCTION oe_period_years(orbital_elements) IS 'Orbital period in years = a^1.5 (Kepler third law). NULL for parabolic/hyperbolic orbits (e >= 1).';
|
|
|
|
|
|
-- ============================================================
|
|
-- MPC MPCORB.DAT parser
|
|
-- ============================================================
|
|
|
|
CREATE FUNCTION oe_from_mpc(text) RETURNS orbital_elements
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
COMMENT ON FUNCTION oe_from_mpc(text) IS
|
|
'Parse one MPCORB.DAT fixed-width line into orbital_elements. Converts MPC packed epoch, computes perihelion distance and tp from (a, e, M).';
|
|
|
|
|
|
-- ============================================================
|
|
-- Observation functions
|
|
-- ============================================================
|
|
|
|
CREATE FUNCTION small_body_heliocentric(orbital_elements, timestamptz) RETURNS heliocentric
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
COMMENT ON FUNCTION small_body_heliocentric(orbital_elements, timestamptz) IS
|
|
'Heliocentric ecliptic J2000 position of a comet/asteroid from its orbital elements at a given time.';
|
|
|
|
CREATE FUNCTION small_body_observe(orbital_elements, observer, timestamptz) RETURNS topocentric
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
COMMENT ON FUNCTION small_body_observe(orbital_elements, observer, timestamptz) IS
|
|
'Observe a comet/asteroid from orbital elements. Auto-fetches Earth via VSOP87. Returns topocentric az/el with geocentric range in km.';
|