While trying to convert ecliptic coordinates from mean equinox of date to true equinox of date, I ran into excessive overhead from the IAU2000B nutation model. The fact that it uses 77 trigonometric terms made the calculations a lot slower. https://apps.dtic.mil/sti/pdfs/AD1112517.pdf Page 4 in the above document mentions a shorter series “NOD version 2” that has 13 terms instead of 77 as used in IAU2000B. I had not noticed NOD2 before, because it appears only in the FORTRAN version of NOVAS 3.x, not the C version. After reading the FORTRAN code, I realized NOD2 is the same as IAU2000B, only it keeps the first 13 of 77 terms. The terms are already arranged in descending order of significance, so it is easy to truncate the series. Based on this discovery, I realized I could achieve all of the required accuracy needed for Astronomy Engine by keeping only the first 5 terms of the nutation series. This tremendously speeds up nutation calculations while sacrificing only a couple of arcseconds of accuracy. It also makes the minified JavaScript code smaller: Before: 119500 bytes. After: 116653 bytes. So that's what I did here. Most of the work was updating unit tests for accepting slightly different calculation results. The nutation formula change did trigger detection of a lurking bug in the inverse_terra functions, which convert a geocentric vector into latitude, longitude, and elevation (i.e. an Observer object). The Newton's Method loop in this function was not always converging, resulting in an infinite loop. I fixed that by increasing the convergence threshold and throwing an exception if the loop iterates more than 10 times. I also fixed a couple of bugs in the `demotest` scripts.
Astronomy Engine examples in Java
The class file Main.java shows examples of how to use the Kotlin version of Astronomy Engine from a Java program.
The demo program is split into separate source files, one for each topic, as listed below. Each topic is chosen by a command line parameter. To build the demo program, run this command in Linux or Mac:
./gradlew jar
On Windows, use this command to build the demo program:
gradlew.bat jar
Then use the rundemo script (or rundemo.bat file on Windows) to
run the demo program, to see usage text:
./rundemo
As an example, to run the MoonPhase demo, try this:
./rundemo moonphase
Constellation.java
This demo finds what constellation the Moon is in at a given time. It also shows how to do a binary search to find the moment in time when the Moon moves across the border between constellations.
JupiterMoons.java
Calculates the coordinates of Jupiter and its four major moons (Io, Europa, Ganymede, and Callisto) as seen from the Earth at a given date and time. This demo illustrates how to correct for the delay caused by the time it takes for light to reach the Earth from the Jupiter system.
LunarEclipse.java
Searches for the first 10 lunar eclipses (partial or total) that occur after the specified time. Penumbral lunar eclipses are ignored, as these are difficult to observe in practice.
MoonPhase.java
This example shows how to determine the Moon's current phase, and how to predict when the next 10 quarter phases will occur.
Positions.java
Given an observer's geographic latitude and longitude, and an optional date and time, this demo displays the equatorial and horizontal coordinates of the Sun, Moon, and planets.
RiseSetCulm.java
Calculates rise, set, and culmination times of the Sun and Moon. Culmination is when a body reaches the highest point in an observer's sky as it crosses the meridian.
Seasons.java
Calculates the equinoxes and solstices for a given calendar year.