moonTimes function

({double rise, double set, double transit})? moonTimes(
  1. double jd,
  2. double lat,
  3. double lon,
  4. double deltaT,
  5. double th0,
  6. ({double dec, double parallax, double ra}) moonCoords(
    1. double jde
    ),
)

Convenience: moonrise/moonset/transit for a Julian Day at midnight.

jd should be at 0h UT (midnight). lat, lon in radians (lon positive west). moonCoords is a function that returns (ra, dec, parallax) for a given JDE. deltaT in seconds.

Returns seconds of day, or null if the Moon doesn't rise/set.

Implementation

({double rise, double transit, double set})? moonTimes(
    double jd,
    double lat,
    double lon,
    double deltaT,
    double th0,
    ({double ra, double dec, double parallax}) Function(double jde) moonCoords) {
  // Compute RA/dec at day-1, day0, day+1.
  final c0 = moonCoords(jd - 1);
  final c1 = moonCoords(jd);
  final c2 = moonCoords(jd + 1);

  final h0 = stdh0Lunar(c1.parallax);
  return times(lat, lon, deltaT, h0, th0,
      [c0.ra, c1.ra, c2.ra], [c0.dec, c1.dec, c2.dec]);
}