diff --git a/docs/public/llms-full.txt b/docs/public/llms-full.txt new file mode 100644 index 0000000..41837eb --- /dev/null +++ b/docs/public/llms-full.txt @@ -0,0 +1,487 @@ +# pg_orrery — Complete LLM Reference + +> Celestial mechanics types and functions for PostgreSQL. Native C extension (v0.8.0) with 82 SQL functions, 8 custom types + 1 composite, GiST/SP-GiST indexing. All functions PARALLEL SAFE. + +- Source: https://git.supported.systems/warehack.ing/pg_orrery +- Docs: https://pg-orrery.warehack.ing +- Requires: PostgreSQL 14–18 +- Install: `CREATE EXTENSION pg_orrery;` + +## Types + +All base types are fixed-size, STORAGE = plain, ALIGNMENT = double. No TOAST. + +### tle (112 bytes) + +Parsed Two-Line Element set for SGP4/SDP4 propagation. Text I/O is the standard two-line format. + +```sql +-- Input: standard TLE two-line format (line1 + newline + line2) +SELECT '1 25544U 98067A 24001.50000000 .00016717 00000-0 10270-3 0 9002 +2 25544 51.6400 208.5000 0007417 35.0000 325.0000 15.49000000000000'::tle; + +-- Or from separate line columns: +SELECT tle_from_lines(line1, line2) FROM raw_tles; +``` + +Accessors: `tle_epoch(tle) → float8` (Julian date), `tle_norad_id(tle) → int4`, `tle_inclination(tle) → float8` (degrees), `tle_eccentricity(tle) → float8`, `tle_raan(tle) → float8` (degrees), `tle_arg_perigee(tle) → float8` (degrees), `tle_mean_anomaly(tle) → float8` (degrees), `tle_mean_motion(tle) → float8` (rev/day), `tle_bstar(tle) → float8` (1/earth-radii), `tle_period(tle) → float8` (minutes), `tle_age(tle, timestamptz) → float8` (days), `tle_perigee(tle) → float8` (km), `tle_apogee(tle) → float8` (km), `tle_intl_desig(tle) → text` (COSPAR ID). + +### eci_position (48 bytes) + +Earth-Centered Inertial position and velocity in TEME frame. + +```sql +-- Output format: (x, y, z, vx, vy, vz) in km and km/s +-- Example: (4283.007,-2459.213,4717.924,3.837,5.662,-2.969) +``` + +Accessors: `eci_x`, `eci_y`, `eci_z` (km), `eci_vx`, `eci_vy`, `eci_vz` (km/s), `eci_speed(eci_position) → float8` (km/s), `eci_altitude(eci_position) → float8` (km, approximate geocentric). + +### geodetic (24 bytes) + +WGS-84 latitude, longitude, altitude. + +```sql +-- Output format: (lat_deg, lon_deg, alt_km) +-- Example: (42.3601,-71.0589,408.123) +``` + +Accessors: `geodetic_lat`, `geodetic_lon` (degrees), `geodetic_alt` (km). + +### topocentric (32 bytes) + +Observer-relative azimuth, elevation, range, range rate. + +```sql +-- Output format: (azimuth_deg, elevation_deg, range_km, range_rate_km_s) +-- Example: (185.234,45.678,1234.56,-2.345) +``` + +Accessors: `topo_azimuth` (degrees, 0=N 90=E 180=S 270=W), `topo_elevation` (degrees, 0=horizon 90=zenith), `topo_range` (km), `topo_range_rate` (km/s, positive=receding). + +### observer (24 bytes) + +Ground station location. Flexible text input. + +```sql +-- Multiple input formats: +SELECT '40.0N 105.3W 1655m'::observer; -- DMS with cardinal directions +SELECT '40.0 -105.3 1655m'::observer; -- Decimal degrees (negative=W/S) +SELECT '40.0N 105.3W'::observer; -- Altitude defaults to 0m + +-- Programmatic construction: +SELECT observer_from_geodetic(40.0, -105.3, 1655.0); -- (lat_deg, lon_deg, alt_m) +``` + +Accessors: `observer_lat` (degrees, +N), `observer_lon` (degrees, +E), `observer_alt` (meters). + +### pass_event (48 bytes) + +Satellite pass visibility window with AOS/MAX/LOS. + +```sql +-- Output format: (aos_time, max_el_time, los_time, max_el_deg, aos_az_deg, los_az_deg) +``` + +Accessors: `pass_aos_time`, `pass_max_el_time`, `pass_los_time` (timestamptz), `pass_max_elevation` (degrees), `pass_aos_azimuth`, `pass_los_azimuth` (degrees), `pass_duration(pass_event) → interval`. + +### heliocentric (24 bytes) + +Ecliptic J2000 position in AU. + +```sql +-- Output format: (x_au, y_au, z_au) +-- Example: (0.983271,-0.182724,0.000021) +``` + +Accessors: `helio_x`, `helio_y`, `helio_z` (AU), `helio_distance(heliocentric) → float8` (AU). + +### orbital_elements (72 bytes) + +Classical Keplerian elements for comets and asteroids. + +```sql +-- Text I/O format: (epoch_jd, q_au, e, inc_deg, omega_deg, Omega_deg, tp_jd, H, G) +-- Example: (2460200.5,1.0123,0.2156,10.587,72.891,80.329,2460180.5,15.2,0.15) + +-- From MPC MPCORB.DAT: +SELECT oe_from_mpc('00001 3.52 0.15 K249V 14.81198 ...fixed-width MPC line...'); +``` + +Accessors: `oe_epoch` (JD), `oe_perihelion` (AU), `oe_eccentricity`, `oe_inclination` (degrees), `oe_arg_perihelion` (degrees), `oe_raan` (degrees), `oe_tp` (JD), `oe_h_mag` (NaN if unknown), `oe_g_slope` (NaN if unknown), `oe_semi_major_axis` (AU, NULL if e≥1), `oe_period_years` (NULL if e≥1). + +### observer_window (composite) + +Query parameter bundle for SP-GiST visibility cone operator. + +```sql +-- Constructed inline as a ROW: +SELECT * FROM satellites WHERE elements &? ROW( + '40.0N 105.3W 1655m'::observer, + '2024-01-01'::timestamptz, + '2024-01-02'::timestamptz, + 10.0 -- min_elevation_degrees +)::observer_window; +``` + +Fields: `obs` (observer), `t_start` (timestamptz), `t_end` (timestamptz), `min_el` (float8, degrees). + +## Body IDs + +### Planets (VSOP87 convention) + +| ID | Body | ID | Body | +|----|---------|----|---------| +| 0 | Sun | 5 | Jupiter | +| 1 | Mercury | 6 | Saturn | +| 2 | Venus | 7 | Uranus | +| 3 | Earth | 8 | Neptune | +| 4 | Mars | 10 | Moon | + +### Galilean moons (0–3) + +0=Io, 1=Europa, 2=Ganymede, 3=Callisto + +### Saturn moons (0–7) + +0=Mimas, 1=Enceladus, 2=Tethys, 3=Dione, 4=Rhea, 5=Titan, 6=Iapetus, 7=Hyperion + +### Uranus moons (0–4) + +0=Miranda, 1=Ariel, 2=Umbriel, 3=Titania, 4=Oberon + +### Mars moons (0–1) + +0=Phobos, 1=Deimos + +## Functions by Domain + +### Satellite — SGP4/SDP4 Propagation (22 functions) + +``` +sgp4_propagate(tle, timestamptz) → eci_position IMMUTABLE +sgp4_propagate_safe(tle, timestamptz) → eci_position IMMUTABLE -- NULL on error +sgp4_propagate_series(tle, start, end, step) → SETOF (t, x,y,z, vx,vy,vz) IMMUTABLE +tle_distance(tle, tle, timestamptz) → float8 IMMUTABLE -- km between two TLEs + +eci_to_geodetic(eci_position, timestamptz) → geodetic IMMUTABLE +eci_to_topocentric(eci_position, observer, timestamptz) → topocentric IMMUTABLE +subsatellite_point(tle, timestamptz) → geodetic IMMUTABLE +ground_track(tle, start, end, step) → SETOF (t, lat, lon, alt) IMMUTABLE + +observe(tle, observer, timestamptz) → topocentric IMMUTABLE -- propagate + observe in one call +observe_safe(tle, observer, timestamptz) → topocentric IMMUTABLE -- NULL on error + +next_pass(tle, observer, timestamptz) → pass_event STABLE -- searches up to 7 days +predict_passes(tle, observer, start, end, min_el DEFAULT 0.0) → SETOF pass_event STABLE +pass_visible(tle, observer, start, end) → boolean STABLE + +tle_from_lines(text, text) → tle IMMUTABLE +observer_from_geodetic(lat_deg, lon_deg, alt_m DEFAULT 0.0) → observer IMMUTABLE +``` + +TLE accessors (15): `tle_epoch`, `tle_norad_id`, `tle_inclination`, `tle_eccentricity`, `tle_raan`, `tle_arg_perigee`, `tle_mean_anomaly`, `tle_mean_motion`, `tle_bstar`, `tle_period`, `tle_age`, `tle_perigee`, `tle_apogee`, `tle_intl_desig`, `tle_from_lines`. + +### Solar System — VSOP87 + ELP2000-82B (5 functions) + +``` +planet_heliocentric(body_id int4, timestamptz) → heliocentric IMMUTABLE -- IDs 0-8 +planet_observe(body_id int4, observer, timestamptz) → topocentric IMMUTABLE -- IDs 1-8 +sun_observe(observer, timestamptz) → topocentric IMMUTABLE +moon_observe(observer, timestamptz) → topocentric IMMUTABLE +``` + +### Planetary Moons (4 functions) + +``` +galilean_observe(moon_id int4, observer, timestamptz) → topocentric IMMUTABLE -- L1.2 theory, IDs 0-3 +saturn_moon_observe(moon_id int4, observer, timestamptz) → topocentric IMMUTABLE -- TASS 1.7, IDs 0-7 +uranus_moon_observe(moon_id int4, observer, timestamptz) → topocentric IMMUTABLE -- GUST86, IDs 0-4 +mars_moon_observe(moon_id int4, observer, timestamptz) → topocentric IMMUTABLE -- MarsSat, IDs 0-1 +``` + +### Stars (2 functions) + +``` +star_observe(ra_hours float8, dec_degrees float8, observer, timestamptz) → topocentric IMMUTABLE +star_observe_safe(ra_hours float8, dec_degrees float8, observer, timestamptz) → topocentric IMMUTABLE -- NULL on error +``` + +RA in hours [0,24), Dec in degrees [-90,90]. Range returned as 0 (infinite distance). + +### Comets & Asteroids — Keplerian + MPC (5 functions) + +``` +kepler_propagate(q_au, eccentricity, inc_deg, arg_peri_deg, raan_deg, perihelion_jd, timestamptz) → heliocentric IMMUTABLE +comet_observe(q_au, e, inc, omega, Omega, tp_jd, earth_x, earth_y, earth_z, observer, timestamptz) → topocentric IMMUTABLE +oe_from_mpc(text) → orbital_elements IMMUTABLE -- parse MPC MPCORB.DAT line +small_body_heliocentric(orbital_elements, timestamptz) → heliocentric IMMUTABLE +small_body_observe(orbital_elements, observer, timestamptz) → topocentric IMMUTABLE -- auto-fetches Earth via VSOP87 +``` + +orbital_elements accessors (11): `oe_epoch`, `oe_perihelion`, `oe_eccentricity`, `oe_inclination`, `oe_arg_perihelion`, `oe_raan`, `oe_tp`, `oe_h_mag`, `oe_g_slope`, `oe_semi_major_axis`, `oe_period_years`. + +### Jupiter Radio (3 functions) + +``` +io_phase_angle(timestamptz) → float8 IMMUTABLE -- degrees [0,360) +jupiter_cml(observer, timestamptz) → float8 IMMUTABLE -- CML III degrees [0,360) +jupiter_burst_probability(io_phase_deg, cml_deg) → float8 IMMUTABLE -- 0-1 probability +``` + +### Interplanetary Transfers — Lambert Solver (2 functions) + +``` +lambert_transfer(dep_body int4, arr_body int4, dep_time, arr_time) + → (c3_departure, c3_arrival, v_inf_departure, v_inf_arrival, tof_days, transfer_sma) IMMUTABLE +lambert_c3(dep_body int4, arr_body int4, dep_time, arr_time) → float8 IMMUTABLE -- departure C3 only, for pork chop plots +``` + +Body IDs 1–8 (Mercury–Neptune). C3 in km²/s², v_inf in km/s, TOF in days, SMA in AU. + +### DE Ephemeris — Optional High-Precision (11 functions) + +All _de() functions fall back to VSOP87/ELP2000-82B when DE is unavailable. All STABLE (external file dependency). + +``` +planet_heliocentric_de(body_id int4, timestamptz) → heliocentric STABLE +planet_observe_de(body_id int4, observer, timestamptz) → topocentric STABLE +sun_observe_de(observer, timestamptz) → topocentric STABLE +moon_observe_de(observer, timestamptz) → topocentric STABLE +lambert_transfer_de(dep_body, arr_body, dep_time, arr_time) → RECORD STABLE +lambert_c3_de(dep_body, arr_body, dep_time, arr_time) → float8 STABLE +galilean_observe_de(moon_id, observer, timestamptz) → topocentric STABLE +saturn_moon_observe_de(moon_id, observer, timestamptz) → topocentric STABLE +uranus_moon_observe_de(moon_id, observer, timestamptz) → topocentric STABLE +mars_moon_observe_de(moon_id, observer, timestamptz) → topocentric STABLE +pg_orrery_ephemeris_info() → (provider, file_path, start_jd, end_jd, version, au_km) STABLE +``` + +Configure: `ALTER SYSTEM SET pg_orrery.ephemeris_path = '/path/to/de441.bin'; SELECT pg_reload_conf();` + +### Orbit Determination (5 functions) + +All return: `(fitted_tle, iterations, rms_final, rms_initial, status, condition_number, covariance, nstate)`. All STABLE. + +``` +tle_from_eci(positions eci_position[], times timestamptz[], seed tle DEFAULT NULL, + fit_bstar bool DEFAULT false, max_iter int4 DEFAULT 15, weights float8[] DEFAULT NULL) → RECORD + +tle_from_topocentric(observations topocentric[], times timestamptz[], obs observer, + seed DEFAULT NULL, fit_bstar DEFAULT false, max_iter DEFAULT 15, + fit_range_rate DEFAULT false, weights DEFAULT NULL) → RECORD + +tle_from_topocentric(observations topocentric[], times timestamptz[], + observers observer[], observer_ids int4[], -- multi-observer variant + seed DEFAULT NULL, fit_bstar DEFAULT false, max_iter DEFAULT 15, + fit_range_rate DEFAULT false, weights DEFAULT NULL) → RECORD + +tle_from_angles(ra_hours float8[], dec_degrees float8[], times timestamptz[], obs observer, + seed DEFAULT NULL, fit_bstar DEFAULT false, max_iter DEFAULT 15, weights DEFAULT NULL) → RECORD + +tle_from_angles(ra_hours float8[], dec_degrees float8[], times timestamptz[], + observers observer[], observer_ids int4[], -- multi-observer variant + seed DEFAULT NULL, fit_bstar DEFAULT false, max_iter DEFAULT 15, weights DEFAULT NULL) → RECORD + +tle_fit_residuals(fitted tle, positions eci_position[], times timestamptz[]) + → SETOF (t, dx_km, dy_km, dz_km, pos_err_km) IMMUTABLE +``` + +## Operators & Indexes + +### GiST — tle_ops (DEFAULT for type tle) + +```sql +CREATE INDEX ON satellites USING gist (elements); +``` + +| Operator | Meaning | Usage | +|----------|---------|-------| +| `&&` | Orbital key overlap (altitude band AND inclination range) | `WHERE a.elements && b.elements` | +| `<->` | 2-D orbital distance (km) — L2 norm of altitude gap + inclination gap | `ORDER BY elements <-> ref_tle LIMIT 10` | + +### SP-GiST — tle_spgist_ops (opt-in) + +```sql +CREATE INDEX ON satellites USING spgist (elements tle_spgist_ops); +``` + +| Operator | Meaning | Usage | +|----------|---------|-------| +| `&?` | Visibility cone check — could satellite be visible from observer? | `WHERE elements &? ROW(obs, t0, t1, 10.0)::observer_window` | + +SP-GiST is a 2-level orbital trie (SMA → inclination) with query-time RAAN filter. Returns a conservative superset — survivors need `predict_passes()` for ground truth. + +## Common Query Patterns + +### Observe a satellite + +```sql +SELECT topo_elevation(observe(elements, '40.0N 105.3W 1655m'::observer, NOW())) +FROM satellites WHERE name = 'ISS'; +``` + +### Batch propagation over a catalog + +```sql +SELECT name, + topo_elevation(observe_safe(elements, '40.0N 105.3W'::observer, NOW())) AS el +FROM satellites +WHERE topo_elevation(observe_safe(elements, '40.0N 105.3W'::observer, NOW())) > 10; +``` + +### Predict passes for one satellite + +```sql +SELECT pass_aos_time(p), pass_max_elevation(p), pass_duration(p) +FROM satellites, + LATERAL predict_passes(elements, '40.0N 105.3W 1655m'::observer, + NOW(), NOW() + '3 days'::interval, 10.0) AS p +WHERE name = 'ISS'; +``` + +### SP-GiST accelerated pass prediction + +```sql +SELECT s.name, p.* +FROM satellites s, + LATERAL predict_passes(s.elements, '40.0N 105.3W 1655m'::observer, + NOW(), NOW() + '1 day'::interval, 10.0) AS p +WHERE s.elements &? ROW( + '40.0N 105.3W 1655m'::observer, NOW(), NOW() + '1 day'::interval, 10.0 +)::observer_window; +``` + +### Observe a planet + +```sql +SELECT topo_azimuth(planet_observe(4, '40.0N 105.3W'::observer, NOW())) AS mars_az, + topo_elevation(planet_observe(4, '40.0N 105.3W'::observer, NOW())) AS mars_el; +``` + +### Tonight's visible planets + +```sql +SELECT body_name, topo_elevation(obs) AS el, topo_azimuth(obs) AS az +FROM (VALUES (1,'Mercury'),(2,'Venus'),(4,'Mars'),(5,'Jupiter'),(6,'Saturn')) AS p(id, body_name), + LATERAL planet_observe(p.id, '40.0N 105.3W'::observer, NOW()) AS obs +WHERE topo_elevation(obs) > 0; +``` + +### GiST conjunction screening + +```sql +SELECT a.name, b.name, + tle_distance(a.elements, b.elements, NOW()) AS dist_km +FROM satellites a, satellites b +WHERE a.id < b.id + AND a.elements && b.elements + AND tle_distance(a.elements, b.elements, NOW()) < 50; +``` + +### Observe a comet/asteroid from MPC data + +```sql +-- From orbital_elements type: +SELECT topo_elevation(small_body_observe(oe, '40.0N 105.3W'::observer, NOW())) +FROM asteroids WHERE name = 'Ceres'; + +-- Bulk MPC import: +COPY mpc_raw(line) FROM '/path/to/MPCORB.DAT'; +INSERT INTO asteroids (name, oe) +SELECT substring(line FROM 1 FOR 7), oe_from_mpc(line) FROM mpc_raw; +``` + +### Lambert transfer — Earth to Mars + +```sql +SELECT * FROM lambert_transfer(3, 4, + '2026-07-01'::timestamptz, + '2027-01-15'::timestamptz); +-- Returns: c3_departure, c3_arrival, v_inf_departure, v_inf_arrival, tof_days, transfer_sma +``` + +### Pork chop plot grid + +```sql +SELECT dep, arr, lambert_c3(3, 4, dep, arr) AS c3 +FROM generate_series('2026-01-01'::timestamptz, '2026-12-01', '10 days') AS dep, + generate_series('2026-07-01'::timestamptz, '2027-06-01', '10 days') AS arr; +``` + +### Jupiter radio burst prediction + +```sql +SELECT io_phase_angle(t) AS io_phase, + jupiter_cml('40.0N 105.3W'::observer, t) AS cml, + jupiter_burst_probability(io_phase_angle(t), + jupiter_cml('40.0N 105.3W'::observer, t)) AS prob +FROM generate_series(NOW(), NOW() + '24 hours', '15 minutes') AS t +WHERE jupiter_burst_probability(io_phase_angle(t), + jupiter_cml('40.0N 105.3W'::observer, t)) > 0.3; +``` + +### Orbit determination from observations + +```sql +SELECT (tle_from_eci( + ARRAY[eci1, eci2, eci3, eci4, eci5], + ARRAY[t1, t2, t3, t4, t5] +)).* +-- Returns: fitted_tle, iterations, rms_final, rms_initial, status, condition_number, covariance, nstate +``` + +## Error Handling + +### _safe() variants + +`sgp4_propagate_safe()`, `observe_safe()`, `star_observe_safe()` return NULL on error instead of raising exceptions. Use for batch queries over potentially invalid data. + +### SGP4 error codes (raised by non-_safe functions) + +| Code | Meaning | +|------|---------| +| -1 | Nearly parabolic orbit | +| -2 | Negative semi-major axis (decayed) | +| -3 | Orbit within Earth radius (continues with NOTICE) | +| -4 | Orbit within Earth radius (continues with NOTICE) | +| -5 | Negative mean motion | +| -6 | Kepler solver convergence failure | + +### Input validation errors + +- Lambert: same-body check, arrival before departure, invalid body_id (not 1–8) +- Stars: RA outside [0,24), Dec outside [-90,90] +- Comets: negative perihelion distance +- Observer: invalid coordinate format + +## Key Constants + +### WGS-72 (SGP4 propagation only) + +``` +mu = 398600.8 km³/s² +ae = 6378.135 km +J2 = 0.001082616 +ke = 0.0743669161331734132 min⁻¹ +``` + +### WGS-84 (coordinate output only) + +``` +a = 6378.137 km +f = 1/298.257223563 +``` + +### Astronomical + +``` +AU = 149597870.7 km (IAU 2012) +Gauss k = 0.01720209895 AU^(3/2)/day +Obliquity J2000 = 23.4392911° +J2000 epoch = JD 2451545.0 (2000 Jan 1.5 TT) +``` + +### Critical rule + +TLEs are fitted against WGS-72 constants. Propagation MUST use WGS-72. Coordinate output uses WGS-84. Never mix. This is handled internally — all pg_orrery functions use the correct constants automatically. diff --git a/docs/public/llms.txt b/docs/public/llms.txt new file mode 100644 index 0000000..abd15e1 --- /dev/null +++ b/docs/public/llms.txt @@ -0,0 +1,66 @@ +# pg_orrery + +> Celestial mechanics types and functions for PostgreSQL. Native C extension with 82 SQL functions, 8 custom types, GiST/SP-GiST indexing. Covers satellites (SGP4/SDP4), planets (VSOP87), Moon (ELP2000-82B), 19 planetary moons, stars, comets, asteroids (MPC catalog), Jupiter radio bursts, orbit determination, and interplanetary Lambert transfers. Optional JPL DE440/441 ephemeris for sub-arcsecond accuracy. + +- [Source code](https://git.supported.systems/warehack.ing/pg_orrery) +- [Full LLM reference](https://pg-orrery.warehack.ing/llms-full.txt): All function signatures, types, body IDs, operators, and query patterns inline + +## Getting Started + +- [What is pg_orrery?](https://pg-orrery.warehack.ing/getting-started/what-is-pg-orrery/): Overview — the "PostGIS for space" analogy, domain coverage, design philosophy +- [Installation](https://pg-orrery.warehack.ing/getting-started/installation/): Build from source with PGXS or run via Docker (PostgreSQL 14–18) +- [Quick Start](https://pg-orrery.warehack.ing/getting-started/quick-start/): First queries — observe the ISS, track planets, predict passes + +## Guides + +- [Tracking Satellites](https://pg-orrery.warehack.ing/guides/tracking-satellites/): SGP4/SDP4 propagation, TLE parsing, batch observation over catalogs +- [Observing the Solar System](https://pg-orrery.warehack.ing/guides/observing-solar-system/): VSOP87 planets, ELP2000-82B Moon, Sun — topocentric observation from SQL +- [Cosmic Queries Cookbook](https://pg-orrery.warehack.ing/guides/cosmic-queries/): 9 cross-domain SQL recipes combining satellites, planets, moons, and stars +- [Planetary Moon Tracking](https://pg-orrery.warehack.ing/guides/planetary-moons/): L1.2 Galilean, TASS17 Saturn, GUST86 Uranus, MarsSat Mars moon theories +- [Star Catalogs in SQL](https://pg-orrery.warehack.ing/guides/star-catalogs/): J2000 coordinates, IAU 1976 precession, batch star observation +- [Comet & Asteroid Tracking](https://pg-orrery.warehack.ing/guides/comets-asteroids/): Keplerian propagation, MPC MPCORB.DAT import, orbital_elements type +- [Jupiter Radio Burst Prediction](https://pg-orrery.warehack.ing/guides/jupiter-radio-bursts/): Io phase angle, CML System III, Carr source region probability +- [Interplanetary Trajectories](https://pg-orrery.warehack.ing/guides/interplanetary-trajectories/): Lambert transfer solver, pork chop plots, C3 energy grids +- [Conjunction Screening](https://pg-orrery.warehack.ing/guides/conjunction-screening/): GiST-indexed altitude/inclination overlap, batch distance computation +- [JPL DE Ephemeris](https://pg-orrery.warehack.ing/guides/de-ephemeris/): Optional DE440/441 binary reader for sub-arcsecond planetary positions +- [Orbit Determination](https://pg-orrery.warehack.ing/guides/orbit-determination/): TLE fitting from ECI, topocentric, and angles-only observations +- [Satellite Pass Prediction](https://pg-orrery.warehack.ing/guides/pass-prediction/): AOS/TCA/LOS computation, visibility windows, minimum elevation filter +- [Building TLE Catalogs](https://pg-orrery.warehack.ing/guides/catalog-management/): CelesTrak/Space-Track import, catalog maintenance, bulk loading + +## Workflow Translation + +- [From Skyfield to SQL](https://pg-orrery.warehack.ing/workflow/from-skyfield/): Side-by-side migration from Python Skyfield to pg_orrery SQL +- [From JPL Horizons to SQL](https://pg-orrery.warehack.ing/workflow/from-jpl-horizons/): Replacing Horizons web API queries with pg_orrery functions +- [From GMAT to SQL](https://pg-orrery.warehack.ing/workflow/from-gmat/): Mission planning workflows translated to SQL +- [From Radio Jupiter Pro to SQL](https://pg-orrery.warehack.ing/workflow/from-radio-jupiter-pro/): Jupiter radio burst prediction comparison +- [From find_orb to SQL](https://pg-orrery.warehack.ing/workflow/from-find-orb/): Orbit determination comparison with Bill Gray's find_orb +- [From Poliastro to SQL](https://pg-orrery.warehack.ing/workflow/from-poliastro/): Lambert transfers and orbital maneuvers comparison +- [The SQL Advantage](https://pg-orrery.warehack.ing/workflow/sql-advantage/): Why database-native celestial mechanics vs. standalone tools + +## Reference + +- [Types](https://pg-orrery.warehack.ing/reference/types/): 8 fixed-size types — tle (112B), eci_position (48B), geodetic (24B), topocentric (32B), observer (24B), pass_event (48B), heliocentric (24B), orbital_elements (72B), plus observer_window composite +- [Functions: Satellite](https://pg-orrery.warehack.ing/reference/functions-satellite/): 22 functions — SGP4/SDP4 propagation, coordinate transforms, pass prediction, observation +- [Functions: Solar System](https://pg-orrery.warehack.ing/reference/functions-solar-system/): VSOP87 planets, Sun, Moon observation and heliocentric positions +- [Functions: Moons](https://pg-orrery.warehack.ing/reference/functions-moons/): Galilean, Saturn, Uranus, Mars moon observation via analytical theories +- [Functions: Stars & Comets](https://pg-orrery.warehack.ing/reference/functions-stars-comets/): Star observation, Keplerian propagation, comet/asteroid observation, MPC parsing, orbital_elements functions +- [Functions: Radio](https://pg-orrery.warehack.ing/reference/functions-radio/): Jupiter decametric radio burst prediction — Io phase, CML, burst probability +- [Functions: Transfers](https://pg-orrery.warehack.ing/reference/functions-transfers/): Lambert transfer solver for interplanetary trajectory design +- [Functions: DE Ephemeris](https://pg-orrery.warehack.ing/reference/functions-de/): Optional JPL DE440/441 variants of all observation functions +- [Functions: Orbit Determination](https://pg-orrery.warehack.ing/reference/functions-od/): TLE fitting from ECI, topocentric, and angles-only observations +- [Operators & Indexes](https://pg-orrery.warehack.ing/reference/operators-gist/): GiST (&&, <->) and SP-GiST (&?) operator classes for orbital indexing +- [Body ID Reference](https://pg-orrery.warehack.ing/reference/body-ids/): Planet IDs 0–10, Galilean 0–3, Saturn 0–7, Uranus 0–4, Mars 0–1 +- [Constants & Accuracy](https://pg-orrery.warehack.ing/reference/constants-accuracy/): WGS-72/WGS-84/IAU constants, accuracy budgets per theory + +## Architecture + +- [Design Principles](https://pg-orrery.warehack.ing/architecture/design-principles/): Hamilton's Development Before the Fact methodology applied to a PG extension +- [Constant Chain of Custody](https://pg-orrery.warehack.ing/architecture/constant-chain-of-custody/): Why WGS-72 for propagation, WGS-84 for output — and the consequences of mixing them +- [Observation Pipeline](https://pg-orrery.warehack.ing/architecture/observation-pipeline/): From orbital elements through frame rotation to observer-relative coordinates +- [Theory-to-Code Mapping](https://pg-orrery.warehack.ing/architecture/theory-to-code/): Each source paper mapped to its C implementation file and SQL function +- [Memory & Thread Safety](https://pg-orrery.warehack.ing/architecture/memory-thread-safety/): palloc/pfree, PARALLEL SAFE, no global mutable state, per-backend DE handles +- [SGP4 Integration](https://pg-orrery.warehack.ing/architecture/sgp4-integration/): Vendored Bill Gray sat_code, .cpp→.c rename, Vallado verification + +## Optional + +- [Benchmarks](https://pg-orrery.warehack.ing/performance/benchmarks/): Timing data — 12k TLEs in 17ms, 66k catalog operations, GiST/SP-GiST index performance