Purpose
Three engines give every body its place. Mercury through Neptune, with the Earth standing in for the Sun, come from a truncated VSOP87 series that Robert loaded from a binary term table. The Moon is his transcription of the Meeus lunar theory, evaluated together with analytic derivatives so the true node and the Black Moon can be taken from a real state vector. And the bodies no published ephemeris covered, Pluto over three millennia, Chiron, the centaurs, the big four asteroids, Quaoar, Eris and Halley, he integrated himself and shipped as binary files. This module ports all three engines and the nutation state that binds them together.
Origin map
| original | ported as | file |
|---|---|---|
initpterm, readpterm, plposhi | VsopTables | src/horcom/ephem/vsop.* |
somo, zeitgleichung | somo, equation_of_time | src/horcom/ephem/sunmoon.* |
moko1, node part of moko | moon_position, lunar_points | src/horcom/ephem/moon.* |
kepler | kepler | src/horcom/ephem/kepler.* |
plelem | mean_elements, transpluto_elements, uranian_elements | src/horcom/ephem/elements.* |
ephem_auswert | EphFile | src/horcom/ephem/eph_file.* |
ipol, ipol3 | ipol, ipol3 | src/horcom/ephem/interpolate.hpp |
praez, praez_kartes_aeqn, praez_kartes_ekln | precess_newcomb, precess_equatorial, precess_ecliptic | src/horcom/ephem/precession.* |
pl_ko, plelempl, pl_praez | pluto_chapront | src/horcom/ephem/pluto_chapront.* |
ko_tr1, ko_tr2 | ecliptic_to_equatorial, equatorial_to_ecliptic | src/horcom/core/coords.hpp |
The VSOP term tables
data/planets.ndx holds pairs of 16 bit integers, a record offset
into data/planets.dat and a term count, in blocks of 18 per
planet, three coordinates times six powers of time. The dat file holds
triples of doubles A, B, C of A cos(B + C t), 2637 records. Robert
names his source in the program's own commentary
For the major planets ME, VE, EARTH (SUN) MA, JU, SA, UR, NE, HORCOM uses an abbreviated version of the latest analytical theory VSOP87 of the BUREAU DES LONGITUDES, PARIS ( P.BRETAGNON ). This has now been made accessible to a wider circle by JEAN MEEUS ("ASTRONOMISCHE ALGORITHMEN").
Decoding the binary settled a fact the listing alone could not. GFA record numbers count from ZERO at runtime while his generator counted from one, so block zero of the index is an unused duplicate of the Earth and every ...eph file begins with sixteen unwritten bytes. The loader was written only after Mercury's 38 term series was found byte exact at the predicted offset.
His own ephemerides
The .eph files are sequences of 16 byte records, an integer Julian day and three scaled heliocentric rectangular coordinates, newest record first. The integrator behind them is documented in his tool sources with a header he repeated in every generator
' STÖRMER/STIEFEL UP TO THE 12TH DIFFERENCE ( 31.7.92 ) 28.11.97 ' NUMERICAL INTEGRATION IN CONSTANT 40-DAY STEPS MARCH 1952 ' After ASTRONOMICAL PAPERS Vol. XII "Coordinates of the outer Planets 1653-2060" ' Washington 1951 ' State libr. shelf mark : 4° Eph.Astr.86f/12
The reader takes five records around the epoch, precesses each vector from its catalogue equinox to the date, interpolates with the Newton Stirling formula and derives rates from first differences. Everything geometric, step, bounds, newest epoch, is derived from the file itself, never from documentation, because the shipped binaries disagree with the listings in three places. The shipped halley.eph steps every 10 days where its generator listing says 20. The shipped pluto.eph reaches JD 2525280, newer than the coverage comment in the program. And the original precesses Halley from B1950 through a duplicated CASE branch although the generator listing says J2000. The shipped halley.eph meets his B1950 start elements only when read as B1950, 0.04 degrees against 0.71, so the reader was right and the port reads it the same way.
The Moon and the true node
moko1 evaluates 60 longitude and radius terms and 60 latitude terms together with their analytic time derivatives, so the result is a full state vector. From its angular momentum the original derives the TRUE node and, through the osculating ellipse, the true apogee, the Black Moon
c = SQR(c1 * c1 + c2 * c2 + c3 * c3) //areal veloc. el11 = ... //true node i4 = ... //MONT. p.78 top g = 0.0002959122083 //grav.const m = 3.0404332E-06 //mass Earth +Moon el24 = FN nb(PI + u4 - wa + el11) //apogee
The tables themselves were extracted mechanically from the listing into
moon_tables.inc, no hand transcription. Two of his steps are
fixed. The original added the nutation in obliquity deps to the ecliptic
latitude of the Moon, the Sun and every planet, up to 9.2 arcseconds,
although nutation turns the equator and leaves the ecliptic latitude
alone, Meeus' Moon example comes out exact without it. And the true
apogee took the latitude of the Moon itself, his u4 under the comment
latitude of the node, so the declination of the Black Moon could be
degrees off. The port takes the argument of latitude of the apogee, the
same angle its longitude rests on, and meets the eccentricity vector of
the state.
Lunations and eclipses
The finst screen walks the lunation series after Meeus, the exact new and full moons with the planetary perturbation terms, and reads the gamma and u quantities for the shadow rules, central or excentric, total or annular, north or south for the sun, umbral or penumbral for the moon. Pinned on the total eclipse that crossed central Europe on the eleventh of August 1999 to the minute and on the umbral lunar eclipse of January 2000. The rise and set screen of auf_unt brackets each day with three positions, opens with the standard hour angle and iterates the Meeus interpolation with the altitude correction, the sun with its refraction depth, the moon with the depth of its own parallax refreshed as the iteration moves, pinned on the solstice clocks of the year two thousand.
RISE / SET asks first for one body over running days or for all real
bodies at one date, then for true or apparent positions, true is the
default. The mask of his eingabe takes the place and the date, the
clock stays locked because the day starts at 0h UT. A latitude beyond
the polar circle is refused like his box, the limit checked for the
date entered in the mask. The single body
comes from his object list, the angles, points and hypothetical bodies
read as dashes there, the extras appear when chosen in PLANET
SELECTION. Every screen holds five blocks in the three columns rising,
meridian passage and setting, each block with the date and UT clock,
the Greenwich sidereal time of the moment, the longitude with the sign
glyph, the latitude and the right ascension with the declination.
Seconds show for true positions except for the moon and Jupiter to
Pluto, like his ze$ and ze1$. His three columns filled the display,
so the text of the screen grows with its window, never below the size of
the theme, the notes under the columns grow along. Space moves on by five days or five
bodies, R goes back five days or to the first bodies. A body that
never crosses the horizon reads OUT OF RANGE in its block, his box
ended the whole screen there. The moon keeps its own standard altitude
from its parallax under both answers, like his auf_pl. Pinned in
test_transit_search.cpp and test_diverses.cpp.
The ECLIPSES screen follows finst row for row. With a valid record it
first asks whether to study the aspects, then the base aspect with its
maximal divisor and the orb factor, the search date comes last. Its
lunation number k1 opens the new moon column one lunation earlier and
the full moon column one and a half, twenty seven rows each. Every
lunation row prints the UT moment and the position of the light, the
first row of every week of rows wears the sun or moon tag like his
plein2 marker. An eclipse adds an inverse row at the moment of greatest
eclipse from finst_1 with its letters, ZT or EX, TOT or RF, N or S for
the sun, KERNSCH or HALBSCH for the moon. With aspects the suchas rows
follow every lunation and eclipse row in inverse, the light of the
syzygy against the Sun through the MC of the active chart without the
south node, harmonic by harmonic up to the maximal divisor, the orb
of the stronger partner times the orb factor. The conjunction row stays
short like his LEFT$ cut, the seventh and eleventh harmonics print one
decimal and the higher multiples their fraction of the circle. Space,
plus and PgDn move on by four fifths of the lunation and eclipse rows,
minus, R and PgUp move back by twice that, ESC ends. Pinned in
test_diverses.cpp on the August 1999 eclipse at 11:03 UT, the
July 1999 umbral eclipse at 11:34 UT and the paging arithmetic.
The coordinate screens
PLANET COORDINATES and EXTRA PLANET COORDINATES are his a91 and
a10 screens drawn by ko_ta. Four header lines of hsa0 name the chart in
his yellow box, the date and clock with the years of life of a derived
chart, the sidereal time of 0h, ARMC, JD and T counted from 1900 at the
UT moment, the place and the Moon phase, then the title names the frame
and the ephemeris mode. The table carries his columns Pl, Ecl. Long.,
Vel.', A, Latitude, R.A.°, Decl.°, the distance, Node N, Node S,
Apsides and Pl, set in the order of the coordinate panel, the motion
right after the longitude with an R column for a retrograde body
between them. His CHANGE EPHEMERIS
DEFAULTS asked whether the distance reads in percent of his mean values
or in AU, the tester wanted both at once, so both screens carry Dist.%
and Dist.AU side by side and the question is gone. His means know the
Sun and the planets, the extra screen measures the real bodies Chiron
to Halley against half the sum of perihelion and aphelion of the orbit
their own ephemeris file holds around J2000, extra_mean_au in
src/horcom/chart/distances.hpp. Mercury to Saturn stand red on
cyan within five percent of their nearest or farthest distance. The A
column carries the sign of the change of the daily motion, for the Sun
and the Moon too, whose change his chain never computed, and stays
blank for the Mean rows whose motion never changes. The
node stands twice, the mean node with his fixed daily motion and the
true node in whole minutes with its motion from vel_om_pd, whatever the
node setting says, and the head cell names the form like the panel, DR
mean and DR true. His Mittel and Wahr
labels of textrc stood plain in a thin frame, the rewrite had put both
in yellow and the tester could not tell which one rides the wheel, now
only the form the chart works with wears the yellow box as its cue. The Black Moon follows
in both forms with its box in the R.A. column, like his zus& = 0
branch, and the Part of Fortune closes the screen, the tester wanted
the points after the planets. The true forms stand inverted always, and
while the marking of CHANGE DIRECTION DEFAULTS inverts MA, SA, UR, NE
and PL as well, two lines under the table say so, the tester asked
where the inverse symbols came from. The right ascension shows three
decimals, latitude and declination two, and the apsides stand as two
lines in his text form. Both screens carry his box of the house cusps
AC, H2, H3, MC, H11 and H12. His screens always showed every row, so the
window opens tall enough for all of them as long as the screen has the
room, the tester missed Quaoar, Xena and Poseidon below the edge of a
smaller one. His screen filled the display, so the text of the table
grows with the window until the columns fill its width or the rows its
height, never below the size of the theme, and the header lines and the
cusp box grow along. A window too small for the table keeps the theme
size and scrolls. The EXTRA screen lists its 20 bodies whatever the
panel chose, in the tester's order, the real bodies first, Chiron,
Quaoar and Xena, the asteroids Ceres, Pallas, Juno and Vesta, the
planetoids Pholus, Damokles and Nessus and Halley's comet, then the
invented points, Transpluto and the eight Hamburg factors, with his
name column. After a key his question VARY THE
TIME ? opens the walk of a9zw, a time unit, a step and a
direction, his key sheet, then the table steps every two seconds with
V, R, D, H, M, plus, minus, Space and the mouse steering it, and every
new time unit starts again with the two second wait. At the end YES to
TAKE the VARIED TIME into the RADIX ? writes the moment into the
RADIX set of the same number, as the question says, also when the
table showed a SOLAR set. Zodiac positions round once at the last unit
shown and carry, here and in every other table and sheet, so
29°59'59.6" of a sign reads 0° of the next like his grze_0, ported as
split_zodiac. The permanent coordinate dock beside the
wheel is a rewrite addition under VIEW. Pinned in
test_coord.cpp.
Verification
test_vsop.cpp pins the loader to 2430 terms and reproduces the
Meeus worked examples, Venus 1992-12-20 to two millionths of a degree and
the Earth for 1992-10-13, plus rate against numerical difference checks.
test_sunmoon.cpp holds nutation and true obliquity for the
Meeus 1987 example within half an arcsecond, the equation of time near its
November maximum, the Moon of 1992-04-12 to his tables' accuracy in
longitude, latitude, distance and parallax, the velocity vector against
numerical differences, and the libration bands of true node and apogee.
test_kepler.cpp verifies the Kepler equation across
eccentricities up to Halley's. test_eph_file.cpp decodes
pluto.eph and lands on the Meeus Pluto example, the frame free radius to
two hundredths of a percent, checks continuity across record boundaries,
bounds behaviour like jdplanetex, Chiron inside the radius arc his generator
documents, and closes the loop by meeting the Chapront analytic fallback and
the integrated file within arc minutes of each other.