Mercurial > emacs
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 |