2931 lines
89 KiB
Go
2931 lines
89 KiB
Go
// Copyright 2022 HE Boliang
|
|
// All rights reserved.
|
|
|
|
package gofa
|
|
|
|
import (
|
|
"math"
|
|
"strings"
|
|
)
|
|
|
|
// SOFA Time Scale and Calendar Tools
|
|
|
|
// Time Scales (20)
|
|
|
|
/*
|
|
D2dtf Format 2-part JD for output
|
|
|
|
Format for output a 2-part Julian Date (or in the case of UTC a
|
|
quasi-JD form that includes special provision for leap seconds).
|
|
|
|
Given:
|
|
|
|
scale string time scale ID (Note 1)
|
|
ndp int resolution (Note 2)
|
|
d1,d2 float64 time as a 2-part Julian Date (Notes 3,4)
|
|
|
|
Returned:
|
|
|
|
iy,im,id int year, month, day in Gregorian calendar (Note 5)
|
|
ihmsf [4]int hours, minutes, seconds, fraction (Note 1)
|
|
|
|
Returned (function value):
|
|
|
|
int status: +1 = dubious year (Note 5)
|
|
0 = OK
|
|
-1 = unacceptable date (Note 6)
|
|
|
|
Notes:
|
|
|
|
1. scale identifies the time scale. Only the value "UTC" (in upper
|
|
case) is significant, and enables handling of leap seconds (see
|
|
Note 4).
|
|
|
|
2. ndp is the number of decimal places in the seconds field, and can
|
|
have negative as well as positive values, such as:
|
|
|
|
ndp resolution
|
|
-4 1 00 00
|
|
-3 0 10 00
|
|
-2 0 01 00
|
|
-1 0 00 10
|
|
0 0 00 01
|
|
1 0 00 00.1
|
|
2 0 00 00.01
|
|
3 0 00 00.001
|
|
|
|
The limits are platform dependent, but a safe range is -5 to +9.
|
|
|
|
3. d1+d2 is Julian Date, apportioned in any convenient way between
|
|
the two arguments, for example where d1 is the Julian Day Number
|
|
and d2 is the fraction of a day. In the case of UTC, where the
|
|
use of JD is problematical, special conventions apply: see the
|
|
next note.
|
|
|
|
4. JD cannot unambiguously represent UTC during a leap second unless
|
|
special measures are taken. The SOFA internal convention is that
|
|
the quasi-JD day represents UTC days whether the length is 86399,
|
|
86400 or 86401 SI seconds. In the 1960-1972 era there were
|
|
smaller jumps (in either direction) each time the linear UTC(TAI)
|
|
expression was changed, and these "mini-leaps" are also included
|
|
in the SOFA convention.
|
|
|
|
5. The warning status "dubious year" flags UTCs that predate the
|
|
introduction of the time scale or that are too far in the future
|
|
to be trusted. See Dat for further details.
|
|
|
|
6. For calendar conventions and limitations, see Cal2jd.
|
|
|
|
Called:
|
|
|
|
Jd2cal JD to Gregorian calendar
|
|
D2tf decompose days to hms
|
|
Dat delta(AT) = TAI-UTC
|
|
*/
|
|
func D2dtf(scale string, ndp int, d1, d2 float64, iy, im, id *int, ihmsf *[4]int) int {
|
|
var leap bool
|
|
var s byte
|
|
var iy1, im1, id1, js, iy2, im2, id2, i int
|
|
var ihmsf1 [4]int
|
|
var a1, b1, fd, dat0, dat12, w, dat24, dleap float64
|
|
|
|
/* The two-part JD. */
|
|
a1 = d1
|
|
b1 = d2
|
|
|
|
/* Provisional calendar date. */
|
|
js = Jd2cal(a1, b1, &iy1, &im1, &id1, &fd)
|
|
if js != 0 {
|
|
return -1
|
|
}
|
|
|
|
/* Is this a leap second day? */
|
|
leap = false
|
|
//if ( ! strcmp(scale,"UTC") ) {
|
|
if strings.Compare(scale, "UTC") == 0 {
|
|
/* TAI-UTC at 0h today. */
|
|
js = Dat(iy1, im1, id1, 0.0, &dat0)
|
|
if js < 0 {
|
|
return -1
|
|
}
|
|
|
|
/* TAI-UTC at 12h today (to detect drift). */
|
|
js = Dat(iy1, im1, id1, 0.5, &dat12)
|
|
if js < 0 {
|
|
return -1
|
|
}
|
|
|
|
/* TAI-UTC at 0h tomorrow (to detect jumps). */
|
|
js = Jd2cal(a1+1.5, b1-fd, &iy2, &im2, &id2, &w)
|
|
if js != 0 {
|
|
return -1
|
|
}
|
|
js = Dat(iy2, im2, id2, 0.0, &dat24)
|
|
if js < 0 {
|
|
return -1
|
|
}
|
|
|
|
/* Any sudden change in TAI-UTC (seconds). */
|
|
dleap = dat24 - (2.0*dat12 - dat0)
|
|
|
|
/* If leap second day, scale the fraction of a day into SI. */
|
|
// leap = (math.Abs(dleap) > 0.5)
|
|
|
|
// if math.Abs(dleap) > 0.5 {
|
|
// leap = 1
|
|
// }
|
|
leap = (math.Abs(dleap) > 0.5)
|
|
|
|
if leap {
|
|
fd += fd * dleap / DAYSEC
|
|
}
|
|
}
|
|
|
|
/* Provisional time of day. */
|
|
D2tf(ndp, fd, &s, &ihmsf1)
|
|
|
|
/* Has the (rounded) time gone past 24h? */
|
|
if ihmsf1[0] > 23 {
|
|
|
|
/* Yes. We probably need tomorrow's calendar date. */
|
|
js = Jd2cal(a1+1.5, b1-fd, &iy2, &im2, &id2, &w)
|
|
if js != 0 {
|
|
return -1
|
|
}
|
|
|
|
/* Is today a leap second day? */
|
|
if !leap {
|
|
|
|
/* No. Use 0h tomorrow. */
|
|
iy1 = iy2
|
|
im1 = im2
|
|
id1 = id2
|
|
ihmsf1[0] = 0
|
|
ihmsf1[1] = 0
|
|
ihmsf1[2] = 0
|
|
|
|
} else {
|
|
|
|
/* Yes. Are we past the leap second itself? */
|
|
if ihmsf1[2] > 0 {
|
|
|
|
/* Yes. Use tomorrow but allow for the leap second. */
|
|
iy1 = iy2
|
|
im1 = im2
|
|
id1 = id2
|
|
ihmsf1[0] = 0
|
|
ihmsf1[1] = 0
|
|
ihmsf1[2] = 0
|
|
|
|
} else {
|
|
/* No. Use 23 59 60... today. */
|
|
ihmsf1[0] = 23
|
|
ihmsf1[1] = 59
|
|
ihmsf1[2] = 60
|
|
}
|
|
|
|
/* If rounding to 10s or coarser always go up to new day. */
|
|
if ndp < 0 && ihmsf1[2] == 60 {
|
|
iy1 = iy2
|
|
im1 = im2
|
|
id1 = id2
|
|
ihmsf1[0] = 0
|
|
ihmsf1[1] = 0
|
|
ihmsf1[2] = 0
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Results. */
|
|
*iy = iy1
|
|
*im = im1
|
|
*id = id1
|
|
for i = 0; i < 4; i++ {
|
|
ihmsf[i] = ihmsf1[i]
|
|
}
|
|
|
|
/* Status. */
|
|
return js
|
|
}
|
|
|
|
/*
|
|
Dtf2d Encode time and date fields into 2-part JD
|
|
|
|
Encode date and time fields into 2-part Julian Date (or in the case
|
|
of UTC a quasi-JD form that includes special provision for leap
|
|
seconds).
|
|
|
|
Given:
|
|
|
|
scale string time scale ID (Note 1)
|
|
iy,im,id int year, month, day in Gregorian calendar (Note 2)
|
|
ihr,imn int hour, minute
|
|
sec float64 seconds
|
|
|
|
Returned:
|
|
|
|
d1,d2 float64 2-part Julian Date (Notes 3,4)
|
|
|
|
Returned (function value):
|
|
|
|
int status: +3 = both of next two
|
|
+2 = time is after end of day (Note 5)
|
|
+1 = dubious year (Note 6)
|
|
0 = OK
|
|
-1 = bad year
|
|
-2 = bad month
|
|
-3 = bad day
|
|
-4 = bad hour
|
|
-5 = bad minute
|
|
-6 = bad second (<0)
|
|
|
|
Notes:
|
|
|
|
1. scale identifies the time scale. Only the value "UTC" (in upper
|
|
case) is significant, and enables handling of leap seconds (see
|
|
Note 4).
|
|
|
|
2. For calendar conventions and limitations, see Cal2jd.
|
|
|
|
3. The sum of the results, d1+d2, is Julian Date, where normally d1
|
|
is the Julian Day Number and d2 is the fraction of a day. In the
|
|
case of UTC, where the use of JD is problematical, special
|
|
conventions apply: see the next note.
|
|
|
|
4. JD cannot unambiguously represent UTC during a leap second unless
|
|
special measures are taken. The SOFA internal convention is that
|
|
the quasi-JD day represents UTC days whether the length is 86399,
|
|
86400 or 86401 SI seconds. In the 1960-1972 era there were
|
|
smaller jumps (in either direction) each time the linear UTC(TAI)
|
|
expression was changed, and these "mini-leaps" are also included
|
|
in the SOFA convention.
|
|
|
|
5. The warning status "time is after end of day" usually means that
|
|
the sec argument is greater than 60.0. However, in a day ending
|
|
in a leap second the limit changes to 61.0 (or 59.0 in the case
|
|
of a negative leap second).
|
|
|
|
6. The warning status "dubious year" flags UTCs that predate the
|
|
introduction of the time scale or that are too far in the future
|
|
to be trusted. See Dat for further details.
|
|
|
|
7. Only in the case of continuous and regular time scales (TAI, TT,
|
|
TCG, TCB and TDB) is the result d1+d2 a Julian Date, strictly
|
|
speaking. In the other cases (UT1 and UTC) the result must be
|
|
used with circumspection; in particular the difference between
|
|
two such results cannot be interpreted as a precise time
|
|
interval.
|
|
|
|
Called:
|
|
|
|
Cal2jd Gregorian calendar to JD
|
|
Dat delta(AT) = TAI-UTC
|
|
Jd2cal JD to Gregorian calendar
|
|
*/
|
|
func Dtf2d(scale string, iy, im, id, ihr, imn int, sec float64, d1, d2 *float64) int {
|
|
var js, iy2, im2, id2 int
|
|
var dj, w, day, seclim, dat0, dat12, dat24, dleap, time float64
|
|
|
|
/* Today's Julian Day Number. */
|
|
js = Cal2jd(iy, im, id, &dj, &w)
|
|
if js != 0 {
|
|
return js
|
|
}
|
|
dj += w
|
|
|
|
/* Day length and final minute length in seconds (provisional). */
|
|
day = DAYSEC
|
|
seclim = 60.0
|
|
|
|
/* Deal with the UTC leap second case. */
|
|
if strings.Compare(scale, "UTC") == 0 {
|
|
|
|
/* TAI-UTC at 0h today. */
|
|
js = Dat(iy, im, id, 0.0, &dat0)
|
|
if js < 0 {
|
|
return js
|
|
}
|
|
|
|
/* TAI-UTC at 12h today (to detect drift). */
|
|
js = Dat(iy, im, id, 0.5, &dat12)
|
|
if js < 0 {
|
|
return js
|
|
}
|
|
|
|
/* TAI-UTC at 0h tomorrow (to detect jumps). */
|
|
js = Jd2cal(dj, 1.5, &iy2, &im2, &id2, &w)
|
|
if js != 0 {
|
|
return js
|
|
}
|
|
js = Dat(iy2, im2, id2, 0.0, &dat24)
|
|
if js < 0 {
|
|
return js
|
|
}
|
|
|
|
/* Any sudden change in TAI-UTC between today and tomorrow. */
|
|
dleap = dat24 - (2.0*dat12 - dat0)
|
|
|
|
/* If leap second day, correct the day and final minute lengths. */
|
|
day += dleap
|
|
if ihr == 23 && imn == 59 {
|
|
seclim += dleap
|
|
}
|
|
|
|
/* End of UTC-specific actions. */
|
|
}
|
|
|
|
/* Validate the time. */
|
|
if ihr >= 0 && ihr <= 23 {
|
|
if imn >= 0 && imn <= 59 {
|
|
if sec >= 0 {
|
|
if sec >= seclim {
|
|
js += 2
|
|
}
|
|
} else {
|
|
js = -6
|
|
}
|
|
} else {
|
|
js = -5
|
|
}
|
|
} else {
|
|
js = -4
|
|
}
|
|
if js < 0 {
|
|
return js
|
|
}
|
|
|
|
/* The time in days. */
|
|
time = (60.0*(float64(60*ihr+imn)) + sec) / float64(day)
|
|
|
|
/* Return the date and time. */
|
|
*d1 = dj
|
|
*d2 = time
|
|
|
|
/* Status. */
|
|
return js
|
|
}
|
|
|
|
/*
|
|
Dat Delta(AT) (=TAI-UTC) for a given UTC date
|
|
|
|
For a given UTC date, calculate Delta(AT) = TAI-UTC.
|
|
|
|
:------------------------------------------:
|
|
: :
|
|
: IMPORTANT :
|
|
: :
|
|
: A new version of this function must be :
|
|
: produced whenever a new leap second is :
|
|
: announced. There are four items to :
|
|
: change on each such occasion: :
|
|
: :
|
|
: 1) A new line must be added to the set :
|
|
: of statements that initialize the :
|
|
: array "changes". :
|
|
: :
|
|
: 2) The constant IYV must be set to the :
|
|
: current year. :
|
|
: :
|
|
: 3) The "Latest leap second" comment :
|
|
: below must be set to the new leap :
|
|
: second date. :
|
|
: :
|
|
: 4) The "This revision" comment, later, :
|
|
: must be set to the current date. :
|
|
: :
|
|
: Change (2) must also be carried out :
|
|
: whenever the function is re-issued, :
|
|
: even if no leap seconds have been :
|
|
: added. :
|
|
: :
|
|
: Latest leap second: 2016 December 31 :
|
|
: :
|
|
:__________________________________________:
|
|
|
|
Given:
|
|
|
|
iy int UTC: year (Notes 1 and 2)
|
|
im int month (Note 2)
|
|
id int day (Notes 2 and 3)
|
|
fd float64 fraction of day (Note 4)
|
|
|
|
Returned:
|
|
|
|
deltat float64 TAI minus UTC, seconds
|
|
|
|
Returned (function value):
|
|
|
|
int status (Note 5):
|
|
1 = dubious year (Note 1)
|
|
0 = OK
|
|
-1 = bad year
|
|
-2 = bad month
|
|
-3 = bad day (Note 3)
|
|
-4 = bad fraction (Note 4)
|
|
-5 = internal error (Note 5)
|
|
|
|
Notes:
|
|
|
|
1. UTC began at 1960 January 1.0 (JD 2436934.5) and it is improper
|
|
to call the function with an earlier date. If this is attempted,
|
|
zero is returned together with a warning status.
|
|
|
|
Because leap seconds cannot, in principle, be predicted in
|
|
advance, a reliable check for dates beyond the valid range is
|
|
impossible. To guard against gross errors, a year five or more
|
|
after the release year of the present function (see the constant
|
|
IYV) is considered dubious. In this case a warning status is
|
|
returned but the result is computed in the normal way.
|
|
|
|
For both too-early and too-late years, the warning status is +1.
|
|
This is distinct from the error status -1, which signifies a year
|
|
so early that JD could not be computed.
|
|
|
|
2. If the specified date is for a day which ends with a leap second,
|
|
the TAI-UTC value returned is for the period leading up to the
|
|
leap second. If the date is for a day which begins as a leap
|
|
second ends, the TAI-UTC returned is for the period following the
|
|
leap second.
|
|
|
|
3. The day number must be in the normal calendar range, for example
|
|
1 through 30 for April. The "almanac" convention of allowing
|
|
such dates as January 0 and December 32 is not supported in this
|
|
function, in order to avoid confusion near leap seconds.
|
|
|
|
4. The fraction of day is used only for dates before the
|
|
introduction of leap seconds, the first of which occurred at the
|
|
end of 1971. It is tested for validity (0 to 1 is the valid
|
|
range) even if not used; if invalid, zero is used and status -4
|
|
is returned. For many applications, setting fd to zero is
|
|
acceptable; the resulting error is always less than 3 ms (and
|
|
occurs only pre-1972).
|
|
|
|
5. The status value returned in the case where there are multiple
|
|
errors refers to the first error detected. For example, if the
|
|
month and day are 13 and 32 respectively, status -2 (bad month)
|
|
will be returned. The "internal error" status refers to a
|
|
case that is impossible but causes some compilers to issue a
|
|
warning.
|
|
|
|
6. In cases where a valid result is not available, zero is returned.
|
|
|
|
References:
|
|
|
|
1. For dates from 1961 January 1 onwards, the expressions from the
|
|
file ftp://maia.usno.navy.mil/ser7/tai-utc.dat are used.
|
|
|
|
2. The 5ms timestep at 1961 January 1 is taken from 2.58.1 (p87) of
|
|
the 1992 Explanatory Supplement.
|
|
|
|
Called:
|
|
|
|
Cal2jd Gregorian calendar to JD
|
|
*/
|
|
func Dat(iy, im, id int, fd float64, deltat *float64) int {
|
|
/* Release year for this version of Dat */
|
|
const IYV = 2023
|
|
|
|
/* Reference dates (MJD) and drift rates (s/day), pre leap seconds */
|
|
drift := [...][2]float64{
|
|
{37300.0, 0.0012960},
|
|
{37300.0, 0.0012960},
|
|
{37300.0, 0.0012960},
|
|
{37665.0, 0.0011232},
|
|
{37665.0, 0.0011232},
|
|
{38761.0, 0.0012960},
|
|
{38761.0, 0.0012960},
|
|
{38761.0, 0.0012960},
|
|
{38761.0, 0.0012960},
|
|
{38761.0, 0.0012960},
|
|
{38761.0, 0.0012960},
|
|
{38761.0, 0.0012960},
|
|
{39126.0, 0.0025920},
|
|
{39126.0, 0.0025920},
|
|
}
|
|
|
|
/* Number of Delta(AT) expressions before leap seconds were introduced */
|
|
// enum { NERA1 = (int) (sizeof drift / sizeof (double) / 2) };
|
|
NERA1 := len(drift)
|
|
|
|
/* Dates and Delta(AT)s */
|
|
changes := [...]struct {
|
|
iyear int
|
|
month int
|
|
delat float64
|
|
}{
|
|
{1960, 1, 1.4178180},
|
|
{1961, 1, 1.4228180},
|
|
{1961, 8, 1.3728180},
|
|
{1962, 1, 1.8458580},
|
|
{1963, 11, 1.9458580},
|
|
{1964, 1, 3.2401300},
|
|
{1964, 4, 3.3401300},
|
|
{1964, 9, 3.4401300},
|
|
{1965, 1, 3.5401300},
|
|
{1965, 3, 3.6401300},
|
|
{1965, 7, 3.7401300},
|
|
{1965, 9, 3.8401300},
|
|
{1966, 1, 4.3131700},
|
|
{1968, 2, 4.2131700},
|
|
{1972, 1, 10.0},
|
|
{1972, 7, 11.0},
|
|
{1973, 1, 12.0},
|
|
{1974, 1, 13.0},
|
|
{1975, 1, 14.0},
|
|
{1976, 1, 15.0},
|
|
{1977, 1, 16.0},
|
|
{1978, 1, 17.0},
|
|
{1979, 1, 18.0},
|
|
{1980, 1, 19.0},
|
|
{1981, 7, 20.0},
|
|
{1982, 7, 21.0},
|
|
{1983, 7, 22.0},
|
|
{1985, 7, 23.0},
|
|
{1988, 1, 24.0},
|
|
{1990, 1, 25.0},
|
|
{1991, 1, 26.0},
|
|
{1992, 7, 27.0},
|
|
{1993, 7, 28.0},
|
|
{1994, 7, 29.0},
|
|
{1996, 1, 30.0},
|
|
{1997, 7, 31.0},
|
|
{1999, 1, 32.0},
|
|
{2006, 1, 33.0},
|
|
{2009, 1, 34.0},
|
|
{2012, 7, 35.0},
|
|
{2015, 7, 36.0},
|
|
{2017, 1, 37.0},
|
|
}
|
|
|
|
/* Number of Delta(AT) changes */
|
|
// enum { NDAT = (int) (sizeof changes / sizeof changes[0]) };
|
|
NDAT := len(changes)
|
|
|
|
/* Miscellaneous local variables */
|
|
var j, i, m int
|
|
var da, djm0, djm float64
|
|
|
|
/* Initialize the result to zero. */
|
|
// *deltat = da = 0.0;
|
|
*deltat = 0.0
|
|
// da = 0.0
|
|
|
|
/* If invalid fraction of a day, set error status and give up. */
|
|
if fd < 0.0 || fd > 1.0 {
|
|
return -4
|
|
}
|
|
|
|
/* Convert the date into an MJD. */
|
|
j = Cal2jd(iy, im, id, &djm0, &djm)
|
|
|
|
/* If invalid year, month, or day, give up. */
|
|
if j < 0 {
|
|
return j
|
|
}
|
|
|
|
/* If pre-UTC year, set warning status and give up. */
|
|
if iy < changes[0].iyear {
|
|
return 1
|
|
}
|
|
|
|
/* If suspiciously late year, set warning status but proceed. */
|
|
if iy > IYV+5 {
|
|
j = 1
|
|
}
|
|
|
|
/* Combine year and month to form a date-ordered integer... */
|
|
m = 12*iy + im
|
|
|
|
/* ...and use it to find the preceding table entry. */
|
|
for i = NDAT - 1; i >= 0; i-- {
|
|
if m >= (12*changes[i].iyear + changes[i].month) {
|
|
break
|
|
}
|
|
}
|
|
|
|
/* Prevent underflow warnings. */
|
|
if i < 0 {
|
|
return -5
|
|
}
|
|
|
|
/* Get the Delta(AT). */
|
|
da = changes[i].delat
|
|
|
|
/* If pre-1972, adjust for drift. */
|
|
if i < NERA1 {
|
|
da += (djm + fd - drift[i][0]) * drift[i][1]
|
|
}
|
|
|
|
/* Return the Delta(AT) value. */
|
|
*deltat = da
|
|
|
|
/* Return the status. */
|
|
return j
|
|
}
|
|
|
|
/*
|
|
Dtdb TDB-TT
|
|
|
|
An approximation to TDB-TT, the difference between barycentric
|
|
dynamical time and terrestrial time, for an observer on the Earth.
|
|
|
|
The different time scales - proper, coordinate and realized - are
|
|
related to each other:
|
|
|
|
TAI <- physically realized
|
|
:
|
|
offset <- observed (nominally +32.184s)
|
|
:
|
|
TT <- terrestrial time
|
|
:
|
|
rate adjustment (L_G) <- definition of TT
|
|
:
|
|
TCG <- time scale for GCRS
|
|
:
|
|
"periodic" terms <- Dtdb is an implementation
|
|
:
|
|
rate adjustment (L_C) <- function of solar-system ephemeris
|
|
:
|
|
TCB <- time scale for BCRS
|
|
:
|
|
rate adjustment (-L_B) <- definition of TDB
|
|
:
|
|
TDB <- TCB scaled to track TT
|
|
:
|
|
"periodic" terms <- -Dtdb is an approximation
|
|
:
|
|
TT <- terrestrial time
|
|
|
|
Adopted values for the various constants can be found in the IERS
|
|
Conventions (McCarthy & Petit 2003).
|
|
|
|
Given:
|
|
|
|
date1,date2 float64 date, TDB (Notes 1-3)
|
|
ut float64 universal time (UT1, fraction of one day)
|
|
elong float64 longitude (east positive, radians)
|
|
u float64 distance from Earth spin axis (km)
|
|
v float64 distance north of equatorial plane (km)
|
|
|
|
Returned (function value):
|
|
|
|
float64 TDB-TT (seconds)
|
|
|
|
Notes:
|
|
|
|
1. The date date1+date2 is a Julian Date, apportioned in any
|
|
convenient way between the two arguments. For example,
|
|
JD(TT)=2450123.7 could be expressed in any of these ways,
|
|
among others:
|
|
|
|
date1 date2
|
|
|
|
2450123.7 0.0 (JD method)
|
|
2451545.0 -1421.3 (J2000 method)
|
|
2400000.5 50123.2 (MJD method)
|
|
2450123.5 0.2 (date & time method)
|
|
|
|
The JD method is the most natural and convenient to use in
|
|
cases where the loss of several decimal digits of resolution
|
|
is acceptable. The J2000 method is best matched to the way
|
|
the argument is handled internally and will deliver the
|
|
optimum resolution. The MJD method and the date & time methods
|
|
are both good compromises between resolution and convenience.
|
|
|
|
Although the date is, formally, barycentric dynamical time (TDB),
|
|
the terrestrial dynamical time (TT) can be used with no practical
|
|
effect on the accuracy of the prediction.
|
|
|
|
2. TT can be regarded as a coordinate time that is realized as an
|
|
offset of 32.184s from International Atomic Time, TAI. TT is a
|
|
specific linear transformation of geocentric coordinate time TCG,
|
|
which is the time scale for the Geocentric Celestial Reference
|
|
System, GCRS.
|
|
|
|
3. TDB is a coordinate time, and is a specific linear transformation
|
|
of barycentric coordinate time TCB, which is the time scale for
|
|
the Barycentric Celestial Reference System, BCRS.
|
|
|
|
4. The difference TCG-TCB depends on the masses and positions of the
|
|
bodies of the solar system and the velocity of the Earth. It is
|
|
dominated by a rate difference, the residual being of a periodic
|
|
character. The latter, which is modeled by the present function,
|
|
comprises a main (annual) sinusoidal term of amplitude
|
|
approximately 0.00166 seconds, plus planetary terms up to about
|
|
20 microseconds, and lunar and diurnal terms up to 2 microseconds.
|
|
These effects come from the changing transverse Doppler effect
|
|
and gravitational red-shift as the observer (on the Earth's
|
|
surface) experiences variations in speed (with respect to the
|
|
BCRS) and gravitational potential.
|
|
|
|
5. TDB can be regarded as the same as TCB but with a rate adjustment
|
|
to keep it close to TT, which is convenient for many applications.
|
|
The history of successive attempts to define TDB is set out in
|
|
Resolution 3 adopted by the IAU General Assembly in 2006, which
|
|
defines a fixed TDB(TCB) transformation that is consistent with
|
|
contemporary solar-system ephemerides. Future ephemerides will
|
|
imply slightly changed transformations between TCG and TCB, which
|
|
could introduce a linear drift between TDB and TT; however, any
|
|
such drift is unlikely to exceed 1 nanosecond per century.
|
|
|
|
6. The geocentric TDB-TT model used in the present function is that of
|
|
Fairhead & Bretagnon (1990), in its full form. It was originally
|
|
supplied by Fairhead (private communications with P.T.Wallace,
|
|
|
|
1990. as a Fortran subroutine. The present C function contains an
|
|
adaptation of the Fairhead code. The numerical results are
|
|
essentially unaffected by the changes, the differences with
|
|
respect to the Fairhead & Bretagnon original being at the 1e-20 s
|
|
level.
|
|
|
|
The topocentric part of the model is from Moyer (1981) and
|
|
Murray (1983), with fundamental arguments adapted from
|
|
Simon et al. 1994. It is an approximation to the expression
|
|
( v / c ) . ( r / c ), where v is the barycentric velocity of
|
|
the Earth, r is the geocentric position of the observer and
|
|
c is the speed of light.
|
|
|
|
By supplying zeroes for u and v, the topocentric part of the
|
|
model can be nullified, and the function will return the Fairhead
|
|
& Bretagnon result alone.
|
|
|
|
7. During the interval 1950-2050, the absolute accuracy is better
|
|
than +/- 3 nanoseconds relative to time ephemerides obtained by
|
|
direct numerical integrations based on the JPL DE405 solar system
|
|
ephemeris.
|
|
|
|
8. It must be stressed that the present function is merely a model,
|
|
and that numerical integration of solar-system ephemerides is the
|
|
definitive method for predicting the relationship between TCG and
|
|
TCB and hence between TT and TDB.
|
|
|
|
References:
|
|
|
|
Fairhead, L., & Bretagnon, P., Astron.Astrophys., 229, 240-247
|
|
(1990).
|
|
|
|
IAU 2006 Resolution 3.
|
|
|
|
McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003),
|
|
IERS Technical Note No. 32, BKG (2004)
|
|
|
|
Moyer, T.D., Cel.Mech., 23, 33 (1981).
|
|
|
|
Murray, C.A., Vectorial Astrometry, Adam Hilger (1983).
|
|
|
|
Seidelmann, P.K. et al., Explanatory Supplement to the
|
|
Astronomical Almanac, Chapter 2, University Science Books (1992).
|
|
|
|
Simon, J.L., Bretagnon, P., Chapront, J., Chapront-Touze, M.,
|
|
Francou, G. & Laskar, J., Astron.Astrophys., 282, 663-683 (1994).
|
|
*/
|
|
func Dtdb(date1, date2 float64, ut, elong, u, v float64) float64 {
|
|
var t, tsol, w, elsun, emsun, d, elj, els, wt, w0, w1, w2, w3, w4,
|
|
wf, wj float64
|
|
var j int
|
|
|
|
/*
|
|
=====================
|
|
Fairhead et al. model
|
|
=====================
|
|
|
|
787 sets of three coefficients.
|
|
|
|
Each set is
|
|
amplitude (microseconds)
|
|
frequency (radians per Julian millennium since J2000.0)
|
|
phase (radians)
|
|
|
|
Sets 1-474 are the T0 terms
|
|
" 475-679 " " T1
|
|
" 680-764 " " T2
|
|
" 765-784 " " T3
|
|
" 785-787 " " T4
|
|
*/
|
|
|
|
fairhd := [787][3]float64{
|
|
/* 1, 10 */
|
|
{1656.674564e-6, 6283.075849991, 6.240054195},
|
|
{22.417471e-6, 5753.384884897, 4.296977442},
|
|
{13.839792e-6, 12566.151699983, 6.196904410},
|
|
{4.770086e-6, 529.690965095, 0.444401603},
|
|
{4.676740e-6, 6069.776754553, 4.021195093},
|
|
{2.256707e-6, 213.299095438, 5.543113262},
|
|
{1.694205e-6, -3.523118349, 5.025132748},
|
|
{1.554905e-6, 77713.771467920, 5.198467090},
|
|
{1.276839e-6, 7860.419392439, 5.988822341},
|
|
{1.193379e-6, 5223.693919802, 3.649823730},
|
|
|
|
/* 11, 20 */
|
|
{1.115322e-6, 3930.209696220, 1.422745069},
|
|
{0.794185e-6, 11506.769769794, 2.322313077},
|
|
{0.447061e-6, 26.298319800, 3.615796498},
|
|
{0.435206e-6, -398.149003408, 4.349338347},
|
|
{0.600309e-6, 1577.343542448, 2.678271909},
|
|
{0.496817e-6, 6208.294251424, 5.696701824},
|
|
{0.486306e-6, 5884.926846583, 0.520007179},
|
|
{0.432392e-6, 74.781598567, 2.435898309},
|
|
{0.468597e-6, 6244.942814354, 5.866398759},
|
|
{0.375510e-6, 5507.553238667, 4.103476804},
|
|
/* 21, 30 */
|
|
{0.243085e-6, -775.522611324, 3.651837925},
|
|
{0.173435e-6, 18849.227549974, 6.153743485},
|
|
{0.230685e-6, 5856.477659115, 4.773852582},
|
|
{0.203747e-6, 12036.460734888, 4.333987818},
|
|
{0.143935e-6, -796.298006816, 5.957517795},
|
|
{0.159080e-6, 10977.078804699, 1.890075226},
|
|
{0.119979e-6, 38.133035638, 4.551585768},
|
|
{0.118971e-6, 5486.777843175, 1.914547226},
|
|
{0.116120e-6, 1059.381930189, 0.873504123},
|
|
{0.137927e-6, 11790.629088659, 1.135934669},
|
|
/* 31, 40 */
|
|
{0.098358e-6, 2544.314419883, 0.092793886},
|
|
{0.101868e-6, -5573.142801634, 5.984503847},
|
|
{0.080164e-6, 206.185548437, 2.095377709},
|
|
{0.079645e-6, 4694.002954708, 2.949233637},
|
|
{0.062617e-6, 20.775395492, 2.654394814},
|
|
{0.075019e-6, 2942.463423292, 4.980931759},
|
|
{0.064397e-6, 5746.271337896, 1.280308748},
|
|
{0.063814e-6, 5760.498431898, 4.167901731},
|
|
{0.048042e-6, 2146.165416475, 1.495846011},
|
|
{0.048373e-6, 155.420399434, 2.251573730},
|
|
/* 41, 50 */
|
|
{0.058844e-6, 426.598190876, 4.839650148},
|
|
{0.046551e-6, -0.980321068, 0.921573539},
|
|
{0.054139e-6, 17260.154654690, 3.411091093},
|
|
{0.042411e-6, 6275.962302991, 2.869567043},
|
|
{0.040184e-6, -7.113547001, 3.565975565},
|
|
{0.036564e-6, 5088.628839767, 3.324679049},
|
|
{0.040759e-6, 12352.852604545, 3.981496998},
|
|
{0.036507e-6, 801.820931124, 6.248866009},
|
|
{0.036955e-6, 3154.687084896, 5.071801441},
|
|
{0.042732e-6, 632.783739313, 5.720622217},
|
|
/* 51, 60 */
|
|
{0.042560e-6, 161000.685737473, 1.270837679},
|
|
{0.040480e-6, 15720.838784878, 2.546610123},
|
|
{0.028244e-6, -6286.598968340, 5.069663519},
|
|
{0.033477e-6, 6062.663207553, 4.144987272},
|
|
{0.034867e-6, 522.577418094, 5.210064075},
|
|
{0.032438e-6, 6076.890301554, 0.749317412},
|
|
{0.030215e-6, 7084.896781115, 3.389610345},
|
|
{0.029247e-6, -71430.695617928, 4.183178762},
|
|
{0.033529e-6, 9437.762934887, 2.404714239},
|
|
{0.032423e-6, 8827.390269875, 5.541473556},
|
|
/* 61, 70 */
|
|
{0.027567e-6, 6279.552731642, 5.040846034},
|
|
{0.029862e-6, 12139.553509107, 1.770181024},
|
|
{0.022509e-6, 10447.387839604, 1.460726241},
|
|
{0.020937e-6, 8429.241266467, 0.652303414},
|
|
{0.020322e-6, 419.484643875, 3.735430632},
|
|
{0.024816e-6, -1194.447010225, 1.087136918},
|
|
{0.025196e-6, 1748.016413067, 2.901883301},
|
|
{0.021691e-6, 14143.495242431, 5.952658009},
|
|
{0.017673e-6, 6812.766815086, 3.186129845},
|
|
{0.022567e-6, 6133.512652857, 3.307984806},
|
|
/* 71, 80 */
|
|
{0.016155e-6, 10213.285546211, 1.331103168},
|
|
{0.014751e-6, 1349.867409659, 4.308933301},
|
|
{0.015949e-6, -220.412642439, 4.005298270},
|
|
{0.015974e-6, -2352.866153772, 6.145309371},
|
|
{0.014223e-6, 17789.845619785, 2.104551349},
|
|
{0.017806e-6, 73.297125859, 3.475975097},
|
|
{0.013671e-6, -536.804512095, 5.971672571},
|
|
{0.011942e-6, 8031.092263058, 2.053414715},
|
|
{0.014318e-6, 16730.463689596, 3.016058075},
|
|
{0.012462e-6, 103.092774219, 1.737438797},
|
|
/* 81, 90 */
|
|
{0.010962e-6, 3.590428652, 2.196567739},
|
|
{0.015078e-6, 19651.048481098, 3.969480770},
|
|
{0.010396e-6, 951.718406251, 5.717799605},
|
|
{0.011707e-6, -4705.732307544, 2.654125618},
|
|
{0.010453e-6, 5863.591206116, 1.913704550},
|
|
{0.012420e-6, 4690.479836359, 4.734090399},
|
|
{0.011847e-6, 5643.178563677, 5.489005403},
|
|
{0.008610e-6, 3340.612426700, 3.661698944},
|
|
{0.011622e-6, 5120.601145584, 4.863931876},
|
|
{0.010825e-6, 553.569402842, 0.842715011},
|
|
/* 91, 100 */
|
|
{0.008666e-6, -135.065080035, 3.293406547},
|
|
{0.009963e-6, 149.563197135, 4.870690598},
|
|
{0.009858e-6, 6309.374169791, 1.061816410},
|
|
{0.007959e-6, 316.391869657, 2.465042647},
|
|
{0.010099e-6, 283.859318865, 1.942176992},
|
|
{0.007147e-6, -242.728603974, 3.661486981},
|
|
{0.007505e-6, 5230.807466803, 4.920937029},
|
|
{0.008323e-6, 11769.853693166, 1.229392026},
|
|
{0.007490e-6, -6256.777530192, 3.658444681},
|
|
{0.009370e-6, 149854.400134205, 0.673880395},
|
|
/* 101, 110 */
|
|
{0.007117e-6, 38.027672636, 5.294249518},
|
|
{0.007857e-6, 12168.002696575, 0.525733528},
|
|
{0.007019e-6, 6206.809778716, 0.837688810},
|
|
{0.006056e-6, 955.599741609, 4.194535082},
|
|
{0.008107e-6, 13367.972631107, 3.793235253},
|
|
{0.006731e-6, 5650.292110678, 5.639906583},
|
|
{0.007332e-6, 36.648562930, 0.114858677},
|
|
{0.006366e-6, 4164.311989613, 2.262081818},
|
|
{0.006858e-6, 5216.580372801, 0.642063318},
|
|
{0.006919e-6, 6681.224853400, 6.018501522},
|
|
/* 111, 120 */
|
|
{0.006826e-6, 7632.943259650, 3.458654112},
|
|
{0.005308e-6, -1592.596013633, 2.500382359},
|
|
{0.005096e-6, 11371.704689758, 2.547107806},
|
|
{0.004841e-6, 5333.900241022, 0.437078094},
|
|
{0.005582e-6, 5966.683980335, 2.246174308},
|
|
{0.006304e-6, 11926.254413669, 2.512929171},
|
|
{0.006603e-6, 23581.258177318, 5.393136889},
|
|
{0.005123e-6, -1.484472708, 2.999641028},
|
|
{0.004648e-6, 1589.072895284, 1.275847090},
|
|
{0.005119e-6, 6438.496249426, 1.486539246},
|
|
/* 121, 130 */
|
|
{0.004521e-6, 4292.330832950, 6.140635794},
|
|
{0.005680e-6, 23013.539539587, 4.557814849},
|
|
{0.005488e-6, -3.455808046, 0.090675389},
|
|
{0.004193e-6, 7234.794256242, 4.869091389},
|
|
{0.003742e-6, 7238.675591600, 4.691976180},
|
|
{0.004148e-6, -110.206321219, 3.016173439},
|
|
{0.004553e-6, 11499.656222793, 5.554998314},
|
|
{0.004892e-6, 5436.993015240, 1.475415597},
|
|
{0.004044e-6, 4732.030627343, 1.398784824},
|
|
{0.004164e-6, 12491.370101415, 5.650931916},
|
|
/* 131, 140 */
|
|
{0.004349e-6, 11513.883316794, 2.181745369},
|
|
{0.003919e-6, 12528.018664345, 5.823319737},
|
|
{0.003129e-6, 6836.645252834, 0.003844094},
|
|
{0.004080e-6, -7058.598461315, 3.690360123},
|
|
{0.003270e-6, 76.266071276, 1.517189902},
|
|
{0.002954e-6, 6283.143160294, 4.447203799},
|
|
{0.002872e-6, 28.449187468, 1.158692983},
|
|
{0.002881e-6, 735.876513532, 0.349250250},
|
|
{0.003279e-6, 5849.364112115, 4.893384368},
|
|
{0.003625e-6, 6209.778724132, 1.473760578},
|
|
/* 141, 150 */
|
|
{0.003074e-6, 949.175608970, 5.185878737},
|
|
{0.002775e-6, 9917.696874510, 1.030026325},
|
|
{0.002646e-6, 10973.555686350, 3.918259169},
|
|
{0.002575e-6, 25132.303399966, 6.109659023},
|
|
{0.003500e-6, 263.083923373, 1.892100742},
|
|
{0.002740e-6, 18319.536584880, 4.320519510},
|
|
{0.002464e-6, 202.253395174, 4.698203059},
|
|
{0.002409e-6, 2.542797281, 5.325009315},
|
|
{0.003354e-6, -90955.551694697, 1.942656623},
|
|
{0.002296e-6, 6496.374945429, 5.061810696},
|
|
/* 151, 160 */
|
|
{0.003002e-6, 6172.869528772, 2.797822767},
|
|
{0.003202e-6, 27511.467873537, 0.531673101},
|
|
{0.002954e-6, -6283.008539689, 4.533471191},
|
|
{0.002353e-6, 639.897286314, 3.734548088},
|
|
{0.002401e-6, 16200.772724501, 2.605547070},
|
|
{0.003053e-6, 233141.314403759, 3.029030662},
|
|
{0.003024e-6, 83286.914269554, 2.355556099},
|
|
{0.002863e-6, 17298.182327326, 5.240963796},
|
|
{0.002103e-6, -7079.373856808, 5.756641637},
|
|
{0.002303e-6, 83996.847317911, 2.013686814},
|
|
/* 161, 170 */
|
|
{0.002303e-6, 18073.704938650, 1.089100410},
|
|
{0.002381e-6, 63.735898303, 0.759188178},
|
|
{0.002493e-6, 6386.168624210, 0.645026535},
|
|
{0.002366e-6, 3.932153263, 6.215885448},
|
|
{0.002169e-6, 11015.106477335, 4.845297676},
|
|
{0.002397e-6, 6243.458341645, 3.809290043},
|
|
{0.002183e-6, 1162.474704408, 6.179611691},
|
|
{0.002353e-6, 6246.427287062, 4.781719760},
|
|
{0.002199e-6, -245.831646229, 5.956152284},
|
|
{0.001729e-6, 3894.181829542, 1.264976635},
|
|
/* 171, 180 */
|
|
{0.001896e-6, -3128.388765096, 4.914231596},
|
|
{0.002085e-6, 35.164090221, 1.405158503},
|
|
{0.002024e-6, 14712.317116458, 2.752035928},
|
|
{0.001737e-6, 6290.189396992, 5.280820144},
|
|
{0.002229e-6, 491.557929457, 1.571007057},
|
|
{0.001602e-6, 14314.168113050, 4.203664806},
|
|
{0.002186e-6, 454.909366527, 1.402101526},
|
|
{0.001897e-6, 22483.848574493, 4.167932508},
|
|
{0.001825e-6, -3738.761430108, 0.545828785},
|
|
{0.001894e-6, 1052.268383188, 5.817167450},
|
|
/* 181, 190 */
|
|
{0.001421e-6, 20.355319399, 2.419886601},
|
|
{0.001408e-6, 10984.192351700, 2.732084787},
|
|
{0.001847e-6, 10873.986030480, 2.903477885},
|
|
{0.001391e-6, -8635.942003763, 0.593891500},
|
|
{0.001388e-6, -7.046236698, 1.166145902},
|
|
{0.001810e-6, -88860.057071188, 0.487355242},
|
|
{0.001288e-6, -1990.745017041, 3.913022880},
|
|
{0.001297e-6, 23543.230504682, 3.063805171},
|
|
{0.001335e-6, -266.607041722, 3.995764039},
|
|
{0.001376e-6, 10969.965257698, 5.152914309},
|
|
/* 191, 200 */
|
|
{0.001745e-6, 244287.600007027, 3.626395673},
|
|
{0.001649e-6, 31441.677569757, 1.952049260},
|
|
{0.001416e-6, 9225.539273283, 4.996408389},
|
|
{0.001238e-6, 4804.209275927, 5.503379738},
|
|
{0.001472e-6, 4590.910180489, 4.164913291},
|
|
{0.001169e-6, 6040.347246017, 5.841719038},
|
|
{0.001039e-6, 5540.085789459, 2.769753519},
|
|
{0.001004e-6, -170.672870619, 0.755008103},
|
|
{0.001284e-6, 10575.406682942, 5.306538209},
|
|
{0.001278e-6, 71.812653151, 4.713486491},
|
|
/* 201, 210 */
|
|
{0.001321e-6, 18209.330263660, 2.624866359},
|
|
{0.001297e-6, 21228.392023546, 0.382603541},
|
|
{0.000954e-6, 6282.095528923, 0.882213514},
|
|
{0.001145e-6, 6058.731054289, 1.169483931},
|
|
{0.000979e-6, 5547.199336460, 5.448375984},
|
|
{0.000987e-6, -6262.300454499, 2.656486959},
|
|
{0.001070e-6, -154717.609887482, 1.827624012},
|
|
{0.000991e-6, 4701.116501708, 4.387001801},
|
|
{0.001155e-6, -14.227094002, 3.042700750},
|
|
{0.001176e-6, 277.034993741, 3.335519004},
|
|
/* 211, 220 */
|
|
{0.000890e-6, 13916.019109642, 5.601498297},
|
|
{0.000884e-6, -1551.045222648, 1.088831705},
|
|
{0.000876e-6, 5017.508371365, 3.969902609},
|
|
{0.000806e-6, 15110.466119866, 5.142876744},
|
|
{0.000773e-6, -4136.910433516, 0.022067765},
|
|
{0.001077e-6, 175.166059800, 1.844913056},
|
|
{0.000954e-6, -6284.056171060, 0.968480906},
|
|
{0.000737e-6, 5326.786694021, 4.923831588},
|
|
{0.000845e-6, -433.711737877, 4.749245231},
|
|
{0.000819e-6, 8662.240323563, 5.991247817},
|
|
/* 221, 230 */
|
|
{0.000852e-6, 199.072001436, 2.189604979},
|
|
{0.000723e-6, 17256.631536341, 6.068719637},
|
|
{0.000940e-6, 6037.244203762, 6.197428148},
|
|
{0.000885e-6, 11712.955318231, 3.280414875},
|
|
{0.000706e-6, 12559.038152982, 2.824848947},
|
|
{0.000732e-6, 2379.164473572, 2.501813417},
|
|
{0.000764e-6, -6127.655450557, 2.236346329},
|
|
{0.000908e-6, 131.541961686, 2.521257490},
|
|
{0.000907e-6, 35371.887265976, 3.370195967},
|
|
{0.000673e-6, 1066.495477190, 3.876512374},
|
|
/* 231, 240 */
|
|
{0.000814e-6, 17654.780539750, 4.627122566},
|
|
{0.000630e-6, 36.027866677, 0.156368499},
|
|
{0.000798e-6, 515.463871093, 5.151962502},
|
|
{0.000798e-6, 148.078724426, 5.909225055},
|
|
{0.000806e-6, 309.278322656, 6.054064447},
|
|
{0.000607e-6, -39.617508346, 2.839021623},
|
|
{0.000601e-6, 412.371096874, 3.984225404},
|
|
{0.000646e-6, 11403.676995575, 3.852959484},
|
|
{0.000704e-6, 13521.751441591, 2.300991267},
|
|
{0.000603e-6, -65147.619767937, 4.140083146},
|
|
/* 241, 250 */
|
|
{0.000609e-6, 10177.257679534, 0.437122327},
|
|
{0.000631e-6, 5767.611978898, 4.026532329},
|
|
{0.000576e-6, 11087.285125918, 4.760293101},
|
|
{0.000674e-6, 14945.316173554, 6.270510511},
|
|
{0.000726e-6, 5429.879468239, 6.039606892},
|
|
{0.000710e-6, 28766.924424484, 5.672617711},
|
|
{0.000647e-6, 11856.218651625, 3.397132627},
|
|
{0.000678e-6, -5481.254918868, 6.249666675},
|
|
{0.000618e-6, 22003.914634870, 2.466427018},
|
|
{0.000738e-6, 6134.997125565, 2.242668890},
|
|
/* 251, 260 */
|
|
{0.000660e-6, 625.670192312, 5.864091907},
|
|
{0.000694e-6, 3496.032826134, 2.668309141},
|
|
{0.000531e-6, 6489.261398429, 1.681888780},
|
|
{0.000611e-6, -143571.324284214, 2.424978312},
|
|
{0.000575e-6, 12043.574281889, 4.216492400},
|
|
{0.000553e-6, 12416.588502848, 4.772158039},
|
|
{0.000689e-6, 4686.889407707, 6.224271088},
|
|
{0.000495e-6, 7342.457780181, 3.817285811},
|
|
{0.000567e-6, 3634.621024518, 1.649264690},
|
|
{0.000515e-6, 18635.928454536, 3.945345892},
|
|
/* 261, 270 */
|
|
{0.000486e-6, -323.505416657, 4.061673868},
|
|
{0.000662e-6, 25158.601719765, 1.794058369},
|
|
{0.000509e-6, 846.082834751, 3.053874588},
|
|
{0.000472e-6, -12569.674818332, 5.112133338},
|
|
{0.000461e-6, 6179.983075773, 0.513669325},
|
|
{0.000641e-6, 83467.156352816, 3.210727723},
|
|
{0.000520e-6, 10344.295065386, 2.445597761},
|
|
{0.000493e-6, 18422.629359098, 1.676939306},
|
|
{0.000478e-6, 1265.567478626, 5.487314569},
|
|
{0.000472e-6, -18.159247265, 1.999707589},
|
|
/* 271, 280 */
|
|
{0.000559e-6, 11190.377900137, 5.783236356},
|
|
{0.000494e-6, 9623.688276691, 3.022645053},
|
|
{0.000463e-6, 5739.157790895, 1.411223013},
|
|
{0.000432e-6, 16858.482532933, 1.179256434},
|
|
{0.000574e-6, 72140.628666286, 1.758191830},
|
|
{0.000484e-6, 17267.268201691, 3.290589143},
|
|
{0.000550e-6, 4907.302050146, 0.864024298},
|
|
{0.000399e-6, 14.977853527, 2.094441910},
|
|
{0.000491e-6, 224.344795702, 0.878372791},
|
|
{0.000432e-6, 20426.571092422, 6.003829241},
|
|
/* 281, 290 */
|
|
{0.000481e-6, 5749.452731634, 4.309591964},
|
|
{0.000480e-6, 5757.317038160, 1.142348571},
|
|
{0.000485e-6, 6702.560493867, 0.210580917},
|
|
{0.000426e-6, 6055.549660552, 4.274476529},
|
|
{0.000480e-6, 5959.570433334, 5.031351030},
|
|
{0.000466e-6, 12562.628581634, 4.959581597},
|
|
{0.000520e-6, 39302.096962196, 4.788002889},
|
|
{0.000458e-6, 12132.439962106, 1.880103788},
|
|
{0.000470e-6, 12029.347187887, 1.405611197},
|
|
{0.000416e-6, -7477.522860216, 1.082356330},
|
|
/* 291, 300 */
|
|
{0.000449e-6, 11609.862544012, 4.179989585},
|
|
{0.000465e-6, 17253.041107690, 0.353496295},
|
|
{0.000362e-6, -4535.059436924, 1.583849576},
|
|
{0.000383e-6, 21954.157609398, 3.747376371},
|
|
{0.000389e-6, 17.252277143, 1.395753179},
|
|
{0.000331e-6, 18052.929543158, 0.566790582},
|
|
{0.000430e-6, 13517.870106233, 0.685827538},
|
|
{0.000368e-6, -5756.908003246, 0.731374317},
|
|
{0.000330e-6, 10557.594160824, 3.710043680},
|
|
{0.000332e-6, 20199.094959633, 1.652901407},
|
|
/* 301, 310 */
|
|
{0.000384e-6, 11933.367960670, 5.827781531},
|
|
{0.000387e-6, 10454.501386605, 2.541182564},
|
|
{0.000325e-6, 15671.081759407, 2.178850542},
|
|
{0.000318e-6, 138.517496871, 2.253253037},
|
|
{0.000305e-6, 9388.005909415, 0.578340206},
|
|
{0.000352e-6, 5749.861766548, 3.000297967},
|
|
{0.000311e-6, 6915.859589305, 1.693574249},
|
|
{0.000297e-6, 24072.921469776, 1.997249392},
|
|
{0.000363e-6, -640.877607382, 5.071820966},
|
|
{0.000323e-6, 12592.450019783, 1.072262823},
|
|
/* 311, 320 */
|
|
{0.000341e-6, 12146.667056108, 4.700657997},
|
|
{0.000290e-6, 9779.108676125, 1.812320441},
|
|
{0.000342e-6, 6132.028180148, 4.322238614},
|
|
{0.000329e-6, 6268.848755990, 3.033827743},
|
|
{0.000374e-6, 17996.031168222, 3.388716544},
|
|
{0.000285e-6, -533.214083444, 4.687313233},
|
|
{0.000338e-6, 6065.844601290, 0.877776108},
|
|
{0.000276e-6, 24.298513841, 0.770299429},
|
|
{0.000336e-6, -2388.894020449, 5.353796034},
|
|
{0.000290e-6, 3097.883822726, 4.075291557},
|
|
/* 321, 330 */
|
|
{0.000318e-6, 709.933048357, 5.941207518},
|
|
{0.000271e-6, 13095.842665077, 3.208912203},
|
|
{0.000331e-6, 6073.708907816, 4.007881169},
|
|
{0.000292e-6, 742.990060533, 2.714333592},
|
|
{0.000362e-6, 29088.811415985, 3.215977013},
|
|
{0.000280e-6, 12359.966151546, 0.710872502},
|
|
{0.000267e-6, 10440.274292604, 4.730108488},
|
|
{0.000262e-6, 838.969287750, 1.327720272},
|
|
{0.000250e-6, 16496.361396202, 0.898769761},
|
|
{0.000325e-6, 20597.243963041, 0.180044365},
|
|
/* 331, 340 */
|
|
{0.000268e-6, 6148.010769956, 5.152666276},
|
|
{0.000284e-6, 5636.065016677, 5.655385808},
|
|
{0.000301e-6, 6080.822454817, 2.135396205},
|
|
{0.000294e-6, -377.373607916, 3.708784168},
|
|
{0.000236e-6, 2118.763860378, 1.733578756},
|
|
{0.000234e-6, 5867.523359379, 5.575209112},
|
|
{0.000268e-6, -226858.238553767, 0.069432392},
|
|
{0.000265e-6, 167283.761587465, 4.369302826},
|
|
{0.000280e-6, 28237.233459389, 5.304829118},
|
|
{0.000292e-6, 12345.739057544, 4.096094132},
|
|
/* 341, 350 */
|
|
{0.000223e-6, 19800.945956225, 3.069327406},
|
|
{0.000301e-6, 43232.306658416, 6.205311188},
|
|
{0.000264e-6, 18875.525869774, 1.417263408},
|
|
{0.000304e-6, -1823.175188677, 3.409035232},
|
|
{0.000301e-6, 109.945688789, 0.510922054},
|
|
{0.000260e-6, 813.550283960, 2.389438934},
|
|
{0.000299e-6, 316428.228673312, 5.384595078},
|
|
{0.000211e-6, 5756.566278634, 3.789392838},
|
|
{0.000209e-6, 5750.203491159, 1.661943545},
|
|
{0.000240e-6, 12489.885628707, 5.684549045},
|
|
/* 351, 360 */
|
|
{0.000216e-6, 6303.851245484, 3.862942261},
|
|
{0.000203e-6, 1581.959348283, 5.549853589},
|
|
{0.000200e-6, 5642.198242609, 1.016115785},
|
|
{0.000197e-6, -70.849445304, 4.690702525},
|
|
{0.000227e-6, 6287.008003254, 2.911891613},
|
|
{0.000197e-6, 533.623118358, 1.048982898},
|
|
{0.000205e-6, -6279.485421340, 1.829362730},
|
|
{0.000209e-6, -10988.808157535, 2.636140084},
|
|
{0.000208e-6, -227.526189440, 4.127883842},
|
|
{0.000191e-6, 415.552490612, 4.401165650},
|
|
/* 361, 370 */
|
|
{0.000190e-6, 29296.615389579, 4.175658539},
|
|
{0.000264e-6, 66567.485864652, 4.601102551},
|
|
{0.000256e-6, -3646.350377354, 0.506364778},
|
|
{0.000188e-6, 13119.721102825, 2.032195842},
|
|
{0.000185e-6, -209.366942175, 4.694756586},
|
|
{0.000198e-6, 25934.124331089, 3.832703118},
|
|
{0.000195e-6, 4061.219215394, 3.308463427},
|
|
{0.000234e-6, 5113.487598583, 1.716090661},
|
|
{0.000188e-6, 1478.866574064, 5.686865780},
|
|
{0.000222e-6, 11823.161639450, 1.942386641},
|
|
/* 371, 380 */
|
|
{0.000181e-6, 10770.893256262, 1.999482059},
|
|
{0.000171e-6, 6546.159773364, 1.182807992},
|
|
{0.000206e-6, 70.328180442, 5.934076062},
|
|
{0.000169e-6, 20995.392966449, 2.169080622},
|
|
{0.000191e-6, 10660.686935042, 5.405515999},
|
|
{0.000228e-6, 33019.021112205, 4.656985514},
|
|
{0.000184e-6, -4933.208440333, 3.327476868},
|
|
{0.000220e-6, -135.625325010, 1.765430262},
|
|
{0.000166e-6, 23141.558382925, 3.454132746},
|
|
{0.000191e-6, 6144.558353121, 5.020393445},
|
|
/* 381, 390 */
|
|
{0.000180e-6, 6084.003848555, 0.602182191},
|
|
{0.000163e-6, 17782.732072784, 4.960593133},
|
|
{0.000225e-6, 16460.333529525, 2.596451817},
|
|
{0.000222e-6, 5905.702242076, 3.731990323},
|
|
{0.000204e-6, 227.476132789, 5.636192701},
|
|
{0.000159e-6, 16737.577236597, 3.600691544},
|
|
{0.000200e-6, 6805.653268085, 0.868220961},
|
|
{0.000187e-6, 11919.140866668, 2.629456641},
|
|
{0.000161e-6, 127.471796607, 2.862574720},
|
|
{0.000205e-6, 6286.666278643, 1.742882331},
|
|
/* 391, 400 */
|
|
{0.000189e-6, 153.778810485, 4.812372643},
|
|
{0.000168e-6, 16723.350142595, 0.027860588},
|
|
{0.000149e-6, 11720.068865232, 0.659721876},
|
|
{0.000189e-6, 5237.921013804, 5.245313000},
|
|
{0.000143e-6, 6709.674040867, 4.317625647},
|
|
{0.000146e-6, 4487.817406270, 4.815297007},
|
|
{0.000144e-6, -664.756045130, 5.381366880},
|
|
{0.000175e-6, 5127.714692584, 4.728443327},
|
|
{0.000162e-6, 6254.626662524, 1.435132069},
|
|
{0.000187e-6, 47162.516354635, 1.354371923},
|
|
/* 401, 410 */
|
|
{0.000146e-6, 11080.171578918, 3.369695406},
|
|
{0.000180e-6, -348.924420448, 2.490902145},
|
|
{0.000148e-6, 151.047669843, 3.799109588},
|
|
{0.000157e-6, 6197.248551160, 1.284375887},
|
|
{0.000167e-6, 146.594251718, 0.759969109},
|
|
{0.000133e-6, -5331.357443741, 5.409701889},
|
|
{0.000154e-6, 95.979227218, 3.366890614},
|
|
{0.000148e-6, -6418.140930027, 3.384104996},
|
|
{0.000128e-6, -6525.804453965, 3.803419985},
|
|
{0.000130e-6, 11293.470674356, 0.939039445},
|
|
/* 411, 420 */
|
|
{0.000152e-6, -5729.506447149, 0.734117523},
|
|
{0.000138e-6, 210.117701700, 2.564216078},
|
|
{0.000123e-6, 6066.595360816, 4.517099537},
|
|
{0.000140e-6, 18451.078546566, 0.642049130},
|
|
{0.000126e-6, 11300.584221356, 3.485280663},
|
|
{0.000119e-6, 10027.903195729, 3.217431161},
|
|
{0.000151e-6, 4274.518310832, 4.404359108},
|
|
{0.000117e-6, 6072.958148291, 0.366324650},
|
|
{0.000165e-6, -7668.637425143, 4.298212528},
|
|
{0.000117e-6, -6245.048177356, 5.379518958},
|
|
/* 421, 430 */
|
|
{0.000130e-6, -5888.449964932, 4.527681115},
|
|
{0.000121e-6, -543.918059096, 6.109429504},
|
|
{0.000162e-6, 9683.594581116, 5.720092446},
|
|
{0.000141e-6, 6219.339951688, 0.679068671},
|
|
{0.000118e-6, 22743.409379516, 4.881123092},
|
|
{0.000129e-6, 1692.165669502, 0.351407289},
|
|
{0.000126e-6, 5657.405657679, 5.146592349},
|
|
{0.000114e-6, 728.762966531, 0.520791814},
|
|
{0.000120e-6, 52.596639600, 0.948516300},
|
|
{0.000115e-6, 65.220371012, 3.504914846},
|
|
/* 431, 440 */
|
|
{0.000126e-6, 5881.403728234, 5.577502482},
|
|
{0.000158e-6, 163096.180360983, 2.957128968},
|
|
{0.000134e-6, 12341.806904281, 2.598576764},
|
|
{0.000151e-6, 16627.370915377, 3.985702050},
|
|
{0.000109e-6, 1368.660252845, 0.014730471},
|
|
{0.000131e-6, 6211.263196841, 0.085077024},
|
|
{0.000146e-6, 5792.741760812, 0.708426604},
|
|
{0.000146e-6, -77.750543984, 3.121576600},
|
|
{0.000107e-6, 5341.013788022, 0.288231904},
|
|
{0.000138e-6, 6281.591377283, 2.797450317},
|
|
/* 441, 450 */
|
|
{0.000113e-6, -6277.552925684, 2.788904128},
|
|
{0.000115e-6, -525.758811831, 5.895222200},
|
|
{0.000138e-6, 6016.468808270, 6.096188999},
|
|
{0.000139e-6, 23539.707386333, 2.028195445},
|
|
{0.000146e-6, -4176.041342449, 4.660008502},
|
|
{0.000107e-6, 16062.184526117, 4.066520001},
|
|
{0.000142e-6, 83783.548222473, 2.936315115},
|
|
{0.000128e-6, 9380.959672717, 3.223844306},
|
|
{0.000135e-6, 6205.325306007, 1.638054048},
|
|
{0.000101e-6, 2699.734819318, 5.481603249},
|
|
/* 451, 460 */
|
|
{0.000104e-6, -568.821874027, 2.205734493},
|
|
{0.000103e-6, 6321.103522627, 2.440421099},
|
|
{0.000119e-6, 6321.208885629, 2.547496264},
|
|
{0.000138e-6, 1975.492545856, 2.314608466},
|
|
{0.000121e-6, 137.033024162, 4.539108237},
|
|
{0.000123e-6, 19402.796952817, 4.538074405},
|
|
{0.000119e-6, 22805.735565994, 2.869040566},
|
|
{0.000133e-6, 64471.991241142, 6.056405489},
|
|
{0.000129e-6, -85.827298831, 2.540635083},
|
|
{0.000131e-6, 13613.804277336, 4.005732868},
|
|
/* 461, 470 */
|
|
{0.000104e-6, 9814.604100291, 1.959967212},
|
|
{0.000112e-6, 16097.679950283, 3.589026260},
|
|
{0.000123e-6, 2107.034507542, 1.728627253},
|
|
{0.000121e-6, 36949.230808424, 6.072332087},
|
|
{0.000108e-6, -12539.853380183, 3.716133846},
|
|
{0.000113e-6, -7875.671863624, 2.725771122},
|
|
{0.000109e-6, 4171.425536614, 4.033338079},
|
|
{0.000101e-6, 6247.911759770, 3.441347021},
|
|
{0.000113e-6, 7330.728427345, 0.656372122},
|
|
{0.000113e-6, 51092.726050855, 2.791483066},
|
|
/* 471, 480 */
|
|
{0.000106e-6, 5621.842923210, 1.815323326},
|
|
{0.000101e-6, 111.430161497, 5.711033677},
|
|
{0.000103e-6, 909.818733055, 2.812745443},
|
|
{0.000101e-6, 1790.642637886, 1.965746028},
|
|
|
|
/* T */
|
|
{102.156724e-6, 6283.075849991, 4.249032005},
|
|
{1.706807e-6, 12566.151699983, 4.205904248},
|
|
{0.269668e-6, 213.299095438, 3.400290479},
|
|
{0.265919e-6, 529.690965095, 5.836047367},
|
|
{0.210568e-6, -3.523118349, 6.262738348},
|
|
{0.077996e-6, 5223.693919802, 4.670344204},
|
|
/* 481, 490 */
|
|
{0.054764e-6, 1577.343542448, 4.534800170},
|
|
{0.059146e-6, 26.298319800, 1.083044735},
|
|
{0.034420e-6, -398.149003408, 5.980077351},
|
|
{0.032088e-6, 18849.227549974, 4.162913471},
|
|
{0.033595e-6, 5507.553238667, 5.980162321},
|
|
{0.029198e-6, 5856.477659115, 0.623811863},
|
|
{0.027764e-6, 155.420399434, 3.745318113},
|
|
{0.025190e-6, 5746.271337896, 2.980330535},
|
|
{0.022997e-6, -796.298006816, 1.174411803},
|
|
{0.024976e-6, 5760.498431898, 2.467913690},
|
|
/* 491, 500 */
|
|
{0.021774e-6, 206.185548437, 3.854787540},
|
|
{0.017925e-6, -775.522611324, 1.092065955},
|
|
{0.013794e-6, 426.598190876, 2.699831988},
|
|
{0.013276e-6, 6062.663207553, 5.845801920},
|
|
{0.011774e-6, 12036.460734888, 2.292832062},
|
|
{0.012869e-6, 6076.890301554, 5.333425680},
|
|
{0.012152e-6, 1059.381930189, 6.222874454},
|
|
{0.011081e-6, -7.113547001, 5.154724984},
|
|
{0.010143e-6, 4694.002954708, 4.044013795},
|
|
{0.009357e-6, 5486.777843175, 3.416081409},
|
|
/* 501, 510 */
|
|
{0.010084e-6, 522.577418094, 0.749320262},
|
|
{0.008587e-6, 10977.078804699, 2.777152598},
|
|
{0.008628e-6, 6275.962302991, 4.562060226},
|
|
{0.008158e-6, -220.412642439, 5.806891533},
|
|
{0.007746e-6, 2544.314419883, 1.603197066},
|
|
{0.007670e-6, 2146.165416475, 3.000200440},
|
|
{0.007098e-6, 74.781598567, 0.443725817},
|
|
{0.006180e-6, -536.804512095, 1.302642751},
|
|
{0.005818e-6, 5088.628839767, 4.827723531},
|
|
{0.004945e-6, -6286.598968340, 0.268305170},
|
|
/* 511, 520 */
|
|
{0.004774e-6, 1349.867409659, 5.808636673},
|
|
{0.004687e-6, -242.728603974, 5.154890570},
|
|
{0.006089e-6, 1748.016413067, 4.403765209},
|
|
{0.005975e-6, -1194.447010225, 2.583472591},
|
|
{0.004229e-6, 951.718406251, 0.931172179},
|
|
{0.005264e-6, 553.569402842, 2.336107252},
|
|
{0.003049e-6, 5643.178563677, 1.362634430},
|
|
{0.002974e-6, 6812.766815086, 1.583012668},
|
|
{0.003403e-6, -2352.866153772, 2.552189886},
|
|
{0.003030e-6, 419.484643875, 5.286473844},
|
|
/* 521, 530 */
|
|
{0.003210e-6, -7.046236698, 1.863796539},
|
|
{0.003058e-6, 9437.762934887, 4.226420633},
|
|
{0.002589e-6, 12352.852604545, 1.991935820},
|
|
{0.002927e-6, 5216.580372801, 2.319951253},
|
|
{0.002425e-6, 5230.807466803, 3.084752833},
|
|
{0.002656e-6, 3154.687084896, 2.487447866},
|
|
{0.002445e-6, 10447.387839604, 2.347139160},
|
|
{0.002990e-6, 4690.479836359, 6.235872050},
|
|
{0.002890e-6, 5863.591206116, 0.095197563},
|
|
{0.002498e-6, 6438.496249426, 2.994779800},
|
|
/* 531, 540 */
|
|
{0.001889e-6, 8031.092263058, 3.569003717},
|
|
{0.002567e-6, 801.820931124, 3.425611498},
|
|
{0.001803e-6, -71430.695617928, 2.192295512},
|
|
{0.001782e-6, 3.932153263, 5.180433689},
|
|
{0.001694e-6, -4705.732307544, 4.641779174},
|
|
{0.001704e-6, -1592.596013633, 3.997097652},
|
|
{0.001735e-6, 5849.364112115, 0.417558428},
|
|
{0.001643e-6, 8429.241266467, 2.180619584},
|
|
{0.001680e-6, 38.133035638, 4.164529426},
|
|
{0.002045e-6, 7084.896781115, 0.526323854},
|
|
/* 541, 550 */
|
|
{0.001458e-6, 4292.330832950, 1.356098141},
|
|
{0.001437e-6, 20.355319399, 3.895439360},
|
|
{0.001738e-6, 6279.552731642, 0.087484036},
|
|
{0.001367e-6, 14143.495242431, 3.987576591},
|
|
{0.001344e-6, 7234.794256242, 0.090454338},
|
|
{0.001438e-6, 11499.656222793, 0.974387904},
|
|
{0.001257e-6, 6836.645252834, 1.509069366},
|
|
{0.001358e-6, 11513.883316794, 0.495572260},
|
|
{0.001628e-6, 7632.943259650, 4.968445721},
|
|
{0.001169e-6, 103.092774219, 2.838496795},
|
|
/* 551, 560 */
|
|
{0.001162e-6, 4164.311989613, 3.408387778},
|
|
{0.001092e-6, 6069.776754553, 3.617942651},
|
|
{0.001008e-6, 17789.845619785, 0.286350174},
|
|
{0.001008e-6, 639.897286314, 1.610762073},
|
|
{0.000918e-6, 10213.285546211, 5.532798067},
|
|
{0.001011e-6, -6256.777530192, 0.661826484},
|
|
{0.000753e-6, 16730.463689596, 3.905030235},
|
|
{0.000737e-6, 11926.254413669, 4.641956361},
|
|
{0.000694e-6, 3340.612426700, 2.111120332},
|
|
{0.000701e-6, 3894.181829542, 2.760823491},
|
|
/* 561, 570 */
|
|
{0.000689e-6, -135.065080035, 4.768800780},
|
|
{0.000700e-6, 13367.972631107, 5.760439898},
|
|
{0.000664e-6, 6040.347246017, 1.051215840},
|
|
{0.000654e-6, 5650.292110678, 4.911332503},
|
|
{0.000788e-6, 6681.224853400, 4.699648011},
|
|
{0.000628e-6, 5333.900241022, 5.024608847},
|
|
{0.000755e-6, -110.206321219, 4.370971253},
|
|
{0.000628e-6, 6290.189396992, 3.660478857},
|
|
{0.000635e-6, 25132.303399966, 4.121051532},
|
|
{0.000534e-6, 5966.683980335, 1.173284524},
|
|
/* 571, 580 */
|
|
{0.000543e-6, -433.711737877, 0.345585464},
|
|
{0.000517e-6, -1990.745017041, 5.414571768},
|
|
{0.000504e-6, 5767.611978898, 2.328281115},
|
|
{0.000485e-6, 5753.384884897, 1.685874771},
|
|
{0.000463e-6, 7860.419392439, 5.297703006},
|
|
{0.000604e-6, 515.463871093, 0.591998446},
|
|
{0.000443e-6, 12168.002696575, 4.830881244},
|
|
{0.000570e-6, 199.072001436, 3.899190272},
|
|
{0.000465e-6, 10969.965257698, 0.476681802},
|
|
{0.000424e-6, -7079.373856808, 1.112242763},
|
|
/* 581, 590 */
|
|
{0.000427e-6, 735.876513532, 1.994214480},
|
|
{0.000478e-6, -6127.655450557, 3.778025483},
|
|
{0.000414e-6, 10973.555686350, 5.441088327},
|
|
{0.000512e-6, 1589.072895284, 0.107123853},
|
|
{0.000378e-6, 10984.192351700, 0.915087231},
|
|
{0.000402e-6, 11371.704689758, 4.107281715},
|
|
{0.000453e-6, 9917.696874510, 1.917490952},
|
|
{0.000395e-6, 149.563197135, 2.763124165},
|
|
{0.000371e-6, 5739.157790895, 3.112111866},
|
|
{0.000350e-6, 11790.629088659, 0.440639857},
|
|
/* 591, 600 */
|
|
{0.000356e-6, 6133.512652857, 5.444568842},
|
|
{0.000344e-6, 412.371096874, 5.676832684},
|
|
{0.000383e-6, 955.599741609, 5.559734846},
|
|
{0.000333e-6, 6496.374945429, 0.261537984},
|
|
{0.000340e-6, 6055.549660552, 5.975534987},
|
|
{0.000334e-6, 1066.495477190, 2.335063907},
|
|
{0.000399e-6, 11506.769769794, 5.321230910},
|
|
{0.000314e-6, 18319.536584880, 2.313312404},
|
|
{0.000424e-6, 1052.268383188, 1.211961766},
|
|
{0.000307e-6, 63.735898303, 3.169551388},
|
|
/* 601, 610 */
|
|
{0.000329e-6, 29.821438149, 6.106912080},
|
|
{0.000357e-6, 6309.374169791, 4.223760346},
|
|
{0.000312e-6, -3738.761430108, 2.180556645},
|
|
{0.000301e-6, 309.278322656, 1.499984572},
|
|
{0.000268e-6, 12043.574281889, 2.447520648},
|
|
{0.000257e-6, 12491.370101415, 3.662331761},
|
|
{0.000290e-6, 625.670192312, 1.272834584},
|
|
{0.000256e-6, 5429.879468239, 1.913426912},
|
|
{0.000339e-6, 3496.032826134, 4.165930011},
|
|
{0.000283e-6, 3930.209696220, 4.325565754},
|
|
/* 611, 620 */
|
|
{0.000241e-6, 12528.018664345, 3.832324536},
|
|
{0.000304e-6, 4686.889407707, 1.612348468},
|
|
{0.000259e-6, 16200.772724501, 3.470173146},
|
|
{0.000238e-6, 12139.553509107, 1.147977842},
|
|
{0.000236e-6, 6172.869528772, 3.776271728},
|
|
{0.000296e-6, -7058.598461315, 0.460368852},
|
|
{0.000306e-6, 10575.406682942, 0.554749016},
|
|
{0.000251e-6, 17298.182327326, 0.834332510},
|
|
{0.000290e-6, 4732.030627343, 4.759564091},
|
|
{0.000261e-6, 5884.926846583, 0.298259862},
|
|
/* 621, 630 */
|
|
{0.000249e-6, 5547.199336460, 3.749366406},
|
|
{0.000213e-6, 11712.955318231, 5.415666119},
|
|
{0.000223e-6, 4701.116501708, 2.703203558},
|
|
{0.000268e-6, -640.877607382, 0.283670793},
|
|
{0.000209e-6, 5636.065016677, 1.238477199},
|
|
{0.000193e-6, 10177.257679534, 1.943251340},
|
|
{0.000182e-6, 6283.143160294, 2.456157599},
|
|
{0.000184e-6, -227.526189440, 5.888038582},
|
|
{0.000182e-6, -6283.008539689, 0.241332086},
|
|
{0.000228e-6, -6284.056171060, 2.657323816},
|
|
/* 631, 640 */
|
|
{0.000166e-6, 7238.675591600, 5.930629110},
|
|
{0.000167e-6, 3097.883822726, 5.570955333},
|
|
{0.000159e-6, -323.505416657, 5.786670700},
|
|
{0.000154e-6, -4136.910433516, 1.517805532},
|
|
{0.000176e-6, 12029.347187887, 3.139266834},
|
|
{0.000167e-6, 12132.439962106, 3.556352289},
|
|
{0.000153e-6, 202.253395174, 1.463313961},
|
|
{0.000157e-6, 17267.268201691, 1.586837396},
|
|
{0.000142e-6, 83996.847317911, 0.022670115},
|
|
{0.000152e-6, 17260.154654690, 0.708528947},
|
|
/* 641, 650 */
|
|
{0.000144e-6, 6084.003848555, 5.187075177},
|
|
{0.000135e-6, 5756.566278634, 1.993229262},
|
|
{0.000134e-6, 5750.203491159, 3.457197134},
|
|
{0.000144e-6, 5326.786694021, 6.066193291},
|
|
{0.000160e-6, 11015.106477335, 1.710431974},
|
|
{0.000133e-6, 3634.621024518, 2.836451652},
|
|
{0.000134e-6, 18073.704938650, 5.453106665},
|
|
{0.000134e-6, 1162.474704408, 5.326898811},
|
|
{0.000128e-6, 5642.198242609, 2.511652591},
|
|
{0.000160e-6, 632.783739313, 5.628785365},
|
|
/* 651, 660 */
|
|
{0.000132e-6, 13916.019109642, 0.819294053},
|
|
{0.000122e-6, 14314.168113050, 5.677408071},
|
|
{0.000125e-6, 12359.966151546, 5.251984735},
|
|
{0.000121e-6, 5749.452731634, 2.210924603},
|
|
{0.000136e-6, -245.831646229, 1.646502367},
|
|
{0.000120e-6, 5757.317038160, 3.240883049},
|
|
{0.000134e-6, 12146.667056108, 3.059480037},
|
|
{0.000137e-6, 6206.809778716, 1.867105418},
|
|
{0.000141e-6, 17253.041107690, 2.069217456},
|
|
{0.000129e-6, -7477.522860216, 2.781469314},
|
|
/* 661, 670 */
|
|
{0.000116e-6, 5540.085789459, 4.281176991},
|
|
{0.000116e-6, 9779.108676125, 3.320925381},
|
|
{0.000129e-6, 5237.921013804, 3.497704076},
|
|
{0.000113e-6, 5959.570433334, 0.983210840},
|
|
{0.000122e-6, 6282.095528923, 2.674938860},
|
|
{0.000140e-6, -11.045700264, 4.957936982},
|
|
{0.000108e-6, 23543.230504682, 1.390113589},
|
|
{0.000106e-6, -12569.674818332, 0.429631317},
|
|
{0.000110e-6, -266.607041722, 5.501340197},
|
|
{0.000115e-6, 12559.038152982, 4.691456618},
|
|
/* 671, 680 */
|
|
{0.000134e-6, -2388.894020449, 0.577313584},
|
|
{0.000109e-6, 10440.274292604, 6.218148717},
|
|
{0.000102e-6, -543.918059096, 1.477842615},
|
|
{0.000108e-6, 21228.392023546, 2.237753948},
|
|
{0.000101e-6, -4535.059436924, 3.100492232},
|
|
{0.000103e-6, 76.266071276, 5.594294322},
|
|
{0.000104e-6, 949.175608970, 5.674287810},
|
|
{0.000101e-6, 13517.870106233, 2.196632348},
|
|
{0.000100e-6, 11933.367960670, 4.056084160},
|
|
|
|
/* T^2 */
|
|
{4.322990e-6, 6283.075849991, 2.642893748},
|
|
/* 681, 690 */
|
|
{0.406495e-6, 0.000000000, 4.712388980},
|
|
{0.122605e-6, 12566.151699983, 2.438140634},
|
|
{0.019476e-6, 213.299095438, 1.642186981},
|
|
{0.016916e-6, 529.690965095, 4.510959344},
|
|
{0.013374e-6, -3.523118349, 1.502210314},
|
|
{0.008042e-6, 26.298319800, 0.478549024},
|
|
{0.007824e-6, 155.420399434, 5.254710405},
|
|
{0.004894e-6, 5746.271337896, 4.683210850},
|
|
{0.004875e-6, 5760.498431898, 0.759507698},
|
|
{0.004416e-6, 5223.693919802, 6.028853166},
|
|
/* 691, 700 */
|
|
{0.004088e-6, -7.113547001, 0.060926389},
|
|
{0.004433e-6, 77713.771467920, 3.627734103},
|
|
{0.003277e-6, 18849.227549974, 2.327912542},
|
|
{0.002703e-6, 6062.663207553, 1.271941729},
|
|
{0.003435e-6, -775.522611324, 0.747446224},
|
|
{0.002618e-6, 6076.890301554, 3.633715689},
|
|
{0.003146e-6, 206.185548437, 5.647874613},
|
|
{0.002544e-6, 1577.343542448, 6.232904270},
|
|
{0.002218e-6, -220.412642439, 1.309509946},
|
|
{0.002197e-6, 5856.477659115, 2.407212349},
|
|
/* 701, 710 */
|
|
{0.002897e-6, 5753.384884897, 5.863842246},
|
|
{0.001766e-6, 426.598190876, 0.754113147},
|
|
{0.001738e-6, -796.298006816, 2.714942671},
|
|
{0.001695e-6, 522.577418094, 2.629369842},
|
|
{0.001584e-6, 5507.553238667, 1.341138229},
|
|
{0.001503e-6, -242.728603974, 0.377699736},
|
|
{0.001552e-6, -536.804512095, 2.904684667},
|
|
{0.001370e-6, -398.149003408, 1.265599125},
|
|
{0.001889e-6, -5573.142801634, 4.413514859},
|
|
{0.001722e-6, 6069.776754553, 2.445966339},
|
|
/* 711, 720 */
|
|
{0.001124e-6, 1059.381930189, 5.041799657},
|
|
{0.001258e-6, 553.569402842, 3.849557278},
|
|
{0.000831e-6, 951.718406251, 2.471094709},
|
|
{0.000767e-6, 4694.002954708, 5.363125422},
|
|
{0.000756e-6, 1349.867409659, 1.046195744},
|
|
{0.000775e-6, -11.045700264, 0.245548001},
|
|
{0.000597e-6, 2146.165416475, 4.543268798},
|
|
{0.000568e-6, 5216.580372801, 4.178853144},
|
|
{0.000711e-6, 1748.016413067, 5.934271972},
|
|
{0.000499e-6, 12036.460734888, 0.624434410},
|
|
/* 721, 730 */
|
|
{0.000671e-6, -1194.447010225, 4.136047594},
|
|
{0.000488e-6, 5849.364112115, 2.209679987},
|
|
{0.000621e-6, 6438.496249426, 4.518860804},
|
|
{0.000495e-6, -6286.598968340, 1.868201275},
|
|
{0.000456e-6, 5230.807466803, 1.271231591},
|
|
{0.000451e-6, 5088.628839767, 0.084060889},
|
|
{0.000435e-6, 5643.178563677, 3.324456609},
|
|
{0.000387e-6, 10977.078804699, 4.052488477},
|
|
{0.000547e-6, 161000.685737473, 2.841633844},
|
|
{0.000522e-6, 3154.687084896, 2.171979966},
|
|
/* 731, 740 */
|
|
{0.000375e-6, 5486.777843175, 4.983027306},
|
|
{0.000421e-6, 5863.591206116, 4.546432249},
|
|
{0.000439e-6, 7084.896781115, 0.522967921},
|
|
{0.000309e-6, 2544.314419883, 3.172606705},
|
|
{0.000347e-6, 4690.479836359, 1.479586566},
|
|
{0.000317e-6, 801.820931124, 3.553088096},
|
|
{0.000262e-6, 419.484643875, 0.606635550},
|
|
{0.000248e-6, 6836.645252834, 3.014082064},
|
|
{0.000245e-6, -1592.596013633, 5.519526220},
|
|
{0.000225e-6, 4292.330832950, 2.877956536},
|
|
/* 741, 750 */
|
|
{0.000214e-6, 7234.794256242, 1.605227587},
|
|
{0.000205e-6, 5767.611978898, 0.625804796},
|
|
{0.000180e-6, 10447.387839604, 3.499954526},
|
|
{0.000229e-6, 199.072001436, 5.632304604},
|
|
{0.000214e-6, 639.897286314, 5.960227667},
|
|
{0.000175e-6, -433.711737877, 2.162417992},
|
|
{0.000209e-6, 515.463871093, 2.322150893},
|
|
{0.000173e-6, 6040.347246017, 2.556183691},
|
|
{0.000184e-6, 6309.374169791, 4.732296790},
|
|
{0.000227e-6, 149854.400134205, 5.385812217},
|
|
/* 751, 760 */
|
|
{0.000154e-6, 8031.092263058, 5.120720920},
|
|
{0.000151e-6, 5739.157790895, 4.815000443},
|
|
{0.000197e-6, 7632.943259650, 0.222827271},
|
|
{0.000197e-6, 74.781598567, 3.910456770},
|
|
{0.000138e-6, 6055.549660552, 1.397484253},
|
|
{0.000149e-6, -6127.655450557, 5.333727496},
|
|
{0.000137e-6, 3894.181829542, 4.281749907},
|
|
{0.000135e-6, 9437.762934887, 5.979971885},
|
|
{0.000139e-6, -2352.866153772, 4.715630782},
|
|
{0.000142e-6, 6812.766815086, 0.513330157},
|
|
/* 761, 770 */
|
|
{0.000120e-6, -4705.732307544, 0.194160689},
|
|
{0.000131e-6, -71430.695617928, 0.000379226},
|
|
{0.000124e-6, 6279.552731642, 2.122264908},
|
|
{0.000108e-6, -6256.777530192, 0.883445696},
|
|
|
|
/* T^3 */
|
|
{0.143388e-6, 6283.075849991, 1.131453581},
|
|
{0.006671e-6, 12566.151699983, 0.775148887},
|
|
{0.001480e-6, 155.420399434, 0.480016880},
|
|
{0.000934e-6, 213.299095438, 6.144453084},
|
|
{0.000795e-6, 529.690965095, 2.941595619},
|
|
{0.000673e-6, 5746.271337896, 0.120415406},
|
|
/* 771, 780 */
|
|
{0.000672e-6, 5760.498431898, 5.317009738},
|
|
{0.000389e-6, -220.412642439, 3.090323467},
|
|
{0.000373e-6, 6062.663207553, 3.003551964},
|
|
{0.000360e-6, 6076.890301554, 1.918913041},
|
|
{0.000316e-6, -21.340641002, 5.545798121},
|
|
{0.000315e-6, -242.728603974, 1.884932563},
|
|
{0.000278e-6, 206.185548437, 1.266254859},
|
|
{0.000238e-6, -536.804512095, 4.532664830},
|
|
{0.000185e-6, 522.577418094, 4.578313856},
|
|
{0.000245e-6, 18849.227549974, 0.587467082},
|
|
/* 781, 787 */
|
|
{0.000180e-6, 426.598190876, 5.151178553},
|
|
{0.000200e-6, 553.569402842, 5.355983739},
|
|
{0.000141e-6, 5223.693919802, 1.336556009},
|
|
{0.000104e-6, 5856.477659115, 4.239842759},
|
|
|
|
/* T^4 */
|
|
{0.003826e-6, 6283.075849991, 5.705257275},
|
|
{0.000303e-6, 12566.151699983, 5.407132842},
|
|
{0.000209e-6, 155.420399434, 1.989815753},
|
|
}
|
|
|
|
/* Time since J2000.0 in Julian millennia. */
|
|
t = ((date1 - DJ00) + date2) / DJM
|
|
|
|
/* ================= */
|
|
/* Topocentric terms */
|
|
/* ================= */
|
|
|
|
/* Convert UT to local solar time in radians. */
|
|
tsol = math.Mod(ut, 1.0)*D2PI + elong
|
|
|
|
/* FUNDAMENTAL ARGUMENTS: Simon et al. 1994. */
|
|
|
|
/* Combine time argument (millennia) with deg/arcsec factor. */
|
|
w = t / 3600.0
|
|
|
|
/* Sun Mean Longitude. */
|
|
elsun = math.Mod(280.46645683+1296027711.03429*w, 360.0) * DD2R
|
|
|
|
/* Sun Mean Anomaly. */
|
|
emsun = math.Mod(357.52910918+1295965810.481*w, 360.0) * DD2R
|
|
|
|
/* Mean Elongation of Moon from Sun. */
|
|
d = math.Mod(297.85019547+16029616012.090*w, 360.0) * DD2R
|
|
|
|
/* Mean Longitude of Jupiter. */
|
|
elj = math.Mod(34.35151874+109306899.89453*w, 360.0) * DD2R
|
|
|
|
/* Mean Longitude of Saturn. */
|
|
els = math.Mod(50.07744430+44046398.47038*w, 360.0) * DD2R
|
|
|
|
/* TOPOCENTRIC TERMS: Moyer 1981 and Murray 1983. */
|
|
wt = +0.00029e-10*u*math.Sin(tsol+elsun-els) +
|
|
+0.00100e-10*u*math.Sin(tsol-2.0*emsun) +
|
|
+0.00133e-10*u*math.Sin(tsol-d) +
|
|
+0.00133e-10*u*math.Sin(tsol+elsun-elj) +
|
|
-0.00229e-10*u*math.Sin(tsol+2.0*elsun+emsun) +
|
|
-0.02200e-10*v*math.Cos(elsun+emsun) +
|
|
+0.05312e-10*u*math.Sin(tsol-emsun) +
|
|
-0.13677e-10*u*math.Sin(tsol+2.0*elsun) +
|
|
-1.31840e-10*v*math.Cos(elsun) +
|
|
+3.17679e-10*u*math.Sin(tsol)
|
|
|
|
/* ===================== */
|
|
/* Fairhead et al. model */
|
|
/* ===================== */
|
|
|
|
/* T0 */
|
|
w0 = 0
|
|
for j = 473; j >= 0; j-- {
|
|
w0 += fairhd[j][0] * math.Sin(fairhd[j][1]*t+fairhd[j][2])
|
|
}
|
|
|
|
/* T1 */
|
|
w1 = 0
|
|
for j = 678; j >= 474; j-- {
|
|
w1 += fairhd[j][0] * math.Sin(fairhd[j][1]*t+fairhd[j][2])
|
|
}
|
|
|
|
/* T2 */
|
|
w2 = 0
|
|
for j = 763; j >= 679; j-- {
|
|
w2 += fairhd[j][0] * math.Sin(fairhd[j][1]*t+fairhd[j][2])
|
|
}
|
|
|
|
/* T3 */
|
|
w3 = 0
|
|
for j = 783; j >= 764; j-- {
|
|
w3 += fairhd[j][0] * math.Sin(fairhd[j][1]*t+fairhd[j][2])
|
|
}
|
|
|
|
/* T4 */
|
|
w4 = 0
|
|
for j = 786; j >= 784; j-- {
|
|
w4 += fairhd[j][0] * math.Sin(fairhd[j][1]*t+fairhd[j][2])
|
|
}
|
|
|
|
/* Multiply by powers of T and combine. */
|
|
wf = t*(t*(t*(t*w4+w3)+w2)+w1) + w0
|
|
|
|
/* Adjustments to use JPL planetary masses instead of IAU. */
|
|
wj = 0.00065e-6*math.Sin(6069.776754*t+4.021194) +
|
|
0.00033e-6*math.Sin(213.299095*t+5.543132) +
|
|
(-0.00196e-6 * math.Sin(6208.294251*t+5.696701)) +
|
|
(-0.00173e-6 * math.Sin(74.781599*t+2.435900)) +
|
|
0.03638e-6*t*t
|
|
|
|
/* ============ */
|
|
/* Final result */
|
|
/* ============ */
|
|
|
|
/* TDB-TT in seconds. */
|
|
w = wt + wf + wj
|
|
|
|
return w
|
|
}
|
|
|
|
/*
|
|
Taitt TAI to TT.
|
|
|
|
Time scale transformation: International Atomic Time, TAI, to
|
|
Terrestrial Time, TT.
|
|
|
|
Given:
|
|
|
|
tai1,tai2 float64 TAI as a 2-part Julian Date
|
|
|
|
Returned:
|
|
|
|
tt1,tt2 float64 TT as a 2-part Julian Date
|
|
|
|
Returned (function value):
|
|
|
|
int status: 0 = OK
|
|
|
|
Note:
|
|
|
|
tai1+tai2 is Julian Date, apportioned in any convenient way
|
|
between the two arguments, for example where tai1 is the Julian
|
|
Day Number and tai2 is the fraction of a day. The returned
|
|
tt1,tt2 follow suit.
|
|
|
|
References:
|
|
|
|
McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003),
|
|
IERS Technical Note No. 32, BKG (2004)
|
|
|
|
Explanatory Supplement to the Astronomical Almanac,
|
|
P. Kenneth Seidelmann (ed), University Science Books (1992)
|
|
*/
|
|
func Taitt(tai1, tai2 float64, tt1, tt2 *float64) int {
|
|
/* TT minus TAI (days). */
|
|
const dtat = TTMTAI / DAYSEC
|
|
|
|
/* Result, safeguarding precision. */
|
|
if math.Abs(tai1) > math.Abs(tai2) {
|
|
*tt1 = tai1
|
|
*tt2 = tai2 + dtat
|
|
} else {
|
|
*tt1 = tai1 + dtat
|
|
*tt2 = tai2
|
|
}
|
|
|
|
/* Status (always OK). */
|
|
return 0
|
|
}
|
|
|
|
/*
|
|
Taiut1 TAI to UT1
|
|
|
|
Time scale transformation: International Atomic Time, TAI, to
|
|
Universal Time, UT1.
|
|
|
|
Given:
|
|
|
|
tai1,tai2 float64 TAI as a 2-part Julian Date
|
|
dta float64 UT1-TAI in seconds
|
|
|
|
Returned:
|
|
|
|
ut11,ut12 float64 UT1 as a 2-part Julian Date
|
|
|
|
Returned (function value):
|
|
|
|
int status: 0 = OK
|
|
|
|
Notes:
|
|
|
|
1. tai1+tai2 is Julian Date, apportioned in any convenient way
|
|
between the two arguments, for example where tai1 is the Julian
|
|
Day Number and tai2 is the fraction of a day. The returned
|
|
UT11,UT12 follow suit.
|
|
|
|
2. The argument dta, i.e. UT1-TAI, is an observed quantity, and is
|
|
available from IERS tabulations.
|
|
|
|
Reference:
|
|
|
|
Explanatory Supplement to the Astronomical Almanac,
|
|
P. Kenneth Seidelmann (ed), University Science Books (1992)
|
|
*/
|
|
func Taiut1(tai1, tai2, dta float64, ut11, ut12 *float64) int {
|
|
var dtad float64
|
|
|
|
/* Result, safeguarding precision. */
|
|
dtad = dta / DAYSEC
|
|
if math.Abs(tai1) > math.Abs(tai2) {
|
|
*ut11 = tai1
|
|
*ut12 = tai2 + dtad
|
|
} else {
|
|
*ut11 = tai1 + dtad
|
|
*ut12 = tai2
|
|
}
|
|
|
|
/* Status (always OK). */
|
|
return 0
|
|
}
|
|
|
|
/*
|
|
Taiutc TAI to UTC
|
|
|
|
Time scale transformation: International Atomic Time, TAI, to
|
|
Coordinated Universal Time, UTC.
|
|
|
|
Given:
|
|
|
|
tai1,tai2 float64 TAI as a 2-part Julian Date (Note 1)
|
|
|
|
Returned:
|
|
|
|
utc1,utc2 float64 UTC as a 2-part quasi Julian Date (Notes 1-3)
|
|
|
|
Returned (function value):
|
|
|
|
int status: +1 = dubious year (Note 4)
|
|
0 = OK
|
|
-1 = unacceptable date
|
|
|
|
Notes:
|
|
|
|
1. tai1+tai2 is Julian Date, apportioned in any convenient way
|
|
between the two arguments, for example where tai1 is the Julian
|
|
Day Number and tai2 is the fraction of a day. The returned utc1
|
|
and utc2 form an analogous pair, except that a special convention
|
|
is used, to deal with the problem of leap seconds - see the next
|
|
note.
|
|
|
|
2. JD cannot unambiguously represent UTC during a leap second unless
|
|
special measures are taken. The convention in the present
|
|
function is that the JD day represents UTC days whether the
|
|
length is 86399, 86400 or 86401 SI seconds. In the 1960-1972 era
|
|
there were smaller jumps (in either direction) each time the
|
|
linear UTC(TAI) expression was changed, and these "mini-leaps"
|
|
are also included in the SOFA convention.
|
|
|
|
3. The function D2dtf can be used to transform the UTC quasi-JD
|
|
into calendar date and clock time, including UTC leap second
|
|
handling.
|
|
|
|
4. The warning status "dubious year" flags UTCs that predate the
|
|
introduction of the time scale or that are too far in the future
|
|
to be trusted. See Dat for further details.
|
|
|
|
Called:
|
|
|
|
Utctai UTC to TAI
|
|
|
|
References:
|
|
|
|
McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003),
|
|
IERS Technical Note No. 32, BKG (2004)
|
|
|
|
Explanatory Supplement to the Astronomical Almanac,
|
|
P. Kenneth Seidelmann (ed), University Science Books (1992)
|
|
*/
|
|
func Taiutc(tai1, tai2 float64, utc1, utc2 *float64) int {
|
|
var big1 bool
|
|
var i, j int
|
|
var a1, a2, u1, u2, g1, g2 float64
|
|
|
|
/* Put the two parts of the TAI into big-first order. */
|
|
big1 = (math.Abs(tai1) >= math.Abs(tai2))
|
|
if big1 {
|
|
a1 = tai1
|
|
a2 = tai2
|
|
} else {
|
|
a1 = tai2
|
|
a2 = tai1
|
|
}
|
|
|
|
/* Initial guess for UTC. */
|
|
u1 = a1
|
|
u2 = a2
|
|
|
|
/* Iterate (though in most cases just once is enough). */
|
|
for i = 0; i < 3; i++ {
|
|
|
|
/* Guessed UTC to TAI. */
|
|
j = Utctai(u1, u2, &g1, &g2)
|
|
if j < 0 {
|
|
return j
|
|
}
|
|
|
|
/* Adjust guessed UTC. */
|
|
u2 += a1 - g1
|
|
u2 += a2 - g2
|
|
}
|
|
|
|
/* Return the UTC result, preserving the TAI order. */
|
|
if big1 {
|
|
*utc1 = u1
|
|
*utc2 = u2
|
|
} else {
|
|
*utc1 = u2
|
|
*utc2 = u1
|
|
}
|
|
|
|
/* Status. */
|
|
return j
|
|
}
|
|
|
|
/*
|
|
Tcbtdb TCB to TDB
|
|
|
|
Time scale transformation: Barycentric Coordinate Time, TCB, to
|
|
Barycentric Dynamical Time, TDB.
|
|
|
|
Given:
|
|
|
|
tcb1,tcb2 float64 TCB as a 2-part Julian Date
|
|
|
|
Returned:
|
|
|
|
tdb1,tdb2 float64 TDB as a 2-part Julian Date
|
|
|
|
Returned (function value):
|
|
|
|
int status: 0 = OK
|
|
|
|
Notes:
|
|
|
|
1. tcb1+tcb2 is Julian Date, apportioned in any convenient way
|
|
between the two arguments, for example where tcb1 is the Julian
|
|
Day Number and tcb2 is the fraction of a day. The returned
|
|
tdb1,tdb2 follow suit.
|
|
|
|
2. The 2006 IAU General Assembly introduced a conventional linear
|
|
transformation between TDB and TCB. This transformation
|
|
compensates for the drift between TCB and terrestrial time TT,
|
|
and keeps TDB approximately centered on TT. Because the
|
|
relationship between TT and TCB depends on the adopted solar
|
|
system ephemeris, the degree of alignment between TDB and TT over
|
|
long intervals will vary according to which ephemeris is used.
|
|
Former definitions of TDB attempted to avoid this problem by
|
|
stipulating that TDB and TT should differ only by periodic
|
|
effects. This is a good description of the nature of the
|
|
relationship but eluded precise mathematical formulation. The
|
|
conventional linear relationship adopted in 2006 sidestepped
|
|
these difficulties whilst delivering a TDB that in practice was
|
|
consistent with values before that date.
|
|
|
|
3. TDB is essentially the same as Teph, the time argument for the
|
|
JPL solar system ephemerides.
|
|
|
|
Reference:
|
|
|
|
IAU 2006 Resolution B3
|
|
*/
|
|
func Tcbtdb(tcb1, tcb2 float64, tdb1, tdb2 *float64) int {
|
|
/* 1977 Jan 1 00:00:32.184 TT, as two-part JD */
|
|
const t77td = DJM0 + DJM77
|
|
const t77tf = TTMTAI / DAYSEC
|
|
|
|
/* TDB (days) at TAI 1977 Jan 1.0 */
|
|
const tdb0 = TDB0 / DAYSEC
|
|
|
|
var d float64
|
|
|
|
/* Result, safeguarding precision. */
|
|
if math.Abs(tcb1) > math.Abs(tcb2) {
|
|
d = tcb1 - t77td
|
|
*tdb1 = tcb1
|
|
*tdb2 = tcb2 + tdb0 - (d+(tcb2-t77tf))*ELB
|
|
} else {
|
|
d = tcb2 - t77td
|
|
*tdb1 = tcb1 + tdb0 - (d+(tcb1-t77tf))*ELB
|
|
*tdb2 = tcb2
|
|
}
|
|
|
|
/* Status (always OK). */
|
|
return 0
|
|
}
|
|
|
|
/*
|
|
Tcgtt TCG to TT
|
|
|
|
Time scale transformation: Geocentric Coordinate Time, TCG, to
|
|
Terrestrial Time, TT.
|
|
|
|
Given:
|
|
|
|
tcg1,tcg2 float64 TCG as a 2-part Julian Date
|
|
|
|
Returned:
|
|
|
|
tt1,tt2 float64 TT as a 2-part Julian Date
|
|
|
|
Returned (function value):
|
|
|
|
int status: 0 = OK
|
|
|
|
Note:
|
|
|
|
tcg1+tcg2 is Julian Date, apportioned in any convenient way
|
|
between the two arguments, for example where tcg1 is the Julian
|
|
Day Number and tcg22 is the fraction of a day. The returned
|
|
tt1,tt2 follow suit.
|
|
|
|
References:
|
|
|
|
McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003),
|
|
IERS Technical Note No. 32, BKG (2004)
|
|
|
|
IAU 2000 Resolution B1.9
|
|
*/
|
|
func Tcgtt(tcg1, tcg2 float64, tt1, tt2 *float64) int {
|
|
/* 1977 Jan 1 00:00:32.184 TT, as MJD */
|
|
const t77t = DJM77 + TTMTAI/DAYSEC
|
|
|
|
/* Result, safeguarding precision. */
|
|
if math.Abs(tcg1) > math.Abs(tcg2) {
|
|
*tt1 = tcg1
|
|
*tt2 = tcg2 - ((tcg1-DJM0)+(tcg2-t77t))*ELG
|
|
} else {
|
|
*tt1 = tcg1 - ((tcg2-DJM0)+(tcg1-t77t))*ELG
|
|
*tt2 = tcg2
|
|
}
|
|
|
|
/* OK status. */
|
|
return 0
|
|
}
|
|
|
|
/*
|
|
Tdbtcb TDB to TCB
|
|
|
|
Time scale transformation: Barycentric Dynamical Time, TDB, to
|
|
Barycentric Coordinate Time, TCB.
|
|
|
|
Given:
|
|
|
|
tdb1,tdb2 float64 TDB as a 2-part Julian Date
|
|
|
|
Returned:
|
|
|
|
tcb1,tcb2 float64 TCB as a 2-part Julian Date
|
|
|
|
Returned (function value):
|
|
|
|
int status: 0 = OK
|
|
|
|
Notes:
|
|
|
|
1. tdb1+tdb2 is Julian Date, apportioned in any convenient way
|
|
between the two arguments, for example where tdb1 is the Julian
|
|
Day Number and tdb2 is the fraction of a day. The returned
|
|
tcb1,tcb2 follow suit.
|
|
|
|
2. The 2006 IAU General Assembly introduced a conventional linear
|
|
transformation between TDB and TCB. This transformation
|
|
compensates for the drift between TCB and terrestrial time TT,
|
|
and keeps TDB approximately centered on TT. Because the
|
|
relationship between TT and TCB depends on the adopted solar
|
|
system ephemeris, the degree of alignment between TDB and TT over
|
|
long intervals will vary according to which ephemeris is used.
|
|
Former definitions of TDB attempted to avoid this problem by
|
|
stipulating that TDB and TT should differ only by periodic
|
|
effects. This is a good description of the nature of the
|
|
relationship but eluded precise mathematical formulation. The
|
|
conventional linear relationship adopted in 2006 sidestepped
|
|
these difficulties whilst delivering a TDB that in practice was
|
|
consistent with values before that date.
|
|
|
|
3. TDB is essentially the same as Teph, the time argument for the
|
|
JPL solar system ephemerides.
|
|
|
|
Reference:
|
|
|
|
IAU 2006 Resolution B3
|
|
*/
|
|
func Tdbtcb(tdb1, tdb2 float64, tcb1, tcb2 *float64) int {
|
|
/* 1977 Jan 1 00:00:32.184 TT, as two-part JD */
|
|
const t77td = DJM0 + DJM77
|
|
const t77tf = TTMTAI / DAYSEC
|
|
|
|
/* TDB (days) at TAI 1977 Jan 1.0 */
|
|
const tdb0 = TDB0 / DAYSEC
|
|
|
|
/* TDB to TCB rate */
|
|
const elbb = ELB / (1.0 - ELB)
|
|
|
|
var d, f float64
|
|
|
|
/* Result, preserving date format but safeguarding precision. */
|
|
if math.Abs(tdb1) > math.Abs(tdb2) {
|
|
d = t77td - tdb1
|
|
f = tdb2 - tdb0
|
|
*tcb1 = tdb1
|
|
*tcb2 = f - (d-(f-t77tf))*elbb
|
|
} else {
|
|
d = t77td - tdb2
|
|
f = tdb1 - tdb0
|
|
*tcb1 = f - (d-(f-t77tf))*elbb
|
|
*tcb2 = tdb2
|
|
}
|
|
|
|
/* Status (always OK). */
|
|
return 0
|
|
}
|
|
|
|
/*
|
|
Tdbtt TDB to TT
|
|
|
|
Time scale transformation: Barycentric Dynamical Time, TDB, to
|
|
Terrestrial Time, TT.
|
|
|
|
Given:
|
|
|
|
tdb1,tdb2 float64 TDB as a 2-part Julian Date
|
|
dtr float64 TDB-TT in seconds
|
|
|
|
Returned:
|
|
|
|
tt1,tt2 float64 TT as a 2-part Julian Date
|
|
|
|
Returned (function value):
|
|
|
|
int status: 0 = OK
|
|
|
|
Notes:
|
|
|
|
1. tdb1+tdb2 is Julian Date, apportioned in any convenient way
|
|
between the two arguments, for example where tdb1 is the Julian
|
|
Day Number and tdb2 is the fraction of a day. The returned
|
|
tt1,tt2 follow suit.
|
|
|
|
2. The argument dtr represents the quasi-periodic component of the
|
|
GR transformation between TT and TCB. It is dependent upon the
|
|
adopted solar-system ephemeris, and can be obtained by numerical
|
|
integration, by interrogating a precomputed time ephemeris or by
|
|
evaluating a model such as that implemented in the SOFA function
|
|
Dtdb. The quantity is dominated by an annual term of 1.7 ms
|
|
amplitude.
|
|
|
|
3. TDB is essentially the same as Teph, the time argument for the
|
|
JPL solar system ephemerides.
|
|
|
|
References:
|
|
|
|
McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003),
|
|
IERS Technical Note No. 32, BKG (2004)
|
|
|
|
IAU 2006 Resolution 3
|
|
*/
|
|
func Tdbtt(tdb1, tdb2, dtr float64, tt1, tt2 *float64) int {
|
|
var dtrd float64
|
|
|
|
/* Result, safeguarding precision. */
|
|
dtrd = dtr / DAYSEC
|
|
if math.Abs(tdb1) > math.Abs(tdb2) {
|
|
*tt1 = tdb1
|
|
*tt2 = tdb2 - dtrd
|
|
} else {
|
|
*tt1 = tdb1 - dtrd
|
|
*tt2 = tdb2
|
|
}
|
|
|
|
/* Status (always OK). */
|
|
return 0
|
|
}
|
|
|
|
/*
|
|
Tttai TT to TAI
|
|
|
|
Time scale transformation: Terrestrial Time, TT, to International
|
|
Atomic Time, TAI.
|
|
|
|
Given:
|
|
|
|
tt1,tt2 float64 TT as a 2-part Julian Date
|
|
|
|
Returned:
|
|
|
|
tai1,tai2 float64 TAI as a 2-part Julian Date
|
|
|
|
Returned (function value):
|
|
|
|
int status: 0 = OK
|
|
|
|
Note:
|
|
|
|
tt1+tt2 is Julian Date, apportioned in any convenient way between
|
|
the two arguments, for example where tt1 is the Julian Day Number
|
|
and tt2 is the fraction of a day. The returned tai1,tai2 follow
|
|
suit.
|
|
|
|
References:
|
|
|
|
McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003),
|
|
IERS Technical Note No. 32, BKG (2004)
|
|
|
|
Explanatory Supplement to the Astronomical Almanac,
|
|
P. Kenneth Seidelmann (ed), University Science Books (1992)
|
|
*/
|
|
func Tttai(tt1, tt2 float64, tai1, tai2 *float64) int {
|
|
/* TT minus TAI (days). */
|
|
const dtat = TTMTAI / DAYSEC
|
|
|
|
/* Result, safeguarding precision. */
|
|
if math.Abs(tt1) > math.Abs(tt2) {
|
|
*tai1 = tt1
|
|
*tai2 = tt2 - dtat
|
|
} else {
|
|
*tai1 = tt1 - dtat
|
|
*tai2 = tt2
|
|
}
|
|
|
|
/* Status (always OK). */
|
|
return 0
|
|
|
|
}
|
|
|
|
/*
|
|
Tttcg TT to TCG
|
|
|
|
Time scale transformation: Terrestrial Time, TT, to Geocentric
|
|
Coordinate Time, TCG.
|
|
|
|
Given:
|
|
|
|
tt1,tt2 float64 TT as a 2-part Julian Date
|
|
|
|
Returned:
|
|
|
|
tcg1,tcg2 float64 TCG as a 2-part Julian Date
|
|
|
|
Returned (function value):
|
|
|
|
int status: 0 = OK
|
|
|
|
Note:
|
|
|
|
tt1+tt2 is Julian Date, apportioned in any convenient way between
|
|
the two arguments, for example where tt1 is the Julian Day Number
|
|
and tt2 is the fraction of a day. The returned tcg1,tcg2 follow
|
|
suit.
|
|
|
|
References:
|
|
|
|
McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003),
|
|
IERS Technical Note No. 32, BKG (2004)
|
|
|
|
IAU 2000 Resolution B1.9
|
|
*/
|
|
func Tttcg(tt1, tt2 float64, tcg1, tcg2 *float64) int {
|
|
/* 1977 Jan 1 00:00:32.184 TT, as MJD */
|
|
const t77t = DJM77 + TTMTAI/DAYSEC
|
|
|
|
/* TT to TCG rate */
|
|
const elgg = ELG / (1.0 - ELG)
|
|
|
|
/* Result, safeguarding precision. */
|
|
if math.Abs(tt1) > math.Abs(tt2) {
|
|
*tcg1 = tt1
|
|
*tcg2 = tt2 + ((tt1-DJM0)+(tt2-t77t))*elgg
|
|
} else {
|
|
*tcg1 = tt1 + ((tt2-DJM0)+(tt1-t77t))*elgg
|
|
*tcg2 = tt2
|
|
}
|
|
|
|
/* Status (always OK). */
|
|
return 0
|
|
}
|
|
|
|
/*
|
|
Tttdb TT to TDB
|
|
|
|
Time scale transformation: Terrestrial Time, TT, to Barycentric
|
|
Dynamical Time, TDB.
|
|
|
|
Given:
|
|
|
|
tt1,tt2 float64 TT as a 2-part Julian Date
|
|
dtr float64 TDB-TT in seconds
|
|
|
|
Returned:
|
|
|
|
tdb1,tdb2 float64 TDB as a 2-part Julian Date
|
|
|
|
Returned (function value):
|
|
|
|
int status: 0 = OK
|
|
|
|
Notes:
|
|
|
|
1. tt1+tt2 is Julian Date, apportioned in any convenient way between
|
|
the two arguments, for example where tt1 is the Julian Day Number
|
|
and tt2 is the fraction of a day. The returned tdb1,tdb2 follow
|
|
suit.
|
|
|
|
2. The argument dtr represents the quasi-periodic component of the
|
|
GR transformation between TT and TCB. It is dependent upon the
|
|
adopted solar-system ephemeris, and can be obtained by numerical
|
|
integration, by interrogating a precomputed time ephemeris or by
|
|
evaluating a model such as that implemented in the SOFA function
|
|
Dtdb. The quantity is dominated by an annual term of 1.7 ms
|
|
amplitude.
|
|
|
|
3. TDB is essentially the same as Teph, the time argument for the JPL
|
|
solar system ephemerides.
|
|
|
|
References:
|
|
|
|
McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003),
|
|
IERS Technical Note No. 32, BKG (2004)
|
|
|
|
IAU 2006 Resolution 3
|
|
*/
|
|
func Tttdb(tt1, tt2, dtr float64, tdb1, tdb2 *float64) int {
|
|
var dtrd float64
|
|
|
|
/* Result, safeguarding precision. */
|
|
dtrd = dtr / DAYSEC
|
|
if math.Abs(tt1) > math.Abs(tt2) {
|
|
*tdb1 = tt1
|
|
*tdb2 = tt2 + dtrd
|
|
} else {
|
|
*tdb1 = tt1 + dtrd
|
|
*tdb2 = tt2
|
|
}
|
|
|
|
/* Status (always OK). */
|
|
return 0
|
|
}
|
|
|
|
/*
|
|
Ttut1 TT to UT1
|
|
|
|
Time scale transformation: Terrestrial Time, TT, to Universal Time,
|
|
UT1.
|
|
|
|
Given:
|
|
|
|
tt1,tt2 float64 TT as a 2-part Julian Date
|
|
dt float64 TT-UT1 in seconds
|
|
|
|
Returned:
|
|
|
|
ut11,ut12 float64 UT1 as a 2-part Julian Date
|
|
|
|
Returned (function value):
|
|
|
|
int status: 0 = OK
|
|
|
|
Notes:
|
|
|
|
1. tt1+tt2 is Julian Date, apportioned in any convenient way between
|
|
the two arguments, for example where tt1 is the Julian Day Number
|
|
and tt2 is the fraction of a day. The returned ut11,ut12 follow
|
|
suit.
|
|
|
|
2. The argument dt is classical Delta T.
|
|
|
|
Reference:
|
|
|
|
Explanatory Supplement to the Astronomical Almanac,
|
|
P. Kenneth Seidelmann (ed), University Science Books (1992)
|
|
*/
|
|
func Ttut1(tt1, tt2, dt float64, ut11, ut12 *float64) int {
|
|
var dtd float64
|
|
|
|
/* Result, safeguarding precision. */
|
|
dtd = dt / DAYSEC
|
|
if math.Abs(tt1) > math.Abs(tt2) {
|
|
*ut11 = tt1
|
|
*ut12 = tt2 - dtd
|
|
} else {
|
|
*ut11 = tt1 - dtd
|
|
*ut12 = tt2
|
|
}
|
|
|
|
/* Status (always OK). */
|
|
return 0
|
|
}
|
|
|
|
/*
|
|
Ut1tai UT1 to TAI
|
|
|
|
Time scale transformation: Universal Time, UT1, to International
|
|
Atomic Time, TAI.
|
|
|
|
Given:
|
|
|
|
ut11,ut12 float64 UT1 as a 2-part Julian Date
|
|
dta float64 UT1-TAI in seconds
|
|
|
|
Returned:
|
|
|
|
tai1,tai2 float64 TAI as a 2-part Julian Date
|
|
|
|
Returned (function value):
|
|
|
|
int status: 0 = OK
|
|
|
|
Notes:
|
|
|
|
1. ut11+ut12 is Julian Date, apportioned in any convenient way
|
|
between the two arguments, for example where ut11 is the Julian
|
|
Day Number and ut12 is the fraction of a day. The returned
|
|
tai1,tai2 follow suit.
|
|
|
|
2. The argument dta, i.e. UT1-TAI, is an observed quantity, and is
|
|
available from IERS tabulations.
|
|
|
|
Reference:
|
|
|
|
Explanatory Supplement to the Astronomical Almanac,
|
|
P. Kenneth Seidelmann (ed), University Science Books (1992)
|
|
*/
|
|
func Ut1tai(ut11, ut12, dta float64, tai1, tai2 *float64) int {
|
|
var dtad float64
|
|
|
|
/* Result, safeguarding precision. */
|
|
dtad = dta / DAYSEC
|
|
if math.Abs(ut11) > math.Abs(ut12) {
|
|
*tai1 = ut11
|
|
*tai2 = ut12 - dtad
|
|
} else {
|
|
*tai1 = ut11 - dtad
|
|
*tai2 = ut12
|
|
}
|
|
|
|
/* Status (always OK). */
|
|
return 0
|
|
}
|
|
|
|
/*
|
|
Ut1tt UT1 to TT
|
|
|
|
Time scale transformation: Universal Time, UT1, to Terrestrial
|
|
Time, TT.
|
|
|
|
Given:
|
|
|
|
ut11,ut12 float64 UT1 as a 2-part Julian Date
|
|
dt float64 TT-UT1 in seconds
|
|
|
|
Returned:
|
|
|
|
tt1,tt2 float64 TT as a 2-part Julian Date
|
|
|
|
Returned (function value):
|
|
|
|
int status: 0 = OK
|
|
|
|
Notes:
|
|
|
|
1. ut11+ut12 is Julian Date, apportioned in any convenient way
|
|
between the two arguments, for example where ut11 is the Julian
|
|
Day Number and ut12 is the fraction of a day. The returned
|
|
tt1,tt2 follow suit.
|
|
|
|
2. The argument dt is classical Delta T.
|
|
|
|
Reference:
|
|
|
|
Explanatory Supplement to the Astronomical Almanac,
|
|
P. Kenneth Seidelmann (ed), University Science Books (1992)
|
|
*/
|
|
func Ut1tt(ut11, ut12, dt float64, tt1, tt2 *float64) int {
|
|
var dtd float64
|
|
|
|
/* Result, safeguarding precision. */
|
|
dtd = dt / DAYSEC
|
|
if math.Abs(ut11) > math.Abs(ut12) {
|
|
*tt1 = ut11
|
|
*tt2 = ut12 + dtd
|
|
} else {
|
|
*tt1 = ut11 + dtd
|
|
*tt2 = ut12
|
|
}
|
|
|
|
/* Status (always OK). */
|
|
return 0
|
|
}
|
|
|
|
/*
|
|
Ut1utc UT1 to UTC
|
|
|
|
Time scale transformation: Universal Time, UT1, to Coordinated
|
|
Universal Time, UTC.
|
|
|
|
Given:
|
|
|
|
ut11,ut12 float64 UT1 as a 2-part Julian Date (Note 1)
|
|
dut1 float64 Delta UT1: UT1-UTC in seconds (Note 2)
|
|
|
|
Returned:
|
|
|
|
utc1,utc2 float64 UTC as a 2-part quasi Julian Date (Notes 3,4)
|
|
|
|
Returned (function value):
|
|
|
|
int status: +1 = dubious year (Note 5)
|
|
0 = OK
|
|
-1 = unacceptable date
|
|
|
|
Notes:
|
|
|
|
1. ut11+ut12 is Julian Date, apportioned in any convenient way
|
|
between the two arguments, for example where ut11 is the Julian
|
|
Day Number and ut12 is the fraction of a day. The returned utc1
|
|
and utc2 form an analogous pair, except that a special convention
|
|
is used, to deal with the problem of leap seconds - see Note 3.
|
|
|
|
2. Delta UT1 can be obtained from tabulations provided by the
|
|
International Earth Rotation and Reference Systems Service. The
|
|
value changes abruptly by 1s at a leap second; however, close to
|
|
a leap second the algorithm used here is tolerant of the "wrong"
|
|
choice of value being made.
|
|
|
|
3. JD cannot unambiguously represent UTC during a leap second unless
|
|
special measures are taken. The convention in the present
|
|
function is that the returned quasi-JD UTC1+UTC2 represents UTC
|
|
days whether the length is 86399, 86400 or 86401 SI seconds.
|
|
|
|
4. The function D2dtf can be used to transform the UTC quasi-JD
|
|
into calendar date and clock time, including UTC leap second
|
|
handling.
|
|
|
|
5. The warning status "dubious year" flags UTCs that predate the
|
|
introduction of the time scale or that are too far in the future
|
|
to be trusted. See Dat for further details.
|
|
|
|
Called:
|
|
|
|
Jd2cal JD to Gregorian calendar
|
|
Dat delta(AT) = TAI-UTC
|
|
Cal2jd Gregorian calendar to JD
|
|
|
|
References:
|
|
|
|
McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003),
|
|
IERS Technical Note No. 32, BKG (2004)
|
|
|
|
Explanatory Supplement to the Astronomical Almanac,
|
|
P. Kenneth Seidelmann (ed), University Science Books (1992)
|
|
*/
|
|
func Ut1utc(ut11, ut12, dut1 float64, utc1, utc2 *float64) int {
|
|
var big1 bool
|
|
var i, iy, im, id, js int
|
|
var duts, u1, u2, d1, dats1, d2, fd, dats2, ddats, us1, us2, du float64
|
|
|
|
/* UT1-UTC in seconds. */
|
|
duts = dut1
|
|
|
|
/* Put the two parts of the UT1 into big-first order. */
|
|
big1 = (math.Abs(ut11) >= math.Abs(ut12))
|
|
if big1 {
|
|
u1 = ut11
|
|
u2 = ut12
|
|
} else {
|
|
u1 = ut12
|
|
u2 = ut11
|
|
}
|
|
|
|
/* See if the UT1 can possibly be in a leap-second day. */
|
|
d1 = u1
|
|
dats1 = 0
|
|
for i = -1; i <= 3; i++ {
|
|
d2 = u2 + float64(i)
|
|
if Jd2cal(d1, d2, &iy, &im, &id, &fd) != 0 {
|
|
return -1
|
|
}
|
|
js = Dat(iy, im, id, 0.0, &dats2)
|
|
if js < 0 {
|
|
return -1
|
|
}
|
|
if i == -1 {
|
|
dats1 = dats2
|
|
}
|
|
ddats = dats2 - dats1
|
|
if math.Abs(ddats) >= 0.5 {
|
|
|
|
/* Yes, leap second nearby: ensure UT1-UTC is "before" value. */
|
|
if ddats*duts >= 0 {
|
|
duts -= ddats
|
|
}
|
|
|
|
/* UT1 for the start of the UTC day that ends in a leap. */
|
|
if Cal2jd(iy, im, id, &d1, &d2) != 0 {
|
|
return -1
|
|
}
|
|
us1 = d1
|
|
us2 = d2 - 1.0 + duts/DAYSEC
|
|
|
|
/* Is the UT1 after this point? */
|
|
du = u1 - us1
|
|
du += u2 - us2
|
|
if du > 0 {
|
|
|
|
/* Yes: fraction of the current UTC day that has elapsed. */
|
|
fd = du * DAYSEC / (DAYSEC + ddats)
|
|
|
|
/* Ramp UT1-UTC to bring about SOFA's JD(UTC) convention. */
|
|
//duts += ddats * ( fd <= 1.0 ? fd : 1.0 );
|
|
if fd <= 1.0 {
|
|
duts += ddats * fd
|
|
} else {
|
|
duts += ddats
|
|
}
|
|
}
|
|
|
|
/* Done. */
|
|
break
|
|
}
|
|
dats1 = dats2
|
|
}
|
|
|
|
/* Subtract the (possibly adjusted) UT1-UTC from UT1 to give UTC. */
|
|
u2 -= duts / DAYSEC
|
|
|
|
/* Result, safeguarding precision. */
|
|
if big1 {
|
|
*utc1 = u1
|
|
*utc2 = u2
|
|
} else {
|
|
*utc1 = u2
|
|
*utc2 = u1
|
|
}
|
|
|
|
/* Status. */
|
|
return js
|
|
}
|
|
|
|
/*
|
|
Utctai UTC to TAI
|
|
|
|
Time scale transformation: Coordinated Universal Time, UTC, to
|
|
International Atomic Time, TAI.
|
|
|
|
Given:
|
|
|
|
utc1,utc2 float64 UTC as a 2-part quasi Julian Date (Notes 1-4)
|
|
|
|
Returned:
|
|
|
|
tai1,tai2 float64 TAI as a 2-part Julian Date (Note 5)
|
|
|
|
Returned (function value):
|
|
|
|
int status: +1 = dubious year (Note 3)
|
|
0 = OK
|
|
-1 = unacceptable date
|
|
|
|
Notes:
|
|
|
|
1. utc1+utc2 is quasi Julian Date (see Note 2), apportioned in any
|
|
convenient way between the two arguments, for example where utc1
|
|
is the Julian Day Number and utc2 is the fraction of a day.
|
|
|
|
2. JD cannot unambiguously represent UTC during a leap second unless
|
|
special measures are taken. The convention in the present
|
|
function is that the JD day represents UTC days whether the
|
|
length is 86399, 86400 or 86401 SI seconds. In the 1960-1972 era
|
|
there were smaller jumps (in either direction) each time the
|
|
linear UTC(TAI) expression was changed, and these "mini-leaps"
|
|
are also included in the SOFA convention.
|
|
|
|
3. The warning status "dubious year" flags UTCs that predate the
|
|
introduction of the time scale or that are too far in the future
|
|
to be trusted. See Dat for further details.
|
|
|
|
4. The function Dtf2d converts from calendar date and time of day
|
|
into 2-part Julian Date, and in the case of UTC implements the
|
|
leap-second-ambiguity convention described above.
|
|
|
|
5. The returned TAI1,TAI2 are such that their sum is the TAI Julian
|
|
Date.
|
|
|
|
Called:
|
|
|
|
Jd2cal JD to Gregorian calendar
|
|
Dat delta(AT) = TAI-UTC
|
|
Cal2jd Gregorian calendar to JD
|
|
|
|
References:
|
|
|
|
McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003),
|
|
IERS Technical Note No. 32, BKG (2004)
|
|
|
|
Explanatory Supplement to the Astronomical Almanac,
|
|
P. Kenneth Seidelmann (ed), University Science Books (1992)
|
|
*/
|
|
func Utctai(utc1, utc2 float64, tai1, tai2 *float64) int {
|
|
var big1 bool
|
|
var iy, im, id, j, iyt, imt, idt int
|
|
var u1, u2, fd, dat0, dat12, w, dat24, dlod, dleap, z1, z2, a2 float64
|
|
|
|
/* Put the two parts of the UTC into big-first order. */
|
|
big1 = (math.Abs(utc1) >= math.Abs(utc2))
|
|
if big1 {
|
|
u1 = utc1
|
|
u2 = utc2
|
|
} else {
|
|
u1 = utc2
|
|
u2 = utc1
|
|
}
|
|
|
|
/* Get TAI-UTC at 0h today. */
|
|
j = Jd2cal(u1, u2, &iy, &im, &id, &fd)
|
|
if j != 0 {
|
|
return j
|
|
}
|
|
j = Dat(iy, im, id, 0.0, &dat0)
|
|
if j < 0 {
|
|
return j
|
|
}
|
|
|
|
/* Get TAI-UTC at 12h today (to detect drift). */
|
|
j = Dat(iy, im, id, 0.5, &dat12)
|
|
if j < 0 {
|
|
return j
|
|
}
|
|
|
|
/* Get TAI-UTC at 0h tomorrow (to detect jumps). */
|
|
j = Jd2cal(u1+1.5, u2-fd, &iyt, &imt, &idt, &w)
|
|
if j != 0 {
|
|
return j
|
|
}
|
|
j = Dat(iyt, imt, idt, 0.0, &dat24)
|
|
if j < 0 {
|
|
return j
|
|
}
|
|
|
|
/* Separate TAI-UTC change into per-day (DLOD) and any jump (DLEAP). */
|
|
dlod = 2.0 * (dat12 - dat0)
|
|
dleap = dat24 - (dat0 + dlod)
|
|
|
|
/* Remove any scaling applied to spread leap into preceding day. */
|
|
fd *= (DAYSEC + dleap) / DAYSEC
|
|
|
|
/* Scale from (pre-1972) UTC seconds to SI seconds. */
|
|
fd *= (DAYSEC + dlod) / DAYSEC
|
|
|
|
/* Today's calendar date to 2-part JD. */
|
|
if Cal2jd(iy, im, id, &z1, &z2) != 0 {
|
|
return -1
|
|
}
|
|
|
|
/* Assemble the TAI result, preserving the UTC split and order. */
|
|
a2 = z1 - u1
|
|
a2 += z2
|
|
a2 += fd + dat0/DAYSEC
|
|
if big1 {
|
|
*tai1 = u1
|
|
*tai2 = a2
|
|
} else {
|
|
*tai1 = a2
|
|
*tai2 = u1
|
|
}
|
|
|
|
/* Status. */
|
|
return j
|
|
}
|
|
|
|
/*
|
|
Utcut1 UTC to UT1
|
|
|
|
Time scale transformation: Coordinated Universal Time, UTC, to
|
|
Universal Time, UT1.
|
|
|
|
Given:
|
|
|
|
utc1,utc2 float64 UTC as a 2-part quasi Julian Date (Notes 1-4)
|
|
dut1 float64 Delta UT1 = UT1-UTC in seconds (Note 5)
|
|
|
|
Returned:
|
|
|
|
ut11,ut12 float64 UT1 as a 2-part Julian Date (Note 6)
|
|
|
|
Returned (function value):
|
|
|
|
int status: +1 = dubious year (Note 3)
|
|
0 = OK
|
|
-1 = unacceptable date
|
|
|
|
Notes:
|
|
|
|
1. utc1+utc2 is quasi Julian Date (see Note 2), apportioned in any
|
|
convenient way between the two arguments, for example where utc1
|
|
is the Julian Day Number and utc2 is the fraction of a day.
|
|
|
|
2. JD cannot unambiguously represent UTC during a leap second unless
|
|
special measures are taken. The convention in the present
|
|
function is that the JD day represents UTC days whether the
|
|
length is 86399, 86400 or 86401 SI seconds.
|
|
|
|
3. The warning status "dubious year" flags UTCs that predate the
|
|
introduction of the time scale or that are too far in the future
|
|
to be trusted. See Dat for further details.
|
|
|
|
4. The function Dtf2d converts from calendar date and time of
|
|
day into 2-part Julian Date, and in the case of UTC implements
|
|
the leap-second-ambiguity convention described above.
|
|
|
|
5. Delta UT1 can be obtained from tabulations provided by the
|
|
International Earth Rotation and Reference Systems Service.
|
|
It is the caller's responsibility to supply a dut1 argument
|
|
containing the UT1-UTC value that matches the given UTC.
|
|
|
|
6. The returned ut11,ut12 are such that their sum is the UT1 Julian
|
|
Date.
|
|
|
|
References:
|
|
|
|
McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003),
|
|
IERS Technical Note No. 32, BKG (2004)
|
|
|
|
Explanatory Supplement to the Astronomical Almanac,
|
|
P. Kenneth Seidelmann (ed), University Science Books (1992)
|
|
|
|
Called:
|
|
Jd2cal JD to Gregorian calendar
|
|
Dat delta(AT) = TAI-UTC
|
|
Utctai UTC to TAI
|
|
Taiut1 TAI to UT1
|
|
*/
|
|
func Utcut1(utc1, utc2, dut1 float64, ut11, ut12 *float64) int {
|
|
var iy, im, id, js, jw int
|
|
var w, dat, dta, tai1, tai2 float64
|
|
|
|
/* Look up TAI-UTC. */
|
|
if Jd2cal(utc1, utc2, &iy, &im, &id, &w) != 0 {
|
|
return -1
|
|
}
|
|
js = Dat(iy, im, id, 0.0, &dat)
|
|
if js < 0 {
|
|
return -1
|
|
}
|
|
|
|
/* Form UT1-TAI. */
|
|
dta = dut1 - dat
|
|
|
|
/* UTC to TAI to UT1. */
|
|
jw = Utctai(utc1, utc2, &tai1, &tai2)
|
|
if jw < 0 {
|
|
return -1
|
|
} else if jw > 0 {
|
|
js = jw
|
|
}
|
|
if Taiut1(tai1, tai2, dta, ut11, ut12) != 0 {
|
|
return -1
|
|
}
|
|
|
|
/* Status. */
|
|
return js
|
|
|
|
}
|