| 1 | /*
|
|---|
| 2 | *+
|
|---|
| 3 | * Name:
|
|---|
| 4 | * palDmoon
|
|---|
| 5 |
|
|---|
| 6 | * Purpose:
|
|---|
| 7 | * Approximate geocentric position and velocity of the Moon
|
|---|
| 8 |
|
|---|
| 9 | * Language:
|
|---|
| 10 | * Starlink ANSI C
|
|---|
| 11 |
|
|---|
| 12 | * Type of Module:
|
|---|
| 13 | * Library routine
|
|---|
| 14 |
|
|---|
| 15 | * Invocation:
|
|---|
| 16 | * void palDmoon( double date, double pv[6] );
|
|---|
| 17 |
|
|---|
| 18 | * Arguments:
|
|---|
| 19 | * date = double (Given)
|
|---|
| 20 | * TDB as a Modified Julian Date (JD-2400000.5)
|
|---|
| 21 | * pv = double [6] (Returned)
|
|---|
| 22 | * Moon x,y,z,xdot,ydot,zdot, mean equator and
|
|---|
| 23 | * equinox of date (AU, AU/s)
|
|---|
| 24 |
|
|---|
| 25 | * Description:
|
|---|
| 26 | * Calculate the approximate geocentric position of the Moon
|
|---|
| 27 | * using a full implementation of the algorithm published by
|
|---|
| 28 | * Meeus (l'Astronomie, June 1984, p348).
|
|---|
| 29 |
|
|---|
| 30 | * Authors:
|
|---|
| 31 | * TIMJ: Tim Jenness (JAC, Hawaii)
|
|---|
| 32 | * PTW: Patrick T. Wallace
|
|---|
| 33 | * {enter_new_authors_here}
|
|---|
| 34 |
|
|---|
| 35 | * Notes:
|
|---|
| 36 | * - Meeus quotes accuracies of 10 arcsec in longitude, 3 arcsec in
|
|---|
| 37 | * latitude and 0.2 arcsec in HP (equivalent to about 20 km in
|
|---|
| 38 | * distance). Comparison with JPL DE200 over the interval
|
|---|
| 39 | * 1960-2025 gives RMS errors of 3.7 arcsec and 83 mas/hour in
|
|---|
| 40 | * longitude, 2.3 arcsec and 48 mas/hour in latitude, 11 km
|
|---|
| 41 | * and 81 mm/s in distance. The maximum errors over the same
|
|---|
| 42 | * interval are 18 arcsec and 0.50 arcsec/hour in longitude,
|
|---|
| 43 | * 11 arcsec and 0.24 arcsec/hour in latitude, 40 km and 0.29 m/s
|
|---|
| 44 | * in distance.
|
|---|
| 45 | * - The original algorithm is expressed in terms of the obsolete
|
|---|
| 46 | * timescale Ephemeris Time. Either TDB or TT can be used, but
|
|---|
| 47 | * not UT without incurring significant errors (30 arcsec at
|
|---|
| 48 | * the present time) due to the Moon's 0.5 arcsec/sec movement.
|
|---|
| 49 | * - The algorithm is based on pre IAU 1976 standards. However,
|
|---|
| 50 | * the result has been moved onto the new (FK5) equinox, an
|
|---|
| 51 | * adjustment which is in any case much smaller than the
|
|---|
| 52 | * intrinsic accuracy of the procedure.
|
|---|
| 53 | * - Velocity is obtained by a complete analytical differentiation
|
|---|
| 54 | * of the Meeus model.
|
|---|
| 55 |
|
|---|
| 56 | * History:
|
|---|
| 57 | * 2012-03-07 (TIMJ):
|
|---|
| 58 | * Initial version based on a direct port of the SLA/F code.
|
|---|
| 59 | * Adapted with permission from the Fortran SLALIB library.
|
|---|
| 60 | * {enter_further_changes_here}
|
|---|
| 61 |
|
|---|
| 62 | * Copyright:
|
|---|
| 63 | * Copyright (C) 1998 Rutherford Appleton Laboratory
|
|---|
| 64 | * Copyright (C) 2012 Science and Technology Facilities Council.
|
|---|
| 65 | * All Rights Reserved.
|
|---|
| 66 |
|
|---|
| 67 | * Licence:
|
|---|
| 68 | * This program is free software; you can redistribute it and/or
|
|---|
| 69 | * modify it under the terms of the GNU General Public License as
|
|---|
| 70 | * published by the Free Software Foundation; either version 3 of
|
|---|
| 71 | * the License, or (at your option) any later version.
|
|---|
| 72 | *
|
|---|
| 73 | * This program is distributed in the hope that it will be
|
|---|
| 74 | * useful, but WITHOUT ANY WARRANTY; without even the implied
|
|---|
| 75 | * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|---|
| 76 | * PURPOSE. See the GNU General Public License for more details.
|
|---|
| 77 | *
|
|---|
| 78 | * You should have received a copy of the GNU General Public License
|
|---|
| 79 | * along with this program; if not, write to the Free Software
|
|---|
| 80 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|---|
| 81 | * MA 02110-1301, USA.
|
|---|
| 82 |
|
|---|
| 83 | * Bugs:
|
|---|
| 84 | * {note_any_bugs_here}
|
|---|
| 85 | *-
|
|---|
| 86 | */
|
|---|
| 87 |
|
|---|
| 88 | #include "pal.h"
|
|---|
| 89 | #include "pal1sofa.h"
|
|---|
| 90 | #include "palmac.h"
|
|---|
| 91 |
|
|---|
| 92 | /* Autoconf can give us -DPIC */
|
|---|
| 93 | #undef PIC
|
|---|
| 94 |
|
|---|
| 95 | void palDmoon( double date, double pv[6] ) {
|
|---|
| 96 |
|
|---|
| 97 | /* Seconds per Julian century (86400*36525) */
|
|---|
| 98 | const double CJ = 3155760000.0;
|
|---|
| 99 |
|
|---|
| 100 | /* Julian epoch of B1950 */
|
|---|
| 101 | const double B1950 = 1949.9997904423;
|
|---|
| 102 |
|
|---|
| 103 | /* Earth equatorial radius in AU ( = 6378.137 / 149597870 ) */
|
|---|
| 104 | const double ERADAU=4.2635212653763e-5;
|
|---|
| 105 |
|
|---|
| 106 | double T,THETA,SINOM,COSOM,DOMCOM,WA,DWA,WB,DWB,WOM,
|
|---|
| 107 | DWOM,SINWOM,COSWOM,V,DV,COEFF,EMN,EMPN,DN,FN,EN,
|
|---|
| 108 | DEN,DTHETA,FTHETA,EL,DEL,B,DB,BF,DBF,P,DP,SP,R,
|
|---|
| 109 | DR,X,Y,Z,XD,YD,ZD,SEL,CEL,SB,CB,RCB,RBD,W,EPJ,
|
|---|
| 110 | EQCOR,EPS,SINEPS,COSEPS,ES,EC;
|
|---|
| 111 | double ELP, DELP;
|
|---|
| 112 | double EM, DEM, EMP, DEMP, D, DD, F, DF, OM, DOM, E, DESQ, ESQ, DE;
|
|---|
| 113 | int N,I;
|
|---|
| 114 |
|
|---|
| 115 | /*
|
|---|
| 116 | * Coefficients for fundamental arguments
|
|---|
| 117 | *
|
|---|
| 118 | * at J1900: T**0, T**1, T**2, T**3
|
|---|
| 119 | * at epoch: T**0, T**1
|
|---|
| 120 | *
|
|---|
| 121 | * Units are degrees for position and Julian centuries for time
|
|---|
| 122 | *
|
|---|
| 123 | */
|
|---|
| 124 |
|
|---|
| 125 | /* Moon's mean longitude */
|
|---|
| 126 | const double ELP0=270.434164;
|
|---|
| 127 | const double ELP1=481267.8831;
|
|---|
| 128 | const double ELP2=-0.001133;
|
|---|
| 129 | const double ELP3=0.0000019;
|
|---|
| 130 |
|
|---|
| 131 | /* Sun's mean anomaly */
|
|---|
| 132 | const double EM0=358.475833;
|
|---|
| 133 | const double EM1=35999.0498;
|
|---|
| 134 | const double EM2=-0.000150;
|
|---|
| 135 | const double EM3=-0.0000033;
|
|---|
| 136 |
|
|---|
| 137 | /* Moon's mean anomaly */
|
|---|
| 138 | const double EMP0=296.104608;
|
|---|
| 139 | const double EMP1=477198.8491;
|
|---|
| 140 | const double EMP2=0.009192;
|
|---|
| 141 | const double EMP3=0.0000144;
|
|---|
| 142 |
|
|---|
| 143 | /* Moon's mean elongation */
|
|---|
| 144 | const double D0=350.737486;
|
|---|
| 145 | const double D1=445267.1142;
|
|---|
| 146 | const double D2=-0.001436;
|
|---|
| 147 | const double D3=0.0000019;
|
|---|
| 148 |
|
|---|
| 149 | /* Mean distance of the Moon from its ascending node */
|
|---|
| 150 | const double F0=11.250889;
|
|---|
| 151 | const double F1=483202.0251;
|
|---|
| 152 | const double F2=-0.003211;
|
|---|
| 153 | const double F3=-0.0000003;
|
|---|
| 154 |
|
|---|
| 155 | /* Longitude of the Moon's ascending node */
|
|---|
| 156 | const double OM0=259.183275;
|
|---|
| 157 | const double OM1=-1934.1420;
|
|---|
| 158 | const double OM2=0.002078;
|
|---|
| 159 | const double OM3=0.0000022;
|
|---|
| 160 |
|
|---|
| 161 | /* Coefficients for (dimensionless) E factor */
|
|---|
| 162 | const double E1=-0.002495;
|
|---|
| 163 | const double E2=-0.00000752;
|
|---|
| 164 |
|
|---|
| 165 | /* Coefficients for periodic variations etc */
|
|---|
| 166 | const double PAC=0.000233;
|
|---|
| 167 | const double PA0=51.2;
|
|---|
| 168 | const double PA1=20.2;
|
|---|
| 169 | const double PBC=-0.001778;
|
|---|
| 170 | const double PCC=0.000817;
|
|---|
| 171 | const double PDC=0.002011;
|
|---|
| 172 | const double PEC=0.003964;
|
|---|
| 173 | const double PE0=346.560;
|
|---|
| 174 | const double PE1=132.870;
|
|---|
| 175 | const double PE2=-0.0091731;
|
|---|
| 176 | const double PFC=0.001964;
|
|---|
| 177 | const double PGC=0.002541;
|
|---|
| 178 | const double PHC=0.001964;
|
|---|
| 179 | const double PIC=-0.024691;
|
|---|
| 180 | const double PJC=-0.004328;
|
|---|
| 181 | const double PJ0=275.05;
|
|---|
| 182 | const double PJ1=-2.30;
|
|---|
| 183 | const double CW1=0.0004664;
|
|---|
| 184 | const double CW2=0.0000754;
|
|---|
| 185 |
|
|---|
| 186 | /*
|
|---|
| 187 | * Coefficients for Moon position
|
|---|
| 188 | *
|
|---|
| 189 | * Tx(N) = coefficient of L, B or P term (deg)
|
|---|
| 190 | * ITx(N,1-5) = coefficients of M, M', D, F, E**n in argument
|
|---|
| 191 | */
|
|---|
| 192 | #define NL 50
|
|---|
| 193 | #define NB 45
|
|---|
| 194 | #define NP 31
|
|---|
| 195 |
|
|---|
| 196 | /*
|
|---|
| 197 | * Longitude
|
|---|
| 198 | */
|
|---|
| 199 | const double TL[NL] = {
|
|---|
| 200 | 6.28875,1.274018,.658309,.213616,-.185596,
|
|---|
| 201 | -.114336,.058793,.057212,.05332,.045874,.041024,-.034718,-.030465,
|
|---|
| 202 | .015326,-.012528,-.01098,.010674,.010034,.008548,-.00791,-.006783,
|
|---|
| 203 | .005162,.005,.004049,.003996,.003862,.003665,.002695,.002602,
|
|---|
| 204 | .002396,-.002349,.002249,-.002125,-.002079,.002059,-.001773,
|
|---|
| 205 | -.001595,.00122,-.00111,8.92e-4,-8.11e-4,7.61e-4,7.17e-4,7.04e-4,
|
|---|
| 206 | 6.93e-4,5.98e-4,5.5e-4,5.38e-4,5.21e-4,4.86e-4
|
|---|
| 207 | };
|
|---|
| 208 |
|
|---|
| 209 | const int ITL[NL][5] = {
|
|---|
| 210 | /* M M' D F n */
|
|---|
| 211 | { +0, +1, +0, +0, 0 },
|
|---|
| 212 | { +0, -1, +2, +0, 0 },
|
|---|
| 213 | { +0, +0, +2, +0, 0 },
|
|---|
| 214 | { +0, +2, +0, +0, 0 },
|
|---|
| 215 | { +1, +0, +0, +0, 1 },
|
|---|
| 216 | { +0, +0, +0, +2, 0 },
|
|---|
| 217 | { +0, -2, +2, +0, 0 },
|
|---|
| 218 | { -1, -1, +2, +0, 1 },
|
|---|
| 219 | { +0, +1, +2, +0, 0 },
|
|---|
| 220 | { -1, +0, +2, +0, 1 },
|
|---|
| 221 | { -1, +1, +0, +0, 1 },
|
|---|
| 222 | { +0, +0, +1, +0, 0 },
|
|---|
| 223 | { +1, +1, +0, +0, 1 },
|
|---|
| 224 | { +0, +0, +2, -2, 0 },
|
|---|
| 225 | { +0, +1, +0, +2, 0 },
|
|---|
| 226 | { +0, -1, +0, +2, 0 },
|
|---|
| 227 | { +0, -1, +4, +0, 0 },
|
|---|
| 228 | { +0, +3, +0, +0, 0 },
|
|---|
| 229 | { +0, -2, +4, +0, 0 },
|
|---|
| 230 | { +1, -1, +2, +0, 1 },
|
|---|
| 231 | { +1, +0, +2, +0, 1 },
|
|---|
| 232 | { +0, +1, -1, +0, 0 },
|
|---|
| 233 | { +1, +0, +1, +0, 1 },
|
|---|
| 234 | { -1, +1, +2, +0, 1 },
|
|---|
| 235 | { +0, +2, +2, +0, 0 },
|
|---|
| 236 | { +0, +0, +4, +0, 0 },
|
|---|
| 237 | { +0, -3, +2, +0, 0 },
|
|---|
| 238 | { -1, +2, +0, +0, 1 },
|
|---|
| 239 | { +0, +1, -2, -2, 0 },
|
|---|
| 240 | { -1, -2, +2, +0, 1 },
|
|---|
| 241 | { +0, +1, +1, +0, 0 },
|
|---|
| 242 | { -2, +0, +2, +0, 2 },
|
|---|
| 243 | { +1, +2, +0, +0, 1 },
|
|---|
| 244 | { +2, +0, +0, +0, 2 },
|
|---|
| 245 | { -2, -1, +2, +0, 2 },
|
|---|
| 246 | { +0, +1, +2, -2, 0 },
|
|---|
| 247 | { +0, +0, +2, +2, 0 },
|
|---|
| 248 | { -1, -1, +4, +0, 1 },
|
|---|
| 249 | { +0, +2, +0, +2, 0 },
|
|---|
| 250 | { +0, +1, -3, +0, 0 },
|
|---|
| 251 | { +1, +1, +2, +0, 1 },
|
|---|
| 252 | { -1, -2, +4, +0, 1 },
|
|---|
| 253 | { -2, +1, +0, +0, 2 },
|
|---|
| 254 | { -2, +1, -2, +0, 2 },
|
|---|
| 255 | { +1, -2, +2, +0, 1 },
|
|---|
| 256 | { -1, +0, +2, -2, 1 },
|
|---|
| 257 | { +0, +1, +4, +0, 0 },
|
|---|
| 258 | { +0, +4, +0, +0, 0 },
|
|---|
| 259 | { -1, +0, +4, +0, 1 },
|
|---|
| 260 | { +0, +2, -1, +0, 0 }
|
|---|
| 261 | };
|
|---|
| 262 |
|
|---|
| 263 | /*
|
|---|
| 264 | * Latitude
|
|---|
| 265 | */
|
|---|
| 266 | const double TB[NB] = {
|
|---|
| 267 | 5.128189,.280606,.277693,.173238,.055413,
|
|---|
| 268 | .046272,.032573,.017198,.009267,.008823,.008247,.004323,.0042,
|
|---|
| 269 | .003372,.002472,.002222,.002072,.001877,.001828,-.001803,-.00175,
|
|---|
| 270 | .00157,-.001487,-.001481,.001417,.00135,.00133,.001106,.00102,
|
|---|
| 271 | 8.33e-4,7.81e-4,6.7e-4,6.06e-4,5.97e-4,4.92e-4,4.5e-4,4.39e-4,
|
|---|
| 272 | 4.23e-4,4.22e-4,-3.67e-4,-3.53e-4,3.31e-4,3.17e-4,3.06e-4,
|
|---|
| 273 | -2.83e-4
|
|---|
| 274 | };
|
|---|
| 275 |
|
|---|
| 276 | const int ITB[NB][5] = {
|
|---|
| 277 | /* M M' D F n */
|
|---|
| 278 | { +0, +0, +0, +1, 0 },
|
|---|
| 279 | { +0, +1, +0, +1, 0 },
|
|---|
| 280 | { +0, +1, +0, -1, 0 },
|
|---|
| 281 | { +0, +0, +2, -1, 0 },
|
|---|
| 282 | { +0, -1, +2, +1, 0 },
|
|---|
| 283 | { +0, -1, +2, -1, 0 },
|
|---|
| 284 | { +0, +0, +2, +1, 0 },
|
|---|
| 285 | { +0, +2, +0, +1, 0 },
|
|---|
| 286 | { +0, +1, +2, -1, 0 },
|
|---|
| 287 | { +0, +2, +0, -1, 0 },
|
|---|
| 288 | { -1, +0, +2, -1, 1 },
|
|---|
| 289 | { +0, -2, +2, -1, 0 },
|
|---|
| 290 | { +0, +1, +2, +1, 0 },
|
|---|
| 291 | { -1, +0, -2, +1, 1 },
|
|---|
| 292 | { -1, -1, +2, +1, 1 },
|
|---|
| 293 | { -1, +0, +2, +1, 1 },
|
|---|
| 294 | { -1, -1, +2, -1, 1 },
|
|---|
| 295 | { -1, +1, +0, +1, 1 },
|
|---|
| 296 | { +0, -1, +4, -1, 0 },
|
|---|
| 297 | { +1, +0, +0, +1, 1 },
|
|---|
| 298 | { +0, +0, +0, +3, 0 },
|
|---|
| 299 | { -1, +1, +0, -1, 1 },
|
|---|
| 300 | { +0, +0, +1, +1, 0 },
|
|---|
| 301 | { +1, +1, +0, +1, 1 },
|
|---|
| 302 | { -1, -1, +0, +1, 1 },
|
|---|
| 303 | { -1, +0, +0, +1, 1 },
|
|---|
| 304 | { +0, +0, -1, +1, 0 },
|
|---|
| 305 | { +0, +3, +0, +1, 0 },
|
|---|
| 306 | { +0, +0, +4, -1, 0 },
|
|---|
| 307 | { +0, -1, +4, +1, 0 },
|
|---|
| 308 | { +0, +1, +0, -3, 0 },
|
|---|
| 309 | { +0, -2, +4, +1, 0 },
|
|---|
| 310 | { +0, +0, +2, -3, 0 },
|
|---|
| 311 | { +0, +2, +2, -1, 0 },
|
|---|
| 312 | { -1, +1, +2, -1, 1 },
|
|---|
| 313 | { +0, +2, -2, -1, 0 },
|
|---|
| 314 | { +0, +3, +0, -1, 0 },
|
|---|
| 315 | { +0, +2, +2, +1, 0 },
|
|---|
| 316 | { +0, -3, +2, -1, 0 },
|
|---|
| 317 | { +1, -1, +2, +1, 1 },
|
|---|
| 318 | { +1, +0, +2, +1, 1 },
|
|---|
| 319 | { +0, +0, +4, +1, 0 },
|
|---|
| 320 | { -1, +1, +2, +1, 1 },
|
|---|
| 321 | { -2, +0, +2, -1, 2 },
|
|---|
| 322 | { +0, +1, +0, +3, 0 }
|
|---|
| 323 | };
|
|---|
| 324 |
|
|---|
| 325 | /*
|
|---|
| 326 | * Parallax
|
|---|
| 327 | */
|
|---|
| 328 | const double TP[NP] = {
|
|---|
| 329 | .950724,.051818,.009531,.007843,.002824,
|
|---|
| 330 | 8.57e-4,5.33e-4,4.01e-4,3.2e-4,-2.71e-4,-2.64e-4,-1.98e-4,1.73e-4,
|
|---|
| 331 | 1.67e-4,-1.11e-4,1.03e-4,-8.4e-5,-8.3e-5,7.9e-5,7.2e-5,6.4e-5,
|
|---|
| 332 | -6.3e-5,4.1e-5,3.5e-5,-3.3e-5,-3e-5,-2.9e-5,-2.9e-5,2.6e-5,
|
|---|
| 333 | -2.3e-5,1.9e-5
|
|---|
| 334 | };
|
|---|
| 335 |
|
|---|
| 336 | const int ITP[NP][5] = {
|
|---|
| 337 | /* M M' D F n */
|
|---|
| 338 | { +0, +0, +0, +0, 0 },
|
|---|
| 339 | { +0, +1, +0, +0, 0 },
|
|---|
| 340 | { +0, -1, +2, +0, 0 },
|
|---|
| 341 | { +0, +0, +2, +0, 0 },
|
|---|
| 342 | { +0, +2, +0, +0, 0 },
|
|---|
| 343 | { +0, +1, +2, +0, 0 },
|
|---|
| 344 | { -1, +0, +2, +0, 1 },
|
|---|
| 345 | { -1, -1, +2, +0, 1 },
|
|---|
| 346 | { -1, +1, +0, +0, 1 },
|
|---|
| 347 | { +0, +0, +1, +0, 0 },
|
|---|
| 348 | { +1, +1, +0, +0, 1 },
|
|---|
| 349 | { +0, -1, +0, +2, 0 },
|
|---|
| 350 | { +0, +3, +0, +0, 0 },
|
|---|
| 351 | { +0, -1, +4, +0, 0 },
|
|---|
| 352 | { +1, +0, +0, +0, 1 },
|
|---|
| 353 | { +0, -2, +4, +0, 0 },
|
|---|
| 354 | { +0, +2, -2, +0, 0 },
|
|---|
| 355 | { +1, +0, +2, +0, 1 },
|
|---|
| 356 | { +0, +2, +2, +0, 0 },
|
|---|
| 357 | { +0, +0, +4, +0, 0 },
|
|---|
| 358 | { -1, +1, +2, +0, 1 },
|
|---|
| 359 | { +1, -1, +2, +0, 1 },
|
|---|
| 360 | { +1, +0, +1, +0, 1 },
|
|---|
| 361 | { -1, +2, +0, +0, 1 },
|
|---|
| 362 | { +0, +3, -2, +0, 0 },
|
|---|
| 363 | { +0, +1, +1, +0, 0 },
|
|---|
| 364 | { +0, +0, -2, +2, 0 },
|
|---|
| 365 | { +1, +2, +0, +0, 1 },
|
|---|
| 366 | { -2, +0, +2, +0, 2 },
|
|---|
| 367 | { +0, +1, -2, +2, 0 },
|
|---|
| 368 | { -1, -1, +4, +0, 1 }
|
|---|
| 369 | };
|
|---|
| 370 |
|
|---|
| 371 | /* Centuries since J1900 */
|
|---|
| 372 | T=(date-15019.5)/36525.;
|
|---|
| 373 |
|
|---|
| 374 | /*
|
|---|
| 375 | * Fundamental arguments (radians) and derivatives (radians per
|
|---|
| 376 | * Julian century) for the current epoch
|
|---|
| 377 | */
|
|---|
| 378 |
|
|---|
| 379 | /* Moon's mean longitude */
|
|---|
| 380 | ELP=PAL__DD2R*fmod(ELP0+(ELP1+(ELP2+ELP3*T)*T)*T,360.);
|
|---|
| 381 | DELP=PAL__DD2R*(ELP1+(2.*ELP2+3*ELP3*T)*T);
|
|---|
| 382 |
|
|---|
| 383 | /* Sun's mean anomaly */
|
|---|
| 384 | EM=PAL__DD2R*fmod(EM0+(EM1+(EM2+EM3*T)*T)*T,360.);
|
|---|
| 385 | DEM=PAL__DD2R*(EM1+(2.*EM2+3*EM3*T)*T);
|
|---|
| 386 |
|
|---|
| 387 | /* Moon's mean anomaly */
|
|---|
| 388 | EMP=PAL__DD2R*fmod(EMP0+(EMP1+(EMP2+EMP3*T)*T)*T,360.);
|
|---|
| 389 | DEMP=PAL__DD2R*(EMP1+(2.*EMP2+3*EMP3*T)*T);
|
|---|
| 390 |
|
|---|
| 391 | /* Moon's mean elongation */
|
|---|
| 392 | D=PAL__DD2R*fmod(D0+(D1+(D2+D3*T)*T)*T,360.);
|
|---|
| 393 | DD=PAL__DD2R*(D1+(2.*D2+3.*D3*T)*T);
|
|---|
| 394 |
|
|---|
| 395 | /* Mean distance of the Moon from its ascending node */
|
|---|
| 396 | F=PAL__DD2R*fmod(F0+(F1+(F2+F3*T)*T)*T,360.);
|
|---|
| 397 | DF=PAL__DD2R*(F1+(2.*F2+3.*F3*T)*T);
|
|---|
| 398 |
|
|---|
| 399 | /* Longitude of the Moon's ascending node */
|
|---|
| 400 | OM=PAL__DD2R*fmod(OM0+(OM1+(OM2+OM3*T)*T)*T,360.);
|
|---|
| 401 | DOM=PAL__DD2R*(OM1+(2.*OM2+3.*OM3*T)*T);
|
|---|
| 402 | SINOM=sin(OM);
|
|---|
| 403 | COSOM=cos(OM);
|
|---|
| 404 | DOMCOM=DOM*COSOM;
|
|---|
| 405 |
|
|---|
| 406 | /* Add the periodic variations */
|
|---|
| 407 | THETA=PAL__DD2R*(PA0+PA1*T);
|
|---|
| 408 | WA=sin(THETA);
|
|---|
| 409 | DWA=PAL__DD2R*PA1*cos(THETA);
|
|---|
| 410 | THETA=PAL__DD2R*(PE0+(PE1+PE2*T)*T);
|
|---|
| 411 | WB=PEC*sin(THETA);
|
|---|
| 412 | DWB=PAL__DD2R*PEC*(PE1+2.*PE2*T)*cos(THETA);
|
|---|
| 413 | ELP=ELP+PAL__DD2R*(PAC*WA+WB+PFC*SINOM);
|
|---|
| 414 | DELP=DELP+PAL__DD2R*(PAC*DWA+DWB+PFC*DOMCOM);
|
|---|
| 415 | EM=EM+PAL__DD2R*PBC*WA;
|
|---|
| 416 | DEM=DEM+PAL__DD2R*PBC*DWA;
|
|---|
| 417 | EMP=EMP+PAL__DD2R*(PCC*WA+WB+PGC*SINOM);
|
|---|
| 418 | DEMP=DEMP+PAL__DD2R*(PCC*DWA+DWB+PGC*DOMCOM);
|
|---|
| 419 | D=D+PAL__DD2R*(PDC*WA+WB+PHC*SINOM);
|
|---|
| 420 | DD=DD+PAL__DD2R*(PDC*DWA+DWB+PHC*DOMCOM);
|
|---|
| 421 | WOM=OM+PAL__DD2R*(PJ0+PJ1*T);
|
|---|
| 422 | DWOM=DOM+PAL__DD2R*PJ1;
|
|---|
| 423 | SINWOM=sin(WOM);
|
|---|
| 424 | COSWOM=cos(WOM);
|
|---|
| 425 | F=F+PAL__DD2R*(WB+PIC*SINOM+PJC*SINWOM);
|
|---|
| 426 | DF=DF+PAL__DD2R*(DWB+PIC*DOMCOM+PJC*DWOM*COSWOM);
|
|---|
| 427 |
|
|---|
| 428 | /* E-factor, and square */
|
|---|
| 429 | E=1.+(E1+E2*T)*T;
|
|---|
| 430 | DE=E1+2.*E2*T;
|
|---|
| 431 | ESQ=E*E;
|
|---|
| 432 | DESQ=2.*E*DE;
|
|---|
| 433 |
|
|---|
| 434 | /*
|
|---|
| 435 | * Series expansions
|
|---|
| 436 | */
|
|---|
| 437 |
|
|---|
| 438 | /* Longitude */
|
|---|
| 439 | V=0.;
|
|---|
| 440 | DV=0.;
|
|---|
| 441 | for (N=NL-1; N>=0; N--) { /* DO N=NL, 1, -1 */
|
|---|
| 442 | COEFF=TL[N];
|
|---|
| 443 | EMN=(double)(ITL[N][0]);
|
|---|
| 444 | EMPN=(double)(ITL[N][1]);
|
|---|
| 445 | DN=(double)(ITL[N][2]);
|
|---|
| 446 | FN=(double)(ITL[N][3]);
|
|---|
| 447 | I=ITL[N][4];
|
|---|
| 448 | if (I == 0) {
|
|---|
| 449 | EN=1.;
|
|---|
| 450 | DEN=0.;
|
|---|
| 451 | } else if (I == 1) {
|
|---|
| 452 | EN=E;
|
|---|
| 453 | DEN=DE;
|
|---|
| 454 | } else {
|
|---|
| 455 | EN=ESQ;
|
|---|
| 456 | DEN=DESQ;
|
|---|
| 457 | }
|
|---|
| 458 | THETA=EMN*EM+EMPN*EMP+DN*D+FN*F;
|
|---|
| 459 | DTHETA=EMN*DEM+EMPN*DEMP+DN*DD+FN*DF;
|
|---|
| 460 | FTHETA=sin(THETA);
|
|---|
| 461 | V=V+COEFF*FTHETA*EN;
|
|---|
| 462 | DV=DV+COEFF*(cos(THETA)*DTHETA*EN+FTHETA*DEN);
|
|---|
| 463 | }
|
|---|
| 464 | EL=ELP+PAL__DD2R*V;
|
|---|
| 465 | DEL=(DELP+PAL__DD2R*DV)/CJ;
|
|---|
| 466 |
|
|---|
| 467 | /* Latitude */
|
|---|
| 468 | V=0.;
|
|---|
| 469 | DV=0.;
|
|---|
| 470 | for (N=NB-1; N>=0; N--) { /* DO N=NB,1,-1 */
|
|---|
| 471 | COEFF=TB[N];
|
|---|
| 472 | EMN=(double)(ITB[N][0]);
|
|---|
| 473 | EMPN=(double)(ITB[N][1]);
|
|---|
| 474 | DN=(double)(ITB[N][2]);
|
|---|
| 475 | FN=(double)(ITB[N][3]);
|
|---|
| 476 | I=ITB[N][4];
|
|---|
| 477 | if (I == 0 ) {
|
|---|
| 478 | EN=1.;
|
|---|
| 479 | DEN=0.;
|
|---|
| 480 | } else if (I == 1) {
|
|---|
| 481 | EN=E;
|
|---|
| 482 | DEN=DE;
|
|---|
| 483 | } else {
|
|---|
| 484 | EN=ESQ;
|
|---|
| 485 | DEN=DESQ;
|
|---|
| 486 | }
|
|---|
| 487 | THETA=EMN*EM+EMPN*EMP+DN*D+FN*F;
|
|---|
| 488 | DTHETA=EMN*DEM+EMPN*DEMP+DN*DD+FN*DF;
|
|---|
| 489 | FTHETA=sin(THETA);
|
|---|
| 490 | V=V+COEFF*FTHETA*EN;
|
|---|
| 491 | DV=DV+COEFF*(cos(THETA)*DTHETA*EN+FTHETA*DEN);
|
|---|
| 492 | }
|
|---|
| 493 | BF=1.-CW1*COSOM-CW2*COSWOM;
|
|---|
| 494 | DBF=CW1*DOM*SINOM+CW2*DWOM*SINWOM;
|
|---|
| 495 | B=PAL__DD2R*V*BF;
|
|---|
| 496 | DB=PAL__DD2R*(DV*BF+V*DBF)/CJ;
|
|---|
| 497 |
|
|---|
| 498 | /* Parallax */
|
|---|
| 499 | V=0.;
|
|---|
| 500 | DV=0.;
|
|---|
| 501 | for (N=NP-1; N>=0; N--) { /* DO N=NP,1,-1 */
|
|---|
| 502 | COEFF=TP[N];
|
|---|
| 503 | EMN=(double)(ITP[N][0]);
|
|---|
| 504 | EMPN=(double)(ITP[N][1]);
|
|---|
| 505 | DN=(double)(ITP[N][2]);
|
|---|
| 506 | FN=(double)(ITP[N][3]);
|
|---|
| 507 | I=ITP[N][4];
|
|---|
| 508 | if (I == 0) {
|
|---|
| 509 | EN=1.;
|
|---|
| 510 | DEN=0.;
|
|---|
| 511 | } else if (I == 1) {
|
|---|
| 512 | EN=E;
|
|---|
| 513 | DEN=DE;
|
|---|
| 514 | } else {
|
|---|
| 515 | EN=ESQ;
|
|---|
| 516 | DEN=DESQ;
|
|---|
| 517 | }
|
|---|
| 518 | THETA=EMN*EM+EMPN*EMP+DN*D+FN*F;
|
|---|
| 519 | DTHETA=EMN*DEM+EMPN*DEMP+DN*DD+FN*DF;
|
|---|
| 520 | FTHETA=cos(THETA);
|
|---|
| 521 | V=V+COEFF*FTHETA*EN;
|
|---|
| 522 | DV=DV+COEFF*(-sin(THETA)*DTHETA*EN+FTHETA*DEN);
|
|---|
| 523 | }
|
|---|
| 524 | P=PAL__DD2R*V;
|
|---|
| 525 | DP=PAL__DD2R*DV/CJ;
|
|---|
| 526 |
|
|---|
| 527 | /*
|
|---|
| 528 | * Transformation into final form
|
|---|
| 529 | */
|
|---|
| 530 |
|
|---|
| 531 | /* Parallax to distance (AU, AU/sec) */
|
|---|
| 532 | SP=sin(P);
|
|---|
| 533 | R=ERADAU/SP;
|
|---|
| 534 | DR=-R*DP*cos(P)/SP;
|
|---|
| 535 |
|
|---|
| 536 | /* Longitude, latitude to x,y,z (AU) */
|
|---|
| 537 | SEL=sin(EL);
|
|---|
| 538 | CEL=cos(EL);
|
|---|
| 539 | SB=sin(B);
|
|---|
| 540 | CB=cos(B);
|
|---|
| 541 | RCB=R*CB;
|
|---|
| 542 | RBD=R*DB;
|
|---|
| 543 | W=RBD*SB-CB*DR;
|
|---|
| 544 | X=RCB*CEL;
|
|---|
| 545 | Y=RCB*SEL;
|
|---|
| 546 | Z=R*SB;
|
|---|
| 547 | XD=-Y*DEL-W*CEL;
|
|---|
| 548 | YD=X*DEL-W*SEL;
|
|---|
| 549 | ZD=RBD*CB+SB*DR;
|
|---|
| 550 |
|
|---|
| 551 | /* Julian centuries since J2000 */
|
|---|
| 552 | T=(date-51544.5)/36525.;
|
|---|
| 553 |
|
|---|
| 554 | /* Fricke equinox correction */
|
|---|
| 555 | EPJ=2000.+T*100.;
|
|---|
| 556 | EQCOR=PAL__DS2R*(0.035+0.00085*(EPJ-B1950));
|
|---|
| 557 |
|
|---|
| 558 | /* Mean obliquity (IAU 1976) */
|
|---|
| 559 | EPS=PAL__DAS2R*(84381.448+(-46.8150+(-0.00059+0.001813*T)*T)*T);
|
|---|
| 560 |
|
|---|
| 561 | /* To the equatorial system, mean of date, FK5 system */
|
|---|
| 562 | SINEPS=sin(EPS);
|
|---|
| 563 | COSEPS=cos(EPS);
|
|---|
| 564 | ES=EQCOR*SINEPS;
|
|---|
| 565 | EC=EQCOR*COSEPS;
|
|---|
| 566 | pv[0]=X-EC*Y+ES*Z;
|
|---|
| 567 | pv[1]=EQCOR*X+Y*COSEPS-Z*SINEPS;
|
|---|
| 568 | pv[2]=Y*SINEPS+Z*COSEPS;
|
|---|
| 569 | pv[3]=XD-EC*YD+ES*ZD;
|
|---|
| 570 | pv[4]=EQCOR*XD+YD*COSEPS-ZD*SINEPS;
|
|---|
| 571 | pv[5]=YD*SINEPS+ZD*COSEPS;
|
|---|
| 572 |
|
|---|
| 573 | }
|
|---|