Computing Solar Eclipses — Research

Contact times, magnitude and position angles from Besselian elements

workingupdated 2026-09-15local-circumstancesbesseliancontactsmagnitudeobscurationposition-angle
  • The whole reduction is eight formulas. Project the observer onto the fundamental planefundamental planeThe plane through the Earth's centre perpendicular to the axis of the Moon's shadow. Its x axis lies in the equator pointing east, its y axis points north, and the shadow's cross-section on it is an exact circle. as (ξ,η,ζ)(\xi,\eta,\zeta) and subtract from the shadow-axis coordinates (x,y)(x,y) to get (u,v)(u,v). Shrink the shadow radii to the observer's plane with L=LζtanfL' = L - \zeta\tan f. Solve u2+v2=L2u^2+v^2 = L'^2 for the contacts and uu+vv=0uu'+vv'=0 for maximum eclipse. The 1961 Explanatory Supplement gives every one of them 1.
  • NASA's JavaScript Solar Eclipse Explorer (JSEX) is that method in 1200 lines of GPL code. Its program.js computes ρsinϕ\rho\sin\phi' with b/a=0.99664719b/a = 0.99664719 and a=6378140a = 6378140 m, and the hour angle as μλWΔT/13713.44\mu - \lambda_W - \Delta T/13713.44. It iterates each contact with a Newton step until the correction is below 10610^{-6} h, and reports P, V, altitude, azimuth, magnitude, obscuration and duration 2.
  • Magnitude has two branches. In the penumbra it is (L1m)/(L1+L2)(L_1'-m)/(L_1'+L_2'), the fraction of the solar diameter covered. Inside the umbra or antumbra it is (L1L2)/(L1+L2)(L_1'-L_2')/(L_1'+L_2'), the ratio of the apparent diameters. NASA tables and every code read here switch branches at m=|L2|m = |L_2'| 1 3.
  • Obscuration is a lens area, never a linear function of magnitude. With the solar radius as unit and ss the lunar radius, S=(s2A+BssinC)/πS' = (s^2 A + B - s\sin C)/\pi where AA, BB, CC are the angles of the triangle formed by the two centres and an intersection point 1. A 0.5 magnitude with equal radii hides about 39 per cent of the disc.
  • The position angle PP of a contact is tanP=u/v\tan P = u/v at the contact instant, measured eastward from the north point, with the sign of sinP\sin P reversed for the interior contacts of a total eclipse because L2<0L_2 < 0. The 1961 Supplement writes this angle QQ. The vertex angle is V=PCV = P - C with tanC=ξ/η\tan C = \xi/\eta the parallactic angle 1 4.
  • The direct numerical alternative needs no auxiliary angles. Tabulate u2+v2L2u^2+v^2-L^2 at equal time steps and inverse-interpolate its zero. The 1992 Explanatory Supplement recommends it as simpler and free of the constant-velocity assumption 5.
  • Nothing in this reduction knows about the lunar limb, refraction or the solar radius choice. Those enter through the elements (kk, the solar radius in L1L_1, L2L_2) and through post-corrections described in corrections-and-code.md.

The question. Given a published set of Besselian elements for one eclipse and an observer's geodetic latitude, longitude and height, what is the exact sequence of formulas for the site? The outputs wanted are the times of the four contacts and of maximum eclipse, the magnitude, the obscuration, the position and vertex angles of each contact, the Sun's altitude and azimuth, and the duration of totality or annularity. Which constants does each formulation fix, and where do the published implementations differ from the almanac text?

The pipeline for one observer

Given Besselian elements x,y,d,μ,L1,L2,tanf1,tanf2x, y, d, \mu, L_1, L_2, \tan f_1, \tan f_2 as polynomials in tt about t0t_0 in Terrestrial Time (TT)Terrestrial Time (TT)The uniform time scale of the ephemerides and of the Besselian elements, equal to TAI + 32.184 s. Older eclipse tables call it TDT, TD or Ephemeris Time (ET). Elements are computed in TT and converted to UT1 with ΔT before any Earth rotation is applied., the ΔT\Delta T they were computed with, and an observer (ϕ,λ,h)(\phi, \lambda, h):

  1. Observer constants. ρsinϕ\rho\sin\phi' and ρcosϕ\rho\cos\phi' from the geodetic latitude, the spheroid and the height 1.
  2. Hour angle. θ=μ(t)λ1.002738ΔT\theta = \mu(t) - \lambda - 1.002738\,\Delta T with west longitude positive 1.
  3. Fundamental-plane position. ξ\xi, η\eta, ζ\zeta and their rates ξ\xi', η\eta' 1.
  4. Relative coordinates. u=xξu = x - \xi, v=yηv = y - \eta, their rates, mm, nn, and the observer's-plane radii L1=L1ζtanf1L_1' = L_1 - \zeta\tan f_1, L2=L2ζtanf2L_2' = L_2 - \zeta\tan f_2 1.
  5. Maximum eclipse. Iterate tt(uu+vv)/n2t \leftarrow t - (uu' + vv')/n^2 to convergence 2.
  6. Eclipse type at the site. None if mL1m \ge L_1'. Partial if m<L1m < L_1'. Central if m<|L2|m < |L_2'|, total when L2<0L_2' < 0 and annular when L2>0L_2' > 0 2.
  7. Contacts. Roots of m(t)=L1(t)m(t) = L_1'(t) for C1 and C4 and of m(t)=|L2(t)|m(t) = |L_2'(t)| for C2 and C3, by the auxiliary-angle Newton step ttD/n2±Lcosψ/nt \leftarrow t - D/n^2 \pm L'\cos\psi/n or by bracketing and inverse interpolation 1 5.
  8. Magnitude. (L1m)/(L1+L2)(L_1' - m)/(L_1' + L_2') in the penumbra, (L1L2)/(L1+L2)(L_1' - L_2')/(L_1' + L_2') inside the umbra or antumbra 1 3.
  9. Obscuration. Lens area with s=(L1L2)/(L1+L2)s = (L_1' - L_2')/(L_1' + L_2'), S=(s2A+BssinC)/πS' = (s^2A + B - s\sin C)/\pi, or s2s^2 for annular and 1 for total 1.
  10. Position angles. At each contact P=atan2(u,v)P = \text{atan2}(u, v) with the sign reversed for the interior contacts of a total eclipse, and V=PCV = P - C with tanC=ξ/η\tan C = \xi/\eta 1.
  11. Altitude and azimuth from dd, θ\theta, ϕ\phi. Flag or replace contacts below the horizon by sunrise or sunset 2.
  12. Duration tC3tC2t_{C3} - t_{C2}, and UT by subtracting ΔT\Delta T from every time 1.
  13. Corrections, reported separately: solar radius, limb profile at C2 and C3, current ΔT\Delta T, height, refraction flag. Their sizes are in corrections and code 6.

The rest of this note is those steps with their symbols, constants and the JSEX code.

The observer reduced to the fundamental planeTwo panels. The left panel is a cross-section through the Earth. A vertical line through the Earth's centre is the fundamental plane, perpendicular to the shadow axis, which runs horizontally toward the Sun. An observer sits on the surface on the sunward side, at geodetic latitude phi measured from the equator, and a horizontal segment from the observer to the plane is labelled zeta, the height above the plane. The right panel shows that plane face-on, with axes xi to the east and eta to the north from the Earth's centre. The observer's projection sits below and left of the centre and the shadow axis above and right of it. A horizontal segment labelled u and a vertical segment labelled v join the two, and the straight line between them is m. Four circles are centred on the shadow axis: the penumbral and umbral radii as tabulated on the plane, dotted, and the same two radii shrunk to the observer's own plane, dashed and solid.a cross-section through the observerthe plane itself, seen from the Sunto the Sunfundamental planeequatorφobserverζheight abovethe planeηξ points outof the pageEarthξηcentreu = x − ξv = y − ηm(ξ, η)(x, y) the shadow axisL₁L₁′L₂′dotted: L₁ and L₂, the radii tabulated on the planeL₁′ = L₁ − ζ tan f₁ L₂′ = L₂ − ζ tan f₂the same radii shrunk to the observer's own plane, ζ awaySchematic. The coordinates drawn are chosen for legibility, not computed for any eclipse.

The observer on the fundamental plane

Geocentric coordinates of the site

The 1961 Explanatory Supplement, section 9D, starts from the geodetic latitude ϕ\phi, the longitude λ\lambda and the height HH above the spheroid 1:

ρsinϕ=(S+H)sinϕ,ρcosϕ=(C+H)cosϕ,\rho\sin\phi' = (S + H)\sin\phi, \qquad \rho\cos\phi' = (C + H)\cos\phi,

C=(1e2sin2ϕ)1/2,S=(1e2)C.C = (1 - e^2\sin^2\phi)^{-1/2}, \qquad S = (1 - e^2)\,C.

Here ρ\rho is the geocentric distance in units of the Earth's equatorial radius and ϕ\phi' is the geocentric latitude. The 1961 text uses e2=0.00672267e^2 = 0.00672267 and converts height in metres to Earth radii with the factor 0.1567794×1060.1567794\times10^{-6}, that is the Hayford radius 6378388 m. A footnote replaces both from 1968 with e2=0.00669454e^2 = 0.00669454 and 0.1567850×1060.1567850\times10^{-6} per metre, the IAU 1964 radius 6378160 m 1. The choice of spheroid moves ρsinϕ\rho\sin\phi' by parts in 10510^{5}, which is below the level at which contact times change by a tenth of a second.

The NASA JavaScript Solar Eclipse Explorer uses the reduced-latitude form instead, in readform() 2:

tmp = Math.atan(0.99664719*Math.tan(obsvconst[0]))
obsvconst[4] = 0.99664719*Math.sin(tmp) + (obsvconst[2]/6378140.0)*Math.sin(obsvconst[0])
obsvconst[5] = Math.cos(tmp) + (obsvconst[2]/6378140.0*Math.cos(obsvconst[0]))

so that with u=arctan(0.99664719tanϕ)u = \arctan(0.99664719\tan\phi) and hh the height in metres,

ρsinϕ=0.99664719sinu+h6378140sinϕ,ρcosϕ=cosu+h6378140cosϕ.\rho\sin\phi' = 0.99664719\sin u + \frac{h}{6378140}\sin\phi, \qquad \rho\cos\phi' = \cos u + \frac{h}{6378140}\cos\phi.

The constant 0.99664719=11/298.2570.99664719 = 1 - 1/298.257 is the IAU 1976 polar-to-equatorial ratio and 6378140 m the IAU 1976 equatorial radius. Both forms are the same ellipsoid geometry. Height enters along the local normal in both. The Eclipse-Engine code uses the CC and SS form with N=1/1e2sin2ϕN = 1/\sqrt{1-e^2\sin^2\phi} and a 6378.1366 km radius 7. Stellarium takes the rectangular geocentric coordinates of the site from its own Earth model and divides by the equatorial radius 8.

Hour angle, longitude and ΔT\Delta T

Besselian elements are tabulated against Terrestrial (formerly Ephemeris) Time, and μ\mu is the Greenwich hour angle of the shadow axis at that time scale. The observer's longitude is a Universal Time quantity, so the Supplement converts it to an ephemeris longitudeephemeris longitudeAn observer's longitude shifted by 1.002738ΔT1.002738,T so that it can be combined with the shadow-axis hour angle μ, which is tabulated against Terrestrial Time rather than Universal Time.: "The longitude λ\lambda must be converted to the ephemeris longitude λ*\lambda^* by increasing it by 1.002738ΔT1.002738\,\Delta T, the sidereal equivalent of ΔT\Delta T" 1. The local hour angle of the axis is then

θ=μλ1.002738ΔT,\theta = \mu - \lambda - 1.002738\,\Delta T,

with west longitude positive and ΔT\Delta T expressed as an angle at 15 arcseconds per second.

The JSEX code is the same statement in radians per second 2:

circumstances[16] = circumstances[7] - obsvconst[1] - (elements[index+5] / 13713.44)

where elements[index+5] is ΔT\Delta T in seconds from the element table and 13713.44=1/(1.002738×15 in radians)13713.44 = 1/(1.002738 \times 15'' \text{ in radians}), that is one over 7.2921×1057.2921\times10^{-5} rad s1^{-1}. Eclipse-Engine writes the same term as 1.002738 * delta_t_s * 15 / 3600 * D2R 7. Stellarium omits the term because it evaluates μ\mu from Greenwich apparent sidereal time at the UT of the requested instant, so ΔT\Delta T is already inside its elements 8. The JSEX element files carry ΔT\Delta T per eclipse. Each eclipse is 28 numbers: the JD and hour of t0t_0 in TDT, the validity window, ΔT\Delta T in seconds, then the polynomial coefficients of xx and yy (cubic), dd, μ\mu, L1L_1 and L2L_2 (quadratic), and tanf1\tan f_1 and tanf2\tan f_2 9.

The coordinates ξ\xi, η\eta, ζ\zeta and their hourly variations

With dd the declination of the shadow axis 1:

ξ=ρcosϕsinθ,\xi = \rho\cos\phi'\sin\theta,
η=ρsinϕcosdρcosϕsindcosθ,\eta = \rho\sin\phi'\cos d - \rho\cos\phi'\sin d\cos\theta,
ζ=ρsinϕsind+ρcosϕcosdcosθ,\zeta = \rho\sin\phi'\sin d + \rho\cos\phi'\cos d\cos\theta,

and the hourly variations, with μ\mu' and dd' the hourly rates of μ\mu and dd in radians:

ξ=μρcosϕcosθ,η=μξsindζd,ζ=μξcosd+ηd.\xi' = \mu'\,\rho\cos\phi'\cos\theta, \qquad \eta' = \mu'\,\xi\sin d - \zeta\,d', \qquad \zeta' = -\mu'\,\xi\cos d + \eta\,d'.

The Supplement adds that "ζ\zeta' is not needed" in most cases and that "if predictions to the nearest second are acceptable, the terms ζd\zeta d' and ηd\eta d' may be omitted" 1. JSEX keeps the ζdd\zeta\,dd term in deta and never forms ζ\zeta' 2. The elements "must always be interpolated to the time assumed in the calculation", which the polynomial form makes automatic 1.

Shadow radii at the observer's plane

The tabulated L1L_1 and L2L_2 are the penumbral and umbral radii on the fundamental plane. The observer sits at height ζ\zeta above it along the axis, so the radii there are

L1=L1ζtanf1,L2=L2ζtanf2,L_1' = L_1 - \zeta\tan f_1, \qquad L_2' = L_2 - \zeta\tan f_2,

where f1f_1 and f2f_2 are the half-angles of the penumbral and umbral cones. JSEX stores these as l1' and l2' in slots 28 and 29 2. Stellarium writes L1 = L1 - zeta * tf1 8. L2L_2' is negative when the observer is inside the umbral cone beyond its vertex, the total case, and positive in the antumbral, annular case 1.

Two identities that every code read here relies on follow from the cone geometry: (L1+L2)/2(L_1' + L_2')/2 is the apparent solar radius and (L1L2)/2(L_1' - L_2')/2 the apparent lunar radius, both in Earth radii projected on the observer's plane. Eclipse-Engine sets rSun = (gm.L1 + gm.L2) / 2, rMoon = (gm.L1 - gm.L2) / 2 7, and the SR123 simulator does the same 10.

Greatest phase and the contacts

The relative coordinates

Define 1

u=xξ,v=yη,u=xξ,v=yη,u = x - \xi, \quad v = y - \eta, \quad u' = x' - \xi', \quad v' = y' - \eta',
m2=u2+v2,n2=u2+v2,m^2 = u^2 + v^2, \qquad n^2 = u'^2 + v'^2,

with mm and nn positive. mm is the distance from the observer to the shadow axis in the observer's plane and nn the relative speed in Earth radii per hour. The 1992 Supplement phrases the whole problem as "an observer sees an eclipse as two disks of fixed size, one crossing the other in a straight line at constant speed" 5.

The four contacts as tangencies of the solar and lunar discsFour panels in a row, each showing the Sun as a light disc and the Moon as a slightly larger grey disc, with a dotted line through both marking the Moon's path relative to the Sun and an arrow showing it moving to the left, eastward. In the first panel the two discs touch from outside on the right of the Sun: first contact, the beginning of the partial phase. In the second the lunar disc has just swallowed the solar one and touches it from inside: second contact, the beginning of totality. In the third the discs touch from inside on the opposite side: third contact, the end of totality. In the fourth they touch from outside on the left: fourth contact, the end of the partial phase. On the fourth panel a line runs from the Sun's centre up to its north point and another to the point of tangency, with an arc between them labelled P, the position angle, opening counter-clockwise from north through about ninety degrees.the two discs as the observer sees them: north up, east to the leftC1exterior tangencythe partial phase beginsC2interior tangencytotality beginsC3interior tangencytotality endsC4exterior tangencythe partial phase endsNPP is measured eastward from thenorth point of the solar limbthe Moon's pathrelative to the SunSchematic. At the interior contacts the two limbs are drawn four pixels apart.

Maximum eclipse

Greatest phase is when (L1m)/(L1+L2)(L_1 - m)/(L_1 + L_2) is a maximum. Because LL varies very slowly, this is when m2m^2 is a minimum, uu+vv=0uu' + vv' = 0. With T=T0+tT = T_0 + t and the velocities held constant over tt,

t=Dn2,D=u0u+v0v,t = -\frac{D}{n^2}, \qquad D = u_0 u' + v_0 v',

in hours 1. JSEX getmid() starts at t=0t = 0 and repeats tmp = (u*a + v*b)/n2; t -= tmp until |tmp|<106|\mathrm{tmp}| < 10^{-6} h or 50 iterations, re-evaluating everything at each step 2. Eclipse-Engine instead scans a 4 hour window at 4000 steps and golden-sections the magnitude 7.

Penumbral contacts (first and fourth)

At beginning or end of the partial phase u2+v2=L12u^2 + v^2 = L_1^2. Substituting u=u0+tuu = u_0 + tu', v=v0+tvv = v_0 + tv' gives the quadratic

n2t2+2Dt+(m02L12)=0.n^2 t^2 + 2Dt + (m_0^2 - L_1^2) = 0.

The Supplement solves it through an auxiliary angle. Setting

Δ=u0vuv0n,sinψ=ΔL1,\Delta = \frac{u_0 v' - u' v_0}{n}, \qquad \sin\psi = \frac{\Delta}{L_1},

the solution is

t=L1cosψnDn2.t = \frac{L_1\cos\psi}{n} - \frac{D}{n^2}.

"The term D/n2-D/n^2 is the correction that would be applied to T0T_0 to give the time of greatest phase ... the term L1cosψ/nL_1\cos\psi/n thus represents approximately the semi-duration of the partial phase which must be subtracted to obtain the time of beginning, or added to obtain the time of end. In other words, cosψ\cos\psi must be taken as negative for the beginning and positive for the end, since L1L_1 is always positive" 1. Δ\Delta is the perpendicular distance from the observer to the relative path of the axis, so |Δ|>L1|\Delta| > L_1 means the site is never in the penumbra.

Umbral contacts (second and third) and the sign rules

The umbral contacts use L2L_2 in the same formula:

t=L2cosψnDn2,sinψ=ΔL2.t = \frac{L_2\cos\psi}{n} - \frac{D}{n^2}, \qquad \sin\psi = \frac{\Delta}{L_2}.

"Because L2L_2 is negative for total eclipses and positive for annular eclipses, cosψ\cos\psi must be taken as positive for the beginning of the total phase and the end of the annular phase, and as negative for the end of the total phase and the beginning of the annular phase. The semi-duration of the umbral phase is given by ±L2cosψ/n\pm L_2\cos\psi/n" 1. A second approximation from the improved times is recommended, and ΔT\Delta T is subtracted at the end to convert to Universal Time.

JSEX encodes exactly this. In c2c3iterate() the sign is 1-1 for C2 and +1+1 for C3 and is reversed when mid[29] < 0, that is when L2<0L_2' < 0. The loop body is 2:

n = Math.sqrt(circumstances[30])
tmp = circumstances[26]*circumstances[25] - circumstances[24]*circumstances[27]
tmp = tmp / n / circumstances[29]
tmp = sign * Math.sqrt(1.0 - tmp*tmp) * circumstances[29] / n
tmp = (circumstances[24]*circumstances[26] + circumstances[25]*circumstances[27]) / circumstances[30] - tmp
circumstances[1] = circumstances[1] - tmp

The first tmp is (uvuv)/(nL2)=sinψ(u'v - uv')/(nL_2') = -\sin\psi, the second is ±L2cosψ/n\pm L_2'\cos\psi/n, and the update is ttD/n2±L2cosψ/nt \leftarrow t - D/n^2 \pm L_2'\cos\psi/n, a Newton step on the contact condition with the velocities re-evaluated each pass. The initial guesses come from the mid-eclipse solution: c2[1] = mid[1] - tmp and c3[1] = mid[1] + tmp for the annular case and the reverse when L2<0L_2' < 0. Convergence is to 10610^{-6} h, about 4 ms, in at most 50 passes. Stellarium's localSolarEclipse returns the same increment in one line, dt = (L * cfi / sqrt(udot*udot + vdot*vdot)) - (u*udot + v*vdot)/n2 with cfi = contact * sqrt(1 - (delta/L)^2) 8.

Is the site inside the umbra?

The site sees a central phase when, at greatest phase, m<|L2|m < |L_2'|. It is total when L2<0L_2' < 0 and annular when L2>0L_2' > 0. JSEX getall() tests if ((mid[36] < mid[29]) || (mid[36] < -mid[29])) and then sets the type from the sign of mid[29] 2. Eclipse-Engine solves the inner contacts on m|L2|m - |L_2'| and notes why the absolute value matters: "L2 is negative inside an umbra and POSITIVE inside an antumbra, so the m + L2 form that holds for a total eclipse has no root for an annular one" 7. A partial eclipse at the site requires only m<L1m < L_1' at greatest phase, which JSEX expresses as a positive magnitude.

The direct numerical alternative

Both Supplements offer a second method. "Times and position angles of contacts may be obtained by direct numerical solution of the equation u2+v2L2=0u^2 + v^2 - L^2 = 0. For four, or more, times at equal intervals surrounding the phase required, a small table is made of the quantities uu, vv, LL, u2+v2L2u^2+v^2-L^2. The time TT of contact is then found, by the standard techniques of inverse interpolation" 1. The 1992 edition prefers it: "There are methods for finding the times of these phenomena by successive iteration, using approximations and auxiliary angles. However, it is simpler to tabulate uu, vv, LL ... and also the discriminant u2+v2L2u^2+v^2-L^2. When the discriminant goes to zero, inverse interpolation gives the time of the local contact" 5. Its advantages listed in 1961 are "no auxiliary formulae and angles; ... no theoretical approximations are necessary (there is no need to assume that uu', vv' and LL are constant)" 1. Eclipse-Engine is the code that follows this route. It brackets sign changes of mL1m - L_1' and m|L2|m - |L_2'| on a grid and bisects. It names contacts "by which way the curve crosses zero, never by the order the roots came out", so that a window containing only a last contact is not mislabelled as a first one 7.

Magnitude

The Supplement's definition: "The magnitude of the eclipse is by definition the fraction of the solar diameter covered by the Moon at the time of greatest phase, expressed in units of the solar diameter" 1. Two cases follow from the figure of the two cones cut by the observer's plane.

An observer in the penumbra at distance mm from the axis:

M1=L1mL1+L2.M_1 = \frac{L_1' - m}{L_1' + L_2'}.

An observer inside the umbra or antumbra sees the whole lunar disc projected on the Sun:

M2=L1L2L1+L2,M_2 = \frac{L_1' - L_2'}{L_1' + L_2'},

and "identical results are obtained for a total eclipse, provided it is noted that in the latter case OA=L2OA = -L_2" 1. The 1992 edition adds: "Note also that this is the diameter of the lunar disk in units of the diameter of the solar disk" 5. NASA's local circumstances tables state the same convention: "For umbral eclipses (both annular and total), the eclipse magnitude is identical to the topocentric ratio of the Moon's and Sun's apparent diameters" 3.

JSEX computes both and switches at the end of getall() 2:

mid[36] = Math.sqrt(mid[24]*mid[24] + mid[25]*mid[25])      // m
mid[37] = (mid[28] - mid[36]) / (mid[28] + mid[29])          // magnitude, penumbral form
mid[38] = (mid[28] - mid[29]) / (mid[28] + mid[29])          // moon/sun ratio
...
if ((mid[39] == 2) || (mid[39] == 3)) { mid[37] = mid[38] }  // umbral: ratio

M1M_1 continues smoothly into M2M_2 at m=|L2|m = |L_2'| in the total case, since there L1m=L1+L2L_1' - m = L_1' + L_2' only when L2=mL_2' = -m. In the annular case M1<1M_1 < 1 at second contact and M2<1M_2 < 1 throughout, so the reported "magnitude" of an annular eclipse is the diameter ratio, below one. Swiss Ephemeris reports both numbers, attr[0] the diameter fraction and attr[8] "magnitude acc. to NASA; = attr[0] for partial and attr[1] for annular and total eclipses" 11.

Obscuration

"In the reduction of certain types of eclipse observations, it is necessary to evaluate the fraction of the surface of the solar disk obscured by the Moon" 1. With the solar radius as the unit, the lunar radius is

s=L1L2L1+L2,s = \frac{L_1' - L_2'}{L_1' + L_2'},

the centre separation is 1+s2M1=2m/(L1+L2)1 + s - 2M_1 = 2m/(L_1' + L_2'), and the triangle formed by the two centres AA (Moon), BB (Sun) and one intersection point CC of the two circles has angles

cosC=L12+L222m2L12L22,cosB=L1L2+m2m(L1+L2),A=π(B+C),\cos C = \frac{L_1'^2 + L_2'^2 - 2m^2}{L_1'^2 - L_2'^2}, \qquad \cos B = \frac{L_1' L_2' + m^2}{m\,(L_1' + L_2')}, \qquad A = \pi - (B + C),

with 0Cπ0 \le C \le \pi and 0Bπ0 \le B \le \pi. The obscured fraction is

S=s2A+BssinCπ.S' = \frac{s^2 A + B - s\sin C}{\pi}.

"During the annular phase, SS' is equal to s2s^2, while it is equal to unity in the case of the total phase" 1. The derivation is two circular segments: S=(s2A+B)(s2sinAcosA+sinBcosB)S = (s^2 A + B) - (s^2\sin A\cos A + \sin B\cos B), and the half-chord CE=ssinA=sinBCE = s\sin A = \sin B collapses the second bracket to ssinCs\sin C. JSEX getcoverage() is a transcription 2:

c = Math.acos((mid[28]*mid[28] + mid[29]*mid[29] - 2.0*mid[36]*mid[36]) / (mid[28]*mid[28] - mid[29]*mid[29]))
b = Math.acos((mid[28]*mid[29] + mid[36]*mid[36])/mid[36]/(mid[28]+mid[29]))
a = Math.PI - b - c
c = ((mid[38]*mid[38]*a + b) - mid[38]*Math.sin(c))/Math.PI

with the annular branch c = mid[38]*mid[38] and clamps at 0 and 1.

The same area written for two discs of angular radii rsr_s and rmr_m at separation δ\delta, the form used by the topocentric codes, is

Obs=rm2α+rs2β12(δ+rs+rm)(δ+rsrm)(δrs+rm)(δ+rs+rm)πrs2,\text{Obs} = \frac{r_m^2\alpha + r_s^2\beta - \tfrac12\sqrt{(-\delta+r_s+r_m)(\delta+r_s-r_m)(\delta-r_s+r_m)(\delta+r_s+r_m)}}{\pi r_s^2},

α=arccosδ2+rm2rs22δrm,β=arccosδ2+rs2rm22δrs,\alpha = \arccos\frac{\delta^2 + r_m^2 - r_s^2}{2\delta r_m}, \qquad \beta = \arccos\frac{\delta^2 + r_s^2 - r_m^2}{2\delta r_s},

which is Eclipse-Engine's obscuration(sep, rs, rm) 7 and, with the square root written as rm2sinαcosα+rs2sinβcosβr_m^2\sin\alpha\cos\alpha + r_s^2\sin\beta\cos\beta, Swiss Ephemeris' sc1 + sc2 12. In terms of magnitude and the radius ratio r=rm/rsr = r_m/r_s the separation is δ/rs=1+r2M1\delta/r_s = 1 + r - 2M_1. With that substitution solareclipses.com writes obscuration as a function of MM and rr alone, building on the image-analysis derivation of Sridhar and others and correcting a sign error in it 13 14.

Obscuration is smaller than magnitude through the partial phase because the covered region is a lens, not a rectangle. Espenak's glossary keeps the two apart: magnitude "is strictly a ratio of diameters and should not be confused with eclipse obscuration, which is a measure of the Sun's surface area occulted by the Moon" 15. The 1992 Supplement opens its section with "Magnitude is commonly confused with obscuration" 5.

Obscuration against magnitude for equal apparent discsA square plot with magnitude from zero to one along the horizontal axis and obscuration from zero to one up the vertical axis. A dashed straight line runs corner to corner where obscuration would equal magnitude. The computed curve starts at the same origin, stays well below that line throughout, rising slowly at first and steeply near the right, and meets it again only at the top right corner where the discs coincide. A marked point on the curve shows that a magnitude of 0.50 corresponds to an obscuration of 0.391.0.00.00.20.20.40.40.60.60.80.81.01.0magnitude, the fraction of the solar diameterobscurationobscuration 0.391 at magnitude 0.50apparent radius ratios = 1.00, equal discsmagnitude is the fraction ofthe solar diameter coveredobscuration is the fractionof the solar area coveredobscuration = magnitudethe computed curvewhich lies below it at everymagnitude short of oneComputed from the lens-area formula of the 1961 Explanatory Supplement, section 9D.

Position angle PP and vertex angle VV

This note writes the position angle of a contact PP, as NASA's tables do. The 1961 Supplement writes the same angle QQ, and the quotations below keep its letter.

At a contact the point of tangency lies on the line of centres, so 1

u=LsinQ,v=LcosQ,tanQ=uv,u = L\sin Q, \qquad v = L\cos Q, \qquad \tan Q = \frac{u}{v},

"where the appropriate value of LL is used. The angle QQ is the position angle of the point of contact, measured eastwards from the north point of the solar limb. The quadrant of QQ is determined by noting that sinQ\sin Q has the sign of uu, except for the contacts of the total phase for which sinQ\sin Q has the opposite sign to uu since L2L_2 is negative for total eclipses" 1. JSEX applies the sign through a multiplier 2:

if ((mid[39] == 3) && ((circumstances[0] == -1) || (circumstances[0] == 1))) contacttype = -1.0
circumstances[31] = Math.atan2(contacttype*circumstances[24], contacttype*circumstances[25])

The Supplement also gives Q=N+ψQ = N + \psi with tanN=u/v\tan N = u'/v', useful when only one approximation has been made, and the 1992 edition restates the angle as the direction of the vector (u,v)(u, v) because "the projected shadow is a reflection of what the observer sees in the sky" 5. NASA's local circumstances tables define PP and VV as "measured counter-clockwise (i.e., eastward) from the north and zenith points, respectively" 3.

The vertex angle subtracts the parallactic angle Cparallactic angle CThe angle at the Sun between the direction to the celestial pole and the direction to the zenith, tanC=ξ/ηC = / in fundamental-plane coordinates. It converts north-referenced to zenith-referenced position angles. CC:

V=PC,tanC=ξη,V = P - C, \qquad \tan C = \frac{\xi}{\eta},

"sinC\sin C having the same algebraic sign as ξ\xi" 1. The same relation appears in the differential-correction section as tanC=(ξ+ξσ)/(η+ησ)\tan C = (\xi + \xi'\sigma)/(\eta + \eta'\sigma) for the contacts at semi-duration σ\sigma from maximum 1. Chauvenet's formulation, as transmitted by Buchanan, is equation (385) V=QCV = Q - C with CC from psinP=sinϕp\sin P = \sin\phi, pcosP=cosϕcosθp\cos P = \cos\phi\cos\theta, csinC=cosPtanθc\sin C = \cos P\tan\theta, ccosC=sin(Pd)c\cos C = \sin(P - d'), where dd' is the Sun's declination 4. JSEX computes CC as the parallactic angle from the altitude 2:

circumstances[33] = Math.asin(coslat * circumstances[17] / Math.cos(circumstances[32]))
if (circumstances[20] < 0.0) { circumstances[33] = Math.PI - circumstances[33] }
circumstances[34] = circumstances[31] - circumstances[33]

that is sinC=cosϕsinθ/cosa\sin C = \cos\phi\sin\theta/\cos a, placed in the second quadrant when η<0\eta < 0, and V=PCV = P - C. Jubier's calculator reports VV as an o'clock value and notes that this differs from the NASA bulletins, where VV is counter-clockwise in degrees 16.

Altitude, azimuth and visibility

The direction of the shadow axis is the direction to the Sun to within the solar parallax, so the Sun's altitude and azimuth follow from dd, θ\theta and ϕ\phi. JSEX 2:

sina=sindsinϕ+cosdcosϕcosθ,\sin a = \sin d\sin\phi + \cos d\cos\phi\cos\theta,
tanA=sinθcosdsindcosϕcosθsinϕcosd,\tan A = \frac{-\sin\theta\cos d}{\sin d\cos\phi - \cos\theta\sin\phi\cos d},

with AA from north through east via atan2. Stellarium uses sina=ζ\sin a = \zeta directly, the same expression in fundamental-plane terms 8. JSEX marks an event as below the horizon when a<0.00524a < -0.00524 rad, that is 0.3-0.3^{\circ}, the comment calling it a "crude correction for refraction (and for consistency's sake)", and it prints such altitudes as 0 2. The header comment records what a real refraction treatment would need: "correcting for refraction will involve creating a 'virtual' altitude for each contact, and hence a different value of rho and O' for each contact" 2.

When a contact falls below the horizon but maximum is above it, JSEX replaces the contact by sunrise or sunset. getsunriset() iterates at most three times on

h0=arccossin(0.00524)sinϕsindcosϕcosd,tt+±h0θμ,h_0 = \arccos\frac{\sin(-0.00524) - \sin\phi\sin d}{\cos\phi\cos d}, \qquad t \leftarrow t + \frac{\pm h_0 - \theta}{\mu'},

and the row is flagged (r) or (s) 2 17. The bit pattern of which of C1, C2, mid, C3, C4 are above the horizon selects one of ten handled cases, and the code admits "There are other patterns, but those are the only ones we're covering!" 2.

Duration and time output

Duration of the central phase is tC3tC2t_{C3} - t_{C2} in hours, printed as minutes and seconds after adding 0.05/600.05/60 h so that the floor rounds to the nearest 0.1 s. If C2 or C3 is below the horizon the duration is measured from maximum instead 2. The Supplement's semi-duration ±L2cosψ/n\pm L_2\cos\psi/n gives the same number in one evaluation when the velocities are constant 1.

Times come out in hours of TDT relative to t0t_0. JSEX converts to local time as t + t0 - tz - (deltaT - 0.5)/3600, subtracting ΔT\Delta T and half a second so that the truncating formatter rounds to the nearest second 2. Every other time in the table is rounded the same way.

What the JSEX program does, in order

For one eclipse and one site, calculatefor() runs getall() 2:

  1. readform() builds the observer constants: ϕ\phi, λW\lambda_W, height, time zone, ρsinϕ\rho\sin\phi', ρcosϕ\rho\cos\phi'.
  2. getmid() iterates ttD/n2t \leftarrow t - D/n^2 from t=0t = 0, each pass calling timelocdependent() which evaluates the polynomials and their derivatives (timedependent()), then θ\theta, ξ\xi, η\eta, ζ\zeta, ξ\xi', η\eta', uu, vv, uu', vv', L1L_1', L2L_2' and n2n^2.
  3. midobservational() computes PP, altitude, CC, VV, azimuth, visibility, then mm, magnitude and the diameter ratio.
  4. If the magnitude is positive, getc1c4() seeds C1 and C4 at tmidL1cosψ/nt_\mathrm{mid} \mp L_1'\cos\psi/n and iterates each with c1c4iterate().
  5. If m<|L2|m < |L_2'|, getc2c3() seeds and iterates C2 and C3 with the sign rule for L2<0L_2' < 0, and sets the type to total or annular. observational() is then run for every contact.
  6. The horizon pattern is examined and sunrise or sunset substituted where a contact is below the horizon.
  7. For central eclipses the magnitude is replaced by the diameter ratio. getcoverage() computes obscuration, getduration() the central duration.

The code carries no limb profile, no refraction beyond the 0.3-0.3^{\circ} threshold, no centre-of-figure offset and no choice of kk or solar radius. Those are frozen inside the element files, the values of the Five Millennium Canon, NASA/TP-2006-214141, with its ΔT\Delta T 18.

Chauvenet and Meeus

Chauvenet's chapter X is a transformation of Bessel's method with the same fundamental-plane quantities. Buchanan's 1904 exposition of it gives the angles of position as Q=N+ψQ = N + \psi and V=QCV = Q - C (equations 276 to 279). It also keeps the old expression of magnitude in "digits", twelfths of the solar diameter, and says it becomes the modern fraction "by omitting the constant 12" 4. The USNO reference list still names Chauvenet volume 1 chapter X and Green (1985) chapter 18 as the treatments of Bessel's formulation 19.

Meeus's "Elements of Solar Eclipses 1951-2200" (1989) is the source the calculator authors cite. Jubier credits it and "Astronomical Algorithms" as having "provided the algorithms for this page" 16, and The Photographer's Ephemeris bases its local circumstances on it together with the 2013 Explanatory Supplement 20. Bill Gray's review describes its heart as "a discussion of the use of Besselian elements" that "contained everything I needed to know to implement eclipse/occultation computations", with no treatment of how to generate the elements 21. The book was not obtained for this note. "Astronomical Algorithms" chapter 54 was not obtained either. As far as this project has established, that chapter derives γ\gamma, uu and the magnitude at greatest eclipse from the lunar phase theory and does not carry the observer-level reduction. That is why the USNO list and the calculator authors point to "Elements" for site-level work 19 22. Confirming that from the text itself is an open question below.

Sources compared

Source Formulation Observer model Contact solver What it has that the others do not
Explanatory Supplement 1961, 9D 1 Closed formulas with auxiliary angle ψ\psi CC, SS, HH in Earth radii, e2=0.00672267e^2 = 0.00672267 then 0.006694540.00669454 t=Lcosψ/nD/n2t = L\cos\psi/n - D/n^2, second approximation Differential corrections t/λ,ϕ,H,ΔT\partial t/\partial\lambda, \partial\phi, \partial H, \partial\Delta T; three worked examples; ionosphere heights
Explanatory Supplement 1992, 8.36 5 Vector restatement Same Inverse interpolation on u2+v2L2u^2+v^2-L^2 recommended Explicit warning list: ephemeris consistency, rotation, centre of figure, limb, refraction
Chauvenet via Buchanan 4 Bessel's method transformed Same quantities Successive approximation Q=N+ψQ = N + \psi form, VV from PP, CC auxiliaries, magnitude in digits
NASA JSEX program.js 2 1961 formulas 0.996647190.99664719, 6378140 m Newton iteration to 10610^{-6} h Sunrise/sunset substitution, obscuration, (r)/(s) flags, full source
Stellarium AstroCalc 8 1961 formulas Site rectangular coordinates from its Earth model Same increment, elements computed on the fly No published elements needed; k=0.2725076k = 0.2725076 and 0.2722810.272281, Sun 696000 km
Eclipse-Engine 7 1961 coordinates, numerical contacts NN, e2e^2, 6378.1366 km Grid plus bisection, golden section for maximum Root naming by crossing direction; lens obscuration in rsr_s, rmr_m

What a developer should do

Implement the 1961 Explanatory Supplement section 9D formulas exactly as quoted above and test against program.js, which is GPL and self-contained 1 2. Use the NASA element files as the first test data because their ΔT\Delta T is embedded and the JSEX output for any city is published, so a match to the second is a full regression test 18 17. Solve the contacts by the direct root-finding of the 1992 edition rather than the auxiliary angle, because it makes no constant-velocity assumption and handles windows containing a single contact cleanly 5 7. Report magnitude in NASA's two branches and obscuration from the lens area, and label the branch. Compute PP from atan2(±u,±v)\text{atan2}(\pm u, \pm v) with the total-eclipse sign reversal and VV from the parallactic angle tanC=ξ/η\tan C = \xi/\eta. Keep every time in TT internally and subtract ΔT\Delta T once at output. Read the 1961 text first, then the 1992 section 8.36, then the JSEX code.

What this changes

Nothing in the global-circumstances pipeline. The local reduction consumes the same elements and the same ΔT\Delta T. It adds one requirement upstream: the element generator must publish tanf1\tan f_1, tanf2\tan f_2 and ΔT\Delta T with the elements, because L1L_1', L2L_2' and θ\theta cannot be formed without them.

Open questions

  • Obtain "Elements of Solar Eclipses 1951-2200" (Meeus 1989) and record its local-circumstances chapter formula by formula, in particular whether it uses the auxiliary angle ψ\psi or direct root finding and which spheroid constants it fixes 23.
  • Obtain "Astronomical Algorithms" chapter 54 and confirm from the text that it stops at γ\gamma, uu and greatest-eclipse magnitude and refers site-level work to "Elements" 22.
  • Obtain the 2013 Explanatory Supplement chapter 11 and note whether section 8.36 of 1992 was carried over unchanged, including the inverse-interpolation recommendation 24.
  • Obtain the Sky and Telescope BASIC listing solarecl.bas (Sinnott's "Astronomical Computing" column), which the search index describes as "Local circumstances of a solar eclipse". The download returned a Cloudflare challenge and the Wayback copy an error page.
  • Retrieve the Wayback snapshot of Chris O'Byrne's original "Eclipse Calculator" (chris.obyrne.com/Eclipses/calculator.html). The live host now serves a parking page and the 2016 snapshot fetched contains only site assets.

References

  1. 1peer-reviewed Explanatory Supplement to the Astronomical Ephemeris and the American Ephemeris and Nautical Almanac (1961), section 9D "Solar eclipses: local circumstances", pp. 241-249 Official almanac chapter. Read from the archive.org OCR text (var/downloads/es1961_djvu.txt, lines 40694-41460). Gives the observer coordinates, hourly variations, greatest phase, contact-time solution with the auxiliary angle psi, position angles Q and V, magnitude, degree of obscuration and the differential corrections for longitude, latitude, height and Delta T.
  2. 2primary Chris O'Byrne and Fred Espenak, "Javascript Solar Eclipse Explorer", program.js (NASA GSFC, 2007, GPL) Read in full (var/downloads/jsex_program.js, 1200 lines). The reference implementation of the Explanatory Supplement local-circumstances method in code: observer constants, time-dependent and time-and-location-dependent circumstances, Newton iteration for mid eclipse and the four contacts, P, V, altitude, azimuth, magnitude, obscuration and sunrise/sunset handling.
  3. 3primary Fred Espenak and Jay Anderson, NASA TP 1999-209484 "Total Solar Eclipse of 2001 June 21", section "Local Circumstances Tables" Read. Defines P and V as measured counter-clockwise from the north and zenith points, states that for umbral eclipses the magnitude equals the topocentric ratio of diameters, that refraction, centre of figure and limb profile are not applied, and that elevation matters only near the umbral limits with the Sun below about 10 degrees.
  4. 4survey Roland Buchanan, "The Mathematical Theory of Eclipses according to Chauvenet's Transformation of Bessel's Method" (1904) Read from the archive.org OCR text (var/downloads/buchanan_djvu.txt). Gives Chauvenet's formulae for the angle of position Q = N + psi, the angle from the vertex V = Q - C (equations 276-279 and 380-385) and the old "digits" magnitude. Used as the accessible statement of Chauvenet's formulation.
  5. 5peer-reviewed Explanatory Supplement to the Astronomical Almanac (Seidelmann ed., 1992), chapter 8, section 8.36 "Local circumstances" Official almanac chapter. Read from the archive.org OCR text (var/downloads/es1992_djvu.txt, lines 47555-47720). Restates the 1961 method in vector form, recommends inverse interpolation on u2+v2-L^2, and gives the magnitude and obscuration derivations (8.3621 to 8.3623).
  6. 6primary Fred Espenak, NASA GSFC, "The Lunar Limb Profile and Eclipse Predictions" Read. Watts corrections bring predictions to better than 0.5 s, uncorrected times can be off by 2 to 3 s and more near the path limits, Kaguya and LRO data reach about 0.2 s.
  7. 7company R. Herrera Alegría, "Eclipse-Engine" (eclipseradar.com engine), js/besselian.js README and js/besselian.js read (var/downloads/eclipse_engine_besselian.js). Observer from the geodetic latitude with N = 1/sqrt(1 - e^2 sin^2), height in units of 6378.1366 km, hour angle mu + lambda - 1.002738 Delta T, two-circle lens obscuration, NASA two-branch magnitude, golden-section for maximum and bisection for contacts on m - L1 and m - |L2|.
  8. 8company Stellarium, src/gui/AstroCalcDialog.cpp, function localSolarEclipse Read (var/downloads/stellarium_AstroCalcDialog.cpp, lines 3379-3445). Observer-level circumstances from the on-the-fly elements: xi, eta, zeta, u, v, the auxiliary angle, the time correction dt = L cos(psi)/n - (u u' + v v')/n^2, magnitude and altitude.
  9. 9primary NASA GSFC, JSEX element file SE2001.js Read the header (var/downloads/jsex_SE2001.js). Each eclipse is 28 numbers: JD of t0, t0 in hours TDT, tmin, tmax, Delta T twice, then the x, y, d, mu, L1, L2 polynomial coefficients and tan f1, tan f2.
  10. 10company SR123, "eclipse-2026" interactive simulator, eclipse.js README and eclipse.js read (var/downloads/sr123_eclipse.js). NASA elements for 2026 August 12 with Delta T = 71.4 s, rho sin/cos phi' with 0.99664719 and no height, lens-area obscuration, NASA two-branch magnitude. Cross-checked against NASA and timeanddate by its author.
  11. 11company Astrodienst, "Swiss Ephemeris Programming Interface", sections on swe_sol_eclipse_how and swe_sol_eclipse_when_loc Read. Documents attr[0] fraction of diameter, attr[1] ratio of diameters, attr[2] obscuration, attr[8] NASA-style magnitude, and tret[0..6] maximum, contacts one to four, sunrise and sunset.
  12. 12company Swiss Ephemeris, swecl.c (functions eclipse_how, eclipse_when_loc, swe_sol_eclipse_how, swe_sol_eclipse_when_loc) Read (var/downloads/swecl.c). Direct topocentric implementation: DSUN = 1392000 km, DMOON = 3476.3 km, angular separation from unit vectors, two-circle lens obscuration, rmoon scaled by 0.99916 for second and third contacts, bracketing search with find_zero.
  13. 13unsourced solareclipses.com, "Solar Eclipse Magnitude and Obscuration: classic derivation" Read. Closed form for obscuration from the magnitude M and radius ratio r with b = r + 1 - 2M, correcting a sign error in Sridhar et al.
  14. 14preprint Sarrvesh Seethapuram Sridhar, S. Pradeep Sundar, I. Kenny Jackson and P. Kannan, "Detection and Analysis of Solar Eclipse", Proc. SPIE 8285 (2011), arXiv:1206.1437 Abstract read. Image-analysis derivation of magnitude and obscuration from eclipse photographs.
  15. 15company Fred Espenak, "Glossary of Solar Eclipse Terms" (EclipseWise) Read. Definitions of eclipse magnitude, eclipse obscuration and the four contacts.
  16. 16company Xavier Jubier, "Solar Eclipse Calculator and Diagram Instructions" (v1.0.6, 2007) Read (curl, var/downloads/jubier_calc_instr.html; the host refused the fetch tool). Defines P, V as o'clock, LC limb correction applied to C2 and C3, umbral depth, says refraction is not modelled, limb corrections change C2/C3 by a few seconds, extrapolated Delta T good to better than 0.5 s, and credits Meeus (Elements, Astronomical Algorithms) and Espenak for elements and limb data.
  17. 17company Fred Espenak, "Key to JavaScript Solar Eclipse Explorer" (EclipseWise) Read. Defines the output columns: magnitude as fraction of diameter, obscuration as fraction of area, (r) and (s) flags for events in progress at sunrise or sunset, duration of the central phase.
  18. 18primary NASA GSFC, "JavaScript Solar Eclipse Explorer" index page Read. States authorship (O'Byrne, McCann, Espenak), that the Besselian elements and Delta T are those of the Five Millennium Canon, and the -1499 to +3000 validity limit set by Delta T uncertainty.
  19. 19primary USNO Astronomical Applications Department, "Eclipse Reference List" Read. Lists Chauvenet vol. 1 ch. X, Green (1985) ch. 18, the 3rd edition Explanatory Supplement ch. 11 and Meeus as the references for eclipse computation.
  20. 20company Crookneck Consulting, "Technical Note: Solar Eclipse Functionality" (The Photographer's Ephemeris) Read. Method from Meeus Elements, the Astronomical Almanac 2023 and the 3rd edition Explanatory Supplement; Espenak's NASA elements; Delta T from Meeus Table 10.A, USNO deltat.data and deltat.preds and the NASA polynomial; smooth Moon with limb effects "typically a few seconds, up to about 15 s"; refraction applied to altitude with circular limbs; SRTM/ASTER elevation.
  21. 21trade Bill Gray, "Books about celestial mechanics and astronomical calculations" (Project Pluto) Read. States that the heart of "Elements of Solar Eclipses" is the use of Besselian elements, that it contained everything needed to implement eclipse and occultation computations, and that it does not discuss generating the elements.
  22. 22survey Jean Meeus, "Astronomical Algorithms", 2nd edition (Willmann-Bell, 1998), chapter 54 "Eclipses" Not read for this note. Chapter 54 gives gamma, u and the magnitude of a partial eclipse at greatest eclipse from the lunar phase theory. It does not give the observer-level Besselian reduction. Photo Ephemeris cites its Table 10.A for Delta T before 2006.
  23. 23survey Jean Meeus, "Elements of Solar Eclipses 1951-2200" (Willmann-Bell, 1989) Not read. The book's local-circumstances chapter is known here only through Jubier's acknowledgement that it supplied the algorithms of his calculator, Photo Ephemeris' method statement, and Bill Gray's review. Its formulation is the Explanatory Supplement one.
  24. 24primary Explanatory Supplement to the Astronomical Almanac, 3rd edition (Urban and Seidelmann eds., 2013), chapter 11 "Eclipses of the Sun and Moon" Not read. Cited only through the USNO eclipse reference list, which describes chapter 11 as an update of the 1992 eclipse chapter.