Commit Graph

109 Commits

Author SHA1 Message Date
Don Cross
3ce32f8819 Kotlin: lunar libration. Fixes for other languages.
The existing lunar libration functions in the
other languages (C, C#, Python, JavaScript) were
calculating the Moon's ecliptic latitude and longitude
in radians, not degrees as intended. They have been fixed.

Implemented the libration function for Kotlin.
2022-04-22 16:36:14 -04:00
Don Cross
554bbf1b00 Kotlin: calculate Lagrange points.
Calculate the position and velocity of any
of the five Lagrange points for a pair of
Solar System bodies. Added the functions:

    lagrangePoint
    lagrangePointFast
2022-04-21 21:11:44 -04:00
Don Cross
e545677d67 Kotlin: observerGravity function. 2022-04-21 16:04:53 -04:00
Don Cross
567376255c Kotlin: visual magnitude, peak magnitude search.
Implemented the `illumination` function, which calculates
visual magnitude, illuminated phase angle/fraction, and
ring tilt for Saturn.

Implemented `searchPeakMagnitude` for finding when
Venus appears brightest in the sky.
2022-04-20 19:47:21 -04:00
Don Cross
ef6af40b0d Kotlin: added maximum elongation search.
Added searchMaxElongation function, which finds the
next time Mercury or Venus reaches is maximum angular
separation from the Sun.
2022-04-18 13:03:08 -04:00
Don Cross
0af17074f2 Kotlin: elongation function.
This function calculates how easy it is to see a given planet
with respect to the Sun: how far apart they are in the sky,
and whether the planet is easier to see in the morning or evening.
This function is especially helpful for spotting Mercury,
but it works with any body.
2022-04-18 11:41:46 -04:00
Don Cross
17fbf34a71 Kotlin: search lunar perigee, apogee.
Added functions to find a series of consecutive
lunar apsides:

    searchLunarApsis
    nextLunarApsis
2022-04-17 21:29:12 -04:00
Don Cross
f64d22c1c2 Kotlin: search for transits of Mercury and Venus.
Implemented functions searchTransit and nextTransit.
2022-04-17 14:40:59 -04:00
Don Cross
16578935ad Kotlin: implemented relative longitude search.
Implemented searchRelativeLongitude, which finds
planetary conjunctions and oppositions.
Discovered I can make all languages' unit tests
more strict: 6.8 minute error tolerance instead of 15.

Fixed documentation mistake in C# function SearchRelativeLongitude:
the function cannot return null. It either finds a solution time
or throws an exception.

Simplified Kotlin unit tests: use a more compact pattern of
scanning space-delimited tokens in lines.
2022-04-17 12:22:07 -04:00
Don Cross
4f387e5fda Kotlin: added heliocentric/topocentric state vector tests. 2022-04-16 16:23:35 -04:00
Don Cross
0ed52f3cea Kotlin: barycentric states, geocentric moon/EMB
Added geoEmbState: calculates the geocentric
state vector of the Earth/Moon Barycenter (EMB).

Added baryState: calculates the barycentric
state vector of a body.

Unit tests now support parsing JPL Horizons
state vector text files.
2022-04-16 15:31:25 -04:00
Don Cross
d5fc878a6a Kotlin: calculate heliocentric ecliptic longitude
Added function: eclipticLongitude.
Verified its calculations against the same function
in the Python version of Astronomy Engine.
2022-04-16 12:59:48 -04:00
Don Cross
f0b0113806 Kotlin: added local solar eclipse prediction.
Added functions to predict solar eclipses seen
from a specified geographic location on the Earth:

    searchLocalSolarEclipse
    nextLocalSolarEclipse
2022-04-16 10:25:22 -04:00
Don Cross
61e398b592 Kotlin: removed all dependencies on JVM.
The Kotlin version of Astronomy Engine was using Java
classes like `Date` and `GregorianCalendar`.

Reworked the code to use a completely self-contained
representation of calendar date/time, just like the C version does.
Now Astronomy Engine does not depend on anything outside of
the Kotlin standard library. This should allow us to use
Astronomy Engine for Kotlin Native apps, Web Assembly, etc.

Updated Java demo to use the new method Time.fromMillisecondsSince1970.
2022-04-14 10:55:22 -04:00
Ebrahim Byagowi
b06493fd6d kotlin: Improve access of companions object fields/methods in Java 2022-04-13 04:25:22 +04:30
Don Cross
5052920517 Merge pull request #200 from ebraminio/kotlin-sam
kotlin: Move search context to the end of arguments
2022-04-12 19:22:18 -04:00
Ebrahim Byagowi
902f25db3f kotlin: Move search context to the end of arguments
This, in addition to annotating SearchContext interface as functional,
turns it into a more idiomatic Kotlin.
2022-04-13 02:53:39 +04:30
Don Cross
77b6edd2ff Kotlin: global solar eclipse search
Added functions:
    searchGlobalSolarEclipse
    nextGlobalSolarEclipse

These functions find a solar eclipse that is visible
somewhere on the Earth. They report the time of the
eclipse, what kind it is (partial, annular, total),
and if annular/total, the geographic location where
the eclipse is greatest.
2022-04-12 16:46:40 -04:00
Don Cross
74cca88d9e Kotlin: lunar eclipse search
Added functions:
    searchLunarEclipse
    nextLunarEclipse

These allow searching for a series of consecutive
lunar eclipses, including penumbral, partial,
and total eclipses.

Added a few extra functions that will be used soon
to search for solar eclipses (global and local) and
transits of Mercury and Venus.
2022-04-12 14:01:22 -04:00
Don Cross
57a736067a Kotlin: renamed AstroTime, AstroVector.
Renamed AstroTime to Time.
Renamed AstroVector to Vector.
For some reason this breaks the Java demo build.
I'm pushing the broken build anyway to see if
ebraminio can help me fix it.
2022-04-11 20:17:59 -04:00
Don Cross
4b3b445889 Kotlin: added function angleFromSun. 2022-04-10 20:42:31 -04:00
Don Cross
3dd817934e Kotlin: minor code cleanup.
Changed RotationMatrix.identity from a variable to a function.
I want to leave open the possibility of mutating matrices
in the future, for the sake of performance critical code.
That means it is a good idea to create a new matrix to avoid
unintended side effects.

Removed redundant function equatorFromVector.
It was the same as Vector.toEquatorial.

Moved nextMoonQuarter to be right after searchMoonQuarter.
Somehow other functions had ended up between them.

Simpler syntax for initializing SearchContextPeakAltitude.
2022-04-10 17:23:22 -04:00
Don Cross
b1ebd8d0d7 Kotlin: convert AstroVector to Observer.
Added `AstroVector.toObserver`, which converts a
geocentric equatorial vector (EQJ or EQD) into
a geographic location in an `Observer` object.
2022-04-09 19:41:15 -04:00
Don Cross
3f71bfeb63 Kotlin: convert Observer to StateVector.
Added `Observer.toStateVector` and `Observer.toVector` for converting
an observer's geographic location to position and velocity vectors
relative to the Earth's center.

Reworked the C unit test to output a text file that can be used
as reference, to make sure the Kotlin output matches.
2022-04-09 17:00:36 -04:00
Ebrahim Byagowi
086a1f602d kotlin: Turn calculation functions to top level declaration 2022-04-09 03:59:12 +04:30
Don Cross
37d15e5f6a Kotlin: altitude search
Added Astronomy.searchAltitude, which enables more generic
searches for altitude events. The most common use for these
are finding civil, nautical, and astronomical twilight times.
2022-04-07 15:12:08 -04:00
Don Cross
1d491118e9 Kotlin: implemented search for rise/set, hour angle.
Implemented the following Kotlin functions:

    Astronomy.searchHourAngle
    Astronomy.searchRiseSet

The Kotlin code can now search for rise/set
times for a given Earthbound observer for the
Sun, Moon, or any planet.

It can also search for times when a given body
reaches a desired hour angle. This has its own
value (for example, culmination), but is also
used to assist finding time brackets that bound
rise/set events.

Added special case exception type:
EarthNotAllowedException.
This follows the pattern of the other languages,
and makes diagnosing a violation easier than
the more generic InvalidBodyException.

Minor simplifications to the C# function
Astronomy.InternalSearchAltitude.

Improved the comments for the C# unit test
function RiseSetTest. They make the algorithm
easier to understand.
2022-04-07 11:56:28 -04:00
Don Cross
94c7884f11 Kotlin: added moon phase and search functions.
Added the following Kotlin functions:

    equatorialToEcliptic
    pairLongitude
    moonPhase
    searchMoonPhase
    searchMoonQuarter
    nextMoonQuarter

Discovered I could tighten the tolerance for the moon phase
unit tests from 120 seconds to 90 seconds and they still pass.
2022-04-05 17:33:19 -04:00
Don Cross
c7bc1a1fe0 Kotlin: fixed formatting of @return doc.
Dokka preserves leading whitespace in the text after
`@return` comments. This causes these fields to render
as preformatted text. Removed the leading whitespace so
this text is rendered as normal markdown.
2022-04-04 12:21:08 -04:00
Don Cross
69bc2e60fc Kotlin: Fixed documentation for return values.
I was using `@returns` in the documentation comments
in Kotlin code, instead of `@return`. Thanks to @ebraminio
for pointing this out.
2022-04-03 20:23:32 -04:00
Don Cross
10bb3f30de Kotlin: implemented seasons search.
Implemented the following related functions in Kotlin:

    sunPosition
    searchSunLongitude
    seasons

C#: fail Astronomy.Seasons with an exception if any of the
equinox/solstice searches fail. If this ever happens, it is
an internal error. It should not be the burden of the caller
to check for nulls!  Fixed mistake in documentation for
searchSunLongitude.
2022-04-03 20:02:11 -04:00
Don Cross
075a80fde8 Kotlin: Implemented Astronomy.search.
Implemented the low-level search function that will be used
to implement all the special-purpose search functions to come.

Added missing documentation to class NodeEventInfo members.

Minor cleanup in the C# function `Astronomy.Search`:
- removed an unused output parameter.
- deleted confusing sentence in documentation.
2022-04-03 10:37:12 -04:00
Don Cross
e879a67be7 Kotlin: Added constellation function. 2022-04-02 15:17:14 -04:00
Don Cross
04e7102f76 Kotlin: rotationEqjGal, rotationGalEqj. 2022-04-01 19:59:03 -04:00
Don Cross
9b11c44b9e Kotlin: rotationEclHor, rotationHorEcl. 2022-04-01 19:44:33 -04:00
Don Cross
a7e667309d Kotlin: rotationEqdEcl, rotationEclEqd. 2022-04-01 19:34:26 -04:00
Don Cross
3c2f8c0cc9 Kotlin: rotationEqjHor, rotationHorEqj.
Added two more rotation functions.

Corrected a typo in the documentation for Rotation_HOR_EQJ
in the other 4 languages.
2022-04-01 19:19:24 -04:00
Don Cross
2ee5f6f8f5 Kotlin: rotationEqdHor, rotationHorEqd.
Added two more of the rotation functions.
This is the pair for converting between of-date equatorial
coordinates and an observer's horizontal system.
2022-04-01 18:52:00 -04:00
Don Cross
cf38342f69 Kotlin: implemented rotationEqdEqj. 2022-04-01 18:27:50 -04:00
Don Cross
aeb6e90028 Kotlin: starting to add rotation functions.
Starting to add the functions that create rotation
matrices to convert from one orientation to another.
Here are the ones implemented in this commit:

    rotationEqjEcl
    rotationEclEqj
    rotationEqjEqd

Also starting to add missing documentation to
resolve Dokka warnings.
2022-04-01 18:12:21 -04:00
Don Cross
397c259bc6 Kotlin: Jupiter's moons.
Implemented Kotlin functions and code generator
for calculating the state vectors of Jupiter's
largest 4 moons.

Added cautionary comments about needing to correct
Jupiter's moons for light travel time.

This is the first pass to get everything needed
for the AstroCheck tests. I tried comparing
C output to Kotlin output, and there are some
serious problems to debug:

    $ ./ctest diff 2.8e-16 temp/{c,k}_check.txt
    First  file: temp/c_check.txt
    Second file: temp/k_check.txt
    Tolerance = 2.800e-16

                lnum                 a_value                 b_value     factor       diff  name
    FAIL      137746  4.2937184148112564e+01  4.2944101081740065e+01    0.03364  2.327e-04  helio_x
    FAIL      373510  1.4197190315274938e+01  1.4193716564905307e+01    0.03364  1.168e-04  helio_y
    FAIL      137746 -6.5897675150466091e+00 -6.5929481589493522e+00    0.03364  1.070e-04  helio_z
    FAIL       59150  1.8035183339348251e+01  1.8035909197904104e+01    0.01730  1.255e-05  sky_j2000_ra
    FAIL      137747 -8.1222057639092533e+00 -8.1250990689970894e+00    0.00556  1.607e-05  sky_j2000_dec
    FAIL      137747  4.8436159305823310e+01  4.8441487614058218e+01    0.03481  1.855e-04  sky_j2000_dist
    FAIL      322846  8.7596368704201495e+01  2.6760770774700188e+02    0.00278  4.995e-01  sky_hor_az
    FAIL      405828 -6.5075824596574279e+01  5.6922941329250996e+01    0.00556  6.778e-01  sky_hor_alt
      OK       92717  4.1268347083494783e-03  4.1268347083494774e-03  223.21429  1.936e-16  jm_x
      OK       45091 -8.0149190392649894e-03 -8.0149190392649929e-03   79.42812  2.756e-16  jm_y
      OK      135377  1.5470777280065808e-03  1.5470777280065804e-03  223.21429  9.680e-17  jm_z
      OK      216836  4.5725777238332412e-03  4.5725777238332394e-03  126.58228  2.196e-16  jm_vx
      OK      351647  5.1351566793199944e-03  5.1351566793199962e-03  126.58228  2.196e-16  jm_vy
      OK      351647  2.5217607180929289e-03  2.5217607180929298e-03  126.58228  1.098e-16  jm_vz

    Score = 6.778e-01
    ctest(Diff): EXCEEDED ERROR TOLERANCE.

So I'm checking this in as work-in-progress.
2022-03-30 22:49:22 -04:00
Don Cross
74a1274c85 Kotlin: Implemented functions: geoVector, equator, horizon.
Implemented more of the core functions needed for
the AstroCheck tests. Most of AstroCheck is now implemented,
except for the JupiterMoons tests.

Code cleanup thanks to @ebraminio:
- Use `when { }` syntax.
- Renamed `IllumInfo` to `IlluminationInfo`.
- Other minor naming fixes.

Configured Dokka to warn about undocumented symbols.

We also configured Dokka to omit internal symbols, including
inside enums, but that does not work, despite this bug
being marked fixed in dokka:

https://github.com/Kotlin/dokka/issues/1802

We suspect they didn't really fix the bug, and that
there is a bug in their test.
2022-03-30 20:42:24 -04:00
Don Cross
f2d19c4dcc Fixed #179: Fixed Kotlin hyperlinks.
Thanks to @ebraminio for telling me how to fix the
Kotlin docstring hyperlinks. Symbols just need to be put
in brackets, not prefixed by a pound sign.
2022-03-30 14:48:20 -04:00
Don Cross
832fec5ce7 Kotlin: simplified per-body mass product and VSOP87 models.
Thanks to @ebraminio, I learned that Kotlin enum classes
allow the members to contain data properties. This greatly
simplifies code so that I no longer need such verbose
`when (body)` statements.

I also understand Kotlin enums better, and I realized
there is no need for `Body.Invalid`, because the compiler
simply does not allow invalid enum values to exist.
In any future hypothetical situation where I want to
represent an optional `Body` value, I can use the nullable type `Body?`.
2022-03-30 14:22:22 -04:00
Don Cross
e4a186aa09 Kotlin: heliocentric state vectors.
Added Astronomy.geoMoonState and Astronomy.helioState functions.
These allow calculating the position and velocity of any
solar system body.

Added sanity checks for state vectors in the unit tests.
2022-03-30 12:53:23 -04:00
Don Cross
1eeea5b46e Kotlin: calculate Solar System Barycenter position. 2022-03-29 20:54:17 -04:00
Don Cross
9d38dac2f1 Kotlin: Gravity simulator, Pluto calculation.
Added calculation of heliocentric and barycentric
state vectors for Pluto. This is done using
a gravity simulator that treats Pluto as a negligible
mass that is affected by the major masses of the
Solar System: Sun, Jupiter, Saturn, Uranus, Neptune.

Updated the code generator to write the Kotlin
version of the Pluto state table, a lookup table
of known-correct state vectors of Pluto at long
intervals, derived from the TOP2013 model.

The gravity simulator interpolates state vectors
of Pluto between these known-correct states.

Minor code style cleanup in the Kotlin source.

Fixed a possible thread-safety issue in the C# code.
2022-03-29 19:22:40 -04:00
Don Cross
044ecfb774 Kotlin: VSOP87 position, velocity vectors.
Implemented the VSOP87 calculation functions for
heliocentric position vectors, heliocentric velocity vectors,
and heliocentric distances.
Implemented Astronomy.helioVector for everything except Pluto and SSB.

Corrected small errors in C# documentation.
2022-03-28 12:33:01 -04:00
Don Cross
2d5ef05536 Kotlin: implemented geocentric Moon.
Implemented the Montenbruck/Pfleger version of the NAO1954
geocentric Moon model in Kotlin.

In the process, code review helped simplify parts of the C# code.
I may want to go back and see if I can simplify the CalcMoon
code in the other languages too.
2022-03-27 20:39:43 -04:00
Don Cross
a96c8358b9 Kotlin: Added Astronomy.rotationAxis().
Added the rotationAxis, which calculates dynamic orientation
of planet, Sun, and Moon rotation axes. Added the first
unit test that verifies against JPL Horizons data.

Eliminated more redundant time parameters in precession functions.

More cleanup of C# code: I realized the private function
vector2radec was redundant with the public function EquatorFromVector.
Deleted vector2radec.
2022-03-26 20:42:14 -04:00