Commit Graph

1683 Commits

Author SHA1 Message Date
Don Cross
d6957e19ee Trying to figure out why Mac OS test build failed. 2022-02-18 19:29:14 -05:00
Don Cross
6779e4e81c The 5.44 arcmin issue persists even in EMB-centric coordinates. 2022-02-18 07:52:36 -05:00
Don Cross
9dfcd80e17 Script that confirms JPL Horizons 5.44 arcmin issue. 2022-02-17 21:40:22 -05:00
Don Cross
3f257ca924 Check JPL Horizons L4/L5 by feeding their geomoon through my function.
I think I have finally tracked down where the 5.4 arcminute
discrepancy comparing my L4 with JPL Horizons L4 is coming from.
When I feed JPL's geocentric Moon state vector through my
L4/L5 calculator, the result is in a slightly different plane
than it should be. It looks like a mistake in JPL Horizons!

I also fixed a bug where ctest's LoadStateVectors() was not
initializing the state.status before appending to the array.
The result was uninitialized random garbage in the status.
2022-02-17 21:02:26 -05:00
Don Cross
a3da258e7c C Lagrange: confirm JPL geocentric moon state.
Make sure Astronomy Engine's geocentric moon state calculations
match what JPL Horizons calculated.
2022-02-17 19:03:36 -05:00
Don Cross
5e3faef062 C Lagrange: simplify logic using cross products.
It is conceptually simpler to take cross products to
generate 3 coordinate axes (essentially a rotation matrix)
that represent radial, tangential, and normal directions
with respect to the major and minor bodies.
2022-02-17 18:47:05 -05:00
Don Cross
5001be0120 ctest.c : More verification of L4/L5 triangles.
Verify that all three angles inside the major/minor/L triangle
are very close to 60 degrees.
2022-02-17 17:08:40 -05:00
Don Cross
8c801edee2 Adding equilateral triangle checks for L4/L5.
Before comparing my Lagrange point calculations to JPL Horizons,
I check to see if my Lagrange point calculations form an
equilateral triangle from (major body, minor body, L4/L5).
2022-02-17 14:09:57 -05:00
Don Cross
f01419a42b ctest.c prints more diagnostics on vector failures.
When ctest.c detects that a state vector error is
unacceptably large, it now prints extra diagnostics
about the two vector values, their magnitudes, and
how much of the error is angular and how much is
a magnitude discrepancy.
2022-02-17 10:07:16 -05:00
Don Cross
35f8a45d53 C Lagrange: fixed mass parameter comments. Clarified algorithm. 2022-02-16 22:13:23 -05:00
Don Cross
6e142a1df5 Verified JPL Horizon velocity angles.
Calculated the angles between JPL Horizons velocity vectors
for the geocentric Moon and the geocentric L4/L5.
They are always very close to 60 degrees apart, within 0.15 arcsec.
This is not large enough to explain the velocity vector
errors my code calculates.
2022-02-16 19:53:59 -05:00
Don Cross
8ba15530ac ctest: Use more precise coordinates for Lagrange.
The Lagrange test was using Solar System barycentric
state vectors for the pair of bodies. This involved
a lot of unnecessary calculation.
For the Sun/EMB test, use heliocentric coordinates.
For the Earth/Moon test, use geocentric coordinates.

Fail the lagrange_jpl test if we see the major/minor/L4,L5
triangle deviate more than a tiny fraction from equilateral,
after adding the velocity components.
This convinces me that the JPL Horizons velocity vectors
make sense for L4/L5.
2022-02-16 17:13:51 -05:00
Don Cross
d8e58e9e36 Confirmed JPL Horizons L4/L5 maintains equilateral triangle.
I'm having problems confirming formulas for L4/L5 velocity vectors.
So I wanted to test the assumption that these Lagrange points would
have velocity vectors that would leave the major body, minor body,
and Lagrange point in an equilateral triangle after all 3 bodies
continued in a straight line at their current relative velocities.

This does turn out to be the case, which means there is just
a bug in how I'm calculating the velocity vectors.
I just need to find the bug.
2022-02-16 12:44:42 -05:00
Don Cross
2616880835 C Lagrange Points: almost there!
Now correctly calculating L4 and L5 positions, but
there is a large error in their velocity vectors.
Refactored ctest.c LagrangeTest() to be a lot easier
to understand and modify. A new function VerifyStateLagrange()
allows passing test parameters in a more function-oriented way.

Confirmed that L4 and L5 always lie in the same plane with
the position vector and velocity vector.
2022-02-16 11:35:01 -05:00
Don Cross
4ea0d3f9f7 Lagrange: confirmed how JPL defines orbital plane for L4, L5.
By taking the cross product of the Moon's position with
its velocity, I confirmed this is the same normal vector
as taking the Moon's position crossed with the L4/L5 position.
This means I should be able to calculate L4 and L5
using position and velocity vectors to define the
instantaenous co-orbital plane.
2022-02-15 16:32:13 -05:00
Don Cross
faa035d3f6 JPL Horizons L4, L5 angles confirmed to be 60 degrees. 2022-02-13 20:29:08 -05:00
Don Cross
7fc126f81f C Lagrange: use Newton's method for better results.
Use the formulas I already had to calculate first
approximations for L1, L2, L3 distances.
Then use Newton's Method to home in on the positions
where centrifugal acceleration balances with net
gravitational acceleration.
2022-02-13 19:26:50 -05:00
Don Cross
4a30682a13 Better accuracy for L1/L2 points.
I realized there was a small mistake in how I was
calculating the distance scaling factor for L1 and L2.
It was relative to the distance between the minor body
and the barycenter, not the minor body and the major body.
This significantly improves the accuracy for Earth/Moon
Lagrange points, but still has more error compared
to JPL Horizons than I currently understand.
2022-02-12 15:39:01 -05:00
Don Cross
476712430e Standard deviations for JPL Horizons analysis.
Analysis of Lagrange point calculations by JPL Horizons
now includes standard deviations of position/velocity
magnitude ratios. They confirm the ratios are very consistent.
2022-02-12 14:04:36 -05:00
Don Cross
9234a926d5 Lagrange analysis of pos/vel magnitude ratios.
This analysis confirms that JPL Horizons is making perfectly
equilateral triangles to calculate the positions of L4, L5.
2022-02-12 13:25:48 -05:00
Don Cross
08606ba56d Fix build error on Microsoft C compiler.
The Microsoft C compiler is oddly picky about declaring a const variable.
Apparently it cannot do math with other const variables in its
initializer expression, unlike other C compilers.
So I had to change MOON_GM from a const to a #define.
2022-02-12 12:59:10 -05:00
Don Cross
65582ff54f Starting analysis of JPL Horizons Lagrange points.
Wrote code in ctest.c to load state vector data from
JPL Horizons output into a dynamically-allocated array.
This makes it easier to detangle the logic for loading
the data from the logic for doing statistical analysis.
2022-02-12 11:59:57 -05:00
Don Cross
ee7b440c9c C LagrangePoint: patched to pass unit tests.
Still not ready, but patching to pass unit tests so
I can push to GitHub for backup.
2022-02-12 10:49:05 -05:00
Don Cross
7ed50c262b C Lagrange work in progress.
The Lagrange point calculation is still not finished,
but L1 and L2 are working. L3 is probably correct, but there
is no test data for it.

I replaced the test data with new JPL Horizons output that
is centered on the primary body instead of the Solar System Barycenter.
This allows Astronomy_LagrangePoint() to be agnostic about
the coordinate systems of the state vectors handed to it.

I still need to get L4 and L5 calculations to match JPL Horizons
data, but it is not yet clear how to do that.
2022-02-12 10:15:41 -05:00
Don Cross
6f9c906061 PY EclipticGeoMoon, SearchMoonNode, NextMoonNode. 2022-02-06 19:55:24 -05:00
Don Cross
785bfc456a Python MoonNode test: loading test data 2022-02-06 17:04:41 -05:00
Don Cross
19007ebfd5 JS EclipticGeoMoon, SearchMoonNode, NextMoonNode. 2022-02-06 16:11:24 -05:00
Don Cross
eb5cc8ea9a C# EclipticGeoMoon, SearchMoonNode, NextMoonNode.
Implemented the C# versions of these functions.
Ported the unit tests from C to C# to validate them.
2022-02-06 12:57:51 -05:00
Don Cross
e7717ea4fa Added C functions SearchMoonNode, NextMoonNode.
Implemented a pair of C functions for finding a series of
Moon nodes:

    Astronomy_SearchMoonNode
    Astronomy_NextMoonNode

Finished the C unit test "moon_nodes" that verifies
my calculations against Fred Espenak's test data.
2022-02-05 14:29:08 -05:00
Don Cross
21526cce57 C moon nodes: confirmed match with Espenak data.
Fixed another bug in my parsing of the original Espenak
data for moon nodes. Added verification that my own
Moon calculations match his:

The Moon is always within 0.182 arcminutes ecliptic
longitude of the node when he says it is crossing the node.

The Moon is always within 1.54 arcminutes of the equatorial
coordinates he says.
2022-02-04 21:30:26 -05:00
Don Cross
3752d588be Fixed bug parsing negative declinations in espenak_nodes.txt. 2022-02-04 20:48:37 -05:00
Don Cross
16d945364e Verify moon nodes by checking ecliptic lat=0. 2022-02-04 20:14:54 -05:00
Don Cross
69184406b3 ctest.c parser for moon_nodes.txt.
Implemented the beginnings of a unit test for moon_nodes.txt.
The code reads and validates the syntax of the file.
2022-02-04 20:02:59 -05:00
Don Cross
13b13a0f3f C Astronomy_EclipticGeoMoon implemented.
This is a thin wrapper function for the internal
function CalcMoon, which has already been extensively
validated. It will enable outside users to search
for ascending and descending nodes of the Moon,
or to calculate ecliptic spherical coordinates for the Moon
for any other useful purpose.
2022-02-03 22:05:12 -05:00
Don Cross
e2a055a216 Test data for Moon ascending/descending nodes. 2022-02-03 21:51:11 -05:00
Don Cross
e4b2911c97 Clarify GeoMoon and GeoMoonState calculating EQJ.
Changed the documentation for the GeoMoon and GeoMoonState
functions to make it explicit that they calculate coordinates
oriented with respect to the Earth's J2000 equator (EQJ).
This is because I will soon add ecliptic (ECL) counterparts
for the GeoMoon function, to more directly search for ascending
and descending nodes of the Moon.
2022-02-03 19:43:18 -05:00
Don Cross
910c1b3781 Lagrange point test data from JPL Horizons.
Added data for testing Lagrange point calculations,
which has yet to be implemented. JPL Horizons
provides L1, L2, L4, and L5 (but *not* L3) calculations
for:

    Sun / EMB
    Earth / Moon

where EMB = Earth/Moon Barycenter.
2022-02-03 12:47:23 -05:00
dependabot[bot]
6e640a7fea Bump cached-path-relative from 1.0.2 to 1.1.0 in /generate
Bumps [cached-path-relative](https://github.com/ashaffer/cached-path-relative) from 1.0.2 to 1.1.0.
- [Release notes](https://github.com/ashaffer/cached-path-relative/releases)
- [Commits](https://github.com/ashaffer/cached-path-relative/commits)

---
updated-dependencies:
- dependency-name: cached-path-relative
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-27 15:32:31 +00:00
Don Cross
90a9839d18 Optimize for map-making calculation patterns.
See this discussion:
https://github.com/cosinekitty/astronomy/issues/150

For the case of calculating a map, where each pixel
on the map represents a different location on the Earth,
it is more efficient to factor out expensive calculation
of sidereal times, assuming the entire map represents
some phenomenon at a single moment in time.

For example, to determine whether the Moon is visible
at different places on the Earth, the following
functions can be calculated across thousands of
different (lat, lon) geographic coordinates around
the world:

    ObserverVector
    Rotation_EQD_HOR

Before iterating over the map pixels, a program
can call GeoMoon, then convert EQJ coordinates to EQD.

Then by passing the same time value in a loop to
ObserverVector and Rotation_EQD_HOR, the program
can calculate a vector from the observer to the Moon
in EQD coordinates, then convert EQD to HOR.
The z-coordinate of the horizontal coordinates
determines whether the Moon is above or below the
observer's horizon at that point on the Earth.

This calculation pattern performed redundant
sidereal time calculations for each pixel on the map.
I changed the code for all 4 languages to cache
sidereal time so that it only needs to be calculated
once.

In the C version of Astronomy Engine, this resulted
in a speedup factor of about 2.3 in the above use case.
(See the function MapPerformanceTest in generate/ctest.c.)
2022-01-22 20:47:46 -05:00
Don Cross
0bfdb359b1 Fixed #153 - Optimize C functions by recycling nutation calculations.
Reduce the number of redundant Earth nutation calculations
by passing astro_time_t values as pointers in more functions.
Nutation values can then be cached in the time parameter
and passed to other functions that can then avoid calculating
the same nutation again.

Nutation is an expensive calculation, so reducing this overhead
can dramatically speed up certain use cases.

This was only needed in C, because this is the only language
in which times are passed by value. In Python, C#, and JavaScript,
times are objects that are already passed by reference, and
they already benefit from this nutation recyling approach.

The following functions have had their parameters changed.
This is a breaking change, but in every case, the caller
usually just needs to change `time` to `&time`.

    Astronomy_Rotation_EQD_EQJ
    Astronomy_Rotation_EQD_ECL
    Astronomy_Rotation_EQD_HOR
    Astronomy_Rotation_EQJ_EQD
    Astronomy_Rotation_EQJ_HOR
    Astronomy_Rotation_ECL_EQD
    Astronomy_Rotation_ECL_HOR
    Astronomy_Rotation_HOR_EQD
    Astronomy_Rotation_HOR_EQJ
    Astronomy_Rotation_HOR_ECL
    Astronomy_RotationAxis
    Astronomy_VectorObserver
2022-01-21 20:59:06 -05:00
Don Cross
111e1acb2b Improved instructions for Windows developers.
For developers wanting to contribute to Astronomy Engine,
the tooling instructions were vague about xsltproc.
I added some useful hints.

I also removed things that don't need to be manually
installed: jsdoc2md, graphviz, etc.
2022-01-19 19:48:05 -05:00
Don Cross
c668ea81e5 Windows: use certutil.exe to validate files.
In Windows builds, I was checking for the existence
of md5sum.exe, and if present, I used it for verifying
downloaded files. However, this is not a standard
utility that comes built into Windows 10.

I found there is a standard utility certutil.exe
that can calculate md5, sha256, etc, checksums.
However, it does not verify files created by the
Linux utilities md5sum, sha256sum, etc.

So I created a batch file checksum.bat that invokes
certutil.exe to process one of those listing files.
Reworked run.bat to call checksum.bat instead of
using md5sum.exe.
2022-01-19 17:49:10 -05:00
Don Cross
884539fde4 Windows CI: attempt downloading and running doxygen. 2022-01-10 16:01:00 -05:00
Don Cross
57a71af403 Windows CI: try using 'py' command to run Python programs.
Weirdly, the python program for generating constellation
data did not seem to run, but that failure did not break
the build directly. I am adding an explicity 'py' command
to run each Python program. Also added a check for missing
output constellation test data.
2022-01-09 22:06:28 -05:00
Don Cross
139fde6fe8 Windows CI: Upgraded Visual Studio target platform of C programs. 2022-01-09 20:42:28 -05:00
Don Cross
27adf8a3e0 Windows CI: second attempt to run msbuild.exe. 2022-01-09 20:09:32 -05:00
Don Cross
4ef515953e Windows CI: attempt to put msbuild.exe in PATH. 2022-01-09 19:57:30 -05:00
Don Cross
7d117f9d8c Windows CI: explicitly end md5 checksum files with LF.
The version of md5sum.exe that runs in GitHub Actions
gets confused when its input file ends with CRLF,
which is weird because this is supposed to be a Windows
environment. So I added a .gitattributes to force
these checksum files to have LF line endings.
2022-01-09 19:46:21 -05:00
Don Cross
e9922a48bb Windows CI: put quotes around executables.
In the GitHub Actions CI environment, the program md5sum.exe
resides in "C:\Program Files\Git\usr\bin\md5sum.exe".
Therefore, to execute it, I need quotes around the executable.
2022-01-09 17:43:46 -05:00
Don Cross
37c8aeafa9 Moved 'windows' directory away from root.
The 'windows' directory is mainly useful for
maintainers, not end users. So I moved it out of
the root to reduce distraction for a first-time
visitor.

While I was fixing up resulting breakage in
Visual Studio project files, I noticed I still had
some hard-coded absolute paths that would only work
on my own Windows laptop (e.g. "c:\don\github\astronomy").
I replaced those with relative paths that will work
regardless of what directory the repo is cloned into.
2022-01-09 12:55:41 -05:00