1891 lines
58 KiB
C
1891 lines
58 KiB
C
|
|
/* SWISSEPH
|
|
$Header: /home/dieter/sweph/RCS/swemmoon.c,v 1.74 2008/06/16 10:07:20 dieter Exp $
|
|
*
|
|
* Steve Moshier's analytical lunar ephemeris
|
|
|
|
**************************************************************/
|
|
|
|
/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved.
|
|
|
|
License conditions
|
|
------------------
|
|
|
|
This file is part of Swiss Ephemeris.
|
|
|
|
Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author
|
|
or distributor accepts any responsibility for the consequences of using it,
|
|
or for whether it serves any particular purpose or works at all, unless he
|
|
or she says so in writing.
|
|
|
|
Swiss Ephemeris is made available by its authors under a dual licensing
|
|
system. The software developer, who uses any part of Swiss Ephemeris
|
|
in his or her software, must choose between one of the two license models,
|
|
which are
|
|
a) GNU public license version 2 or later
|
|
b) Swiss Ephemeris Professional License
|
|
|
|
The choice must be made before the software developer distributes software
|
|
containing parts of Swiss Ephemeris to others, and before any public
|
|
service using the developed software is activated.
|
|
|
|
If the developer choses the GNU GPL software license, he or she must fulfill
|
|
the conditions of that license, which includes the obligation to place his
|
|
or her whole software project under the GNU GPL or a compatible license.
|
|
See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
|
|
If the developer choses the Swiss Ephemeris Professional license,
|
|
he must follow the instructions as found in http://www.astro.com/swisseph/
|
|
and purchase the Swiss Ephemeris Professional Edition from Astrodienst
|
|
and sign the corresponding license contract.
|
|
|
|
The License grants you the right to use, copy, modify and redistribute
|
|
Swiss Ephemeris, but only under certain conditions described in the License.
|
|
Among other things, the License requires that the copyright notices and
|
|
this notice be preserved on all copies.
|
|
|
|
Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl
|
|
|
|
The authors of Swiss Ephemeris have no control or influence over any of
|
|
the derived works, i.e. over software or services created by other
|
|
programmers which use Swiss Ephemeris functions.
|
|
|
|
The names of the authors or of the copyright holder (Astrodienst) must not
|
|
be used for promoting any software, product or service which uses or contains
|
|
the Swiss Ephemeris. This copyright notice is the ONLY place where the
|
|
names of the authors can legally appear, except in cases where they have
|
|
given special permission in writing.
|
|
|
|
The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used
|
|
for promoting such software, products or services.
|
|
*/
|
|
|
|
|
|
/*
|
|
* Expansions for the geocentric ecliptic longitude,
|
|
* latitude, and distance of the Moon referred to the mean equinox
|
|
* and ecliptic of date.
|
|
*
|
|
* This version of cmoon.c adjusts the ELP2000-85 analytical Lunar
|
|
* theory of Chapront-Touze and Chapront to fit the Jet Propulsion
|
|
* Laboratory's DE404 long ephemeris on the interval from 3000 B.C.
|
|
* to 3000 A.D.
|
|
*
|
|
* The fit is much better in the remote past and future if
|
|
* secular terms are included in the arguments of the oscillatory
|
|
* perturbations. Such adjustments cannot easily be incorporated
|
|
* into the 1991 lunar tables. In this program the traditional
|
|
* literal arguments are used instead, with mean elements adjusted
|
|
* for a best fit to the reference ephemeris.
|
|
*
|
|
* This program omits many oscillatory terms from the analytical
|
|
* theory which, if they were included, would yield a much higher
|
|
* accuracy for modern dates. Detailed statistics of the precision
|
|
* are given in the table below. Comparing at 64-day intervals
|
|
* over the period -3000 to +3000, the maximum discrepancies noted
|
|
* were 7" longitude, 5" latitude, and 5 x 10^-8 au radius.
|
|
* The expressions used for precession in this comparision were
|
|
* those of Simon et al (1994).
|
|
*
|
|
* The adjusted coefficients were found by an unweighted least squares
|
|
* fit to the numerical ephemeris in the mentioned test interval.
|
|
* The approximation error increases rapidly outside this interval.
|
|
* J. Chapront (1994) has described the basic fitting procedure.
|
|
*
|
|
* A major change from DE200 to DE404 is in the coefficient
|
|
* of tidal acceleration of the Moon, which causes the Moon's
|
|
* longitude to depart by about -0.9" per century squared
|
|
* from DE200. Uncertainty in this quantity continues to
|
|
* be the limiting factor in long term projections of the Moon's
|
|
* ephemeris.
|
|
*
|
|
* Since the Lunar theory is cast in the ecliptic of date, it makes
|
|
* some difference what formula you use for precession. The adjustment
|
|
* to DE404 was carried out relative to the mean equinox and ecliptic
|
|
* of date as defined in Williams (1994). An earlier version of this
|
|
* program used the precession given by Simon et al (1994). The difference
|
|
* between these two precession formulas amounts to about 12" in Lunar
|
|
* longitude at 3000 B.C.
|
|
*
|
|
* Maximum deviations between DE404 and this program
|
|
* in a set of 34274 samples spaced 64 days apart
|
|
*
|
|
* Interval Longitude Latitude Radius
|
|
* Julian Year arc sec arc sec 10^-8 au
|
|
* -3000 to -2500 5.66 4.66 4.93
|
|
* -2500 to -2000 5.49 3.98 4.56
|
|
* -2000 to -1500 6.98 4.17 4.81
|
|
* -1500 to -1000 5.74 3.53 4.87
|
|
* -1000 to -500 5.95 3.42 4.67
|
|
* -500 to 0 4.94 3.07 4.04
|
|
* 0 to 500 4.42 2.65 4.55
|
|
* 500 to 1000 5.68 3.30 3.99
|
|
* 1000 to 1500 4.32 3.21 3.83
|
|
* 1500 to 2000 2.70 2.69 3.71
|
|
* 2000 to 2500 3.35 2.32 3.85
|
|
* 2500 to 3000 4.62 2.39 4.11
|
|
*
|
|
*
|
|
*
|
|
* References:
|
|
*
|
|
* James G. Williams, "Contributions to the Earth's obliquity rate,
|
|
* precession, and nutation," Astron. J. 108, 711-724 (1994)
|
|
*
|
|
* DE403 and DE404 ephemerides by E. M. Standish, X. X. Newhall, and
|
|
* J. G. Williams are at the JPL computer site navigator.jpl.nasa.gov.
|
|
*
|
|
* J. L. Simon, P. Bretagnon, J. Chapront, M. Chapront-Touze', G. Francou,
|
|
* and J. Laskar, "Numerical Expressions for precession formulae and
|
|
* mean elements for the Moon and the planets," Astronomy and Astrophysics
|
|
* 282, 663-683 (1994)
|
|
*
|
|
* P. Bretagnon and Francou, G., "Planetary theories in rectangular
|
|
* and spherical variables. VSOP87 solutions," Astronomy and
|
|
* Astrophysics 202, 309-315 (1988)
|
|
*
|
|
* M. Chapront-Touze' and J. Chapront, "ELP2000-85: a semi-analytical
|
|
* lunar ephemeris adequate for historical times," Astronomy and
|
|
* Astrophysics 190, 342-352 (1988).
|
|
*
|
|
* M. Chapront-Touze' and J. Chapront, _Lunar Tables and
|
|
* Programs from 4000 B.C. to A.D. 8000_, Willmann-Bell (1991)
|
|
*
|
|
* J. Laskar, "Secular terms of classical planetary theories
|
|
* using the results of general theory," Astronomy and Astrophysics
|
|
* 157, 59070 (1986)
|
|
*
|
|
* S. L. Moshier, "Comparison of a 7000-year lunar ephemeris
|
|
* with analytical theory," Astronomy and Astrophysics 262,
|
|
* 613-616 (1992)
|
|
*
|
|
* J. Chapront, "Representation of planetary ephemerides by frequency
|
|
* analysis. Application to the five outer planets," Astronomy and
|
|
* Astrophysics Suppl. Ser. 109, 181-192 (1994)
|
|
*
|
|
*
|
|
* Entry swi_moshmoon2() returns the geometric position of the Moon
|
|
* relative to the Earth. Its calling procedure is as follows:
|
|
*
|
|
* double JD; input Julian Ephemeris Date
|
|
* double pol[3]; output ecliptic polar coordinatees in radians and au
|
|
* pol[0] longitude, pol[1] latitude, pol[2] radius
|
|
* swi_moshmoon2( JD, pol );
|
|
*
|
|
* - S. L. Moshier, August, 1991
|
|
* DE200 fit: July, 1992
|
|
* DE404 fit: October, 1995
|
|
*
|
|
* Dieter Koch: adaptation to SWISSEPH, April 1996
|
|
* 18-feb-2006 replaced LP by SWELP because of name collision
|
|
*/
|
|
|
|
#include <string.h>
|
|
#include "swephexp.h"
|
|
#include "sweph.h"
|
|
#include "swephlib.h"
|
|
|
|
static void mean_elements(void);
|
|
static void mean_elements_pl(void);
|
|
static double mods3600(double x);
|
|
static void ecldat_equ2000(double tjd, double *xpm);
|
|
static void chewm(short *pt, int nlines, int nangles, int typflg,
|
|
double *ans);
|
|
static void sscc(int k, double arg, int n);
|
|
static void moon1(void);
|
|
static void moon2(void);
|
|
static void moon3(void);
|
|
static void moon4(void);
|
|
|
|
|
|
#ifdef MOSH_MOON_200
|
|
|
|
/* The following coefficients were calculated by a simultaneous least
|
|
* squares fit between the analytical theory and the continued DE200
|
|
* numerically integrated ephemeris from 9000 BC to 13000 AD.
|
|
* See references to the array z[] later on in the program.
|
|
* The 71 coefficients were estimated from 42,529 Lunar positions.
|
|
*/
|
|
static double z[] = {
|
|
-1.225346551567e+001, /* F, t^2 */
|
|
-1.096676093208e-003, /* F, t^3 */
|
|
-2.165750777942e-006, /* F, t^4 */
|
|
-2.790392351314e-009, /* F, t^5 */
|
|
4.189032191814e-011, /* F, t^6 */
|
|
4.474984866301e-013, /* F, t^7 */
|
|
3.239398410335e+001, /* l, t^2 */
|
|
5.185305877294e-002, /* l, t^3 */
|
|
-2.536291235258e-004, /* l, t^4 */
|
|
-2.506365935364e-008, /* l, t^5 */
|
|
3.452144225877e-011, /* l, t^6 */
|
|
-1.755312760154e-012, /* l, t^7 */
|
|
-5.870522364514e+000, /* D, t^2 */
|
|
6.493037519768e-003, /* D, t^3 */
|
|
-3.702060118571e-005, /* D, t^4 */
|
|
2.560078201452e-009, /* D, t^5 */
|
|
2.555243317839e-011, /* D, t^6 */
|
|
-3.207663637426e-013, /* D, t^7 */
|
|
-4.776684245026e+000, /* L, t^2 */
|
|
6.580112707824e-003, /* L, t^3 */
|
|
-6.073960534117e-005, /* L, t^4 */
|
|
-1.024222633731e-008, /* L, t^5 */
|
|
2.235210987108e-010, /* L, t^6 */
|
|
7.200592540556e-014, /* L, t^7 */
|
|
-8.552017636339e+001, /* t^2 cos(18V - 16E - l) */
|
|
-2.055794304596e+002, /* t^2 sin(18V - 16E - l) */
|
|
-1.097555241866e+000, /* t^3 cos(18V - 16E - l) */
|
|
5.219423171002e-001, /* t^3 sin(18V - 16E - l) */
|
|
2.088802640755e-003, /* t^4 cos(18V - 16E - l) */
|
|
4.616541527921e-003, /* t^4 sin(18V - 16E - l) */
|
|
4.794930645807e+000, /* t^2 cos(10V - 3E - l) */
|
|
-4.595134364283e+001, /* t^2 sin(10V - 3E - l) */
|
|
-6.659812174691e-002, /* t^3 cos(10V - 3E - l) */
|
|
-2.570048828246e-001, /* t^3 sin(10V - 3E - l) */
|
|
6.229863046223e-004, /* t^4 cos(10V - 3E - l) */
|
|
5.504368344700e-003, /* t^4 sin(10V - 3E - l) */
|
|
-3.084830597278e+000, /* t^2 cos(8V - 13E) */
|
|
-1.000471012253e+001, /* t^2 sin(8V - 13E) */
|
|
6.590112074510e-002, /* t^3 cos(8V - 13E) */
|
|
-3.212573348278e-003, /* t^3 sin(8V - 13E) */
|
|
5.409038312567e-004, /* t^4 cos(8V - 13E) */
|
|
1.293377988163e-003, /* t^4 sin(8V - 13E) */
|
|
2.311794636111e+001, /* t^2 cos(4E - 8M + 3J) */
|
|
-3.157036220040e+000, /* t^2 sin(4E - 8M + 3J) */
|
|
-3.019293162417e+000, /* t^2 cos(18V - 16E) */
|
|
-9.211526858975e+000, /* t^2 sin(18V - 16E) */
|
|
-4.993704215784e-002, /* t^3 cos(18V - 16E) */
|
|
2.991187525454e-002, /* t^3 sin(18V - 16E) */
|
|
-3.827414182969e+000, /* t^2 cos(18V - 16E - 2l) */
|
|
-9.891527703219e+000, /* t^2 sin(18V - 16E - 2l) */
|
|
-5.322093802878e-002, /* t^3 cos(18V - 16E - 2l) */
|
|
3.164702647371e-002, /* t^3 sin(18V - 16E - 2l) */
|
|
7.713905234217e+000, /* t^2 cos(2J - 5S) */
|
|
-6.077986950734e+000, /* t^3 sin(2J - 5S) */
|
|
-1.278232501462e-001, /* t^2 cos(L - F) */
|
|
4.760967236383e-001, /* t^2 sin(L - F) */
|
|
-6.759005756460e-001, /* t^3 sin(l') */
|
|
1.655727996357e-003, /* t^4 sin(l') */
|
|
1.646526117252e-001, /* t^3 sin(2D - l') */
|
|
-4.167078100233e-004, /* t^4 sin(2D - l') */
|
|
2.067529538504e-001, /* t^3 sin(2D - l' - l) */
|
|
-5.219127398748e-004, /* t^4 sin(2D - l' - l) */
|
|
-1.526335222289e-001, /* t^3 sin(l' - l) */
|
|
-1.120545131358e-001, /* t^3 sin(l' + l) */
|
|
4.619472391553e-002, /* t^3 sin(2D - 2l') */
|
|
4.863621236157e-004, /* t^4 sin(2D - 2l') */
|
|
-4.280059182608e-002, /* t^3 sin(2l') */
|
|
-4.328378207833e-004, /* t^4 sin(2l') */
|
|
-8.371028286974e-003, /* t^3 sin(2D - l) */
|
|
4.089447328174e-002, /* t^3 sin(2D - 2l' - l) */
|
|
-1.238363006354e-002, /* t^3 sin(2D + 2l' - l) */
|
|
};
|
|
#else
|
|
|
|
/* The following coefficients were calculated by a simultaneous least
|
|
* squares fit between the analytical theory and DE404 on the finite
|
|
* interval from -3000 to +3000.
|
|
* The coefficients were estimated from 34,247 Lunar positions.
|
|
*/
|
|
static double FAR z[] = {
|
|
|
|
/* The following are scaled in arc seconds, time in Julian centuries.
|
|
They replace the corresponding terms in the mean elements. */
|
|
-1.312045233711e+01, /* F, t^2 */
|
|
-1.138215912580e-03, /* F, t^3 */
|
|
-9.646018347184e-06, /* F, t^4 */
|
|
3.146734198839e+01, /* l, t^2 */
|
|
4.768357585780e-02, /* l, t^3 */
|
|
-3.421689790404e-04, /* l, t^4 */
|
|
-6.847070905410e+00, /* D, t^2 */
|
|
-5.834100476561e-03, /* D, t^3 */
|
|
-2.905334122698e-04, /* D, t^4 */
|
|
-5.663161722088e+00, /* L, t^2 */
|
|
5.722859298199e-03, /* L, t^3 */
|
|
-8.466472828815e-05, /* L, t^4 */
|
|
|
|
/* The following longitude terms are in arc seconds times 10^5. */
|
|
-8.429817796435e+01, /* t^2 cos(18V - 16E - l) */
|
|
-2.072552484689e+02, /* t^2 sin(18V - 16E - l) */
|
|
7.876842214863e+00, /* t^2 cos(10V - 3E - l) */
|
|
1.836463749022e+00, /* t^2 sin(10V - 3E - l) */
|
|
-1.557471855361e+01, /* t^2 cos(8V - 13E) */
|
|
-2.006969124724e+01, /* t^2 sin(8V - 13E) */
|
|
2.152670284757e+01, /* t^2 cos(4E - 8M + 3J) */
|
|
-6.179946916139e+00, /* t^2 sin(4E - 8M + 3J) */
|
|
-9.070028191196e-01, /* t^2 cos(18V - 16E) */
|
|
-1.270848233038e+01, /* t^2 sin(18V - 16E) */
|
|
-2.145589319058e+00, /* t^2 cos(2J - 5S) */
|
|
1.381936399935e+01, /* t^2 sin(2J - 5S) */
|
|
-1.999840061168e+00, /* t^3 sin(l') */
|
|
};
|
|
#endif /* ! MOSH_MOON_200 */
|
|
|
|
/* Perturbation tables
|
|
*/
|
|
#define NLR 118
|
|
static short FAR LR[8 * NLR] = {
|
|
|
|
/*
|
|
Longitude Radius
|
|
D l' l F 1" .0001" 1km .0001km */
|
|
|
|
0, 0, 1, 0, 22639, 5858, -20905, -3550,
|
|
2, 0, -1, 0, 4586, 4383, -3699, -1109,
|
|
2, 0, 0, 0, 2369, 9139, -2955, -9676,
|
|
0, 0, 2, 0, 769, 257, -569, -9251,
|
|
0, 1, 0, 0, -666, -4171, 48, 8883,
|
|
0, 0, 0, 2, -411, -5957, -3, -1483,
|
|
2, 0, -2, 0, 211, 6556, 246, 1585,
|
|
2, -1, -1, 0, 205, 4358, -152, -1377,
|
|
2, 0, 1, 0, 191, 9562, -170, -7331,
|
|
2, -1, 0, 0, 164, 7285, -204, -5860,
|
|
0, 1, -1, 0, -147, -3213, -129, -6201,
|
|
1, 0, 0, 0, -124, -9881, 108, 7427,
|
|
0, 1, 1, 0, -109, -3803, 104, 7552,
|
|
2, 0, 0, -2, 55, 1771, 10, 3211,
|
|
0, 0, 1, 2, -45, -996, 0, 0,
|
|
0, 0, 1, -2, 39, 5333, 79, 6606,
|
|
4, 0, -1, 0, 38, 4298, -34, -7825,
|
|
0, 0, 3, 0, 36, 1238, -23, -2104,
|
|
4, 0, -2, 0, 30, 7726, -21, -6363,
|
|
2, 1, -1, 0, -28, -3971, 24, 2085,
|
|
2, 1, 0, 0, -24, -3582, 30, 8238,
|
|
1, 0, -1, 0, -18, -5847, -8, -3791,
|
|
1, 1, 0, 0, 17, 9545, -16, -6747,
|
|
2, -1, 1, 0, 14, 5303, -12, -8314,
|
|
2, 0, 2, 0, 14, 3797, -10, -4448,
|
|
4, 0, 0, 0, 13, 8991, -11, -6500,
|
|
2, 0, -3, 0, 13, 1941, 14, 4027,
|
|
0, 1, -2, 0, -9, -6791, -7, -27,
|
|
2, 0, -1, 2, -9, -3659, 0, 7740,
|
|
2, -1, -2, 0, 8, 6055, 10, 562,
|
|
1, 0, 1, 0, -8, -4531, 6, 3220,
|
|
2, -2, 0, 0, 8, 502, -9, -8845,
|
|
0, 1, 2, 0, -7, -6302, 5, 7509,
|
|
0, 2, 0, 0, -7, -4475, 1, 657,
|
|
2, -2, -1, 0, 7, 3712, -4, -9501,
|
|
2, 0, 1, -2, -6, -3832, 4, 1311,
|
|
2, 0, 0, 2, -5, -7416, 0, 0,
|
|
4, -1, -1, 0, 4, 3740, -3, -9580,
|
|
0, 0, 2, 2, -3, -9976, 0, 0,
|
|
3, 0, -1, 0, -3, -2097, 3, 2582,
|
|
2, 1, 1, 0, -2, -9145, 2, 6164,
|
|
4, -1, -2, 0, 2, 7319, -1, -8970,
|
|
0, 2, -1, 0, -2, -5679, -2, -1171,
|
|
2, 2, -1, 0, -2, -5212, 2, 3536,
|
|
2, 1, -2, 0, 2, 4889, 0, 1437,
|
|
2, -1, 0, -2, 2, 1461, 0, 6571,
|
|
4, 0, 1, 0, 1, 9777, -1, -4226,
|
|
0, 0, 4, 0, 1, 9337, -1, -1169,
|
|
4, -1, 0, 0, 1, 8708, -1, -5714,
|
|
1, 0, -2, 0, -1, -7530, -1, -7385,
|
|
2, 1, 0, -2, -1, -4372, 0, -1357,
|
|
0, 0, 2, -2, -1, -3726, -4, -4212,
|
|
1, 1, 1, 0, 1, 2618, 0, -9333,
|
|
3, 0, -2, 0, -1, -2241, 0, 8624,
|
|
4, 0, -3, 0, 1, 1868, 0, -5142,
|
|
2, -1, 2, 0, 1, 1770, 0, -8488,
|
|
0, 2, 1, 0, -1, -1617, 1, 1655,
|
|
1, 1, -1, 0, 1, 777, 0, 8512,
|
|
2, 0, 3, 0, 1, 595, 0, -6697,
|
|
2, 0, 1, 2, 0, -9902, 0, 0,
|
|
2, 0, -4, 0, 0, 9483, 0, 7785,
|
|
2, -2, 1, 0, 0, 7517, 0, -6575,
|
|
0, 1, -3, 0, 0, -6694, 0, -4224,
|
|
4, 1, -1, 0, 0, -6352, 0, 5788,
|
|
1, 0, 2, 0, 0, -5840, 0, 3785,
|
|
1, 0, 0, -2, 0, -5833, 0, -7956,
|
|
6, 0, -2, 0, 0, 5716, 0, -4225,
|
|
2, 0, -2, -2, 0, -5606, 0, 4726,
|
|
1, -1, 0, 0, 0, -5569, 0, 4976,
|
|
0, 1, 3, 0, 0, -5459, 0, 3551,
|
|
2, 0, -2, 2, 0, -5357, 0, 7740,
|
|
2, 0, -1, -2, 0, 1790, 8, 7516,
|
|
3, 0, 0, 0, 0, 4042, -1, -4189,
|
|
2, -1, -3, 0, 0, 4784, 0, 4950,
|
|
2, -1, 3, 0, 0, 932, 0, -585,
|
|
2, 0, 2, -2, 0, -4538, 0, 2840,
|
|
2, -1, -1, 2, 0, -4262, 0, 373,
|
|
0, 0, 0, 4, 0, 4203, 0, 0,
|
|
0, 1, 0, 2, 0, 4134, 0, -1580,
|
|
6, 0, -1, 0, 0, 3945, 0, -2866,
|
|
2, -1, 0, 2, 0, -3821, 0, 0,
|
|
2, -1, 1, -2, 0, -3745, 0, 2094,
|
|
4, 1, -2, 0, 0, -3576, 0, 2370,
|
|
1, 1, -2, 0, 0, 3497, 0, 3323,
|
|
2, -3, 0, 0, 0, 3398, 0, -4107,
|
|
0, 0, 3, 2, 0, -3286, 0, 0,
|
|
4, -2, -1, 0, 0, -3087, 0, -2790,
|
|
0, 1, -1, -2, 0, 3015, 0, 0,
|
|
4, 0, -1, -2, 0, 3009, 0, -3218,
|
|
2, -2, -2, 0, 0, 2942, 0, 3430,
|
|
6, 0, -3, 0, 0, 2925, 0, -1832,
|
|
2, 1, 2, 0, 0, -2902, 0, 2125,
|
|
4, 1, 0, 0, 0, -2891, 0, 2445,
|
|
4, -1, 1, 0, 0, 2825, 0, -2029,
|
|
3, 1, -1, 0, 0, 2737, 0, -2126,
|
|
0, 1, 1, 2, 0, 2634, 0, 0,
|
|
1, 0, 0, 2, 0, 2543, 0, 0,
|
|
3, 0, 0, -2, 0, -2530, 0, 2010,
|
|
2, 2, -2, 0, 0, -2499, 0, -1089,
|
|
2, -3, -1, 0, 0, 2469, 0, -1481,
|
|
3, -1, -1, 0, 0, -2314, 0, 2556,
|
|
4, 0, 2, 0, 0, 2185, 0, -1392,
|
|
4, 0, -1, 2, 0, -2013, 0, 0,
|
|
0, 2, -2, 0, 0, -1931, 0, 0,
|
|
2, 2, 0, 0, 0, -1858, 0, 0,
|
|
2, 1, -3, 0, 0, 1762, 0, 0,
|
|
4, 0, -2, 2, 0, -1698, 0, 0,
|
|
4, -2, -2, 0, 0, 1578, 0, -1083,
|
|
4, -2, 0, 0, 0, 1522, 0, -1281,
|
|
3, 1, 0, 0, 0, 1499, 0, -1077,
|
|
1, -1, -1, 0, 0, -1364, 0, 1141,
|
|
1, -3, 0, 0, 0, -1281, 0, 0,
|
|
6, 0, 0, 0, 0, 1261, 0, -859,
|
|
2, 0, 2, 2, 0, -1239, 0, 0,
|
|
1, -1, 1, 0, 0, -1207, 0, 1100,
|
|
0, 0, 5, 0, 0, 1110, 0, -589,
|
|
0, 3, 0, 0, 0, -1013, 0, 213,
|
|
4, -1, -3, 0, 0, 998, 0, 0,
|
|
};
|
|
|
|
|
|
#ifdef MOSH_MOON_200
|
|
#define NMB 56
|
|
static short FAR MB[6 * NMB] = {
|
|
|
|
/*
|
|
Latitude
|
|
D l' l F 1" .0001" */
|
|
|
|
0, 0, 0, 1, 18461, 2387,
|
|
0, 0, 1, 1, 1010, 1671,
|
|
0, 0, 1, -1, 999, 6936,
|
|
2, 0, 0, -1, 623, 6524,
|
|
2, 0, -1, 1, 199, 4837,
|
|
2, 0, -1, -1, 166, 5741,
|
|
2, 0, 0, 1, 117, 2607,
|
|
0, 0, 2, 1, 61, 9120,
|
|
2, 0, 1, -1, 33, 3572,
|
|
0, 0, 2, -1, 31, 7597,
|
|
2, -1, 0, -1, 29, 5766,
|
|
2, 0, -2, -1, 15, 5663,
|
|
2, 0, 1, 1, 15, 1216,
|
|
2, 1, 0, -1, -12, -941,
|
|
2, -1, -1, 1, 8, 8681,
|
|
2, -1, 0, 1, 7, 9586,
|
|
2, -1, -1, -1, 7, 4346,
|
|
0, 1, -1, -1, -6, -7314,
|
|
4, 0, -1, -1, 6, 5796,
|
|
0, 1, 0, 1, -6, -4601,
|
|
0, 0, 0, 3, -6, -2965,
|
|
0, 1, -1, 1, -5, -6324,
|
|
1, 0, 0, 1, -5, -3684,
|
|
0, 1, 1, 1, -5, -3113,
|
|
0, 1, 1, -1, -5, -759,
|
|
0, 1, 0, -1, -4, -8396,
|
|
1, 0, 0, -1, -4, -8057,
|
|
0, 0, 3, 1, 3, 9841,
|
|
4, 0, 0, -1, 3, 6745,
|
|
4, 0, -1, 1, 2, 9985,
|
|
0, 0, 1, -3, 2, 7986,
|
|
4, 0, -2, 1, 2, 4139,
|
|
2, 0, 0, -3, 2, 1863,
|
|
2, 0, 2, -1, 2, 1462,
|
|
2, -1, 1, -1, 1, 7660,
|
|
2, 0, -2, 1, -1, -6244,
|
|
0, 0, 3, -1, 1, 5813,
|
|
2, 0, 2, 1, 1, 5198,
|
|
2, 0, -3, -1, 1, 5156,
|
|
2, 1, -1, 1, -1, -3178,
|
|
2, 1, 0, 1, -1, -2643,
|
|
4, 0, 0, 1, 1, 1919,
|
|
2, -1, 1, 1, 1, 1346,
|
|
2, -2, 0, -1, 1, 859,
|
|
0, 0, 1, 3, -1, -194,
|
|
2, 1, 1, -1, 0, -8227,
|
|
1, 1, 0, -1, 0, 8042,
|
|
1, 1, 0, 1, 0, 8026,
|
|
0, 1, -2, -1, 0, -7932,
|
|
2, 1, -1, -1, 0, -7910,
|
|
1, 0, 1, 1, 0, -6674,
|
|
2, -1, -2, -1, 0, 6502,
|
|
0, 1, 2, 1, 0, -6388,
|
|
4, 0, -2, -1, 0, 6337,
|
|
4, -1, -1, -1, 0, 5958,
|
|
1, 0, 1, -1, 0, -5889,
|
|
};
|
|
#else
|
|
#define NMB 77
|
|
static short FAR MB[6 * NMB] = {
|
|
|
|
/*
|
|
Latitude
|
|
D l' l F 1" .0001" */
|
|
|
|
0, 0, 0, 1, 18461, 2387,
|
|
0, 0, 1, 1, 1010, 1671,
|
|
0, 0, 1, -1, 999, 6936,
|
|
2, 0, 0, -1, 623, 6524,
|
|
2, 0, -1, 1, 199, 4837,
|
|
2, 0, -1, -1, 166, 5741,
|
|
2, 0, 0, 1, 117, 2607,
|
|
0, 0, 2, 1, 61, 9120,
|
|
2, 0, 1, -1, 33, 3572,
|
|
0, 0, 2, -1, 31, 7597,
|
|
2, -1, 0, -1, 29, 5766,
|
|
2, 0, -2, -1, 15, 5663,
|
|
2, 0, 1, 1, 15, 1216,
|
|
2, 1, 0, -1, -12, -941,
|
|
2, -1, -1, 1, 8, 8681,
|
|
2, -1, 0, 1, 7, 9586,
|
|
2, -1, -1, -1, 7, 4346,
|
|
0, 1, -1, -1, -6, -7314,
|
|
4, 0, -1, -1, 6, 5796,
|
|
0, 1, 0, 1, -6, -4601,
|
|
0, 0, 0, 3, -6, -2965,
|
|
0, 1, -1, 1, -5, -6324,
|
|
1, 0, 0, 1, -5, -3684,
|
|
0, 1, 1, 1, -5, -3113,
|
|
0, 1, 1, -1, -5, -759,
|
|
0, 1, 0, -1, -4, -8396,
|
|
1, 0, 0, -1, -4, -8057,
|
|
0, 0, 3, 1, 3, 9841,
|
|
4, 0, 0, -1, 3, 6745,
|
|
4, 0, -1, 1, 2, 9985,
|
|
0, 0, 1, -3, 2, 7986,
|
|
4, 0, -2, 1, 2, 4139,
|
|
2, 0, 0, -3, 2, 1863,
|
|
2, 0, 2, -1, 2, 1462,
|
|
2, -1, 1, -1, 1, 7660,
|
|
2, 0, -2, 1, -1, -6244,
|
|
0, 0, 3, -1, 1, 5813,
|
|
2, 0, 2, 1, 1, 5198,
|
|
2, 0, -3, -1, 1, 5156,
|
|
2, 1, -1, 1, -1, -3178,
|
|
2, 1, 0, 1, -1, -2643,
|
|
4, 0, 0, 1, 1, 1919,
|
|
2, -1, 1, 1, 1, 1346,
|
|
2, -2, 0, -1, 1, 859,
|
|
0, 0, 1, 3, -1, -194,
|
|
2, 1, 1, -1, 0, -8227,
|
|
1, 1, 0, -1, 0, 8042,
|
|
1, 1, 0, 1, 0, 8026,
|
|
0, 1, -2, -1, 0, -7932,
|
|
2, 1, -1, -1, 0, -7910,
|
|
1, 0, 1, 1, 0, -6674,
|
|
2, -1, -2, -1, 0, 6502,
|
|
0, 1, 2, 1, 0, -6388,
|
|
4, 0, -2, -1, 0, 6337,
|
|
4, -1, -1, -1, 0, 5958,
|
|
1, 0, 1, -1, 0, -5889,
|
|
4, 0, 1, -1, 0, 4734,
|
|
1, 0, -1, -1, 0, -4299,
|
|
4, -1, 0, -1, 0, 4149,
|
|
2, -2, 0, 1, 0, 3835,
|
|
3, 0, 0, -1, 0, -3518,
|
|
4, -1, -1, 1, 0, 3388,
|
|
2, 0, -1, -3, 0, 3291,
|
|
2, -2, -1, 1, 0, 3147,
|
|
0, 1, 2, -1, 0, -3129,
|
|
3, 0, -1, -1, 0, -3052,
|
|
0, 1, -2, 1, 0, -3013,
|
|
2, 0, 1, -3, 0, -2912,
|
|
2, -2, -1, -1, 0, 2686,
|
|
0, 0, 4, 1, 0, 2633,
|
|
2, 0, -3, 1, 0, 2541,
|
|
2, 0, -1, 3, 0, -2448,
|
|
2, 1, 1, 1, 0, -2370,
|
|
4, -1, -2, 1, 0, 2138,
|
|
4, 0, 1, 1, 0, 2126,
|
|
3, 0, -1, 1, 0, -2059,
|
|
4, 1, -1, -1, 0, -1719,
|
|
};
|
|
#endif /* ! MOSH_MOON_200 */
|
|
|
|
#define NLRT 38
|
|
static short FAR LRT[8 * NLRT] = {
|
|
|
|
/*
|
|
Multiply by T
|
|
Longitude Radius
|
|
D l' l F .1" .00001" .1km .00001km */
|
|
|
|
0, 1, 0, 0, 16, 7680, -1, -2302,
|
|
2, -1, -1, 0, -5, -1642, 3, 8245,
|
|
2, -1, 0, 0, -4, -1383, 5, 1395,
|
|
0, 1, -1, 0, 3, 7115, 3, 2654,
|
|
0, 1, 1, 0, 2, 7560, -2, -6396,
|
|
2, 1, -1, 0, 0, 7118, 0, -6068,
|
|
2, 1, 0, 0, 0, 6128, 0, -7754,
|
|
1, 1, 0, 0, 0, -4516, 0, 4194,
|
|
2, -2, 0, 0, 0, -4048, 0, 4970,
|
|
0, 2, 0, 0, 0, 3747, 0, -540,
|
|
2, -2, -1, 0, 0, -3707, 0, 2490,
|
|
2, -1, 1, 0, 0, -3649, 0, 3222,
|
|
0, 1, -2, 0, 0, 2438, 0, 1760,
|
|
2, -1, -2, 0, 0, -2165, 0, -2530,
|
|
0, 1, 2, 0, 0, 1923, 0, -1450,
|
|
0, 2, -1, 0, 0, 1292, 0, 1070,
|
|
2, 2, -1, 0, 0, 1271, 0, -6070,
|
|
4, -1, -1, 0, 0, -1098, 0, 990,
|
|
2, 0, 0, 0, 0, 1073, 0, -1360,
|
|
2, 0, -1, 0, 0, 839, 0, -630,
|
|
2, 1, 1, 0, 0, 734, 0, -660,
|
|
4, -1, -2, 0, 0, -688, 0, 480,
|
|
2, 1, -2, 0, 0, -630, 0, 0,
|
|
0, 2, 1, 0, 0, 587, 0, -590,
|
|
2, -1, 0, -2, 0, -540, 0, -170,
|
|
4, -1, 0, 0, 0, -468, 0, 390,
|
|
2, -2, 1, 0, 0, -378, 0, 330,
|
|
2, 1, 0, -2, 0, 364, 0, 0,
|
|
1, 1, 1, 0, 0, -317, 0, 240,
|
|
2, -1, 2, 0, 0, -295, 0, 210,
|
|
1, 1, -1, 0, 0, -270, 0, -210,
|
|
2, -3, 0, 0, 0, -256, 0, 310,
|
|
2, -3, -1, 0, 0, -187, 0, 110,
|
|
0, 1, -3, 0, 0, 169, 0, 110,
|
|
4, 1, -1, 0, 0, 158, 0, -150,
|
|
4, -2, -1, 0, 0, -155, 0, 140,
|
|
0, 0, 1, 0, 0, 155, 0, -250,
|
|
2, -2, -2, 0, 0, -148, 0, -170,
|
|
};
|
|
|
|
#define NBT 16
|
|
static short FAR BT[5 * NBT] = {
|
|
|
|
/*
|
|
Multiply by T
|
|
Latitude
|
|
D l' l F .00001" */
|
|
|
|
2, -1, 0, -1, -7430,
|
|
2, 1, 0, -1, 3043,
|
|
2, -1, -1, 1, -2229,
|
|
2, -1, 0, 1, -1999,
|
|
2, -1, -1, -1, -1869,
|
|
0, 1, -1, -1, 1696,
|
|
0, 1, 0, 1, 1623,
|
|
0, 1, -1, 1, 1418,
|
|
0, 1, 1, 1, 1339,
|
|
0, 1, 1, -1, 1278,
|
|
0, 1, 0, -1, 1217,
|
|
2, -2, 0, -1, -547,
|
|
2, -1, 1, -1, -443,
|
|
2, 1, -1, 1, 331,
|
|
2, 1, 0, 1, 317,
|
|
2, 0, 0, -1, 295,
|
|
};
|
|
|
|
#define NLRT2 25
|
|
static short FAR LRT2[6 * NLRT2] = {
|
|
|
|
/*
|
|
Multiply by T^2
|
|
Longitude Radius
|
|
D l' l F .00001" .00001km */
|
|
|
|
0, 1, 0, 0, 487, -36,
|
|
2, -1, -1, 0, -150, 111,
|
|
2, -1, 0, 0, -120, 149,
|
|
0, 1, -1, 0, 108, 95,
|
|
0, 1, 1, 0, 80, -77,
|
|
2, 1, -1, 0, 21, -18,
|
|
2, 1, 0, 0, 20, -23,
|
|
1, 1, 0, 0, -13, 12,
|
|
2, -2, 0, 0, -12, 14,
|
|
2, -1, 1, 0, -11, 9,
|
|
2, -2, -1, 0, -11, 7,
|
|
0, 2, 0, 0, 11, 0,
|
|
2, -1, -2, 0, -6, -7,
|
|
0, 1, -2, 0, 7, 5,
|
|
0, 1, 2, 0, 6, -4,
|
|
2, 2, -1, 0, 5, -3,
|
|
0, 2, -1, 0, 5, 3,
|
|
4, -1, -1, 0, -3, 3,
|
|
2, 0, 0, 0, 3, -4,
|
|
4, -1, -2, 0, -2, 0,
|
|
2, 1, -2, 0, -2, 0,
|
|
2, -1, 0, -2, -2, 0,
|
|
2, 1, 1, 0, 2, -2,
|
|
2, 0, -1, 0, 2, 0,
|
|
0, 2, 1, 0, 2, 0,
|
|
};
|
|
|
|
#define NBT2 12
|
|
static short FAR BT2[5 * NBT2] = {
|
|
|
|
/*
|
|
Multiply by T^2
|
|
Latitiude
|
|
D l' l F .00001" */
|
|
|
|
2, -1, 0, -1, -22,
|
|
2, 1, 0, -1, 9,
|
|
2, -1, 0, 1, -6,
|
|
2, -1, -1, 1, -6,
|
|
2, -1, -1, -1, -5,
|
|
0, 1, 0, 1, 5,
|
|
0, 1, -1, -1, 5,
|
|
0, 1, 1, 1, 4,
|
|
0, 1, 1, -1, 4,
|
|
0, 1, 0, -1, 4,
|
|
0, 1, -1, 1, 4,
|
|
2, -2, 0, -1, -2,
|
|
};
|
|
|
|
/* The following times are set up by update() and refer
|
|
* to the same instant. The distinction between them
|
|
* is required by altaz().
|
|
*/
|
|
static double FAR ss[5][8];
|
|
static double FAR cc[5][8];
|
|
|
|
static double l; /* Moon's ecliptic longitude */
|
|
static double B; /* Ecliptic latitude */
|
|
|
|
static double moonpol[3];
|
|
|
|
/* Orbit calculation begins.
|
|
*/
|
|
static double SWELP;
|
|
static double M;
|
|
static double MP;
|
|
static double D;
|
|
static double NF;
|
|
static double T;
|
|
static double T2;
|
|
|
|
static double T3;
|
|
static double T4;
|
|
static double f;
|
|
static double g;
|
|
static double Ve;
|
|
static double Ea;
|
|
static double Ma;
|
|
static double Ju;
|
|
static double Sa;
|
|
static double cg;
|
|
static double sg;
|
|
static double l1;
|
|
static double l2;
|
|
static double l3;
|
|
static double l4;
|
|
|
|
/* Calculate geometric coordinates of Moon
|
|
* without light time or nutation correction.
|
|
*/
|
|
int
|
|
swi_moshmoon2(double J, double *pol)
|
|
{
|
|
int i;
|
|
T = (J - J2000) / 36525.0;
|
|
T2 = T * T;
|
|
mean_elements();
|
|
mean_elements_pl();
|
|
moon1();
|
|
moon2();
|
|
moon3();
|
|
moon4();
|
|
for (i = 0; i < 3; i++)
|
|
pol[i] = moonpol[i];
|
|
return (0);
|
|
}
|
|
|
|
/* Moshier's moom
|
|
* tjd julian day
|
|
* xpm array of 6 doubles for moon's position and speed vectors
|
|
* serr pointer to error string
|
|
*/
|
|
int
|
|
swi_moshmoon(double tjd, AS_BOOL do_save, double *xpmret, char *serr)
|
|
{
|
|
int i;
|
|
double a, b, x1[6], x2[6], t;
|
|
double xx[6], *xpm;
|
|
struct plan_data *pdp = &swed.pldat[SEI_MOON];
|
|
char s[AS_MAXCH];
|
|
if (do_save)
|
|
xpm = pdp->x;
|
|
else
|
|
xpm = xx;
|
|
/* allow 0.2 day tolerance so that true node interval fits in */
|
|
if (tjd < MOSHLUEPH_START - 0.2 || tjd > MOSHLUEPH_END + 0.2) {
|
|
if (serr != NULL) {
|
|
sprintf(s, "jd %f outside Moshier's Moon range %.2f .. %.2f ",
|
|
tjd, MOSHLUEPH_START, MOSHLUEPH_END);
|
|
if (strlen(serr) + strlen(s) < AS_MAXCH)
|
|
strcat(serr, s);
|
|
}
|
|
return (ERR);
|
|
}
|
|
/* if moon has already been computed */
|
|
if (tjd == pdp->teval && pdp->iephe == SEFLG_MOSEPH) {
|
|
if (xpmret != NULL)
|
|
for (i = 0; i <= 5; i++)
|
|
xpmret[i] = pdp->x[i];
|
|
return (OK);
|
|
}
|
|
/* else compute moon */
|
|
swi_moshmoon2(tjd, xpm);
|
|
if (do_save) {
|
|
pdp->teval = tjd;
|
|
pdp->xflgs = -1;
|
|
pdp->iephe = SEFLG_MOSEPH;
|
|
}
|
|
/* Moshier moon is referred to ecliptic of date. But we need
|
|
* equatorial positions for several reasons.
|
|
* e.g. computation of earth from emb and moon
|
|
* of heliocentric moon
|
|
* Besides, this helps to keep the program structure simpler
|
|
*/
|
|
ecldat_equ2000(tjd, xpm);
|
|
/* speed */
|
|
/* from 2 other positions. */
|
|
/* one would be good enough for computation of osculating node,
|
|
* but not for osculating apogee */
|
|
t = tjd + MOON_SPEED_INTV;
|
|
swi_moshmoon2(t, x1);
|
|
ecldat_equ2000(t, x1);
|
|
t = tjd - MOON_SPEED_INTV;
|
|
swi_moshmoon2(t, x2);
|
|
ecldat_equ2000(t, x2);
|
|
for (i = 0; i <= 2; i++) {
|
|
#if 0
|
|
xpm[i + 3] = (x1[i] - x2[i]) / MOON_SPEED_INTV / 2;
|
|
#else
|
|
b = (x1[i] - x2[i]) / 2;
|
|
a = (x1[i] + x2[i]) / 2 - xpm[i];
|
|
xpm[i + 3] = (2 * a + b) / MOON_SPEED_INTV;
|
|
#endif
|
|
}
|
|
if (xpmret != NULL)
|
|
for (i = 0; i <= 5; i++)
|
|
xpmret[i] = xpm[i];
|
|
return (OK);
|
|
}
|
|
|
|
#ifdef MOSH_MOON_200
|
|
static void
|
|
moon1()
|
|
{
|
|
double a;
|
|
|
|
sscc(0, STR * D, 6);
|
|
sscc(1, STR * M, 4);
|
|
sscc(2, STR * MP, 4);
|
|
sscc(3, STR * NF, 4);
|
|
|
|
moonpol[0] = 0.0;
|
|
moonpol[1] = 0.0;
|
|
moonpol[2] = 0.0;
|
|
|
|
/* terms in T^2, scale 1.0 = 10^-5" */
|
|
chewm(LRT2, NLRT2, 4, 2, moonpol);
|
|
chewm(BT2, NBT2, 4, 4, moonpol);
|
|
|
|
f = 18 * Ve - 16 * Ea;
|
|
|
|
g = STR * (f - MP); /* 18V - 16E - l */
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l = 6.367278 * cg + 12.747036 * sg; /* t^0 */
|
|
l1 = 23123.70 * cg - 10570.02 * sg; /* t^1 */
|
|
l2 = z[24] * cg + z[25] * sg; /* t^2 */
|
|
l3 = z[26] * cg + z[27] * sg; /* t^3 */
|
|
l4 = z[28] * cg + z[29] * sg; /* t^4 */
|
|
moonpol[2] += 5.01 * cg + 2.72 * sg;
|
|
|
|
g = STR * (10. * Ve - 3. * Ea - MP);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.253102 * cg + 0.503359 * sg;
|
|
l1 += 1258.46 * cg + 707.29 * sg;
|
|
l2 += z[30] * cg + z[31] * sg;
|
|
l3 += z[32] * cg + z[33] * sg;
|
|
l4 += z[34] * cg + z[35] * sg;
|
|
|
|
g = STR * (8. * Ve - 13. * Ea);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.187231 * cg - 0.127481 * sg;
|
|
l1 += -319.87 * cg - 18.34 * sg;
|
|
l2 += z[36] * cg + z[37] * sg;
|
|
l3 += z[38] * cg + z[39] * sg;
|
|
l4 += z[40] * cg + z[41] * sg;
|
|
|
|
a = 4.0 * Ea - 8.0 * Ma + 3.0 * Ju;
|
|
g = STR * a;
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.866287 * cg + 0.248192 * sg;
|
|
l1 += 41.87 * cg + 1053.97 * sg;
|
|
l2 += z[42] * cg + z[43] * sg;
|
|
|
|
g = STR * (a - MP);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.165009 * cg + 0.044176 * sg;
|
|
l1 += 4.67 * cg + 201.55 * sg;
|
|
|
|
|
|
g = STR * f; /* 18V - 16E */
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += 0.330401 * cg + 0.661362 * sg;
|
|
l1 += 1202.67 * cg - 555.59 * sg;
|
|
l2 += z[44] * cg + z[45] * sg;
|
|
l3 += z[46] * cg + z[47] * sg;
|
|
|
|
g = STR * (f - 2.0 * MP); /* 18V - 16E - 2l */
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += 0.352185 * cg + 0.705041 * sg;
|
|
l1 += 1283.59 * cg - 586.43 * sg;
|
|
l2 += z[48] * cg + z[49] * sg;
|
|
l3 += z[50] * cg + z[51] * sg;
|
|
|
|
g = STR * (2.0 * Ju - 5.0 * Sa);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.034700 * cg + 0.160041 * sg;
|
|
l2 += z[52] * cg + z[53] * sg;
|
|
|
|
g = STR * (SWELP - NF);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += 0.000116 * cg + 7.063040 * sg;
|
|
l1 += 298.8 * sg;
|
|
l2 += z[54] * cg + z[55] * sg;
|
|
|
|
|
|
/* T^3 terms */
|
|
sg = sin(STR * M);
|
|
l3 += z[56] * sg;
|
|
l4 += z[57] * sg;
|
|
|
|
g = STR * (2.0 * D - M);
|
|
sg = sin(g);
|
|
cg = cos(g);
|
|
l3 += z[58] * sg;
|
|
l4 += z[59] * sg;
|
|
moonpol[2] += -0.2655 * cg * T;
|
|
|
|
g = g - STR * MP;
|
|
sg = sin(g);
|
|
l3 += z[60] * sg;
|
|
l4 += z[61] * sg;
|
|
|
|
g = STR * (M - MP);
|
|
l3 += z[62] * sin(g);
|
|
moonpol[2] += -0.1568 * cos(g) * T;
|
|
|
|
g = STR * (M + MP);
|
|
l3 += z[63] * sin(g);
|
|
moonpol[2] += 0.1309 * cos(g) * T;
|
|
|
|
g = STR * 2.0 * (D - M);
|
|
sg = sin(g);
|
|
l3 += z[64] * sg;
|
|
l4 += z[65] * sg;
|
|
|
|
g = STR * 2.0 * M;
|
|
sg = sin(g);
|
|
l3 += z[66] * sg;
|
|
l4 += z[67] * sg;
|
|
|
|
g = STR * (2.0 * D - MP);
|
|
sg = sin(g);
|
|
l3 += z[68] * sg;
|
|
|
|
g = STR * (2.0 * (D - M) - MP);
|
|
sg = sin(g);
|
|
l3 += z[69] * sg;
|
|
|
|
g = STR * (2.0 * (D + M) - MP);
|
|
sg = sin(g);
|
|
cg = cos(g);
|
|
l3 += z[70] * sg;
|
|
moonpol[2] += 0.5568 * cg * T;
|
|
|
|
l2 += moonpol[0];
|
|
|
|
g = STR * (2.0 * D - M - MP);
|
|
moonpol[2] += -0.1910 * cos(g) * T;
|
|
|
|
|
|
moonpol[1] *= T;
|
|
moonpol[2] *= T;
|
|
|
|
/* terms in T */
|
|
moonpol[0] = 0.0;
|
|
chewm(BT, NBT, 4, 4, moonpol);
|
|
chewm(LRT, NLRT, 4, 1, moonpol);
|
|
g = STR * (f - MP - NF - 2355767.6); /* 18V - 16E - l - F */
|
|
moonpol[1] += -1127. * sin(g);
|
|
g = STR * (f - MP + NF - 235353.6); /* 18V - 16E - l + F */
|
|
moonpol[1] += -1123. * sin(g);
|
|
g = STR * (Ea + D + 51987.6);
|
|
moonpol[1] += 1303. * sin(g);
|
|
g = STR * SWELP;
|
|
moonpol[1] += 342. * sin(g);
|
|
|
|
|
|
g = STR * (2. * Ve - 3. * Ea);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.343550 * cg - 0.000276 * sg;
|
|
l1 += 105.90 * cg + 336.53 * sg;
|
|
|
|
g = STR * (f - 2. * D); /* 18V - 16E - 2D */
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += 0.074668 * cg + 0.149501 * sg;
|
|
l1 += 271.77 * cg - 124.20 * sg;
|
|
|
|
g = STR * (f - 2. * D - MP);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += 0.073444 * cg + 0.147094 * sg;
|
|
l1 += 265.24 * cg - 121.16 * sg;
|
|
|
|
g = STR * (f + 2. * D - MP);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += 0.072844 * cg + 0.145829 * sg;
|
|
l1 += 265.18 * cg - 121.29 * sg;
|
|
|
|
g = STR * (f + 2. * (D - MP));
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += 0.070201 * cg + 0.140542 * sg;
|
|
l1 += 255.36 * cg - 116.79 * sg;
|
|
|
|
g = STR * (Ea + D - NF);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += 0.288209 * cg - 0.025901 * sg;
|
|
l1 += -63.51 * cg - 240.14 * sg;
|
|
|
|
g = STR * (2. * Ea - 3. * Ju + 2. * D - MP);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += 0.077865 * cg + 0.438460 * sg;
|
|
l1 += 210.57 * cg + 124.84 * sg;
|
|
|
|
g = STR * (Ea - 2. * Ma);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.216579 * cg + 0.241702 * sg;
|
|
l1 += 197.67 * cg + 125.23 * sg;
|
|
|
|
g = STR * (a + MP);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.165009 * cg + 0.044176 * sg;
|
|
l1 += 4.67 * cg + 201.55 * sg;
|
|
|
|
g = STR * (a + 2. * D - MP);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.133533 * cg + 0.041116 * sg;
|
|
l1 += 6.95 * cg + 187.07 * sg;
|
|
|
|
g = STR * (a - 2. * D + MP);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.133430 * cg + 0.041079 * sg;
|
|
l1 += 6.28 * cg + 169.08 * sg;
|
|
|
|
g = STR * (3. * Ve - 4. * Ea);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.175074 * cg + 0.003035 * sg;
|
|
l1 += 49.17 * cg + 150.57 * sg;
|
|
|
|
g = STR * (2. * (Ea + D - MP) - 3. * Ju + 213534.);
|
|
l1 += 158.4 * sin(g);
|
|
l1 += moonpol[0];
|
|
|
|
a = 0.1 * T; /* set amplitude scale of 1.0 = 10^-4 arcsec */
|
|
moonpol[1] *= a;
|
|
moonpol[2] *= a;
|
|
}
|
|
#else
|
|
static void
|
|
moon1()
|
|
{
|
|
double a;
|
|
|
|
/* This code added by Bhanu Pinnamaneni, 17-aug-2009 */
|
|
|
|
/* Note by Dieter: Bhanu noted that ss and cc are not sufficiently
|
|
* initialised and random values are used for the calculation.
|
|
* However, this may be only part of the bug.
|
|
* The bug could be in sscc(). Or may be the bug is rather in
|
|
* the 116th line of NLR, where the value "5" may be wrong.
|
|
* Still, this will make a maximum difference of only 0.1", while the error
|
|
* of the Moshier lunar ephemeris can reach 7". */
|
|
int i, j;
|
|
for (i = 0; i < 5; i++) {
|
|
for (j = 0; j < 8; j++) {
|
|
ss[i][j] = 0;
|
|
cc[i][j] = 0;
|
|
}
|
|
}
|
|
|
|
/* End of code addition */
|
|
sscc(0, STR * D, 6);
|
|
sscc(1, STR * M, 4);
|
|
sscc(2, STR * MP, 4);
|
|
sscc(3, STR * NF, 4);
|
|
moonpol[0] = 0.0;
|
|
moonpol[1] = 0.0;
|
|
moonpol[2] = 0.0;
|
|
|
|
/* terms in T^2, scale 1.0 = 10^-5" */
|
|
chewm(LRT2, NLRT2, 4, 2, moonpol);
|
|
chewm(BT2, NBT2, 4, 4, moonpol);
|
|
f = 18 * Ve - 16 * Ea;
|
|
g = STR * (f - MP); /* 18V - 16E - l */
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l = 6.367278 * cg + 12.747036 * sg; /* t^0 */
|
|
l1 = 23123.70 * cg - 10570.02 * sg; /* t^1 */
|
|
l2 = z[12] * cg + z[13] * sg; /* t^2 */
|
|
moonpol[2] += 5.01 * cg + 2.72 * sg;
|
|
g = STR * (10. * Ve - 3. * Ea - MP);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.253102 * cg + 0.503359 * sg;
|
|
l1 += 1258.46 * cg + 707.29 * sg;
|
|
l2 += z[14] * cg + z[15] * sg;
|
|
g = STR * (8. * Ve - 13. * Ea);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.187231 * cg - 0.127481 * sg;
|
|
l1 += -319.87 * cg - 18.34 * sg;
|
|
l2 += z[16] * cg + z[17] * sg;
|
|
a = 4.0 * Ea - 8.0 * Ma + 3.0 * Ju;
|
|
g = STR * a;
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.866287 * cg + 0.248192 * sg;
|
|
l1 += 41.87 * cg + 1053.97 * sg;
|
|
l2 += z[18] * cg + z[19] * sg;
|
|
g = STR * (a - MP);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.165009 * cg + 0.044176 * sg;
|
|
l1 += 4.67 * cg + 201.55 * sg;
|
|
g = STR * f; /* 18V - 16E */
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += 0.330401 * cg + 0.661362 * sg;
|
|
l1 += 1202.67 * cg - 555.59 * sg;
|
|
l2 += z[20] * cg + z[21] * sg;
|
|
g = STR * (f - 2.0 * MP); /* 18V - 16E - 2l */
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += 0.352185 * cg + 0.705041 * sg;
|
|
l1 += 1283.59 * cg - 586.43 * sg;
|
|
g = STR * (2.0 * Ju - 5.0 * Sa);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.034700 * cg + 0.160041 * sg;
|
|
l2 += z[22] * cg + z[23] * sg;
|
|
g = STR * (SWELP - NF);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += 0.000116 * cg + 7.063040 * sg;
|
|
l1 += 298.8 * sg;
|
|
|
|
/* T^3 terms */
|
|
sg = sin(STR * M);
|
|
|
|
/* l3 += z[24] * sg; moshier! l3 not initialized! */
|
|
l3 = z[24] * sg;
|
|
l4 = 0;
|
|
g = STR * (2.0 * D - M);
|
|
sg = sin(g);
|
|
cg = cos(g);
|
|
moonpol[2] += -0.2655 * cg * T;
|
|
g = STR * (M - MP);
|
|
moonpol[2] += -0.1568 * cos(g) * T;
|
|
g = STR * (M + MP);
|
|
moonpol[2] += 0.1309 * cos(g) * T;
|
|
g = STR * (2.0 * (D + M) - MP);
|
|
sg = sin(g);
|
|
cg = cos(g);
|
|
moonpol[2] += 0.5568 * cg * T;
|
|
l2 += moonpol[0];
|
|
g = STR * (2.0 * D - M - MP);
|
|
moonpol[2] += -0.1910 * cos(g) * T;
|
|
moonpol[1] *= T;
|
|
moonpol[2] *= T;
|
|
|
|
/* terms in T */
|
|
moonpol[0] = 0.0;
|
|
chewm(BT, NBT, 4, 4, moonpol);
|
|
chewm(LRT, NLRT, 4, 1, moonpol);
|
|
g = STR * (f - MP - NF - 2355767.6); /* 18V - 16E - l - F */
|
|
moonpol[1] += -1127. * sin(g);
|
|
g = STR * (f - MP + NF - 235353.6); /* 18V - 16E - l + F */
|
|
moonpol[1] += -1123. * sin(g);
|
|
g = STR * (Ea + D + 51987.6);
|
|
moonpol[1] += 1303. * sin(g);
|
|
g = STR * SWELP;
|
|
moonpol[1] += 342. * sin(g);
|
|
g = STR * (2. * Ve - 3. * Ea);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.343550 * cg - 0.000276 * sg;
|
|
l1 += 105.90 * cg + 336.53 * sg;
|
|
g = STR * (f - 2. * D); /* 18V - 16E - 2D */
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += 0.074668 * cg + 0.149501 * sg;
|
|
l1 += 271.77 * cg - 124.20 * sg;
|
|
g = STR * (f - 2. * D - MP);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += 0.073444 * cg + 0.147094 * sg;
|
|
l1 += 265.24 * cg - 121.16 * sg;
|
|
g = STR * (f + 2. * D - MP);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += 0.072844 * cg + 0.145829 * sg;
|
|
l1 += 265.18 * cg - 121.29 * sg;
|
|
g = STR * (f + 2. * (D - MP));
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += 0.070201 * cg + 0.140542 * sg;
|
|
l1 += 255.36 * cg - 116.79 * sg;
|
|
g = STR * (Ea + D - NF);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += 0.288209 * cg - 0.025901 * sg;
|
|
l1 += -63.51 * cg - 240.14 * sg;
|
|
g = STR * (2. * Ea - 3. * Ju + 2. * D - MP);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += 0.077865 * cg + 0.438460 * sg;
|
|
l1 += 210.57 * cg + 124.84 * sg;
|
|
g = STR * (Ea - 2. * Ma);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.216579 * cg + 0.241702 * sg;
|
|
l1 += 197.67 * cg + 125.23 * sg;
|
|
g = STR * (a + MP);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.165009 * cg + 0.044176 * sg;
|
|
l1 += 4.67 * cg + 201.55 * sg;
|
|
g = STR * (a + 2. * D - MP);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.133533 * cg + 0.041116 * sg;
|
|
l1 += 6.95 * cg + 187.07 * sg;
|
|
g = STR * (a - 2. * D + MP);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.133430 * cg + 0.041079 * sg;
|
|
l1 += 6.28 * cg + 169.08 * sg;
|
|
g = STR * (3. * Ve - 4. * Ea);
|
|
cg = cos(g);
|
|
sg = sin(g);
|
|
l += -0.175074 * cg + 0.003035 * sg;
|
|
l1 += 49.17 * cg + 150.57 * sg;
|
|
g = STR * (2. * (Ea + D - MP) - 3. * Ju + 213534.);
|
|
l1 += 158.4 * sin(g);
|
|
l1 += moonpol[0];
|
|
a = 0.1 * T; /* set amplitude scale of 1.0 = 10^-4 arcsec */
|
|
moonpol[1] *= a;
|
|
moonpol[2] *= a;
|
|
}
|
|
#endif /* MOSH_MOON_200 */
|
|
|
|
static void
|
|
moon2()
|
|
{
|
|
|
|
/* terms in T^0 */
|
|
g = STR * (2 * (Ea - Ju + D) - MP + 648431.172);
|
|
l += 1.14307 * sin(g);
|
|
g = STR * (Ve - Ea + 648035.568);
|
|
l += 0.82155 * sin(g);
|
|
g = STR * (3 * (Ve - Ea) + 2 * D - MP + 647933.184);
|
|
l += 0.64371 * sin(g);
|
|
g = STR * (Ea - Ju + 4424.04);
|
|
l += 0.63880 * sin(g);
|
|
g = STR * (SWELP + MP - NF + 4.68);
|
|
l += 0.49331 * sin(g);
|
|
g = STR * (SWELP - MP - NF + 4.68);
|
|
l += 0.4914 * sin(g);
|
|
g = STR * (SWELP + NF + 2.52);
|
|
l += 0.36061 * sin(g);
|
|
g = STR * (2. * Ve - 2. * Ea + 736.2);
|
|
l += 0.30154 * sin(g);
|
|
g = STR * (2. * Ea - 3. * Ju + 2. * D - 2. * MP + 36138.2);
|
|
l += 0.28282 * sin(g);
|
|
g = STR * (2. * Ea - 2. * Ju + 2. * D - 2. * MP + 311.0);
|
|
l += 0.24516 * sin(g);
|
|
g = STR * (Ea - Ju - 2. * D + MP + 6275.88);
|
|
l += 0.21117 * sin(g);
|
|
g = STR * (2. * (Ea - Ma) - 846.36);
|
|
l += 0.19444 * sin(g);
|
|
g = STR * (2. * (Ea - Ju) + 1569.96);
|
|
l -= 0.18457 * sin(g);
|
|
g = STR * (2. * (Ea - Ju) - MP - 55.8);
|
|
l += 0.18256 * sin(g);
|
|
g = STR * (Ea - Ju - 2. * D + 6490.08);
|
|
l += 0.16499 * sin(g);
|
|
g = STR * (Ea - 2. * Ju - 212378.4);
|
|
l += 0.16427 * sin(g);
|
|
g = STR * (2. * (Ve - Ea - D) + MP + 1122.48);
|
|
l += 0.16088 * sin(g);
|
|
g = STR * (Ve - Ea - MP + 32.04);
|
|
l -= 0.15350 * sin(g);
|
|
g = STR * (Ea - Ju - MP + 4488.88);
|
|
l += 0.14346 * sin(g);
|
|
g = STR * (2. * (Ve - Ea + D) - MP - 8.64);
|
|
l += 0.13594 * sin(g);
|
|
g = STR * (2. * (Ve - Ea - D) + 1319.76);
|
|
l += 0.13432 * sin(g);
|
|
g = STR * (Ve - Ea - 2. * D + MP - 56.16);
|
|
l -= 0.13122 * sin(g);
|
|
g = STR * (Ve - Ea + MP + 54.36);
|
|
l -= 0.12722 * sin(g);
|
|
g = STR * (3. * (Ve - Ea) - MP + 433.8);
|
|
l += 0.12539 * sin(g);
|
|
g = STR * (Ea - Ju + MP + 4002.12);
|
|
l += 0.10994 * sin(g);
|
|
g = STR * (20. * Ve - 21. * Ea - 2. * D + MP - 317511.72);
|
|
l += 0.10652 * sin(g);
|
|
g = STR * (26. * Ve - 29. * Ea - MP + 270002.52);
|
|
l += 0.10490 * sin(g);
|
|
g = STR * (3. * Ve - 4. * Ea + D - MP - 322765.56);
|
|
l += 0.10386 * sin(g);
|
|
g = STR * (SWELP + 648002.556);
|
|
B = 8.04508 * sin(g);
|
|
g = STR * (Ea + D + 996048.252);
|
|
B += 1.51021 * sin(g);
|
|
g = STR * (f - MP + NF + 95554.332);
|
|
B += 0.63037 * sin(g);
|
|
g = STR * (f - MP - NF + 95553.792);
|
|
B += 0.63014 * sin(g);
|
|
g = STR * (SWELP - MP + 2.9);
|
|
B += 0.45587 * sin(g);
|
|
g = STR * (SWELP + MP + 2.5);
|
|
B += -0.41573 * sin(g);
|
|
g = STR * (SWELP - 2.0 * NF + 3.2);
|
|
B += 0.32623 * sin(g);
|
|
g = STR * (SWELP - 2.0 * D + 2.5);
|
|
B += 0.29855 * sin(g);
|
|
}
|
|
|
|
static void
|
|
moon3()
|
|
{
|
|
|
|
/* terms in T^0 */
|
|
moonpol[0] = 0.0;
|
|
chewm(LR, NLR, 4, 1, moonpol);
|
|
chewm(MB, NMB, 4, 3, moonpol);
|
|
l += (((l4 * T + l3) * T + l2) * T + l1) * T * 1.0e-5;
|
|
moonpol[0] = SWELP + l + 1.0e-4 * moonpol[0];
|
|
moonpol[1] = 1.0e-4 * moonpol[1] + B;
|
|
moonpol[2] = 1.0e-4 * moonpol[2] + 385000.52899; /* kilometers */
|
|
}
|
|
|
|
/* Compute final ecliptic polar coordinates
|
|
*/
|
|
static void
|
|
moon4()
|
|
{
|
|
moonpol[2] /= AUNIT / 1000;
|
|
moonpol[0] = STR * mods3600(moonpol[0]);
|
|
moonpol[1] = STR * moonpol[1];
|
|
B = moonpol[1];
|
|
}
|
|
|
|
/* mean lunar node
|
|
* J julian day
|
|
* pol return array for position and velocity
|
|
* (polar coordinates of ecliptic of date)
|
|
*/
|
|
int
|
|
swi_mean_node(double J, double *pol, char *serr)
|
|
{
|
|
#if 0
|
|
double a, b, c;
|
|
#endif
|
|
char s[AS_MAXCH];
|
|
T = (J - J2000) / 36525.0;
|
|
T2 = T * T;
|
|
T3 = T * T2;
|
|
T4 = T2 * T2;
|
|
/* with elements from swi_moshmoon2(), which are fitted to jpl-ephemeris */
|
|
if (J < MOSHNDEPH_START || J > MOSHNDEPH_END) {
|
|
if (serr != NULL) {
|
|
sprintf(s, "jd %f outside mean node range %.2f .. %.2f ", J,
|
|
MOSHNDEPH_START, MOSHNDEPH_END);
|
|
if (strlen(serr) + strlen(s) < AS_MAXCH)
|
|
strcat(serr, s);
|
|
}
|
|
return ERR;
|
|
}
|
|
mean_elements();
|
|
/* longitude */
|
|
pol[0] = swi_mod2PI((SWELP - NF) * STR);
|
|
/* latitude */
|
|
pol[1] = 0.0;
|
|
/* distance */
|
|
pol[2] = MOON_MEAN_DIST / AUNIT; /* or should it be derived from mean
|
|
* orbital ellipse? */
|
|
#if 0
|
|
a = pol[0];
|
|
/* Chapront, according to Meeus, German, p. 339 */
|
|
pol[0] =
|
|
125.0445550 - 1934.1361849 * T + 0.0020762 * T2 + T3 / 467410 -
|
|
T4 / 60616000;
|
|
pol[0] = swi_mod2PI(pol[0] * DEGTORAD);
|
|
c = pol[0];
|
|
printf("mean node\n");
|
|
printf("moshier de404 - chapront %f\"\n", (a - c) * RADTODEG * 3600);
|
|
#endif
|
|
return OK;
|
|
}
|
|
|
|
/* mean lunar apogee ('dark moon', 'lilith')
|
|
* J julian day
|
|
* pol return array for position
|
|
* (polar coordinates of ecliptic of date)
|
|
* serr error return string
|
|
*/
|
|
int
|
|
swi_mean_apog(double J, double *pol, char *serr)
|
|
{
|
|
#if 0
|
|
int i;
|
|
double a, b;
|
|
double x[3];
|
|
#endif
|
|
double node;
|
|
char s[AS_MAXCH];
|
|
T = (J - J2000) / 36525.0;
|
|
T2 = T * T;
|
|
T3 = T * T2;
|
|
T4 = T2 * T2;
|
|
/* with elements from swi_moshmoon2(), which are fitted to jpl-ephemeris */
|
|
if (J < MOSHNDEPH_START || J > MOSHNDEPH_END) {
|
|
if (serr != NULL) {
|
|
sprintf(s, "jd %f outside mean apogee range %.2f .. %.2f ", J,
|
|
MOSHNDEPH_START, MOSHNDEPH_END);
|
|
if (strlen(serr) + strlen(s) < AS_MAXCH)
|
|
strcat(serr, s);
|
|
}
|
|
return (ERR);
|
|
}
|
|
mean_elements();
|
|
pol[0] = swi_mod2PI((SWELP - MP) * STR + PI);
|
|
#if 0
|
|
a = pol[0];
|
|
/* Chapront, according to Meeus, German, p. 339 */
|
|
pol[0] =
|
|
83.3532430 + 4069.0137111 * T - 0.0103238 * T2 - T3 / 80053 +
|
|
T4 / 18999000;
|
|
pol[0] = swi_mod2PI(pol[0] * DEGTORAD + PI);
|
|
b = pol[0];
|
|
printf("mean apogee\n");
|
|
printf("moshier de404 - chapront %f\"\n", (a - b) * RADTODEG * 3600);
|
|
#endif
|
|
pol[1] = 0;
|
|
pol[2] = MOON_MEAN_DIST * (1 + MOON_MEAN_ECC) / AUNIT; /* apogee */
|
|
#if 0
|
|
pol[2] = 2 * MOON_MEAN_ECC * MOON_MEAN_DIST / AUNIT; /* 2nd focus */
|
|
#endif
|
|
/* Lilith or Dark Moon is either the empty focal point of the mean
|
|
* lunar ellipse or, for some people, its apogee ("aphelion").
|
|
* This is 180 degrees from the perigee.
|
|
*
|
|
* Since the lunar orbit is not in the ecliptic, the apogee must be
|
|
* projected onto the ecliptic.
|
|
* Joelle de Gravelaine has in her book "Lilith der schwarze Mond"
|
|
* (Astrodata, 1990) an ephemeris which gives noon (12.00) positions
|
|
* but does not project them onto the ecliptic.
|
|
* This results in a mistake of several arc minutes.
|
|
*
|
|
* There is also another problem. The other focal point doesn't
|
|
* coincide with the geocenter but with the barycenter of the
|
|
* earth-moon-system. The difference is about 4700 km. If one
|
|
* took this into account, it would result in an oscillation
|
|
* of the Black Moon. If defined as the apogee, this oscillation
|
|
* would be about +/- 40 arcmin.
|
|
* If defined as the second focus, the effect is very large:
|
|
* +/- 6 deg!
|
|
* We neglect this influence.
|
|
*/
|
|
/* apogee is now projected onto ecliptic */
|
|
node = (SWELP - NF) * STR;
|
|
pol[0] = swi_mod2PI(pol[0] - node);
|
|
swi_polcart(pol, pol);
|
|
swi_coortrf(pol, pol, -MOON_MEAN_INCL * DEGTORAD);
|
|
swi_cartpol(pol, pol);
|
|
pol[0] = swi_mod2PI(pol[0] + node);
|
|
#if 0
|
|
/* speed */
|
|
mean_elements(T - PLAN_SPEED_INTV, &SWELP, &MP, &NF, &M, &D);
|
|
pol[3] = swi_mod2PI((SWELP - MP) * STR + PI);
|
|
pol[4] = 0;
|
|
pol[5] = MOON_MEAN_DIST * (1 + MOON_MEAN_ECC) / AUNIT; /* apogee */
|
|
#if 0
|
|
pol[2] = 2 * MOON_MEAN_ECC * MOON_MEAN_DIST / AUNIT; /* 2nd focus */
|
|
#endif
|
|
node = (SWELP - NF) * STR;
|
|
pol[3] = swi_mod2PI(pol[3] - node);
|
|
swi_polcart(pol + 3, pol + 3);
|
|
swi_coortrf(pol + 3, pol + 3, -MOON_MEAN_INCL * DEGTORAD);
|
|
swi_cartpol(pol + 3, pol + 3);
|
|
pol[3] = swi_mod2PI(pol[3] + node);
|
|
for (i = 0; i <= 2; i++)
|
|
pol[3 + i] = pol[i] - pol[3 + i];
|
|
pol[3] = swi_mod2PI(pol[3]);
|
|
#endif
|
|
return OK;
|
|
}
|
|
|
|
/* Program to step through the perturbation table
|
|
*/
|
|
static void
|
|
chewm(short *pt, int nlines, int nangles, int typflg, double *ans)
|
|
{
|
|
int i, j, k, k1, m;
|
|
double cu, su, cv, sv, ff;
|
|
for (i = 0; i < nlines; i++) {
|
|
k1 = 0;
|
|
sv = 0.0;
|
|
cv = 0.0;
|
|
for (m = 0; m < nangles; m++) {
|
|
j = *pt++; /* multiple angle factor */
|
|
if (j) {
|
|
k = j;
|
|
if (j < 0)
|
|
k = -k; /* make angle factor > 0 */
|
|
/* sin, cos (k*angle) from lookup table */
|
|
su = ss[m][k - 1];
|
|
cu = cc[m][k - 1];
|
|
if (j < 0)
|
|
su = -su; /* negative angle factor */
|
|
if (k1 == 0) {
|
|
/* Set sin, cos of first angle. */
|
|
sv = su;
|
|
cv = cu;
|
|
k1 = 1;
|
|
}
|
|
else {
|
|
/* Combine angles by trigonometry. */
|
|
ff = su * cv + cu * sv;
|
|
cv = cu * cv - su * sv;
|
|
sv = ff;
|
|
}
|
|
}
|
|
}
|
|
/* Accumulate
|
|
*/
|
|
switch (typflg) {
|
|
/* large longitude and radius */
|
|
case 1:
|
|
j = *pt++;
|
|
k = *pt++;
|
|
ans[0] += (10000.0 * j + k) * sv;
|
|
j = *pt++;
|
|
k = *pt++;
|
|
if (k)
|
|
ans[2] += (10000.0 * j + k) * cv;
|
|
break;
|
|
/* longitude and radius */
|
|
case 2:
|
|
j = *pt++;
|
|
k = *pt++;
|
|
ans[0] += j * sv;
|
|
ans[2] += k * cv;
|
|
break;
|
|
/* large latitude */
|
|
case 3:
|
|
j = *pt++;
|
|
k = *pt++;
|
|
ans[1] += (10000.0 * j + k) * sv;
|
|
break;
|
|
/* latitude */
|
|
case 4:
|
|
j = *pt++;
|
|
ans[1] += j * sv;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Prepare lookup table of sin and cos ( i*Lj )
|
|
* for required multiple angles
|
|
*/
|
|
static void
|
|
sscc(int k, double arg, int n)
|
|
{
|
|
double cu, su, cv, sv, s;
|
|
int i;
|
|
su = sin(arg);
|
|
cu = cos(arg);
|
|
ss[k][0] = su; /* sin(L) */
|
|
cc[k][0] = cu; /* cos(L) */
|
|
sv = 2.0 * su * cu;
|
|
cv = cu * cu - su * su;
|
|
ss[k][1] = sv; /* sin(2L) */
|
|
cc[k][1] = cv;
|
|
for (i = 2; i < n; i++) {
|
|
s = su * cv + cu * sv;
|
|
cv = cu * cv - su * sv;
|
|
sv = s;
|
|
ss[k][i] = sv; /* sin( i+1 L ) */
|
|
cc[k][i] = cv;
|
|
}
|
|
}
|
|
|
|
/* converts from polar coordinates of ecliptic of date
|
|
* to cartesian coordinates of equator 2000
|
|
* tjd date
|
|
* x array of position
|
|
*/
|
|
static void
|
|
ecldat_equ2000(double tjd, double *xpm)
|
|
{
|
|
/* cartesian */
|
|
swi_polcart(xpm, xpm);
|
|
/* equatorial */
|
|
swi_coortrf2(xpm, xpm, -swed.oec.seps, swed.oec.ceps);
|
|
/* j2000 */
|
|
swi_precess(xpm, tjd, J_TO_J2000);
|
|
/**/}
|
|
|
|
/* Reduce arc seconds modulo 360 degrees
|
|
* answer in arc seconds
|
|
*/
|
|
static double
|
|
mods3600(double x)
|
|
{
|
|
double lx;
|
|
lx = x;
|
|
lx = lx - 1296000.0 * floor(lx / 1296000.0);
|
|
return (lx);
|
|
}
|
|
|
|
void
|
|
swi_mean_lunar_elements(double tjd, double *node, double *dnode, double *peri,
|
|
double *dperi)
|
|
{
|
|
T = (tjd - J2000) / 36525.0;
|
|
T2 = T * T;
|
|
mean_elements();
|
|
*node = swe_degnorm((SWELP - NF) * STR * RADTODEG);
|
|
*peri = swe_degnorm((SWELP - MP) * STR * RADTODEG);
|
|
T -= 1.0 / 36525;
|
|
mean_elements();
|
|
*dnode = swe_degnorm(*node - (SWELP - NF) * STR * RADTODEG);
|
|
*dnode -= 360;
|
|
*dperi = swe_degnorm(*peri - (SWELP - MP) * STR * RADTODEG);
|
|
}
|
|
|
|
static void
|
|
mean_elements()
|
|
{
|
|
double fracT = fmod(T, 1);
|
|
|
|
/* Mean anomaly of sun = l' (J. Laskar) */
|
|
|
|
/*M = mods3600(129596581.038354 * T + 1287104.76154);*/
|
|
M = mods3600(129600000.0 * fracT - 3418.961646 * T + 1287104.76154);
|
|
M += ((((((((1.62e-20 * T - 1.0390e-17) * T - 3.83508e-15) * T +
|
|
4.237343e-13) * T + 8.8555011e-11) * T - 4.77258489e-8) * T -
|
|
1.1297037031e-5) * T + 1.4732069041e-4) * T -
|
|
0.552891801772) * T2;
|
|
#ifdef MOSH_MOON_200
|
|
|
|
/* Mean distance of moon from its ascending node = F */
|
|
NF = mods3600(1739527263.0983 * T + 335779.55755);
|
|
|
|
/* Mean anomaly of moon = l */
|
|
MP = mods3600(1717915923.4728 * T + 485868.28096);
|
|
|
|
/* Mean elongation of moon = D */
|
|
D = mods3600(1602961601.4603 * T + 1072260.73512);
|
|
|
|
/* Mean longitude of moon */
|
|
SWELP = mods3600(1732564372.83264 * T + 785939.95571);
|
|
|
|
/* Higher degree secular terms found by least squares fit */
|
|
NF +=
|
|
(((((z[5] * T + z[4]) * T + z[3]) * T + z[2]) * T + z[1]) * T +
|
|
z[0]) * T2;
|
|
MP +=
|
|
(((((z[11] * T + z[10]) * T + z[9]) * T + z[8]) * T + z[7]) * T +
|
|
z[6]) * T2;
|
|
D += (((((z[17] * T + z[16]) * T + z[15]) * T + z[14]) * T + z[13]) * T +
|
|
z[12]) * T2;
|
|
SWELP +=
|
|
(((((z[23] * T + z[22]) * T + z[21]) * T + z[20]) * T + z[19]) * T +
|
|
z[18]) * T2;
|
|
#else
|
|
|
|
/* Mean distance of moon from its ascending node = F */
|
|
|
|
/*NF = mods3600((1739527263.0983 - 2.079419901760e-01) * T + 335779.55755);*/
|
|
NF = mods3600(1739232000.0 * fracT + 295263.0983 * T -
|
|
2.079419901760e-01 * T + 335779.55755);
|
|
|
|
/* Mean anomaly of moon = l */
|
|
|
|
/*MP = mods3600((1717915923.4728 - 2.035946368532e-01) * T + 485868.28096);*/
|
|
MP = mods3600(1717200000.0 * fracT + 715923.4728 * T -
|
|
2.035946368532e-01 * T + 485868.28096);
|
|
|
|
/* Mean elongation of moon = D */
|
|
|
|
/*D = mods3600((1602961601.4603 + 3.962893294503e-01) * T + 1072260.73512);*/
|
|
D = mods3600(1601856000.0 * fracT + 1105601.4603 * T +
|
|
3.962893294503e-01 * T + 1072260.73512);
|
|
|
|
/* Mean longitude of moon, referred to the mean ecliptic and equinox of date */
|
|
|
|
/*SWELP = mods3600((1732564372.83264 - 6.784914260953e-01) * T + 785939.95571);*/
|
|
SWELP =
|
|
mods3600(1731456000.0 * fracT + 1108372.83264 * T -
|
|
6.784914260953e-01 * T + 785939.95571);
|
|
|
|
/* Higher degree secular terms found by least squares fit */
|
|
NF += ((z[2] * T + z[1]) * T + z[0]) * T2;
|
|
MP += ((z[5] * T + z[4]) * T + z[3]) * T2;
|
|
D += ((z[8] * T + z[7]) * T + z[6]) * T2;
|
|
SWELP += ((z[11] * T + z[10]) * T + z[9]) * T2;
|
|
#endif /* ! MOSH_MOON_200 */
|
|
|
|
/* sensitivity of mean elements
|
|
* delta argument = scale factor times delta amplitude (arcsec)
|
|
* cos l 9.0019 = mean eccentricity
|
|
* cos 2D 43.6
|
|
* cos F 11.2 (latitude term)
|
|
*/
|
|
}
|
|
|
|
void
|
|
mean_elements_pl()
|
|
{
|
|
|
|
/* Mean longitudes of planets (Laskar, Bretagnon) */
|
|
Ve = mods3600(210664136.4335482 * T + 655127.283046);
|
|
Ve +=
|
|
((((((((-9.36e-023 * T - 1.95e-20) * T + 6.097e-18) * T +
|
|
4.43201e-15) * T + 2.509418e-13) * T - 3.0622898e-10) * T -
|
|
2.26602516e-9) * T - 1.4244812531e-5) * T + 0.005871373088) * T2;
|
|
Ea = mods3600(129597742.26669231 * T + 361679.214649);
|
|
Ea +=
|
|
((((((((-1.16e-22 * T + 2.976e-19) * T + 2.8460e-17) * T -
|
|
1.08402e-14) * T - 1.226182e-12) * T + 1.7228268e-10) * T +
|
|
1.515912254e-7) * T + 8.863982531e-6) * T - 2.0199859001e-2) * T2;
|
|
Ma = mods3600(68905077.59284 * T + 1279559.78866);
|
|
Ma += (-1.043e-5 * T + 9.38012e-3) * T2;
|
|
Ju = mods3600(10925660.428608 * T + 123665.342120);
|
|
Ju += (1.543273e-5 * T - 3.06037836351e-1) * T2;
|
|
Sa = mods3600(4399609.65932 * T + 180278.89694);
|
|
Sa += ((4.475946e-8 * T - 6.874806E-5) * T + 7.56161437443E-1) * T2;
|
|
}
|
|
|
|
/* Calculate geometric coordinates of true interpolated Moon apsides
|
|
*/
|
|
int
|
|
swi_intp_apsides(double J, double *pol, int ipli)
|
|
{
|
|
double dd;
|
|
double rsv[3];
|
|
double sNF, sD, sLP, sMP, sM, sVe, sEa, sMa, sJu, sSa, fM, fVe, fEa, fMa,
|
|
fJu, fSa, cMP, zMP, fNF, fD, fLP;
|
|
double dMP, mLP, mNF, mD, mMP;
|
|
int i, ii, iii, niter = 4; /* niter: silence compiler warning */
|
|
ii = 1;
|
|
zMP = 27.55454988;
|
|
fNF = 27.212220817 / zMP;
|
|
/**/ fD = 29.530588835 / zMP;
|
|
/**/ fLP = 27.321582 / zMP;
|
|
/**/ fM = 365.2596359 / zMP;
|
|
fVe = 224.7008001 / zMP;
|
|
fEa = 365.2563629 / zMP;
|
|
fMa = 686.9798519 / zMP;
|
|
fJu = 4332.589348 / zMP;
|
|
fSa = 10759.22722 / zMP;
|
|
T = (J - J2000) / 36525.0;
|
|
T2 = T * T;
|
|
T4 = T2 * T2;
|
|
mean_elements();
|
|
mean_elements_pl();
|
|
sNF = NF;
|
|
sD = D;
|
|
sLP = SWELP;
|
|
sMP = MP;
|
|
sM = M;
|
|
sVe = Ve;
|
|
sEa = Ea;
|
|
sMa = Ma;
|
|
sJu = Ju;
|
|
sSa = Sa;
|
|
sNF = mods3600(NF);
|
|
sD = mods3600(D);
|
|
sLP = mods3600(SWELP);
|
|
sMP = mods3600(MP);
|
|
if (ipli == SEI_INTP_PERG) {
|
|
MP = 0.0;
|
|
niter = 5;
|
|
}
|
|
if (ipli == SEI_INTP_APOG) {
|
|
MP = 648000.0;
|
|
niter = 4;
|
|
}
|
|
cMP = 0;
|
|
dd = 18000.0;
|
|
for (iii = 0; iii <= niter; iii++) {
|
|
/**/ dMP = sMP - MP;
|
|
mLP = sLP - dMP;
|
|
mNF = sNF - dMP;
|
|
mD = sD - dMP;
|
|
mMP = sMP - dMP;
|
|
for (ii = 0; ii <= 2; ii++) {
|
|
/**/ MP = mMP + (ii - 1) * dd;
|
|
/**/ NF = mNF + (ii - 1) * dd / fNF;
|
|
D = mD + (ii - 1) * dd / fD;
|
|
SWELP = mLP + (ii - 1) * dd / fLP;
|
|
M = sM + (ii - 1) * dd / fM;
|
|
Ve = sVe + (ii - 1) * dd / fVe;
|
|
Ea = sEa + (ii - 1) * dd / fEa;
|
|
Ma = sMa + (ii - 1) * dd / fMa;
|
|
Ju = sJu + (ii - 1) * dd / fJu;
|
|
Sa = sSa + (ii - 1) * dd / fSa;
|
|
moon1();
|
|
moon2();
|
|
moon3();
|
|
moon4();
|
|
if (ii == 1) {
|
|
for (i = 0; i < 3; i++)
|
|
pol[i] = moonpol[i];
|
|
}
|
|
rsv[ii] = moonpol[2];
|
|
}
|
|
cMP =
|
|
(1.5 * rsv[0] - 2 * rsv[1] + 0.5 * rsv[2]) / (rsv[0] + rsv[2] -
|
|
2 * rsv[1]);
|
|
/**/ cMP *= dd;
|
|
cMP = cMP - dd;
|
|
mMP += cMP;
|
|
MP = mMP;
|
|
dd /= 10;
|
|
}
|
|
return (0);
|
|
}
|