Atmospheric Refraction Analysis — Pikes Peak / 39 Aquarii¶
Event: Stellar occultation of 39 Aquarii behind Pikes Peak · 2025-01-27 18:43 UTC−7
Observer: Dr. Heffron · 38.9997°N, 104.497°W · 2073 m
Atmosphere: Grand Junction radiosonde · 2025-01-28 UTC
Software: refraction.py · Ciddor refractive-index model + WGS-84 spherical ray tracing
Intent of Below Analysis¶
Investigate the software provided by Astronomy Live to apply ray traced per globe model assumptions. Main purpose was to understand clearly the globe claim.
No conlcusions to be drawn here, this document will ultimately be provided as an appendix and methodolgy will be used for further anaylsis within a wider project.
Observer 2073 m -> 787.8 mbar T = -0.2 C Pikes Peak 4300 m -> 592.7 mbar Balloon data: 6369 levels, 1474 - 33435 m dms test: +02°19'04.44"
=== Pikes Peak / 39 Aquarii Full Refraction Results === Ground distance : 50.65 km Slant range : 50.72 km Angular sep : phi = +00°27'16.59" Peak geom elev : +02°17'20.60" Peak app elev : +02°19'04.39" Peak uplift : 1.730 arcmin Star geom elev : +02°05'44.47" Star uplift : 13.332 arcmin
Section 1 · Software Overview¶
refraction.py calculates atmospheric refraction corrections for stellar occultation observations.
Physics¶
Starlight from a distant point source travels in a curved path, bending downward through the atmosphere as it passes through layers of increasing air density. At the observer, the tangent drawn to the ray at that endpoint points to the star's apparent position — which is higher than the true geometric position. That angular difference is the uplift.
Star (at infinity)
| geometric direction (straight line in vacuum)
~~~~~|~~~~~~~~~~~~~ top of atmosphere
| ray curves downward through density gradient
~~~~~|~~~~~~~~~~~~~ ground level
/ <- tangent at observer = apparent direction (higher)
[Observer]
The software pipeline:
- Load a real atmospheric profile (T, P, RH vs altitude) from the balloon sounding
- Calculate refractive index n(z) at every altitude using the Ciddor (1996) model
- Trace a ray through the atmosphere using Snell's law in spherical coordinates:
n(r)·r·cos(α) = b(constant impact parameter) - Return the uplift — how many arcminutes the atmosphere shifts the apparent position
For this analysis: Pikes Peak is the blocking object and 39 Aquarii is the star being occulted.
Section 2 · Function Reference¶
Each group below describes what the functions do, followed by a live demonstration using the Pikes Peak observation inputs.
Group A — Interpolation¶
| Function | Purpose |
|---|---|
interpolated_pressure_to_alt(baropress, groundtruth) |
Convert a pressure value (hPa) to altitude (m) by linear interpolation through the balloon profile |
interpolated_at_altitude(alt_m, groundtruth) |
Return any profile quantity (T, P, RH) at a given altitude by linear interpolation |
Both rely on the five global arrays populated by target_and_star_geometry_bundle. They are used throughout the atmosphere model to look up T, P, and RH during ray tracing.
Interpolated T and P at selected altitudes:
2073 m -> T = +4.3 C P = 790.47 hPa
3000 m -> T = -2.7 C P = 704.30 hPa
5000 m -> T = -20.2 C P = 542.20 hPa
10000 m -> T = -49.0 C P = 262.57 hPa
20000 m -> T = -59.9 C P = 54.60 hPa
Group B — Ciddor Refractive Index Model¶
| Function | Purpose |
|---|---|
ciddor_Z(T_k, p_pa, xw) |
Compressibility factor Z of air (non-ideal gas correction) |
ciddor(lambda_nm, t_c, p_pa, rh_percent, xc_ppm) |
Refractive index n of moist air at a given wavelength, T, P, humidity, and CO₂ |
The Ciddor (1996) model is the BIPM-recommended formula for air refractive index. At observer altitude n ≈ 1.000277; it approaches 1.0 at the top of the atmosphere. The gradient dn/dz drives refraction — light bends toward regions of higher n (denser, lower air).
At observer (2073 m): T=4.3 C P=790.5 hPa RH=19%
Ciddor n = 1.000225051 (n-1 = 225.05 ppm)
n(z) across altitudes:
2073 m n = 1.000225051 (n-1 = 225.05 ppm)
3000 m n = 1.000205720 (n-1 = 205.72 ppm)
5000 m n = 1.000169360 (n-1 = 169.36 ppm)
10000 m n = 1.000092553 (n-1 = 92.55 ppm)
20000 m n = 1.000020224 (n-1 = 20.22 ppm)
35000 m n = 1.000002359 (n-1 = 2.36 ppm)
Group C — WGS-84 Ellipsoid Geometry¶
| Function | Purpose |
|---|---|
wgs84_radii_of_curvature(lat_deg) |
Meridional (M) and normal (N) radii at a latitude |
wgs84_normal_section_radius(lat_deg, azimuth_deg) |
Earth radius along a specific azimuth — used for ground distance → arc angle |
wgs84_gauss_radius(lat_deg) |
Gaussian mean radius √(M·N) — used for star refraction |
haversine_central_angle_rad(...) |
Great-circle angle between two lat/lon points (spherical fallback) |
Earth is oblate — the local radius of curvature varies with latitude and azimuth. Using WGS-84 instead of a sphere changes ground distances by tens of metres over 50 km.
At latitude 38.9997 deg N: Meridional radius M = 6360.718 km Normal radius N = 6386.609 km Gauss radius sqrt(MN) = 6373.650 km Sphere reference = 6371.000 km WGS84 - sphere = 2650.4 m Ground distance observer -> peak: WGS-84 geodesic : 50.649 km Haversine : 50.551 km
Group D — Atmosphere Model (AmbianceAtmosphereWithRH)¶
AmbianceAtmosphereWithRH is the central atmosphere object used during ray tracing. For each queried altitude it:
- Retrieves T and P from the balloon profile (or ISO standard atmosphere above the balloon ceiling)
- Retrieves RH from the balloon profile (set to zero above ceiling)
- Calls
ciddor()to compute n - Caches the result at 50 m resolution to avoid recomputing during the ray stepping loop
Above 80 km it returns n = 1.0 (vacuum).
n(z) from AmbianceAtmosphereWithRH:
2073 m n = 1.000225051
3000 m n = 1.000205720
5000 m n = 1.000169360
10000 m n = 1.000092553
20000 m n = 1.000020224
35000 m n = 1.000001919
60000 m n = 1.000000070
79999 m n = 1.000000004
80000 m n = 1.000000000
Group E — Ray Tracing¶
| Function | Purpose |
|---|---|
_trace_to_radius(atm, b, observer_alt_m, ...) |
Step a ray outward from the observer until it reaches target radius r_target. Returns (φ, r, s, ok) — accumulated angle, final radius, path length, success flag |
_trace_infinite_exit_direction(...) |
Trace to the top of atmosphere and return the exit direction as a unit vector — that direction in vacuum is the geometric star position |
Snell's law in polar form — the impact parameter b is conserved:
b = n(r) · r · cos(α) (α = angle from local vertical)
Δr = Δs · sin(α)
Δφ = Δs · cos(α) / r
Impact parameter b = 6371940.551 m Ray hit at phi = +00°27'18.90" (target phi_t = +00°27'16.59") Path length s = 50.72 km Success = True
Group F — Apparent → Geometric (Stars at Infinity)¶
geometric_from_apparent_infinite(apparent_elev_deg, observer_lat_deg, observer_alt_m, settings)
For a star at infinite distance the function:
- Traces a ray outward from the observer in the apparent direction
- Records the ray direction in vacuum at the top of atmosphere
- Returns the geometric elevation — where the star truly is in the sky
This is the core correction applied when matching an observed star position to a catalogue.
Apparent elevation (Pikes Peak direction) : +02°19'04.39" Geometric star elevation : +02°05'44.47" Star uplift : 13.332 arcmin (matches pipeline star_uplift: 13.332 arcmin)
Group G — Full Pipeline¶
| Function | Purpose |
|---|---|
apparent_geometric_uplift_target_lla(...) |
For a finite target (peak, aircraft): uses bisection to find the apparent elevation angle whose traced ray lands at exactly the target's angular position φ_t. Returns apparent, geometric, uplift, ground distance, φ_t |
target_and_star_geometry_bundle(...) |
Sets global atmosphere arrays, calls the above, computes slant range via law of cosines, and calls geometric_from_apparent_infinite for the star. Returns the complete result set |
How apparent_geometric_uplift_target_lla Works¶
apparent_geometric_uplift_target_lla answers: "At what apparent angle must I aim my theodolite so a refracted ray lands on Pikes Peak?"
It does three things:
- Computes geometry — ground distance observer→peak (50.65 km), central angle φ_t, and
plane_geom(pure geometric elevation from coordinates, no atmosphere) - Runs a bisection — iterates over trial apparent angles α_app, tracing a refracted ray for each one, until it finds the α_app where the refracted ray arrives at exactly φ_t at radius R_earth + 4300 m
- Returns —
plane_app(the winning α_app),plane_geom, their difference (peak uplift 1.73 arcmin), ground distance, φ_t in degrees
plane_app is the bisection output (the answer). The bisection target is g(α_app) = φ_hit(α_app) − φ_t = 0, where φ_t is fixed.
What is φ_t?¶
φ_t is the central angle — the angle at Earth's centre subtended by the arc from observer to Pikes Peak:
φ_t = ground_distance / R_earth = 50,650 m / 6,385,560 m ≈ 0.007934 rad = +00°27'16.59"
In refraction.py's 2D spherical cross-section the observer sits at φ = 0 and the peak sits at φ = φ_t. The bisection tests: does this trial ray arrive at the right φ when it reaches r = R_earth + 4300 m?
Bisection step-by-step (real values from this run)¶
Setup:
- Geometric elevation (vacuum):
plane_geom= +02°17'20.60" - Initial bracket: lo = +01°47'20.60" (geometric − 0.5°), hi = +02°47'20.60" (geometric + 0.5°)
- g(lo) = +6.47 arcmin → ray overshoots (φ_hit > φ_t, the ray sweeps too far horizontally)
- g(hi) = −4.08 arcmin → ray undershoots (φ_hit < φ_t, too steep, not enough horizontal travel)
- Signs are opposite → bracket confirmed, bisection begins
How g(α_app) works: compute impact parameter b = n₀·r₀·cos(α_app), trace the ray in 50 m steps until it reaches r = R_earth + 4300 m, record the angular position φ_hit. Then g = φ_hit − φ_t.
| Iter | Trial angle α_app | g (arcsec) | Action |
|---|---|---|---|
| 1 | +02°17'20.60" (geom) | +17.6" | overshoots → raise lo |
| 2 | +02°32'20.60" | −124.1" | undershoots → lower hi |
| 3 | +02°24'50.60" | −56.2" | undershoots → lower hi |
| 4 | +02°21'05.60" | −20.1" | undershoots → lower hi |
| 5 | +02°19'13.10" | −1.5" | undershoots → lower hi |
| 6 | +02°18'16.85" | +8.0" | overshoots → raise lo |
| 7 | +02°18'44.98" | +3.3" | overshoots → raise lo |
| … | … | … | bracket halves each step |
| 30 | +02°19'04.39" | 0.000" | converged → plane_app |
Why lo moves up when g > 0: a positive g means the ray swept too far (φ_hit > φ_t) — the angle was too shallow, too much horizontal travel. The fix is to raise the lower bound and try a steeper angle.
Why hi moves down when g < 0: a negative g means the ray undershot (φ_hit < φ_t) — the angle was too steep, not enough horizontal travel. The fix is to lower the upper bound and try a shallower angle.
After 30 iterations the bracket width is 1° / 2³⁰ ≈ 0.000000001° ≈ 0.000003 arcsec — effectively machine precision.
Geometric vs apparent peak elevation:
+02°17'20.60"=plane_geom— geometric elevation of Pikes Peak, computed from coordinates alone (vacuum, no atmosphere)+02°19'04.39"=plane_app— apparent elevation you would actually observe with a theodolite — refraction bends the peak up 1.73 arcmin
The +02°19' is what the atmosphere makes it look like. The +02°17' is where it actually is geometrically. If you measured it with a physical theodolite, you would see +02°19'.
=== Full results summary === Ground dist 50.65 km Slant range 50.72 km Angular sep phi = +00°27'16.59" Peak geom +02°17'20.60" apparent +02°19'04.39" uplift 1.730 arcmin Star geom +02°05'44.47" uplift 13.332 arcmin
Section 2h · Apparent vs Geometric Star Position¶
target_and_star_geometry_bundle returns several elevation angles. It is important to be clear about which is which:
| Variable | Value | What it is |
|---|---|---|
plane_app |
+02°19'04" | Apparent elevation of Pikes Peak = apparent position of 39 Aquarii at occultation. The direction the observer looks to see both peak and star through the atmosphere. |
plane_geom |
+02°17'21" | True geometric elevation of Pikes Peak — where the summit truly is in vacuum. |
star_geom |
+02°05'44" | True geometric position of 39 Aquarii — where the star actually is in space, no atmosphere. |
star_uplift |
13.332 arcmin | plane_app − star_geom — total atmospheric refraction. |
peak_uplift |
1.730 arcmin | plane_app − plane_geom — refraction to the finite Pikes Peak summit. |
The apparent star position is plane_app, not a separate output. At the moment of occultation the star and the peak share the same apparent direction — that is the definition of occultation. refraction.py finds plane_app by bisecting rays until one lands on the summit, then derives star_geom by running the refraction correction in reverse for a star at infinity in that same direction.
Star uplift = plane_app − star_geom is the full atmospheric shift between where the star appears (+02°19'04") and where it truly is (+02°05'44").
39 Aquarii ICRS (J2000 / Simbad): RA 22h12m25.76s Dec -14d11m38.3s True geometric altitude — three independent methods: astropy (ICRS + WGS-84, vacuum) : +02°07'25.32" refraction.py (WGS-84 ray trace) : +02°05'44.47" GP dist / Gauss radius (spherical) : +02°08'12.49" astropy vs refraction.py : 1.68 arcmin astropy vs GP-dist approx : 0.79 arcmin Azimuth : +249°56'00.37"
Section 3 · Grand Junction Radiosonde Atmospheric Profile¶
Weather balloon data from Grand Junction, CO (2025-01-28 UTC) — the real atmospheric profile used for all refraction calculations.
The balloon ascended from ~1,474 m to ~33,435 m, measuring T, P, humidity at 6,369 levels.
Section 4 · Refractive Index Profile n(z)¶
n decreases monotonically with altitude as air density falls. The gradient dn/dz drives refraction: light bends toward regions of higher n (denser, lower air), which is downward — consistent with the physics in Section 1.
Below the balloon ceiling the profile uses measured T, P, RH. Above it falls back to the ISO standard atmosphere.
Section 4b · Raw Ciddor Values — Balloon Data Points¶
Layer model used by refraction.py: Concentric spherical shells (coincident spherical layer model). Each atmospheric layer is a spherical shell at constant radius r from Earth's centre. Snell's law takes the form:
b = n(r) · r · cos(α) = constant (impact parameter)
This is not a flat-stacked layer model (which would use n₁·sin(θ₁) = n₂·sin(θ₂) with horizontal planes). The spherical form correctly accounts for Earth's curvature over the ~50 km path from observer to Pikes Peak.
The plot below shows raw Ciddor n values computed directly from each balloon measurement level (6,369 points) vs the smooth interpolated curve used during ray tracing.
Section 5a · Full Ray Path — Observer to Balloon Ceiling¶
Traces the light ray from the observer all the way to the weather balloon data ceiling (~33,435 m) at the same apparent elevation angle as the Pikes Peak observation.
The two panels show:
- Left: cross-section of the ray path — refracted (Ciddor) vs vacuum straight line, with key altitude reference lines. The horizontal separation between the two rays at the ceiling quantifies total atmospheric deflection over the full path.
- Right: refractive index n(z) profile at 200 m steps — the density gradient the ray travels through. Steeper gradient = more bending per unit path length.
Path length : 438.0 km Horizontal extent : 437.2 km Launch angle : +02°19'04.39" Angle at ceiling : +83°59'32.71" Δ height (ref-vac) : 13741.9 m
Section 5b · Where Does refraction.py Calculate To?¶
refraction.py supports two distinct endpoint types, depending on the function called:
| Function | Target | Endpoint |
|---|---|---|
apparent_geometric_uplift_target_lla |
Finite target (e.g. Pikes Peak) | Bisects ray path to hit target at 4,300 m |
geometric_from_apparent_infinite |
Star at infinity | Traces ray to top of atmosphere (80,000 m), then projects to infinity |
39 Aquarii ............................. (infinity — direction only)
↑ ← geometric (vacuum) direction
80,000 m ─────────────────────────────── top of atmosphere ← ray exits here
│ ray bends through decreasing n(z); impact parameter b = n·r·cos(α) conserved
33,435 m ─────────────────────────────── balloon data ceiling
│ (above here: Ambiance ISO standard atmosphere, anchored to balloon surface)
│
4,300 m ─────────────────────────────── Pikes Peak summit ← finite target endpoint
2,073 m ─────────────────────────────── Observer
The plot below traces the full refracted ray from the observer to the 80,000 m boundary, then overlays the straight vacuum line pointing in the true geometric direction of 39 Aquarii (derived from the Star GP Distance in the observation spreadsheet). The gap between the two lines at any altitude is the cumulative effect of atmospheric refraction.
Refracted ray exit : x = 790.05 km y = 31.465 km (local Cartesian) Vacuum line at exit : y = 31.370 km Separation at exit : 95.2 m / 0.41 arcmin (chord) star_uplift (refraction.py): 13.332 arcmin
Section 5c · Bennett Reference Formula¶
The Bennett (1982) formula gives a fast analytic estimate of refraction using a standard atmosphere:
Standard refraction (arcmin):
$$R_0 = \frac{1}{\tan\!\left(H_2 + \dfrac{7.31}{H_2 + 4.4}\right)}$$
Improved correction (max error 0.015'):
$$R_{0,\text{imp}} = R_0 - 0.06 \cdot \sin(14.7 R_0 + 13)$$
Pressure/temperature correction (P in mbar, T in °C):
$$f = \frac{P}{1010} \cdot \frac{283}{273 + T} \qquad R = R_{0,\text{imp}} \times f$$
Standard conditions: P = 1010 mbar, T = 10 °C (f = 1).
Used here as a sanity check against refraction.py's full Ciddor ray-trace. Bennett assumes a standard atmosphere; small differences from the balloon-profile result are expected.
Bennett at apparent elev +02°19'04.39" : 13.643 arcmin
refraction.py star_uplift (same quantity) : 13.332 arcmin
Difference (standard vs balloon atmosphere) : 0.311 arcmin (2.3%)
Note: peak_uplift = 1.730 arcmin is the finite-target uplift to Pikes Peak summit,
not the star uplift. Bennett does not compute finite-target corrections.
Bennett at 1 deg : 19.68 arcmin
Bennett at 0.1 deg: 26.85 arcmin (near horizon)
Section 5d · BAA Article vs refraction.py — Contrast & Comparison¶
Source: britastro.org/2019/atmospheric-refraction
Shared Foundation¶
Both start from the same physics: Snell's law, light bending at density boundaries, and a pressure/temperature correction factor. The BAA's Sæmundsson formula and the Bennett formula used in Section 5c are the same class of solution — empirical closed-form approximations that assume a standard atmosphere.
1 — Atmospheric Profile¶
| BAA / Sæmundsson | refraction.py | |
|---|---|---|
| Profile source | Standard conditions (10°C, 101 kPa) | Real balloon sounding — 6,369 measured levels |
| Humidity | Ignored | Full water vapour via Ciddor (molar fraction xw) |
| CO₂ | Ignored | Variable ppm input |
| Profile updates | Fixed published table | Loaded fresh per observation |
The BAA explicitly states humidity has a small effect and can be ignored. The Ciddor model includes it because at low elevation angles over long paths the water vapour contribution accumulates.
2 — Refractive Index Formula¶
| BAA / Sæmundsson | refraction.py (Ciddor 1996) | |
|---|---|---|
| Method | Empirical polynomial fit | First-principles physics (BIPM reference standard) |
| Humidity | Excluded | Included via saturation vapour pressure & molar fractions |
| Wavelength | Not modelled | Any wavelength (default 550 nm green) |
| CO₂ correction | None | Explicit: ±0.534×10⁻⁶ per ppm offset from 450 ppm |
| Accuracy | ~1 arcmin | Sub-arcsecond |
3 — Layer Geometry (Key Difference)¶
The BAA describes discrete atmospheric layers — this implies flat stacked horizontal planes where Snell's law is applied at each flat interface:
n₁ · sin(θ₁) = n₂ · sin(θ₂) ← flat layer assumption
refraction.py uses coincident spherical shells — each layer is a sphere centred on Earth. The conserved quantity is the impact parameter:
b = n(r) · r · cos(α) = constant ← spherical Snell's law (refraction.py)
Over the 50 km path to Pikes Peak at 2.3° elevation, the flat model accumulates geometric error from Earth's curvature. Over the 435 km full path to the balloon ceiling this error grows substantially.
4 — Ray Tracing vs Closed Form¶
| BAA / Sæmundsson | refraction.py | |
|---|---|---|
| Method | Single formula, one evaluation | Numerical integration, 50 m steps |
| Path shape | Assumed (standard curve) | Actually computed from measured T/P/RH at every step |
| Finite targets | Not possible | Full bisection search to hit a specific peak altitude |
| Near-horizon validity | BAA notes "fails below ~20°" | Designed for 0–5° range |
The BAA article explicitly warns the simple formula breaks below 20°. The Pikes Peak observation is at +02°19'04" — squarely in the regime where only a full ray trace through a real atmosphere profile is trustworthy.
5 — Scope and Purpose¶
| BAA Article | refraction.py | |
|---|---|---|
| Target distance | Stars at infinity only | Stars (∞) and finite targets (peaks, aircraft) |
| Use case | General telescope pointing | Stellar occultation prediction |
| Earth model | Not addressed | WGS-84 ellipsoid (latitude-dependent radius) |
| Outputs | Uplift in arcmin (one number) | Apparent elev, geometric elev, uplift, slant range, ground distance |
6 — Numerical Cross-Check¶
The BAA table gives 28'59" (~29 arcmin) at the horizon under standard conditions. The code cell below computes all three methods side-by-side at matching angles and conditions to show where they agree and where they diverge.
=== Numerical Cross-Check: BAA/Saemundsson vs Bennett vs refraction.py ===
Elevation BAA Saemundsson Bennett refraction.py Notes
(std atm) (std atm) (balloon)
--------------------------------------------------------------------------------
+90°00'00.00" -0.002 arcmin -0.015' 0.000' Zenith
+30°00'00.00" 1.746 arcmin 1.680' 1.334' BAA table ref: 1 arcmin 45 arcsec
+10°00'00.00" 5.408 arcmin 5.332' 4.237'
+05°00'00.00" 9.674 arcmin 9.861' 7.848' BAA table ref: 9 arcmin 40 arcsec
+02°19'04.39" 15.754 arcmin 16.861' 13.332' Pikes Peak obs
+01°00'00.00" 21.744 arcmin 24.318' 18.982'
+00°30'00.00" 25.004 arcmin 28.696' 22.144'
+00°06'00.00" 28.126 arcmin 33.178' 24.958' Near horizon
Conditions:
BAA / Bennett standard : T = 10.0 C P = 101.0 kPa (1010 mbar)
refraction.py (balloon): T = -0.2 C P = 787.8 mbar (Grand Junction Jan 2025)
Key divergence at Pikes Peak (+02°19'04.39"):
Saemundsson (std atm) : 15.754 arcmin
refraction.py (balloon): 13.332 arcmin
Difference : 2.422 arcmin
BAA formula valid above ~20 deg; Pikes Peak obs at +02°19'04.39" is in the invalid range.
Section 6 · Refraction Uplift Curve — Bennett vs Ciddor Ray-Trace¶
Uplift vs apparent elevation across the full sky:
- Bennett — fast analytic, standard atmosphere with P/T correction at observer altitude
- refraction.py — full Ciddor model + ray tracing with actual balloon profile
The vertical dashed line marks the Pikes Peak observation angle.
Computing refraction.py uplift curve ... Done.
Section 7 · Observation Geometry — Pikes Peak / 39 Aquarii¶
Cross-section view showing the observer, Pikes Peak, and three key directions from the observer:
- Geometric elevation of Pikes Peak — the true line-of-sight in vacuum
- Apparent elevation — what the observer sees (shifted up by refraction)
- Star geometric elevation — where 39 Aquarii truly is after correcting for refraction
The refraction uplift determines whether the star was geometrically behind the peak at the moment of observation.
Section 7b · Forced Apparent Elevation — 2.52°¶
Same geometry diagram as Section 7 but with the apparent elevation forced to 2.52° instead of the occultation-derived plane_app. This shows what refraction.py computes when the star is observed 13 arcmin above the peak direction — i.e., the star is clearing the peak and is visible to the observer.
Forced apparent elevation : +02°31'12.00" Geometric elevation : +02°18'29.49" Star uplift : 12.709 arcmin Compare to occultation geometry: plane_app : +02°19'04.39" star_geom : +02°05'44.47" uplift : 13.332 arcmin
Section 8 · Export to HTML¶
Exports the two key charts as self-contained HTML files.
Each file embeds the full Plotly JS bundle — no server required for S3/CloudFront hosting.
section3_radiosonde_profile.html (4995 KB) section4_refractive_index.html (4741 KB) section4b_ciddor_raw.html (4893 KB) section5a_balloon_ceiling_ray.html (4852 KB) section5c_cartesian_80km.html (5365 KB) section6_uplift_curve.html (4743 KB) section7_geometry_diagram.html (4739 KB) section7b_geometry_forced.html (4740 KB) Exported 8 plots.