ephem

The position engines, his series and his own ephemerides

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

originalported asfile
initpterm, readpterm, plposhiVsopTablessrc/horcom/ephem/vsop.*
somo, zeitgleichungsomo, equation_of_timesrc/horcom/ephem/sunmoon.*
moko1, node part of mokomoon_position, lunar_pointssrc/horcom/ephem/moon.*
keplerkeplersrc/horcom/ephem/kepler.*
plelemmean_elements, transpluto_elements, uranian_elementssrc/horcom/ephem/elements.*
ephem_auswertEphFilesrc/horcom/ephem/eph_file.*
ipol, ipol3ipol, ipol3src/horcom/ephem/interpolate.hpp
praez, praez_kartes_aeqn, praez_kartes_eklnprecess_newcomb, precess_equatorial, precess_eclipticsrc/horcom/ephem/precession.*
pl_ko, plelempl, pl_praezpluto_chaprontsrc/horcom/ephem/pluto_chapront.*
ko_tr1, ko_tr2ecliptic_to_equatorial, equatorial_to_eclipticsrc/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").
from his commentary file on the ephemeris

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 method header of his ephemeris generators, cited down to the library shelf mark

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 annotated core of moko, his Montenbruck page references included

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.