line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
=head1 NAME |
2
|
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
Time::TT - Terrestrial Time and its realisations |
4
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
=head1 SYNOPSIS |
6
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
use Time::TT qw(tt_instant_to_mjd tt_mjd_to_instant); |
8
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
$mjd = tt_instant_to_mjd($instant); |
10
|
|
|
|
|
|
|
$instant = tt_mjd_to_instant($mjd); |
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
use Time::TT qw(tt_instant_to_jepoch tt_jepoch_to_instant); |
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
$jepoch = tt_instant_to_jepoch($instant); |
15
|
|
|
|
|
|
|
$instant = tt_jepoch_to_instant($jepoch); |
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
use Time::TT qw(tt_realisation); |
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
$rln = tt_realisation("bipm05"); |
20
|
|
|
|
|
|
|
$instant = $rln->from_tai($tai_instant); |
21
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
=head1 DESCRIPTION |
23
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
Terrestrial Time (TT) is a time scale representing time on the surface |
25
|
|
|
|
|
|
|
of Terra. Specifically, it is the proper time experienced by a clock |
26
|
|
|
|
|
|
|
located on the rotating geoid (i.e., at sea level). It is indirectly the |
27
|
|
|
|
|
|
|
basis for Terran civil timekeeping, via its realisation International |
28
|
|
|
|
|
|
|
Atomic Time (TAI). It is linearly related to (and in fact now defined |
29
|
|
|
|
|
|
|
in terms of) the astronomical time scale Geocentric Coordinate Time (TCG). |
30
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
This module represents instants on the TT time scale as a scalar number |
32
|
|
|
|
|
|
|
of SI seconds since an epoch. This is an appropriate form for all manner |
33
|
|
|
|
|
|
|
of calculations. The TT scale is defined with a well-known point at |
34
|
|
|
|
|
|
|
TAI instant 1977-01-01T00:00:00.0. That instant is assigned the scalar |
35
|
|
|
|
|
|
|
value 599_616_000 exactly, corresponding to an epoch (scalar value zero) |
36
|
|
|
|
|
|
|
near the TAI epoch 1958-01-01T00:00:00.0. This matches the convention |
37
|
|
|
|
|
|
|
used by C for instants on the TAI scale. Because TAI does |
38
|
|
|
|
|
|
|
not match the rate of TT perfectly, the TT epoch is not precisely equal |
39
|
|
|
|
|
|
|
to the TAI epoch, but is instead around 600 us earlier than it. |
40
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
There is also a conventional way to represent TT instants using day-based |
42
|
|
|
|
|
|
|
notations associated with planetary rotation `time' scales. The `day' |
43
|
|
|
|
|
|
|
of TT is a nominal period of exactly 86400 SI seconds, which is slightly |
44
|
|
|
|
|
|
|
shorter than an actual Terran day. The well-known point at TAI instant |
45
|
|
|
|
|
|
|
1977-01-01T00:00:00.0 is assigned the label 1977-01-01T00:00:32.184 |
46
|
|
|
|
|
|
|
(MJD 43144.0003725). Because TT is not connected to Terran rotation, |
47
|
|
|
|
|
|
|
and so has no inherent concept of a day, it is somewhat misleading to |
48
|
|
|
|
|
|
|
use such day-based notations. Conversion between this notation and the |
49
|
|
|
|
|
|
|
linear count of seconds is supported by this module. This notation does |
50
|
|
|
|
|
|
|
not match the similar day-based notation used for TAI. |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
There is another conventional way to represent TT instants, using a larger |
53
|
|
|
|
|
|
|
unit approximating the duration of a Terran year. The `Julian year' |
54
|
|
|
|
|
|
|
is a nominal period of exactly 365.25 `days' of exactly 86400 SI seconds |
55
|
|
|
|
|
|
|
each. The TT instant 2000-01-01T12:00:00.0 (MJD 51544.5) is labelled as |
56
|
|
|
|
|
|
|
Julian epoch 2000.0. Julian epochs are used only with TT, not with any |
57
|
|
|
|
|
|
|
other time scale. The Julian epoch numbers correspond approximately to |
58
|
|
|
|
|
|
|
Gregorian calendar years, for dates within a few kiloyears of the epoch. |
59
|
|
|
|
|
|
|
Because TT is not connected to the Terran orbit, and so has no inherent |
60
|
|
|
|
|
|
|
concept of a year, the year-based notation is somewhat misleading. |
61
|
|
|
|
|
|
|
Conversion between this notation and the linear count of seconds is |
62
|
|
|
|
|
|
|
supported by this module. |
63
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
Because TT is a theoretical time scale, not directly accessible for |
65
|
|
|
|
|
|
|
practical use, it must be realised using atomic clocks. This is done |
66
|
|
|
|
|
|
|
by metrological agencies, each with different imperfections. To achieve |
67
|
|
|
|
|
|
|
microsecond accuracy it is necessary to take account of these differences. |
68
|
|
|
|
|
|
|
This module supports conversion of times between different realisations |
69
|
|
|
|
|
|
|
of TT. |
70
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
=cut |
72
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
package Time::TT; |
74
|
|
|
|
|
|
|
|
75
|
2
|
|
|
2
|
|
50542
|
{ use 5.006; } |
|
2
|
|
|
|
|
7
|
|
|
2
|
|
|
|
|
82
|
|
76
|
2
|
|
|
2
|
|
13
|
use warnings; |
|
2
|
|
|
|
|
3
|
|
|
2
|
|
|
|
|
61
|
|
77
|
2
|
|
|
2
|
|
25
|
use strict; |
|
2
|
|
|
|
|
9
|
|
|
2
|
|
|
|
|
78
|
|
78
|
|
|
|
|
|
|
|
79
|
2
|
|
|
2
|
|
10
|
use Carp qw(croak); |
|
2
|
|
|
|
|
3
|
|
|
2
|
|
|
|
|
196
|
|
80
|
2
|
|
|
2
|
|
2134
|
use Math::BigRat 0.13; |
|
2
|
|
|
|
|
181182
|
|
|
2
|
|
|
|
|
12
|
|
81
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
our $VERSION = "0.005"; |
83
|
|
|
|
|
|
|
|
84
|
2
|
|
|
2
|
|
4520
|
use parent "Exporter"; |
|
2
|
|
|
|
|
681
|
|
|
2
|
|
|
|
|
14
|
|
85
|
|
|
|
|
|
|
our @EXPORT_OK = qw( |
86
|
|
|
|
|
|
|
tt_instant_to_mjd tt_mjd_to_instant |
87
|
|
|
|
|
|
|
tt_instant_to_jepoch tt_jepoch_to_instant |
88
|
|
|
|
|
|
|
tt_realisation |
89
|
|
|
|
|
|
|
); |
90
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
=head1 FUNCTIONS |
92
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
=over |
94
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
=item tt_instant_to_mjd(INSTANT) |
96
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
Converts from a count of seconds to a Modified Julian Date in the manner |
98
|
|
|
|
|
|
|
conventional for TT. The MJD can be further converted to other forms of |
99
|
|
|
|
|
|
|
day-based date using other modules. The input must be a C |
100
|
|
|
|
|
|
|
object, and the result is the same type. |
101
|
|
|
|
|
|
|
|
102
|
|
|
|
|
|
|
=cut |
103
|
|
|
|
|
|
|
|
104
|
2
|
|
|
2
|
|
208
|
use constant TT_EPOCH_MJD => Math::BigRat->new("36204.0003725"); |
|
2
|
|
|
|
|
3
|
|
|
2
|
|
|
|
|
13
|
|
105
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
sub tt_instant_to_mjd($) { |
107
|
4
|
|
|
4
|
1
|
5796
|
my($tt) = @_; |
108
|
4
|
|
|
|
|
18
|
return TT_EPOCH_MJD + ($tt / 86400); |
109
|
|
|
|
|
|
|
} |
110
|
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
=item tt_mjd_to_instant(MJD) |
112
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
Converts from a Modified Julian Date, interpreted in the manner |
114
|
|
|
|
|
|
|
conventional for TT, to a count of seconds. The input must be a |
115
|
|
|
|
|
|
|
C object, and the result is the same type. |
116
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
=cut |
118
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
sub tt_mjd_to_instant($) { |
120
|
4
|
|
|
4
|
1
|
4559
|
my($mjd) = @_; |
121
|
4
|
|
|
|
|
14
|
return ($mjd - TT_EPOCH_MJD) * 86400; |
122
|
|
|
|
|
|
|
} |
123
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
=item tt_instant_to_jepoch(INSTANT) |
125
|
|
|
|
|
|
|
|
126
|
|
|
|
|
|
|
Converts from a count of seconds to a Julian epoch. The input must be |
127
|
|
|
|
|
|
|
a C object, and the result is the same type. |
128
|
|
|
|
|
|
|
|
129
|
|
|
|
|
|
|
=cut |
130
|
|
|
|
|
|
|
|
131
|
2
|
|
|
2
|
|
2296
|
use constant TT_EPOCH_JEPOCH => 1958 + Math::BigRat->new("0.0003725/365.25"); |
|
2
|
|
|
|
|
4
|
|
|
2
|
|
|
|
|
12
|
|
132
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
sub tt_instant_to_jepoch($) { |
134
|
3
|
|
|
3
|
1
|
24464
|
my($tt) = @_; |
135
|
3
|
|
|
|
|
12
|
return TT_EPOCH_JEPOCH + ($tt / 31557600); |
136
|
|
|
|
|
|
|
} |
137
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
=item tt_jepoch_to_instant(JEPOCH) |
139
|
|
|
|
|
|
|
|
140
|
|
|
|
|
|
|
Converts from a Julian epoch to a count of seconds. The input must be |
141
|
|
|
|
|
|
|
a C object, and the result is the same type. |
142
|
|
|
|
|
|
|
|
143
|
|
|
|
|
|
|
=cut |
144
|
|
|
|
|
|
|
|
145
|
|
|
|
|
|
|
sub tt_jepoch_to_instant($) { |
146
|
3
|
|
|
3
|
1
|
5242
|
my($jepoch) = @_; |
147
|
3
|
|
|
|
|
14
|
return ($jepoch - TT_EPOCH_JEPOCH) * 31557600; |
148
|
|
|
|
|
|
|
} |
149
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
=item tt_realisation(NAME) |
151
|
|
|
|
|
|
|
|
152
|
|
|
|
|
|
|
Looks up and returns an object representing a named realisation of TT. |
153
|
|
|
|
|
|
|
The object returned is of the class C; see the |
154
|
|
|
|
|
|
|
documentation of that class for its interface. |
155
|
|
|
|
|
|
|
|
156
|
|
|
|
|
|
|
The name, recognised case-insensitively, may be of these forms: |
157
|
|
|
|
|
|
|
|
158
|
|
|
|
|
|
|
=over |
159
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
=item B |
161
|
|
|
|
|
|
|
|
162
|
|
|
|
|
|
|
Retrospective best estimate of TT, published by the BIPM. TT(BIPM05) |
163
|
|
|
|
|
|
|
was published in 2005, and other versions were (and will be) published |
164
|
|
|
|
|
|
|
in other years, with the digits in the name varying accordingly. |
165
|
|
|
|
|
|
|
These time scales are currently based on reanalysis of the TAI data. |
166
|
|
|
|
|
|
|
They are defined by isolated data points, so conversions in general |
167
|
|
|
|
|
|
|
involve interpolation; the process is by its nature inexact. |
168
|
|
|
|
|
|
|
|
169
|
|
|
|
|
|
|
=item B |
170
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
TT(EAL) is derived from the Free Atomic Scale (EAL). EAL is the |
172
|
|
|
|
|
|
|
weighted average of the time ticked by the clocks contributing to TAI, |
173
|
|
|
|
|
|
|
with no gravitational correction applied. TAI is generated by applying |
174
|
|
|
|
|
|
|
a frequency shift to EAL to correct for gravitational time dilation. |
175
|
|
|
|
|
|
|
The relationship between EAL and TAI is precisely defined, so conversions |
176
|
|
|
|
|
|
|
are exact. |
177
|
|
|
|
|
|
|
|
178
|
|
|
|
|
|
|
=item B |
179
|
|
|
|
|
|
|
|
180
|
|
|
|
|
|
|
TT(TAI) is the principal realisation of TT, derived directly from |
181
|
|
|
|
|
|
|
International Atomic Time (TAI). This is defined monthly in retrospect |
182
|
|
|
|
|
|
|
and then never revised. |
183
|
|
|
|
|
|
|
|
184
|
|
|
|
|
|
|
=item B |
185
|
|
|
|
|
|
|
|
186
|
|
|
|
|
|
|
TT(TAI) based on TAI(NPL), the real-time estimate of TAI supplied by |
187
|
|
|
|
|
|
|
the National Physical Laboratory in the UK. Other real-time estimates |
188
|
|
|
|
|
|
|
of TAI are named similarly using an abbreviation of the name of the |
189
|
|
|
|
|
|
|
supplying agency. See the C function in L |
190
|
|
|
|
|
|
|
for more discussion, or L for a list of agencies. |
191
|
|
|
|
|
|
|
|
192
|
|
|
|
|
|
|
=back |
193
|
|
|
|
|
|
|
|
194
|
|
|
|
|
|
|
Other names may be recognised in the future, as more TT(k) time scales |
195
|
|
|
|
|
|
|
are defined. |
196
|
|
|
|
|
|
|
|
197
|
|
|
|
|
|
|
In order to use any of the TAI-based realisations the C |
198
|
|
|
|
|
|
|
module is required. |
199
|
|
|
|
|
|
|
|
200
|
|
|
|
|
|
|
=cut |
201
|
|
|
|
|
|
|
|
202
|
|
|
|
|
|
|
# |
203
|
|
|
|
|
|
|
# general |
204
|
|
|
|
|
|
|
# |
205
|
|
|
|
|
|
|
|
206
|
|
|
|
|
|
|
sub _get_bipm_file($) { |
207
|
0
|
|
|
0
|
|
|
my($fn) = @_; |
208
|
0
|
|
|
|
|
|
require Net::FTP::Tiny; |
209
|
0
|
|
|
|
|
|
Net::FTP::Tiny->VERSION(0.001); |
210
|
0
|
|
|
|
|
|
return Net::FTP::Tiny::ftp_get("ftp://ftp2.bipm.fr/pub/tai/$fn"); |
211
|
|
|
|
|
|
|
} |
212
|
|
|
|
|
|
|
|
213
|
|
|
|
|
|
|
# |
214
|
|
|
|
|
|
|
# TT(BIPMnn) |
215
|
|
|
|
|
|
|
# |
216
|
|
|
|
|
|
|
|
217
|
2
|
|
|
2
|
|
6438
|
use constant TT_SYNCH_TIME => Math::BigRat->new(599616000); |
|
2
|
|
|
|
|
6
|
|
|
2
|
|
|
|
|
12
|
|
218
|
2
|
|
|
2
|
|
402
|
use constant TT_SYNCH_MJD => 43144; |
|
2
|
|
|
|
|
5
|
|
|
2
|
|
|
|
|
3228
|
|
219
|
|
|
|
|
|
|
|
220
|
|
|
|
|
|
|
my %tt_bipmnn; |
221
|
|
|
|
|
|
|
|
222
|
|
|
|
|
|
|
sub _tt_bipmnn($) { |
223
|
0
|
|
|
0
|
|
|
my($yr) = @_; |
224
|
0
|
|
|
|
|
|
my $r = $tt_bipmnn{$yr}; |
225
|
0
|
0
|
|
|
|
|
return $r if defined $r; |
226
|
0
|
|
|
|
|
|
my $content = _get_bipm_file("scale/ttbipm.$yr"); |
227
|
0
|
0
|
|
|
|
|
$content =~ /\A[\ \t\n]*TT\(BIPM[0-9]{2,4}\)\ is\ a\ realization/ |
228
|
|
|
|
|
|
|
or die "doesn't look like a TT(BIPMnn) file\n"; |
229
|
0
|
|
|
|
|
|
require Time::TT::OffsetKnot; |
230
|
0
|
|
|
|
|
|
Time::TT::OffsetKnot->VERSION(0.005); |
231
|
0
|
|
|
|
|
|
my @data; |
232
|
0
|
|
|
|
|
|
my $last_mjd = 0; |
233
|
0
|
|
|
|
|
|
while($content =~ /^\ *([0-9]+)\.(?:[-+]|\ +[-+]?)[0-9]+(?:\.[0-9]+)? |
234
|
|
|
|
|
|
|
([-+]|\ +[-+]?)([0-9]+(?:\.[0-9]+)?)\ *[\r\n]/xmg) { |
235
|
0
|
|
|
|
|
|
my($mjd, $sign, $offset_us) = ($1, $2, $3); |
236
|
0
|
0
|
|
|
|
|
die "data out of order at mjd=$mjd" unless $mjd > $last_mjd; |
237
|
0
|
0
|
0
|
|
|
|
if($last_mjd < TT_SYNCH_MJD && $mjd >= TT_SYNCH_MJD) { |
238
|
0
|
|
|
|
|
|
require Math::Interpolator::Knot; |
239
|
0
|
|
|
|
|
|
Math::Interpolator::Knot->VERSION(0.003); |
240
|
0
|
|
|
|
|
|
push @data, Math::Interpolator::Knot |
241
|
|
|
|
|
|
|
->new(TT_SYNCH_TIME, TT_SYNCH_TIME); |
242
|
|
|
|
|
|
|
} |
243
|
0
|
0
|
|
|
|
|
$offset_us = "-$offset_us" unless $sign =~ /-\z/; |
244
|
0
|
|
|
|
|
|
push @data, Time::TT::OffsetKnot->new($mjd, $offset_us, 6); |
245
|
0
|
|
|
|
|
|
$last_mjd = $mjd; |
246
|
|
|
|
|
|
|
} |
247
|
0
|
|
|
|
|
|
require Math::Interpolator::Robust; |
248
|
0
|
|
|
|
|
|
Math::Interpolator::Robust->VERSION(0.003); |
249
|
0
|
|
|
|
|
|
require Time::TT::InterpolatingRealisation; |
250
|
0
|
|
|
|
|
|
Time::TT::InterpolatingRealisation->VERSION(0.005); |
251
|
0
|
|
|
|
|
|
$r = Time::TT::InterpolatingRealisation->new( |
252
|
|
|
|
|
|
|
Math::Interpolator::Robust->new(@data)); |
253
|
0
|
|
|
|
|
|
return $tt_bipmnn{$yr} = $r; |
254
|
|
|
|
|
|
|
} |
255
|
|
|
|
|
|
|
|
256
|
|
|
|
|
|
|
# |
257
|
|
|
|
|
|
|
# TT(EAL) |
258
|
|
|
|
|
|
|
# |
259
|
|
|
|
|
|
|
|
260
|
|
|
|
|
|
|
my $tt_eal; |
261
|
|
|
|
|
|
|
|
262
|
|
|
|
|
|
|
sub _tt_eal() { |
263
|
0
|
0
|
|
0
|
|
|
return $tt_eal if defined $tt_eal; |
264
|
0
|
|
|
|
|
|
my $content = _get_bipm_file("scale/ealtai04.ar"); |
265
|
0
|
0
|
|
|
|
|
$content =~ /\A[\ \t\n]*[^\n]*differences between the normalized/i |
266
|
|
|
|
|
|
|
or die "doesn't look like an EAL file\n"; |
267
|
0
|
|
|
|
|
|
require Math::Interpolator::Knot; |
268
|
0
|
|
|
|
|
|
Math::Interpolator::Knot->VERSION(0.003); |
269
|
0
|
|
|
|
|
|
my @data; |
270
|
0
|
|
|
|
|
|
my $tai = Math::BigRat->new(-94694400); # 1955-01-01 |
271
|
0
|
|
|
|
|
|
push @data, Math::Interpolator::Knot->new($tai, $tai); |
272
|
0
|
|
|
|
|
|
$tai = Math::BigRat->new(599616000); # 1977-01-01 |
273
|
0
|
|
|
|
|
|
push @data, Math::Interpolator::Knot->new($tai, $tai); |
274
|
0
|
|
|
|
|
|
my $mjd = Math::BigRat->new(43144); |
275
|
0
|
|
|
|
|
|
my $eal = $tai; |
276
|
0
|
|
|
|
|
|
my $fdiff_scale = Math::BigRat->new("0.0000000000001"); |
277
|
0
|
|
|
|
|
|
while($content =~ /^\ *[0-9]+\ +[A-Za-z]+\ +[0-9]+\ +- |
278
|
|
|
|
|
|
|
\ +[0-9]+\ +[A-Za-z]+\ +[0-9]+ |
279
|
|
|
|
|
|
|
\ +([0-9]+)\ +-\ +([0-9]+) |
280
|
|
|
|
|
|
|
\ +([0-9]+(?:\.[0-9]+)?)[\ \t\n]/xmg) { |
281
|
0
|
|
|
|
|
|
my($old_mjd, $new_mjd, $fdiff) = ($1, $2, $3); |
282
|
0
|
|
|
|
|
|
$old_mjd = Math::BigRat->new($old_mjd); |
283
|
0
|
0
|
|
|
|
|
die "data not contiguous at mjd=$mjd" unless $old_mjd == $mjd; |
284
|
0
|
|
|
|
|
|
$new_mjd = Math::BigRat->new($new_mjd); |
285
|
0
|
|
|
|
|
|
$fdiff = Math::BigRat->new($fdiff) * $fdiff_scale; |
286
|
0
|
|
|
|
|
|
my $tai_s = ($new_mjd - $mjd) * 86400; |
287
|
0
|
|
|
|
|
|
my $eal_s = $tai_s * (1 + $fdiff); |
288
|
0
|
|
|
|
|
|
$mjd = $new_mjd; |
289
|
0
|
|
|
|
|
|
$tai += $tai_s; |
290
|
0
|
|
|
|
|
|
$eal += $eal_s; |
291
|
0
|
|
|
|
|
|
push @data, Math::Interpolator::Knot->new($tai, $eal); |
292
|
|
|
|
|
|
|
} |
293
|
0
|
|
|
|
|
|
$tai += 1000000; |
294
|
0
|
|
|
|
|
|
$eal += 1000000; |
295
|
0
|
|
|
|
|
|
require Math::Interpolator::Source; |
296
|
0
|
|
|
|
|
|
Math::Interpolator::Source->VERSION(0.003); |
297
|
|
|
|
|
|
|
push @data, Math::Interpolator::Source->new( |
298
|
0
|
|
|
0
|
|
|
sub () { croak "later data for TT(EAL) is missing"; }, |
299
|
0
|
|
|
|
|
|
$tai, $eal); |
300
|
0
|
|
|
|
|
|
require Math::Interpolator::Linear; |
301
|
0
|
|
|
|
|
|
Math::Interpolator::Linear->VERSION(0.003); |
302
|
0
|
|
|
|
|
|
require Time::TT::InterpolatingRealisation; |
303
|
0
|
|
|
|
|
|
Time::TT::InterpolatingRealisation->VERSION(0.005); |
304
|
0
|
|
|
|
|
|
$tt_eal = Time::TT::InterpolatingRealisation->new( |
305
|
|
|
|
|
|
|
Math::Interpolator::Linear->new(@data)); |
306
|
0
|
|
|
|
|
|
return $tt_eal; |
307
|
|
|
|
|
|
|
} |
308
|
|
|
|
|
|
|
|
309
|
|
|
|
|
|
|
# |
310
|
|
|
|
|
|
|
# invocation of realisations |
311
|
|
|
|
|
|
|
# |
312
|
|
|
|
|
|
|
|
313
|
|
|
|
|
|
|
sub tt_realisation($) { |
314
|
0
|
|
|
0
|
1
|
|
my($k) = @_; |
315
|
0
|
0
|
|
|
|
|
if($k =~ m#\Atai(?:/(.+))?\z#si) { |
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
316
|
0
|
|
|
|
|
|
require Time::TAI; |
317
|
0
|
0
|
|
|
|
|
return Time::TAI::tai_realisation(defined($1) ? $1 : ""); |
318
|
|
|
|
|
|
|
} elsif($k =~ m#\Abipm([0-9][0-9])\z#i) { |
319
|
0
|
|
|
|
|
|
my $yr = $1; |
320
|
0
|
|
|
|
|
|
return _tt_bipmnn($yr); |
321
|
|
|
|
|
|
|
} elsif($k =~ m#\Aeal\z#i) { |
322
|
0
|
|
|
|
|
|
return _tt_eal(); |
323
|
|
|
|
|
|
|
} else { |
324
|
0
|
|
|
|
|
|
croak "no realisation TT(".uc($k).") known"; |
325
|
|
|
|
|
|
|
} |
326
|
|
|
|
|
|
|
} |
327
|
|
|
|
|
|
|
|
328
|
|
|
|
|
|
|
=back |
329
|
|
|
|
|
|
|
|
330
|
|
|
|
|
|
|
=head1 BUGS |
331
|
|
|
|
|
|
|
|
332
|
|
|
|
|
|
|
The data for EAL only goes forward to mid-2005. There is no |
333
|
|
|
|
|
|
|
machine-readable source of subsequent data. |
334
|
|
|
|
|
|
|
|
335
|
|
|
|
|
|
|
=head1 SEE ALSO |
336
|
|
|
|
|
|
|
|
337
|
|
|
|
|
|
|
L, |
338
|
|
|
|
|
|
|
L, |
339
|
|
|
|
|
|
|
L, |
340
|
|
|
|
|
|
|
L, |
341
|
|
|
|
|
|
|
L |
342
|
|
|
|
|
|
|
|
343
|
|
|
|
|
|
|
=head1 AUTHOR |
344
|
|
|
|
|
|
|
|
345
|
|
|
|
|
|
|
Andrew Main (Zefram) |
346
|
|
|
|
|
|
|
|
347
|
|
|
|
|
|
|
=head1 COPYRIGHT |
348
|
|
|
|
|
|
|
|
349
|
|
|
|
|
|
|
Copyright (C) 2006, 2007, 2010, 2012 |
350
|
|
|
|
|
|
|
Andrew Main (Zefram) |
351
|
|
|
|
|
|
|
|
352
|
|
|
|
|
|
|
=head1 LICENSE |
353
|
|
|
|
|
|
|
|
354
|
|
|
|
|
|
|
This module is free software; you can redistribute it and/or modify it |
355
|
|
|
|
|
|
|
under the same terms as Perl itself. |
356
|
|
|
|
|
|
|
|
357
|
|
|
|
|
|
|
=cut |
358
|
|
|
|
|
|
|
|
359
|
|
|
|
|
|
|
1; |