hprnutang.pro
32.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
;+
; NAME:
; HPRNUTANG
;
; AUTHOR:
; Craig B. Markwardt, NASA/GSFC Code 662, Greenbelt, MD 20770
; craigm@lheamail.gsfc.nasa.gov
; UPDATED VERSIONs can be found on my WEB PAGE:
; http://cow.physics.wisc.edu/~craigm/idl/idl.html
;
; PURPOSE:
; Compute high precision earth precession, nutation and orientation angles
;
; MAJOR TOPICS:
; Geometry
;
; CALLING SEQUENCE:
; HPRNUTANG, JDTT, ZETA, THETA, Z, DPSI, DEPS, $
; POLAR_X=PMX, POLAR_Y=PMY, JD_UT1=JD_UT1, /USE_EOPDATA, $
; TBASE=, FIXED_EPOCH=, FIXED_BASE=, $
; /JPL, /NO_UT1, $
; MEAN_OBLIQUITY=EPS0, TRUE_OBLIQUITY=EPS, $
; GMS_TIME=GMST, GAS_TIME=GAST, EQ_EQUINOX=EQEQ
;
;
; DESCRIPTION:
;
; The procedure HPRNUTANG computes values of the earth
; orientation-related angles, including precession and nutation,
; which are used for high precision earth-based astronomy
; applications.
;
; It is the goal of this procedure to provide all angles relevant in
; determining the position of an earth station, as measured in an
; earth-fixed coordinate system, and converting to space-fixed
; coordinates. This is useful in applications where observations by
; a station in the earth-fixed frame are taken of an astrophysical
; object which is in the non-rotating space-fixed frame.
;
; This routine potentially depends on the following external
; procedures, which also themselves depend on external data files:
;
; EOPDATA - estimates Earth orientation parameters (if
; USE_EOPDATA keyword is set), depends on earth
; orientation data file.
; TAI_UTC - computes time difference TAI - UTC (leap seconds),
; depends on leap seconds file.
;
; This interface is somewhat provisional. See OPEN QUESTIONS below.
;
; The user requests the quantities for a particular set of epoch
; times, as measured in Julian days, in the system of Terrestrial
; Dynamical Time ( = TDT = TT ).
;
; HPRNUTANG returns several quantities. It is not possible to
; describe each of these quantities in full detail in this
; documentation. The user is referred to the Explanatory Supplement
; to the Astronomical Almanac (Sec 3.2) for more complete
; descriptions. The quantities are:
;
; * ZETA, THETA, Z, which are euler angles representing the
; precession of the mean celestial ephemeris pole with respect to
; the space-fixed coordinate system defined by the FIXED epoch.
; For a vector R_MEAN_OFDATE, whose space-fixed coordinates are
; referred to the mean pole of date, the transformation to
; space-fixed coordinates referred to the mean pole of the fixed
; epoch is:
;
; R_FIXED = qtvrot(R_MEAN_OFDATE, $
; qteuler(['z','y','z'], -zeta, +theta, -z))
;
; By default the "fixed" epoch is J2000.0. [ See below for
; definitions of QTVROT and QTEULER. ]
;
; * DPSI, DEPS, which are the angles representing the nutation in
; longitude and obliquity of the true of-date celestial ephemeris
; pole with respect to the mean pole of date. For a vector
; R_TRUE_OFDATE, whose space-fixed coordinates are referred to
; the true pole of date, the transformation to space-fixed
; coordinates referred to the mean pole of date is:
;
; R_MEAN_OFDATE = qtvrot(R_TRUE_OFDATE, $
; qteuler(['x','z','x'], $
; +eps0, -dpsi, -eps0-deps)
;
; where EPS and EPS0 are defined below.
;
; * EPS0, which is the mean obliquity of the ecliptic plane,
; referred to the mean equator of date, at the requested epoch.
; For a vector, R_ECL_OFDATE, whose space-fixed coordinates are
; referred to the mean ecliptic and equinox of date, the
; transformation to space-fixed coordinates referred to the mean
; equator and equinox of date is:
;
; R_MEAN_OFDATE = qtvrot(R_ECL_OFDATE, $
; qteuler(['x'], eps0)
;
; * EPS, which is the true obliquity of the ecliptic plane,
; referred to the mean equator of date, at the requested epoch.
;
; * GMST, GAST, which are the mean and apparent Greenwich Sidereal
; Times at the requested epoch. For a vector R_TRUE_EARTHFIXED,
; whose earth-fixed coordinates are referred to the true pole of
; date, the transformation to space-fixed coordinates referred to
; the true pole of date are:
;
; R_TRUE_OFDATE = qtvrot(R_TRUE_EARTHFIXED, $
; qteuler(['z'], +gast))
;
; * EQEQ, the equation of the equinoxes at the requested epoch.
; This quantity may be more commonly known as the "precession of
; the equinox."
;
; * PMX, PMY, the coordinates of the celestial ephemeris pole as
; measured in the earth-fixed coordinate system (set to zero if
; the USE_EOPDATA keyword is not set). For a vector
; R_MEAN_EARTHFIXED, whose earth-fixed coordinates are referred
; to the International Reference Pole, the transformation to
; earth-fixed coordinates referred to the true pole of date are:
;
; R_TRUE_EARTHFIXED = qtvrot(R_MEAN_EARTHFIXED, $
; qteuler(['x','y'], -pmy, -pmx))
;
; The vector R_MEAN_EARTHFIXED, could be for example, the
; cartesian coordinates of a station on the earth, as determined
; from its geodetic/geocentric latitude and longitude.
;
; * JD_UT1, the UT1 time (expressed in Julian days) (set to UTC if
; the USE_EOPDATA keyword is not set or if NO_UT1 is set).
;
; Users may select different techniques to compute some of these
; quantities. See keywords JPL and USE_EOPDATA.
;
;
; OPEN QUESTIONS
;
; How will the transition to a new IERS EOP series be accomplished?
; Using a keyword? How can users select different nutation series?
; How can users select different fundamental arguments for the
; planets.
;
;
; VERIFICATION
;
; The precession and nutation quantities were compared against those
; produced by the SLALIB telescope pointing library.
;
; For the epoch JD 2450449 (TT), the precession quantities of
; HPRNUTANG agree numerically with SLALIB SLA_PREC to within 0.1
; microarcseconds, and the nutation quantities agree SLALIB SLA_NUTC
; to within 6 microarcseconds (and 54 microarcseconds in the mean
; obliquity). The GMST values agree with SLALIB SLA_GMSTA to better
; than 1 nanosecond. Of course this says nothing about the accuracy
; of the IAU 1976/1980 precession and nutation models with respect
; to the true precession and nutations.
;
; The precession and nutation quantities computed in this procedure
; -- ZETA, THETA, Z, DPSI and DEPS -- were also used to compute the
; space-fixed coordinates of the Goldstone DSS-63 deep space network
; tracking station. These values were compared against values
; produced by JPL Horizons ephemeris generator. Agreement was found
; at the 60 cm level. Accuracy at that level is probably limited by
; the JPL DE406 earth ephemeris used by Horizons.
;
; Polar motion values were estimated at the same epoch using
; EOPDATA, and applied to three orthogonal unit vectors. The above
; quaternion transformation produces the same coordinate values,
; when compared against SLALIB_POLMO.
;
;
; QTEULER and QTVROT
;
; The functions QTEULER and QTVROT are functions from the Markwardt
; quaternion library. QTEULER composes a chain of Euler-like
; rotations into a single quaternion. QTVROT applies a quaternion
; rotation to a 3-vector.
;
; The user need not use these functions. Any function which
; constructs a set of Euler-like rotations, and then applies them to
; 3-vectors will work fine.
;
;
; INPUTS:
;
; JDTT - a vector or scalar, the TT epoch time(s) for which high
; precision values are to be computed.
;
; For reference, JDTT = JDTAI + 32.184/86400d, where JDTAI is
; the international atomic time measured in days. The value
; of the keyword TBASE is added to JDTT to arrive at the
; actual Julian date.
;
; OUTPUTS:
;
; ZETA, THETA, Z - Euler angles of precession of the mean celestial
; ephemeris pole, expressed in ANGUNITS units.
;
; DPSI, DEPS - the nutation angles in longitude and obliquity of the
; true pole with respect to the mean pole, expressed in
; ANGUNITS units. By default the values are based on
; the IAU 1980 theory of nutation. The user can select
; JPL to interpolate the JPL nutation ephemerides.
;
; When USE_EOPDATA is set, the nutation angles are
; augmented by the offset correction terms supplied in
; the EOP file.
;
; KEYWORD PARAMETERS:
;
; TBASE - scalar or vector, a fixed epoch time (Julian days) to be
; added to each value of JDTT. Since subtraction of large
; numbers occurs with TBASE first, the greatest precision is
; achieved when TBASE is expressed as a nearby julian epoch,
; JDTT is expressed as a small offset from the fixed epoch.
; Default: 0
;
; FIXED_EPOCH - a scalar or vector number, the fixed epoch (in TT
; Julian Days) against which the precession angles of
; the mean pole are referred.
; Default: JD 2451545.0 TT ( = J2000.0 )
;
; FIXED_BASE - scalar or vector, a fixed epoch time to be added to
; FIXED_EPOCH, in much the same way that TBASE is added
; to JDTT. Default: 0
;
; POLAR_X, POLAR_Y - upon return, the quantities PMX and PMY, in
; ANGUNITS units, if USE_EOPDATA is set. If
; USE_EOPDATA is not set then zero is returned
; for both PMX and PMY.
;
; JD_UT1 - upon return, the time in the UT1 system at the requested
; epoch, if the USE_EOPDATA keyword is set. If the
; USE_EOPDATA keyword is not set, or if NO_UT1 is set, then
; the time in UTC is returned (which is guaranteed to be
; within +/- 0.9 seconds of UT1).
;
; MEAN_OBLIQUITY - upon return, the quantity EPS0, in ANGUNITS
; units.
;
; TRUE_OBLIQUITY - upon return, the quantity EPS, in ANGUNITS units.
;
; GMS_TIME - upon return, the quantity GMST in radians.
;
; GAS_TIME - upon return, the quantity GAST in radians.
;
; EQ_EQUINOX - upon return, the quantity EQEQ in ANGUNITS units.
;
; ANGUNITS - scalar string, output units of angular parameters.
; Possible values are 'ARCSEC' or 'RADIAN'.
; Default value: 'RADIAN'
;
; JPL - a scalar integer or string. If JPL is defined, then the routine
; attempts to use the JPL nutation ephemeris to determine the
; nutation angle quantities. If JPL is a scalar string, then
; it is interpreted as the FITS file name to use (see
; JPLEPHREAD). If JPL=1, the JPL ephemeris FITS file must be
; present in
; $ASTRO_DATA/JPLEPH.405
; where ASTRO_DATA is the standard environment variable for
; data used by the IDL Astronomy Library.
; Default: not set (i.e. do not use JPL ephemeris nutation quantities)
;
; NO_UT1 - if set, then do not compute UT1, but use UTC instead.
;
; USE_EOPDATA - if set, use the EOPDATA procedure to determine earth
; orientation parameters at the requested epoch.
; These include polar motion values, corrections to
; the 1980 IAU nutation theory, and the UT1
; correction.
;
;
; EXAMPLE:
;
; Need an example converting topocentric to/from J2000.0
;
; Need an example converting station position earth-fixed
; coordinates to/from space-fixed coordinates.
;
;
;
; SEE ALSO:
;
; HPRNUTANG, TAI_UTC (Markwardt Library)
; PRECESS, NUTATE, PREMAT, JPRECESS, BPRECESS (IDL Astronomy Library)
;
;
; REFERENCES:
;
; Aoki, S., Guinot, B., Kaplan, G.H., Kinoshita, H., McCarthy, D.D.,
; Seidelmann, P.K., 1982: Astron. Astrophys., 105, 359-361.
;
; HORIZONS, JPL Web-based ephemeris calculator (Ephemeris DE406)
; http://ssd.jpl.nasa.gov/horizons.html
;
; McCarthy, D. D. (ed.) 1996: IERS Conventions, IERS T.N. 21.
; http://maia.usno.navy.mil/conventions.html
;
; Seidelmann, P.K. 1992, *Explanatory Supplement to the Astronomical
; Almanac*, ISBN 0-935702-68-7
;
;
; MODIFICATION HISTORY:
; Written, 30 Jan 2002, CM
; Documented, 15 Feb 2002, CM
; Added docs about ecliptic; added default of 'RADIAN' to code; 01
; Mar 2002, CM
; Corrected equation of equinoxes (had DPSI*COS(EPS0), when it
; should be DPSI*COS(EPS)), 01 Mar 2002, CM
; Added default message, 04 Mar 2002, CM
; Added more logic to detect JPL ephemeris file, 17 Mar 2002, CM
; Corrected discussion of geodetic coordinates, 26 May 2002, CM
; Documentation tweaks, 05 Jan 2004, CM
; Some modifications to conserve memory, 22 Dec 2008, CM
; Allow TBASE/FBASE to be a vector, 01 Jan 2009, CM
; Documentation of the JPL parameter, 02 Dec 2009, CM
;
; $Id: hprnutang.pro,v 1.18 2013/07/18 03:29:44 cmarkwar Exp $
;
;-
; Copyright (C) 2002, 2004, 2008, 2009, Craig Markwardt
; This software is provided as is without any warranty whatsoever.
; Permission to use, copy, modify, and distribute modified or
; unmodified copies is granted, provided this copyright and disclaimer
; are included unchanged.
;-
pro hprnutang_init_iau1980, argfacts, psiamps, epsamps
; IAU 1980 Nutation Model
; * taken from http://hpiers.obspm.fr/eop-pc/models/nut_iau1980
iau_1980_nut_strs = [ $
; # Fortran format : (5I3,8X,6F10.1)
; # Delaunay Arg. period(days)
; # lm ls F D Om psisin t sin eps cos t cos
; 0 . 10 . 20 30 40 50 60
' 0 0 0 0 1 -6798.4 -171996.0 -174.2 92025.0 8.9 ', $
' 0 0 2 -2 2 182.6 -13187.0 -1.6 5736.0 -3.1 ', $
' 0 0 2 0 2 13.7 -2274.0 -0.2 977.0 -0.5 ', $
' 0 0 0 0 2 -3399.2 2062.0 0.2 -895.0 0.5 ', $
' 0 -1 0 0 0 -365.3 -1426.0 3.4 54.0 -0.1 ', $
' 1 0 0 0 0 27.6 712.0 0.1 -7.0 0.0 ', $
' 0 1 2 -2 2 121.7 -517.0 1.2 224.0 -0.6 ', $
' 0 0 2 0 1 13.6 -386.0 -0.4 200.0 0.0 ', $
' 1 0 2 0 2 9.1 -301.0 0.0 129.0 -0.1 ', $
' 0 -1 2 -2 2 365.2 217.0 -0.5 -95.0 0.3 ', $
' -1 0 0 2 0 31.8 158.0 0.0 -1.0 0.0 ', $
' 0 0 2 -2 1 177.8 129.0 0.1 -70.0 0.0 ', $
' -1 0 2 0 2 27.1 123.0 0.0 -53.0 0.0 ', $
' 1 0 0 0 1 27.7 63.0 0.1 -33.0 0.0 ', $
' 0 0 0 2 0 14.8 63.0 0.0 -2.0 0.0 ', $
' -1 0 2 2 2 9.6 -59.0 0.0 26.0 0.0 ', $
' -1 0 0 0 1 -27.4 -58.0 -0.1 32.0 0.0 ', $
' 1 0 2 0 1 9.1 -51.0 0.0 27.0 0.0 ', $
' -2 0 0 2 0 -205.9 -48.0 0.0 1.0 0.0 ', $
' -2 0 2 0 1 1305.5 46.0 0.0 -24.0 0.0 ', $
' 0 0 2 2 2 7.1 -38.0 0.0 16.0 0.0 ', $
' 2 0 2 0 2 6.9 -31.0 0.0 13.0 0.0 ', $
' 2 0 0 0 0 13.8 29.0 0.0 -1.0 0.0 ', $
' 1 0 2 -2 2 23.9 29.0 0.0 -12.0 0.0 ', $
' 0 0 2 0 0 13.6 26.0 0.0 -1.0 0.0 ', $
' 0 0 2 -2 0 173.3 -22.0 0.0 0.0 0.0 ', $
' -1 0 2 0 1 27.0 21.0 0.0 -10.0 0.0 ', $
' 0 2 0 0 0 182.6 17.0 -0.1 0.0 0.0 ', $
' 0 2 2 -2 2 91.3 -16.0 0.1 7.0 0.0 ', $
' -1 0 0 2 1 32.0 16.0 0.0 -8.0 0.0 ', $
' 0 1 0 0 1 386.0 -15.0 0.0 9.0 0.0 ', $
' 1 0 0 -2 1 -31.7 -13.0 0.0 7.0 0.0 ', $
' 0 -1 0 0 1 -346.6 -12.0 0.0 6.0 0.0 ', $
' 2 0 -2 0 0 -1095.2 11.0 0.0 0.0 0.0 ', $
' -1 0 2 2 1 9.5 -10.0 0.0 5.0 0.0 ' ]
iau_1980_nut_strs = [ iau_1980_nut_strs, $
' 1 0 2 2 2 5.6 -8.0 0.0 3.0 0.0 ', $
' 0 -1 2 0 2 14.2 -7.0 0.0 3.0 0.0 ', $
' 0 0 2 2 1 7.1 -7.0 0.0 3.0 0.0 ', $
' 1 1 0 -2 0 -34.8 -7.0 0.0 0.0 0.0 ', $
' 0 1 2 0 2 13.2 7.0 0.0 -3.0 0.0 ', $
' -2 0 0 2 1 -199.8 -6.0 0.0 3.0 0.0 ', $
' 0 0 0 2 1 14.8 -6.0 0.0 3.0 0.0 ', $
' 2 0 2 -2 2 12.8 6.0 0.0 -3.0 0.0 ', $
' 1 0 0 2 0 9.6 6.0 0.0 0.0 0.0 ', $
' 1 0 2 -2 1 23.9 6.0 0.0 -3.0 0.0 ', $
' 0 0 0 -2 1 -14.7 -5.0 0.0 3.0 0.0 ', $
' 0 -1 2 -2 1 346.6 -5.0 0.0 3.0 0.0 ', $
' 2 0 2 0 1 6.9 -5.0 0.0 3.0 0.0 ', $
' 1 -1 0 0 0 29.8 5.0 0.0 0.0 0.0 ', $
' 1 0 0 -1 0 411.8 -4.0 0.0 0.0 0.0 ', $
' 0 0 0 1 0 29.5 -4.0 0.0 0.0 0.0 ', $
' 0 1 0 -2 0 -15.4 -4.0 0.0 0.0 0.0 ', $
' 1 0 -2 0 0 -26.9 4.0 0.0 0.0 0.0 ', $
' 2 0 0 -2 1 212.3 4.0 0.0 -2.0 0.0 ', $
' 0 1 2 -2 1 119.6 4.0 0.0 -2.0 0.0 ', $
' 1 1 0 0 0 25.6 -3.0 0.0 0.0 0.0 ', $
' 1 -1 0 -1 0 -3232.9 -3.0 0.0 0.0 0.0 ', $
' -1 -1 2 2 2 9.8 -3.0 0.0 1.0 0.0 ', $
' 0 -1 2 2 2 7.2 -3.0 0.0 1.0 0.0 ', $
' 1 -1 2 0 2 9.4 -3.0 0.0 1.0 0.0 ', $
' 3 0 2 0 2 5.5 -3.0 0.0 1.0 0.0 ', $
' -2 0 2 0 2 1615.7 -3.0 0.0 1.0 0.0 ', $
' 1 0 2 0 0 9.1 3.0 0.0 0.0 0.0 ', $
' -1 0 2 4 2 5.8 -2.0 0.0 1.0 0.0 ', $
' 1 0 0 0 2 27.8 -2.0 0.0 1.0 0.0 ', $
' -1 0 2 -2 1 -32.6 -2.0 0.0 1.0 0.0 ', $
' 0 -2 2 -2 1 6786.3 -2.0 0.0 1.0 0.0 ', $
' -2 0 0 0 1 -13.7 -2.0 0.0 1.0 0.0 ', $
' 2 0 0 0 1 13.8 2.0 0.0 -1.0 0.0 ', $
' 3 0 0 0 0 9.2 2.0 0.0 0.0 0.0 ', $
' 1 1 2 0 2 8.9 2.0 0.0 -1.0 0.0 ', $
' 0 0 2 1 2 9.3 2.0 0.0 -1.0 0.0 ', $
' 1 0 0 2 1 9.6 -1.0 0.0 0.0 0.0 ', $
' 1 0 2 2 1 5.6 -1.0 0.0 1.0 0.0 ', $
' 1 1 0 -2 1 -34.7 -1.0 0.0 0.0 0.0 ', $
' 0 1 0 2 0 14.2 -1.0 0.0 0.0 0.0 ', $
' 0 1 2 -2 0 117.5 -1.0 0.0 0.0 0.0 ', $
' 0 1 -2 2 0 -329.8 -1.0 0.0 0.0 0.0 ', $
' 1 0 -2 2 0 23.8 -1.0 0.0 0.0 0.0 ', $
' 1 0 -2 -2 0 -9.5 -1.0 0.0 0.0 0.0 ', $
' 1 0 2 -2 0 32.8 -1.0 0.0 0.0 0.0 ', $
' 1 0 0 -4 0 -10.1 -1.0 0.0 0.0 0.0 ', $
' 2 0 0 -4 0 -15.9 -1.0 0.0 0.0 0.0 ', $
' 0 0 2 4 2 4.8 -1.0 0.0 0.0 0.0 ', $
' 0 0 2 -1 2 25.4 -1.0 0.0 0.0 0.0 ', $
' -2 0 2 4 2 7.3 -1.0 0.0 1.0 0.0 ', $
' 2 0 2 2 2 4.7 -1.0 0.0 0.0 0.0 ', $
' 0 -1 2 0 1 14.2 -1.0 0.0 0.0 0.0 ', $
' 0 0 -2 0 1 -13.6 -1.0 0.0 0.0 0.0 ', $
' 0 0 4 -2 2 12.7 1.0 0.0 0.0 0.0 ', $
' 0 1 0 0 2 409.2 1.0 0.0 0.0 0.0 ', $
' 1 1 2 -2 2 22.5 1.0 0.0 -1.0 0.0 ', $
' 3 0 2 -2 2 8.7 1.0 0.0 0.0 0.0 ', $
' -2 0 2 2 2 14.6 1.0 0.0 -1.0 0.0 ', $
' -1 0 0 0 2 -27.3 1.0 0.0 -1.0 0.0 ', $
' 0 0 -2 2 1 -169.0 1.0 0.0 0.0 0.0 ', $
' 0 1 2 0 1 13.1 1.0 0.0 0.0 0.0 ', $
' -1 0 4 0 2 9.1 1.0 0.0 0.0 0.0 ', $
' 2 1 0 -2 0 131.7 1.0 0.0 0.0 0.0 ', $
' 2 0 0 2 0 7.1 1.0 0.0 0.0 0.0 ', $
' 2 0 2 -2 1 12.8 1.0 0.0 -1.0 0.0 ', $
' 2 0 -2 0 1 -943.2 1.0 0.0 0.0 0.0 ', $
' 1 -1 0 -2 0 -29.3 1.0 0.0 0.0 0.0 ', $
' -1 0 0 1 1 -388.3 1.0 0.0 0.0 0.0 ', $
' -1 -1 0 2 1 35.0 1.0 0.0 0.0 0.0 ', $
' 0 1 0 1 0 27.3 1.0 0.0 0.0 0.0 ' ]
n80 = n_elements(iau_1980_nut_strs)
argfacts = fltarr(5,n80)
str = strmid(iau_1980_nut_strs,0,16)
reads, str, argfacts
argfacts = transpose(argfacts)
psiamps = dblarr(2,n80)
str = strmid(iau_1980_nut_strs,23,21)
reads, str, psiamps
psiamps = transpose(psiamps)
epsamps = fltarr(2,n80)
str = strmid(iau_1980_nut_strs,43,20)
reads, str, epsamps
epsamps = transpose(epsamps)
return
end
pro hprnutang_init_iau1980_args, args
;; c1 = mean anomaly of Moon
;; c2 = mean anomaly of Sun
;; c3 = mean longitude of the Moon minus the mean longitude of Moon's node
;; c4 = mean elongation of Moon from Sun
;; c5 = mean longitude of ascending node of the Moon
;; c6 = mean anomaly of Mercury
;; c7 = mean anomaly of Venus
;; c8 = mean anomaly of Earth
;; c9 = mean anomaly of Mars
;; ca = mean anomaly of Jupiter
;; cb = mean anomaly of Saturn
c1 = [134.96298139d*3600d, 1717915922.6330d, 31.310d, 0.064d]
c2 = [357.52772333d*3600d, 129596581.2240d, -0.577d, -0.012d]
c3 = [ 93.27191028d*3600d, 1739527263.1370d, -13.257d, 0.011d]
c4 = [297.85036306d*3600d, 1602961601.3280d, -6.891d, 0.019d]
c5 = [125.04452222d*3600d, -6962890.5390d, 7.455d, 0.008d]
c6 = [252.3d *3600d, 149472.7d, 0d, 0d ]
c7 = [179.9d *3600d, 58517.8d, 0d, 0d ]
c8 = [ 98.4d *3600d, 35999.4d, 0d, 0d ]
c9 = [353.3d *3600d, 19140.3d, 0d, 0d ]
ca = [ 32.3 *3600d, 3034.9d, 0d, 0d ]
cb = [ 48.0 *3600d, 1222.1d, 0d, 0d ]
args = [[c1],[c2],[c3],[c4],[c5],[c6],[c7],[c8],[c9],[ca],[cb]]
args = args * !dpi / 180d / 3600d
return
end
pro hprnutang_init_iau1996_args, args
;; c1 = mean anomaly of Moon
;; c2 = mean anomaly of Sun
;; c3 = mean longitude of the Moon minus the mean longitude of Moon's node
;; c4 = mean elongation of Moon from Sun
;; c5 = mean longitude of ascending node of the Moon
;; c6 = mean anomaly of Mercury
;; c7 = mean anomaly of Venus
;; c8 = mean anomaly of Earth
;; c9 = mean anomaly of Mars
;; ca = mean anomaly of Jupiter
;; cb = mean anomaly of Saturn
;; cc = accumulated general precession
c1= [134.96340251d*3600d, 1717915923.2178d, 31.8792d, 5.1635d-2, 2.4470d-4]
c2= [357.52910918d*3600d, 129596581.0481d, -0.5532d, 1.36d-4, -1.149d-5]
c3= [ 93.27209062d*3600d, 1739527262.8478d, -12.7512d, -1.037d-3, 4.17d-6]
c4= [297.85019547d*3600d, 1602961601.2090d, -6.3706d, 6.593d-3, -3.169d-5]
c5= [125.04455501d*3600d, -6962890.2665d, 7.4722d, 7.702d-3, -5.939d-5]
c6= [ 0d, 0d, 0d, 0d, 0d ]
c7= [181.979800853d*3600d, 58517.8156748d*3600d, 0d, 0d, 0d ]
c8= [100.466448494d*3600d, 35999.3728521d*3600d, 0d, 0d, 0d ]
c9= [355.433274605d*3600d, 19140.299314d *3600d, 0d, 0d, 0d ]
ca= [ 34.351483900d*3600d, 3034.90567464d*3600d, 0d, 0d, 0d ]
cb= [ 50.0774713998d*3600d, 1222.11379404d*3600d, 0d, 0d, 0d ]
cc= [ 0d, 1.39697137214d*3600d, 3.086d-4, 0d, 0d ]
args = [[c1],[c2],[c3],[c4],[c5],[c6],[c7],[c8],[c9],[ca],[cb],[cc]]
args = args * !dpi / 180d / 3600d
return
end
pro hprnutang, jdtt, zeta, theta, z, dpsi, deps, jpl=jpl, $
tbase=tbase0, polar_x=pmx, polar_y=pmy, $
fixed_epoch=fepoch0, fixed_base=fbase0, $
jd_ut1=jdut1, mean_obliquity=eps0, true_obliquity=eps, $
gms_time=gmst, gas_time=gast, eq_equinox=eqeq, $
use_eopdata=useeop, no_ut1=no_ut1, no_nutation=no_nut1
common hprnutang_iau80_coeffs, arg80, psi80, eps80
common hprnutang_iau80_args, farg80
common hprnutang_iau96_args, farg96
if n_params() EQ 0 then begin
message, 'USAGE:', /info
message, 'HPRNUTANG, JDTT, ZETA, THETA, Z, DPSI, DEPS, '+ $
'[ TBASE=, /JPL, /USE_EOPDATA, /NO_UT1, FIXED_EPOCH=, FIXED_BASE=, '+ $
'POLAR_X=, POLAR_Y=, JD_UT1=, MEAN_OBLIQUITY=, TRUE_OBLIQUITY=, '+$
'GMS_TIME=, GAS_TIME=, EQ_EQUINOX= ]', /info
return
endif
if n_elements(arg80) EQ 0 then begin
hprnutang_init_iau1980, arg80, psi80, eps80 ;; IAU 1980 Nutation theory
hprnutang_init_iau1980_args, farg80 ;; Fund. args of 1980 theory
hprnutang_init_iau1996_args, farg96 ;; Fund. args of 1996 theory
endif
; if keyword_set(arg96) then farg = farg96 else farg = farg80
farg = farg80
;; Default angular units
if n_elements(angunits0) EQ 0 then $
angunits = 'RADIAN' $
else $
angunits = strtrim(strupcase(strcompress(angunits0(0))),2)
;; Default time bases
if n_elements(tbase0) EQ 0 then tbase = 0d $
else tbase = double(tbase0)
if n_elements(fbase0) EQ 0 then fbase = 0d $
else fbase = double(fbase0)
;; "Fixed" epoch, which is the epoch of equinox that coordinates are
;; precessed *to*, default 2000
if n_elements(tfixed0) EQ 0 then fepoch = 2451545.0D - fbase $
else fepoch = double(fepoch0(*))
;; Form epoch of date in centuries from J2000.0
t = (jdtt(*) + (tbase - 2451545.0d))/36525d
;; Angular conversion factors
TWOPI = 2d*!dpi
AS2R = !dpi/3600d/180d ;; 1 arcsec to radians
MAS2R = !dpi*0.0001d/3600d/180d ;; 0.1 milliarcsec to radians
;; Interpolate the JPL ephemerides of nutations if requested
if keyword_set(jpl) then begin
;; Markwardt-specific function
forward_function get_xtecal
sz = size(jpl)
if sz(sz(0)+1) EQ 7 then efile = strtrim(jpl(0),2) $
else efile = find_with_def('JPLEPH.405','ASTRO_DATA')
if efile EQ '' then begin
catch, catcherr
if catcherr EQ 0 then efile = get_xtecal()+'clock/JPLEPH.200'
catch, /cancel
if efile EQ '' then $
message, 'ERROR: could not find JPL ephemeris'
endif
jdlimits = [min(jdtt+tbase)-1, max(jdtt+tbase)+1]
jplephread, efile, info, raw, jdlimits, status=st, errmsg=ee
if st EQ 0 then message, ee
jplephinterp, info, raw, jdtt, dpsi, deps, $
object='NUTATIONS', tbase=tbase
goto, PRECESS_ANGLES
endif
;; Do this equation in chunks, in case of a large input time array
dpsi = t*0 & deps = dpsi
nt = n_elements(t)
ns = 1000L
if NOT keyword_set(nonut1) then for i = 0L, nt-1, ns do begin
;; Compute indices of input and output arrays
imax = (i+ns-1)<(nt-1)
ti = t(i:imax)
if n_elements(one) NE n_elements(ti) then $
one = ti*0 + 1
;; Compute the fundamental arguments: mean anom of Moon; mean anom
;; of Sun; long. of Moon minus long. of Moon's node; mean elongation
;; betw. Moon & Sun; mean long. of asc. node of Moon
;; ESAA Table 3.222.2
fundargs = [[poly(ti, farg(*,0))], [poly(ti, farg(*,1))], $
[poly(ti, farg(*,2))], [poly(ti, farg(*,3))], $
[poly(ti, farg(*,4))]] MOD TWOPI
;; ESAA Eqn 3.222-6 (lower equation)
arg = arg80 # transpose(temporary(fundargs))
;; IAU 1980 Nutation in longitude and obliquity (radians)
;; ESAA Eqn 3.222-6 (upper equations) and Table 3.222.1
dpsi(i:imax) = total( (psi80(*,0)#one + psi80(*,1)#ti) * sin(arg), 1)
deps(i:imax) = total( (eps80(*,0)#one + eps80(*,1)#ti) * cos(arg), 1)
arg = 0
endfor
;; Above quantities are in mas, convert to radians
dpsi = dpsi * MAS2R
deps = deps * MAS2R
PRECESS_ANGLES:
;; Precession from epoch of date to "fixed" epoch
;; ESAA Eqn 3.211-2
t0 = ((fbase-2451545d0) + fepoch) / 36525d0
td = ((tbase-fbase) + (jdtt(*)-fepoch)) / 36525d0
;; Arguments of ZETA, Z and THETA (part of ESAA Table 3.211.1)
;; Symbology note: ESAA's T is my t0; ESAA's t is my td
w1 = poly(t0, [2306.2181d, 1.39656d, -0.000139d])
w2 = poly(t0, [2004.3109d, -0.85330d, -0.000217d])
;; IAU 1976 Precession quantities (arcsec)
;; Remainder of ESAA Table 3.211.1
zeta = (w1 + (( 0.30188D0 - 0.000344D0 * t0 ) + 0.017998D0 * td ) * td )*td
z = (w1 + (( 1.09468D0 + 0.000066D0 * t0 ) + 0.018203D0 * td ) * td )*td
theta = (w2 + ((-0.42665D0 - 0.000217D0 * t0 ) - 0.041833D0 * td ) * td )*td
;; ABOVE QUANTITIES ARE IN ARCSEC!
w1 = 0 & w2 = 0 & td = 0 & t0 = 0 ;; Memory
;; Get earth orientation parameters, UT1-UTC
;; Convert TT to UT1
jdtai = jdtt(*) - 32.184d/86400d
jdutc = jdtai + tai_utc(jdtai + tbase, /invert)/86400d
;; Query the EOP database, or set the values to zero
if keyword_set(useeop) then begin
eopdata, jdutc, pmx, pmy, ut1_utc, dpsi1, deps1, tbase=tbase
;; Adjust the values of the nutation in longitude and obliquity
deps = deps + deps1
dpsi = dpsi + dpsi1
deps1 = 0 & dpsi1 = 0 ;; Memory
endif else begin
pmx = 0 & pmy = 0 & ut1_utc = 0
endelse
if keyword_set(no_ut1) then ut1_utc = 0
;; Mean obliquity of ecliptic at epoch of date (arcsec)
;; ESAA Eqn 3.222-1
eps0 = poly(t, [84381.448D0, -46.8150D0, -0.00059D0, +0.001813D0]) * AS2R
;; True obliquity of ecliptic at epoch of date
;; ESAA Eqn 3.222-2
eps = eps0 + deps
;; Greenwich Mean Sidereal Time
jdut1 = jdutc + ut1_utc/86400d
jdutc = 0 & jdtai = 0 & & ut1_utc = 0 ;; Memory
t1 = ((tbase-2451545D) + jdut1) / 36525d
;; ESAA Eqn 2.24-1
gmst1 = poly(t1, [24110.54841d, 8640184.812866d, 0.093104d, -6.2D-6])/86400d
gmst = (gmst1 MOD 1d) + (jdut1 MOD 1d) + (tbase MOD 1d) + 3.5d
gmst = TWOPI*( gmst MOD 1d )
t1 = 0 & gmst1 = 0 ;; Memory
;; Equation of the equinoxes - includes two terms depending on the
;; mean longitude of the ascending node of the moon.
;; ESAA Sec. 3.223 and (IERS Conventions 1996)
om = poly(t, farg(*,4)) MOD TWOPI
eqeq = dpsi * cos(eps) + AS2R * (2.64d-3*sin(om) + 6.3d-5*sin(2d*om))
om = 0 ;; Memory
;; Greenwich Apparent Sidereal Time
;; ESAA Sec. 3.223
gast = gmst + eqeq
;; Units conversions
case angunits of
'ARCSEC': begin
R2AS = 1d/AS2R ;; Radian to arcsec
dpsi = dpsi * R2AS
deps = deps * R2AS
eps = eps * R2AS
eps0 = eps0 * R2AS
eqeq = eqeq * R2AS
pmx = pmx * R2AS
pmy = pmy * R2AS
end
'RADIAN': begin ;; Arcsec to radians
zeta = zeta * AS2R
z = z * AS2R
theta= theta* AS2R
end
;; Also convert to degrees?
else: begin
message, 'ERROR: angular unit '+angunits+$
' was not recognized'
end
end
return
end