Subject: Re: bug#20414: Fwd: lunar.el

From: Lars Ingebrigtsen <[email-masked]>
Date: Tue, 25 Jun 2019 19:31:41 +0200

Nicholas Strauss <[email-masked]> writes:

>  2nd test is to compare predictions --  100 years run (modify
> emacs/lisp/calendar/lunar.el)
> NASA web page ( http://eclipse.gsfc.nasa.gov/LEdecade/LEdecade2011.html )
>
> I'm attaching my mutated lunar.el and a 100 year table.

Sounds great.  I was going to apply your patch (after changing it
coding-standards-wise slightly), but then I saw that you didn't have
copyright papers on file.  (I thought I remembered your name, but it was
a different Strauss.)

The change is big enough that a copyright assignment to the Free
Software Foundation is needed -- would you be willing to sign such
paperwork?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no
diff --git a/lisp/calendar/lunar.el b/lisp/calendar/lunar.el
index 1cdcc97f36..e3336fde8e 100644
--- a/lisp/calendar/lunar.el
+++ b/lisp/calendar/lunar.el
@@ -91,6 +91,7 @@ lunar-phase
                        (* -0.0016528 time time)
                        (* -0.00000239 time time time))
                     360.0))
+	 (eclipse (eclipse-check moon-lat phase))
          (adjustment
           (if (memq phase '(0 2))
               (+ (* (- 0.1734 (* 0.000393 time))
@@ -146,7 +147,25 @@ lunar-phase
          (time (* 24 (- date (truncate date))))
          (date (calendar-gregorian-from-absolute (truncate date)))
          (adj (dst-adjust-time date time)))
-    (list (car adj) (apply 'solar-time-string (cdr adj)) phase)))
+    (list (car adj) (apply 'solar-time-string (cdr adj)) phase eclipse)))
+
+;; from "Astronomy with your Personal Computer", Subroutine Eclipse
+;; Line 7000 Peter Duffett-Smith Cambridge University Press 1990
+(defun eclipse-check (moon-lat phase)
+  (let* ((moon-lat (* (/ math-pi 180) moon-lat))
+         (moon-lat (abs (- moon-lat (* (floor (/ moon-lat math-pi)) math-pi))))
+         (moon-lat (if (> moon-lat 0.37)
+                       (- math-pi moon-lat)
+                     moon-lat))
+         (phase-name (cond ((= phase 0) "Solar")
+                           ((= phase 2) "Lunar")
+                           (t ""))))
+    (cond ((< moon-lat 2.42600766e-1)
+	   (concat "** " phase-name " Eclipse **"))
+	  ((< moon-lat 0.37)
+	   (concat "** " phase-name " Eclipse possible **"))
+	  (t
+	   ""))))
 
 (defconst lunar-cycles-per-year 12.3685 ; 365.25/29.530588853
   "Mean number of lunar cycles per 365.25 day year.")
@@ -222,9 +241,10 @@ calendar-lunar-phases
         (insert
          (mapconcat
           (lambda (x)
-            (format "%s: %s %s" (calendar-date-string (car x))
+            (format "%s: %s %s %s" (calendar-date-string (car x))
                     (lunar-phase-name (nth 2 x))
-                    (cadr x)))
+                    (cadr x)
+		    (car (last x))))
           (lunar-phase-list m1 y1) "\n")))
       (message "Computing phases of the moon...done"))))