source: trunk/FACT++/erfa/src/nut80.c@ 20021

Last change on this file since 20021 was 18921, checked in by tbretz, 7 years ago
Updated to ERFA 1.4.0
File size: 14.5 KB
Line 
1#include "erfa.h"
2
3void eraNut80(double date1, double date2, double *dpsi, double *deps)
4/*
5** - - - - - - - - -
6** e r a N u t 8 0
7** - - - - - - - - -
8**
9** Nutation, IAU 1980 model.
10**
11** Given:
12** date1,date2 double TT as a 2-part Julian Date (Note 1)
13**
14** Returned:
15** dpsi double nutation in longitude (radians)
16** deps double nutation in obliquity (radians)
17**
18** Notes:
19**
20** 1) The TT date date1+date2 is a Julian Date, apportioned in any
21** convenient way between the two arguments. For example,
22** JD(TT)=2450123.7 could be expressed in any of these ways,
23** among others:
24**
25** date1 date2
26**
27** 2450123.7 0.0 (JD method)
28** 2451545.0 -1421.3 (J2000 method)
29** 2400000.5 50123.2 (MJD method)
30** 2450123.5 0.2 (date & time method)
31**
32** The JD method is the most natural and convenient to use in
33** cases where the loss of several decimal digits of resolution
34** is acceptable. The J2000 method is best matched to the way
35** the argument is handled internally and will deliver the
36** optimum resolution. The MJD method and the date & time methods
37** are both good compromises between resolution and convenience.
38**
39** 2) The nutation components are with respect to the ecliptic of
40** date.
41**
42** Called:
43** eraAnpm normalize angle into range +/- pi
44**
45** Reference:
46**
47** Explanatory Supplement to the Astronomical Almanac,
48** P. Kenneth Seidelmann (ed), University Science Books (1992),
49** Section 3.222 (p111).
50**
51** Copyright (C) 2013-2017, NumFOCUS Foundation.
52** Derived, with permission, from the SOFA library. See notes at end of file.
53*/
54{
55 double t, el, elp, f, d, om, dp, de, arg, s, c;
56 int j;
57
58/* Units of 0.1 milliarcsecond to radians */
59 const double U2R = ERFA_DAS2R / 1e4;
60
61/* ------------------------------------------------ */
62/* Table of multiples of arguments and coefficients */
63/* ------------------------------------------------ */
64
65/* The units for the sine and cosine coefficients are 0.1 mas and */
66/* the same per Julian century */
67
68 static const struct {
69 int nl,nlp,nf,nd,nom; /* coefficients of l,l',F,D,Om */
70 double sp,spt; /* longitude sine, 1 and t coefficients */
71 double ce,cet; /* obliquity cosine, 1 and t coefficients */
72 } x[] = {
73
74 /* 1-10 */
75 { 0, 0, 0, 0, 1, -171996.0, -174.2, 92025.0, 8.9 },
76 { 0, 0, 0, 0, 2, 2062.0, 0.2, -895.0, 0.5 },
77 { -2, 0, 2, 0, 1, 46.0, 0.0, -24.0, 0.0 },
78 { 2, 0, -2, 0, 0, 11.0, 0.0, 0.0, 0.0 },
79 { -2, 0, 2, 0, 2, -3.0, 0.0, 1.0, 0.0 },
80 { 1, -1, 0, -1, 0, -3.0, 0.0, 0.0, 0.0 },
81 { 0, -2, 2, -2, 1, -2.0, 0.0, 1.0, 0.0 },
82 { 2, 0, -2, 0, 1, 1.0, 0.0, 0.0, 0.0 },
83 { 0, 0, 2, -2, 2, -13187.0, -1.6, 5736.0, -3.1 },
84 { 0, 1, 0, 0, 0, 1426.0, -3.4, 54.0, -0.1 },
85
86 /* 11-20 */
87 { 0, 1, 2, -2, 2, -517.0, 1.2, 224.0, -0.6 },
88 { 0, -1, 2, -2, 2, 217.0, -0.5, -95.0, 0.3 },
89 { 0, 0, 2, -2, 1, 129.0, 0.1, -70.0, 0.0 },
90 { 2, 0, 0, -2, 0, 48.0, 0.0, 1.0, 0.0 },
91 { 0, 0, 2, -2, 0, -22.0, 0.0, 0.0, 0.0 },
92 { 0, 2, 0, 0, 0, 17.0, -0.1, 0.0, 0.0 },
93 { 0, 1, 0, 0, 1, -15.0, 0.0, 9.0, 0.0 },
94 { 0, 2, 2, -2, 2, -16.0, 0.1, 7.0, 0.0 },
95 { 0, -1, 0, 0, 1, -12.0, 0.0, 6.0, 0.0 },
96 { -2, 0, 0, 2, 1, -6.0, 0.0, 3.0, 0.0 },
97
98 /* 21-30 */
99 { 0, -1, 2, -2, 1, -5.0, 0.0, 3.0, 0.0 },
100 { 2, 0, 0, -2, 1, 4.0, 0.0, -2.0, 0.0 },
101 { 0, 1, 2, -2, 1, 4.0, 0.0, -2.0, 0.0 },
102 { 1, 0, 0, -1, 0, -4.0, 0.0, 0.0, 0.0 },
103 { 2, 1, 0, -2, 0, 1.0, 0.0, 0.0, 0.0 },
104 { 0, 0, -2, 2, 1, 1.0, 0.0, 0.0, 0.0 },
105 { 0, 1, -2, 2, 0, -1.0, 0.0, 0.0, 0.0 },
106 { 0, 1, 0, 0, 2, 1.0, 0.0, 0.0, 0.0 },
107 { -1, 0, 0, 1, 1, 1.0, 0.0, 0.0, 0.0 },
108 { 0, 1, 2, -2, 0, -1.0, 0.0, 0.0, 0.0 },
109
110 /* 31-40 */
111 { 0, 0, 2, 0, 2, -2274.0, -0.2, 977.0, -0.5 },
112 { 1, 0, 0, 0, 0, 712.0, 0.1, -7.0, 0.0 },
113 { 0, 0, 2, 0, 1, -386.0, -0.4, 200.0, 0.0 },
114 { 1, 0, 2, 0, 2, -301.0, 0.0, 129.0, -0.1 },
115 { 1, 0, 0, -2, 0, -158.0, 0.0, -1.0, 0.0 },
116 { -1, 0, 2, 0, 2, 123.0, 0.0, -53.0, 0.0 },
117 { 0, 0, 0, 2, 0, 63.0, 0.0, -2.0, 0.0 },
118 { 1, 0, 0, 0, 1, 63.0, 0.1, -33.0, 0.0 },
119 { -1, 0, 0, 0, 1, -58.0, -0.1, 32.0, 0.0 },
120 { -1, 0, 2, 2, 2, -59.0, 0.0, 26.0, 0.0 },
121
122 /* 41-50 */
123 { 1, 0, 2, 0, 1, -51.0, 0.0, 27.0, 0.0 },
124 { 0, 0, 2, 2, 2, -38.0, 0.0, 16.0, 0.0 },
125 { 2, 0, 0, 0, 0, 29.0, 0.0, -1.0, 0.0 },
126 { 1, 0, 2, -2, 2, 29.0, 0.0, -12.0, 0.0 },
127 { 2, 0, 2, 0, 2, -31.0, 0.0, 13.0, 0.0 },
128 { 0, 0, 2, 0, 0, 26.0, 0.0, -1.0, 0.0 },
129 { -1, 0, 2, 0, 1, 21.0, 0.0, -10.0, 0.0 },
130 { -1, 0, 0, 2, 1, 16.0, 0.0, -8.0, 0.0 },
131 { 1, 0, 0, -2, 1, -13.0, 0.0, 7.0, 0.0 },
132 { -1, 0, 2, 2, 1, -10.0, 0.0, 5.0, 0.0 },
133
134 /* 51-60 */
135 { 1, 1, 0, -2, 0, -7.0, 0.0, 0.0, 0.0 },
136 { 0, 1, 2, 0, 2, 7.0, 0.0, -3.0, 0.0 },
137 { 0, -1, 2, 0, 2, -7.0, 0.0, 3.0, 0.0 },
138 { 1, 0, 2, 2, 2, -8.0, 0.0, 3.0, 0.0 },
139 { 1, 0, 0, 2, 0, 6.0, 0.0, 0.0, 0.0 },
140 { 2, 0, 2, -2, 2, 6.0, 0.0, -3.0, 0.0 },
141 { 0, 0, 0, 2, 1, -6.0, 0.0, 3.0, 0.0 },
142 { 0, 0, 2, 2, 1, -7.0, 0.0, 3.0, 0.0 },
143 { 1, 0, 2, -2, 1, 6.0, 0.0, -3.0, 0.0 },
144 { 0, 0, 0, -2, 1, -5.0, 0.0, 3.0, 0.0 },
145
146 /* 61-70 */
147 { 1, -1, 0, 0, 0, 5.0, 0.0, 0.0, 0.0 },
148 { 2, 0, 2, 0, 1, -5.0, 0.0, 3.0, 0.0 },
149 { 0, 1, 0, -2, 0, -4.0, 0.0, 0.0, 0.0 },
150 { 1, 0, -2, 0, 0, 4.0, 0.0, 0.0, 0.0 },
151 { 0, 0, 0, 1, 0, -4.0, 0.0, 0.0, 0.0 },
152 { 1, 1, 0, 0, 0, -3.0, 0.0, 0.0, 0.0 },
153 { 1, 0, 2, 0, 0, 3.0, 0.0, 0.0, 0.0 },
154 { 1, -1, 2, 0, 2, -3.0, 0.0, 1.0, 0.0 },
155 { -1, -1, 2, 2, 2, -3.0, 0.0, 1.0, 0.0 },
156 { -2, 0, 0, 0, 1, -2.0, 0.0, 1.0, 0.0 },
157
158 /* 71-80 */
159 { 3, 0, 2, 0, 2, -3.0, 0.0, 1.0, 0.0 },
160 { 0, -1, 2, 2, 2, -3.0, 0.0, 1.0, 0.0 },
161 { 1, 1, 2, 0, 2, 2.0, 0.0, -1.0, 0.0 },
162 { -1, 0, 2, -2, 1, -2.0, 0.0, 1.0, 0.0 },
163 { 2, 0, 0, 0, 1, 2.0, 0.0, -1.0, 0.0 },
164 { 1, 0, 0, 0, 2, -2.0, 0.0, 1.0, 0.0 },
165 { 3, 0, 0, 0, 0, 2.0, 0.0, 0.0, 0.0 },
166 { 0, 0, 2, 1, 2, 2.0, 0.0, -1.0, 0.0 },
167 { -1, 0, 0, 0, 2, 1.0, 0.0, -1.0, 0.0 },
168 { 1, 0, 0, -4, 0, -1.0, 0.0, 0.0, 0.0 },
169
170 /* 81-90 */
171 { -2, 0, 2, 2, 2, 1.0, 0.0, -1.0, 0.0 },
172 { -1, 0, 2, 4, 2, -2.0, 0.0, 1.0, 0.0 },
173 { 2, 0, 0, -4, 0, -1.0, 0.0, 0.0, 0.0 },
174 { 1, 1, 2, -2, 2, 1.0, 0.0, -1.0, 0.0 },
175 { 1, 0, 2, 2, 1, -1.0, 0.0, 1.0, 0.0 },
176 { -2, 0, 2, 4, 2, -1.0, 0.0, 1.0, 0.0 },
177 { -1, 0, 4, 0, 2, 1.0, 0.0, 0.0, 0.0 },
178 { 1, -1, 0, -2, 0, 1.0, 0.0, 0.0, 0.0 },
179 { 2, 0, 2, -2, 1, 1.0, 0.0, -1.0, 0.0 },
180 { 2, 0, 2, 2, 2, -1.0, 0.0, 0.0, 0.0 },
181
182 /* 91-100 */
183 { 1, 0, 0, 2, 1, -1.0, 0.0, 0.0, 0.0 },
184 { 0, 0, 4, -2, 2, 1.0, 0.0, 0.0, 0.0 },
185 { 3, 0, 2, -2, 2, 1.0, 0.0, 0.0, 0.0 },
186 { 1, 0, 2, -2, 0, -1.0, 0.0, 0.0, 0.0 },
187 { 0, 1, 2, 0, 1, 1.0, 0.0, 0.0, 0.0 },
188 { -1, -1, 0, 2, 1, 1.0, 0.0, 0.0, 0.0 },
189 { 0, 0, -2, 0, 1, -1.0, 0.0, 0.0, 0.0 },
190 { 0, 0, 2, -1, 2, -1.0, 0.0, 0.0, 0.0 },
191 { 0, 1, 0, 2, 0, -1.0, 0.0, 0.0, 0.0 },
192 { 1, 0, -2, -2, 0, -1.0, 0.0, 0.0, 0.0 },
193
194 /* 101-106 */
195 { 0, -1, 2, 0, 1, -1.0, 0.0, 0.0, 0.0 },
196 { 1, 1, 0, -2, 1, -1.0, 0.0, 0.0, 0.0 },
197 { 1, 0, -2, 2, 0, -1.0, 0.0, 0.0, 0.0 },
198 { 2, 0, 0, 2, 0, 1.0, 0.0, 0.0, 0.0 },
199 { 0, 0, 2, 4, 2, -1.0, 0.0, 0.0, 0.0 },
200 { 0, 1, 0, 1, 0, 1.0, 0.0, 0.0, 0.0 }
201 };
202
203/* Number of terms in the series */
204 const int NT = (int) (sizeof x / sizeof x[0]);
205
206/*--------------------------------------------------------------------*/
207
208/* Interval between fundamental epoch J2000.0 and given date (JC). */
209 t = ((date1 - ERFA_DJ00) + date2) / ERFA_DJC;
210
211/* --------------------- */
212/* Fundamental arguments */
213/* --------------------- */
214
215/* Mean longitude of Moon minus mean longitude of Moon's perigee. */
216 el = eraAnpm(
217 (485866.733 + (715922.633 + (31.310 + 0.064 * t) * t) * t)
218 * ERFA_DAS2R + fmod(1325.0 * t, 1.0) * ERFA_D2PI);
219
220/* Mean longitude of Sun minus mean longitude of Sun's perigee. */
221 elp = eraAnpm(
222 (1287099.804 + (1292581.224 + (-0.577 - 0.012 * t) * t) * t)
223 * ERFA_DAS2R + fmod(99.0 * t, 1.0) * ERFA_D2PI);
224
225/* Mean longitude of Moon minus mean longitude of Moon's node. */
226 f = eraAnpm(
227 (335778.877 + (295263.137 + (-13.257 + 0.011 * t) * t) * t)
228 * ERFA_DAS2R + fmod(1342.0 * t, 1.0) * ERFA_D2PI);
229
230/* Mean elongation of Moon from Sun. */
231 d = eraAnpm(
232 (1072261.307 + (1105601.328 + (-6.891 + 0.019 * t) * t) * t)
233 * ERFA_DAS2R + fmod(1236.0 * t, 1.0) * ERFA_D2PI);
234
235/* Longitude of the mean ascending node of the lunar orbit on the */
236/* ecliptic, measured from the mean equinox of date. */
237 om = eraAnpm(
238 (450160.280 + (-482890.539 + (7.455 + 0.008 * t) * t) * t)
239 * ERFA_DAS2R + fmod(-5.0 * t, 1.0) * ERFA_D2PI);
240
241/* --------------- */
242/* Nutation series */
243/* --------------- */
244
245/* Initialize nutation components. */
246 dp = 0.0;
247 de = 0.0;
248
249/* Sum the nutation terms, ending with the biggest. */
250 for (j = NT-1; j >= 0; j--) {
251
252 /* Form argument for current term. */
253 arg = (double)x[j].nl * el
254 + (double)x[j].nlp * elp
255 + (double)x[j].nf * f
256 + (double)x[j].nd * d
257 + (double)x[j].nom * om;
258
259 /* Accumulate current nutation term. */
260 s = x[j].sp + x[j].spt * t;
261 c = x[j].ce + x[j].cet * t;
262 if (s != 0.0) dp += s * sin(arg);
263 if (c != 0.0) de += c * cos(arg);
264 }
265
266/* Convert results from 0.1 mas units to radians. */
267 *dpsi = dp * U2R;
268 *deps = de * U2R;
269
270 return;
271
272}
273/*----------------------------------------------------------------------
274**
275**
276** Copyright (C) 2013-2017, NumFOCUS Foundation.
277** All rights reserved.
278**
279** This library is derived, with permission, from the International
280** Astronomical Union's "Standards of Fundamental Astronomy" library,
281** available from http://www.iausofa.org.
282**
283** The ERFA version is intended to retain identical functionality to
284** the SOFA library, but made distinct through different function and
285** file names, as set out in the SOFA license conditions. The SOFA
286** original has a role as a reference standard for the IAU and IERS,
287** and consequently redistribution is permitted only in its unaltered
288** state. The ERFA version is not subject to this restriction and
289** therefore can be included in distributions which do not support the
290** concept of "read only" software.
291**
292** Although the intent is to replicate the SOFA API (other than
293** replacement of prefix names) and results (with the exception of
294** bugs; any that are discovered will be fixed), SOFA is not
295** responsible for any errors found in this version of the library.
296**
297** If you wish to acknowledge the SOFA heritage, please acknowledge
298** that you are using a library derived from SOFA, rather than SOFA
299** itself.
300**
301**
302** TERMS AND CONDITIONS
303**
304** Redistribution and use in source and binary forms, with or without
305** modification, are permitted provided that the following conditions
306** are met:
307**
308** 1 Redistributions of source code must retain the above copyright
309** notice, this list of conditions and the following disclaimer.
310**
311** 2 Redistributions in binary form must reproduce the above copyright
312** notice, this list of conditions and the following disclaimer in
313** the documentation and/or other materials provided with the
314** distribution.
315**
316** 3 Neither the name of the Standards Of Fundamental Astronomy Board,
317** the International Astronomical Union nor the names of its
318** contributors may be used to endorse or promote products derived
319** from this software without specific prior written permission.
320**
321** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
322** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
323** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
324** FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
325** COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
326** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
327** BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
328** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
329** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
330** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
331** ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
332** POSSIBILITY OF SUCH DAMAGE.
333**
334*/
Note: See TracBrowser for help on using the repository browser.