comparison lisp/calendar/lunar.el @ 13044:9155a9ab5de9

Added code to support Chinese calendar.
author Edward M. Reingold <reingold@emr.cs.iit.edu>
date Thu, 21 Sep 1995 02:46:47 +0000
parents 45559582aa9d
children 83f275dcd93a
comparison
equal deleted inserted replaced
13043:2072d3ab4119 13044:9155a9ab5de9
1 ;;; lunar.el --- calendar functions for phases of the moon. 1 ;;; lunar.el --- calendar functions for phases of the moon.
2 2
3 ;; Copyright (C) 1992, 1993 Free Software Foundation, Inc. 3 ;; Copyright (C) 1992, 1993, 1995 Free Software Foundation, Inc.
4 4
5 ;; Author: Edward M. Reingold <reingold@cs.uiuc.edu> 5 ;; Author: Edward M. Reingold <reingold@cs.uiuc.edu>
6 ;; Keywords: calendar 6 ;; Keywords: calendar
7 ;; Human-Keywords: moon, lunar phases, calendar, diary 7 ;; Human-Keywords: moon, lunar phases, calendar, diary
8 8
26 26
27 ;; This collection of functions implements lunar phases for calendar.el and 27 ;; This collection of functions implements lunar phases for calendar.el and
28 ;; diary.el. 28 ;; diary.el.
29 29
30 ;; Based on ``Astronomical Formulae for Calculators,'' 3rd ed., by Jean Meeus, 30 ;; Based on ``Astronomical Formulae for Calculators,'' 3rd ed., by Jean Meeus,
31 ;; Willmann-Bell, Inc., 1985. 31 ;; Willmann-Bell, Inc., 1985 and ``Astronomical Algorithms'' by Jean Meeus,
32 ;; Willmann-Bell, Inc., 1991.
32 ;; 33 ;;
33 ;; WARNING: The calculations will be accurate only to within a few minutes. 34 ;; WARNING: The calculations will be accurate only to within a few minutes.
34 35
35 ;; The author would be delighted to have an astronomically more sophisticated 36 ;; The author would be delighted to have an astronomically more sophisticated
36 ;; person rewrite the code for the lunar calculations in this file! 37 ;; person rewrite the code for the lunar calculations in this file!
165 (calendar-gregorian-from-absolute 166 (calendar-gregorian-from-absolute
166 (truncate date))))) 167 (truncate date)))))
167 60.0 24.0))) 168 60.0 24.0)))
168 (time (* 24 (- date (truncate date)))) 169 (time (* 24 (- date (truncate date))))
169 (date (calendar-gregorian-from-absolute (truncate date))) 170 (date (calendar-gregorian-from-absolute (truncate date)))
170 (adj (solar-adj-time-for-dst date time))) 171 (adj (dst-adjust-time date time)))
171 (list (car adj) (apply 'solar-time-string (cdr adj)) phase))) 172 (list (car adj) (apply 'solar-time-string (cdr adj)) phase)))
172 173
173 (defun lunar-phase-name (phase) 174 (defun lunar-phase-name (phase)
174 "Name of lunar PHASE. 175 "Name of lunar PHASE.
175 0 = new moon, 1 = first quarter, 2 = full moon, 3 = last quarter." 176 0 = new moon, 1 = first quarter, 2 = full moon, 3 = last quarter."
245 (setq phase (lunar-phase index))) 246 (setq phase (lunar-phase index)))
246 (if (calendar-date-equal (car phase) date) 247 (if (calendar-date-equal (car phase) date)
247 (concat (lunar-phase-name (car (cdr (cdr phase)))) " " 248 (concat (lunar-phase-name (car (cdr (cdr phase)))) " "
248 (car (cdr phase)))))) 249 (car (cdr phase))))))
249 250
251
252 ;; For the Chinese calendar the calculations for the new moon need to be more
253 ;; accurate than those above, so we use more terms in the approximation.
254
255 (defun lunar-new-moon-time (k)
256 "Astronomical (Julian) day number of K th new moon."
257 (let* ((T (/ k 1236.85))
258 (T2 (* T T))
259 (T3 (* T T T))
260 (T4 (* T2 T2))
261 (JDE (+ 2451550.09765
262 (* 29.530588853 k)
263 (* 0.0001337 T2)
264 (* -0.000000150 T3)
265 (* 0.00000000073 T4)))
266 (E (- 1 (* 0.002516 T) (* 0.0000074 T2)))
267 (sun-anomaly (+ 2.5534
268 (* 29.10535669 k)
269 (* -0.0000218 T2)
270 (* -0.00000011 T3)))
271 (moon-anomaly (+ 201.5643
272 (* 385.81693528 k)
273 (* 0.0107438 T2)
274 (* 0.00001239 T3)
275 (* -0.000000058 T4)))
276 (moon-argument (+ 160.7108
277 (* 390.67050274 k)
278 (* -0.0016341 T2)
279 (* -0.00000227 T3)
280 (* 0.000000011 T4)))
281 (omega (+ 124.7746
282 (* -1.56375580 k)
283 (* 0.0020691 T2)
284 (* 0.00000215 T3)))
285 (A1 (+ 299.77 (* 0.107408 k) (* -0.009173 T2)))
286 (A2 (+ 251.88 (* 0.016321 k)))
287 (A3 (+ 251.83 (* 26.641886 k)))
288 (A4 (+ 349.42 (* 36.412478 k)))
289 (A5 (+ 84.66 (* 18.206239 k)))
290 (A6 (+ 141.74 (* 53.303771 k)))
291 (A7 (+ 207.14 (* 2.453732 k)))
292 (A8 (+ 154.84 (* 7.306860 k)))
293 (A9 (+ 34.52 (* 27.261239 k)))
294 (A10 (+ 207.19 (* 0.121824 k)))
295 (A11 (+ 291.34 (* 1.844379 k)))
296 (A12 (+ 161.72 (* 24.198154 k)))
297 (A13 (+ 239.56 (* 25.513099 k)))
298 (A14 (+ 331.55 (* 3.592518 k)))
299 (correction
300 (+ (* -0.40720 (solar-sin-degrees moon-anomaly))
301 (* 0.17241 E (solar-sin-degrees sun-anomaly))
302 (* 0.01608 (solar-sin-degrees (* 2 moon-anomaly)))
303 (* 0.01039 (solar-sin-degrees (* 2 moon-argument)))
304 (* 0.00739 E (solar-sin-degrees (- moon-anomaly sun-anomaly)))
305 (* -0.00514 E (solar-sin-degrees (+ moon-anomaly sun-anomaly)))
306 (* 0.00208 E E (solar-sin-degrees (* 2 sun-anomaly)))
307 (* -0.00111 (solar-sin-degrees
308 (- moon-anomaly (* 2 moon-argument))))
309 (* -0.00057 (solar-sin-degrees
310 (+ moon-anomaly (* 2 moon-argument))))
311 (* 0.00056 E (solar-sin-degrees
312 (+ (* 2 moon-anomaly) sun-anomaly)))
313 (* -0.00042 (solar-sin-degrees (* 3 moon-anomaly)))
314 (* 0.00042 E (solar-sin-degrees
315 (+ sun-anomaly (* 2 moon-argument))))
316 (* 0.00038 E (solar-sin-degrees
317 (- sun-anomaly (* 2 moon-argument))))
318 (* -0.00024 E (solar-sin-degrees
319 (- (* 2 moon-anomaly) sun-anomaly)))
320 (* -0.00017 (solar-sin-degrees omega))
321 (* -0.00007 (solar-sin-degrees
322 (+ moon-anomaly (* 2 sun-anomaly))))
323 (* 0.00004 (solar-sin-degrees
324 (- (* 2 moon-anomaly) (* 2 moon-argument))))
325 (* 0.00004 (solar-sin-degrees (* 3 sun-anomaly)))
326 (* 0.00003 (solar-sin-degrees (+ moon-anomaly sun-anomaly
327 (* -2 moon-argument))))
328 (* 0.00003 (solar-sin-degrees
329 (+ (* 2 moon-anomaly) (* 2 moon-argument))))
330 (* -0.00003 (solar-sin-degrees (+ moon-anomaly sun-anomaly
331 (* 2 moon-argument))))
332 (* 0.00003 (solar-sin-degrees (- moon-anomaly sun-anomaly
333 (* -2 moon-argument))))
334 (* -0.00002 (solar-sin-degrees (- moon-anomaly sun-anomaly
335 (* 2 moon-argument))))
336 (* -0.00002 (solar-sin-degrees
337 (+ (* 3 moon-anomaly) sun-anomaly)))
338 (* 0.00002 (solar-sin-degrees (* 4 moon-anomaly)))))
339 (additional
340 (+ (* 0.000325 (solar-sin-degrees A1))
341 (* 0.000165 (solar-sin-degrees A2))
342 (* 0.000164 (solar-sin-degrees A3))
343 (* 0.000126 (solar-sin-degrees A4))
344 (* 0.000110 (solar-sin-degrees A5))
345 (* 0.000062 (solar-sin-degrees A6))
346 (* 0.000060 (solar-sin-degrees A7))
347 (* 0.000056 (solar-sin-degrees A8))
348 (* 0.000047 (solar-sin-degrees A9))
349 (* 0.000042 (solar-sin-degrees A10))
350 (* 0.000040 (solar-sin-degrees A11))
351 (* 0.000037 (solar-sin-degrees A12))
352 (* 0.000035 (solar-sin-degrees A13))
353 (* 0.000023 (solar-sin-degrees A14))))
354 (newJDE (+ JDE correction additional)))
355 (+ newJDE
356 (- (solar-ephemeris-correction
357 (extract-calendar-year
358 (calendar-gregorian-from-absolute
359 (floor (calendar-absolute-from-astro newJDE))))))
360 (/ calendar-time-zone 60.0 24.0))))
361
362 (defun lunar-new-moon-on-or-after (d)
363 "Astronomical (Julian) day number of first new moon on or after astronomical
364 (Julian) day number d. The fractional part is the time of day.
365
366 The date and time are local time, including any daylight savings rules,
367 as governed by the values of calendar-daylight-savings-starts,
368 calendar-daylight-savings-starts-time, calendar-daylight-savings-ends,
369 calendar-daylight-savings-ends-time, calendar-daylight-time-offset, and
370 calendar-time-zone."
371 (let* ((date (calendar-gregorian-from-absolute
372 (floor (calendar-absolute-from-astro d))))
373 (year (+ (extract-calendar-year date)
374 (/ (calendar-day-number date) 365.25)))
375 (k (floor (* (- year 2000.0) 12.3685)))
376 (date (lunar-new-moon-time k)))
377 (while (< date d)
378 (setq k (1+ k))
379 (setq date (lunar-new-moon-time k)))
380 (let* ((a-date (calendar-absolute-from-astro date))
381 (time (* 24 (- a-date (truncate a-date))))
382 (date (calendar-gregorian-from-absolute (truncate a-date)))
383 (adj (dst-adjust-time date time)))
384 (calendar-astro-from-absolute
385 (+ (calendar-absolute-from-gregorian (car adj))
386 (/ (car (cdr adj)) 24.0))))))
387
250 (provide 'lunar) 388 (provide 'lunar)
251 389
252 ;;; lunar.el ends here 390 ;;; lunar.el ends here