Skip to content
Snippets Groups Projects
Commit db33d4c1 authored by Luc Maisonobe's avatar Luc Maisonobe
Browse files

Added support for USNO tai-utc.dat file, enabled by default.

This support is in addition to the legacy support for IERS
UTC-TAI.history file which is still supported and also enabled by
default.
parent b402ecb1
No related branches found
No related tags found
No related merge requests found
/* Copyright 2002-2015 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.orekit.time;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.math3.util.FastMath;
import org.orekit.errors.OrekitException;
import org.orekit.errors.OrekitMessages;
/** Loader for UTC-TAI extracted from tai-utc.dat file from USNO.
* <p>
* This class is immutable and hence thread-safe
* </p>
* @author Luc Maisonobe
* @since 7.1
*/
public class TAIUTCDatFilesLoader implements UTCTAILoader {
/** Default supported files name pattern. */
public static final String DEFAULT_SUPPORTED_NAMES = "^tai-utc\\.dat$";
/** Regular expression for optional blanks. */
private static final String BLANKS = "\\p{Blank}*";
/** Regular expression for storage start. */
private static final String STORAGE_START = "(";
/** Regular expression for storage end. */
private static final String STORAGE_END = ")";
/** Regular expression for alternative. */
private static final String ALTERNATIVE = "|";
/** Regular expression matching blanks at start of line. */
private static final String LINE_START_REGEXP = "^" + BLANKS;
/** Regular expression matching blanks at end of line. */
private static final String LINE_END_REGEXP = BLANKS + "$";
/** Regular expression matching integers. */
private static final String INTEGER_REGEXP = "[-+]?\\p{Digit}+";
/** Regular expression matching real numbers. */
private static final String REAL_REGEXP = "[-+]?(?:(?:\\p{Digit}+(?:\\.\\p{Digit}*)?)|(?:\\.\\p{Digit}+))(?:[eE][-+]?\\p{Digit}+)?";
/** Regular expression matching an integer field to store. */
private static final String STORED_INTEGER_FIELD = BLANKS + STORAGE_START + INTEGER_REGEXP + STORAGE_END;
/** Regular expression matching a real field to store. */
private static final String STORED_REAL_FIELD = BLANKS + STORAGE_START + REAL_REGEXP + STORAGE_END;
/** Regular expression for supported files names. */
private final String supportedNames;
/** Data lines pattern. */
private Pattern dataPattern;
/** Time scales offsets. */
private SortedMap<DateComponents, Integer> entries;
/** Build a loader for tai-utc.dat file from USNO.
* @param supportedNames regular expression for supported files names
*/
public TAIUTCDatFilesLoader(final String supportedNames) {
this.supportedNames = supportedNames;
// data lines read:
// 1965 SEP 1 =JD 2439004.5 TAI-UTC= 3.8401300 S + (MJD - 38761.) X 0.001296 S
// 1966 JAN 1 =JD 2439126.5 TAI-UTC= 4.3131700 S + (MJD - 39126.) X 0.002592 S
// 1968 FEB 1 =JD 2439887.5 TAI-UTC= 4.2131700 S + (MJD - 39126.) X 0.002592 S
// 1972 JAN 1 =JD 2441317.5 TAI-UTC= 10.0 S + (MJD - 41317.) X 0.0 S
// 1972 JUL 1 =JD 2441499.5 TAI-UTC= 11.0 S + (MJD - 41317.) X 0.0 S
// 1973 JAN 1 =JD 2441683.5 TAI-UTC= 12.0 S + (MJD - 41317.) X 0.0 S
// 1974 JAN 1 =JD 2442048.5 TAI-UTC= 13.0 S + (MJD - 41317.) X 0.0 S
// month as a three letters upper case abbreviation
final StringBuilder builder = new StringBuilder(BLANKS + STORAGE_START);
for (final Month month : Month.values()) {
builder.append(month.getUpperCaseAbbreviation());
builder.append(ALTERNATIVE);
}
builder.delete(builder.length() - 1, builder.length());
builder.append(STORAGE_END);
final String monthField = builder.toString();
dataPattern = Pattern.compile(LINE_START_REGEXP +
STORED_INTEGER_FIELD + monthField + STORED_INTEGER_FIELD +
"\\p{Blank}+=JD" + STORED_REAL_FIELD +
"\\p{Blank}+TAI-UTC=" + STORED_REAL_FIELD +
"\\p{Blank}+S\\p{Blank}+\\+\\p{Blank}+\\(MJD\\p{Blank}+-" + STORED_REAL_FIELD +
"\\p{Blank}*\\)\\p{Blank}+X" + STORED_REAL_FIELD +
"\\p{Blank}*S" + LINE_END_REGEXP);
entries = new TreeMap<DateComponents, Integer>();
}
/** Get the regular expression for supported files names.
* @return regular expression for supported files names
*/
public String getSupportedNames() {
return supportedNames;
}
/** Load stored UTC-TAI offsets entries.
* @return sorted UTC-TAI offsets entries (may be empty if no data file is available)
*/
public SortedMap<DateComponents, Integer> loadTimeSteps() {
return entries;
}
/** {@inheritDoc} */
public boolean stillAcceptsData() {
return (entries == null) || entries.isEmpty();
}
/** Load UTC-TAI offsets entries read from some file.
* <p>The time steps are extracted from some {@code tai-utc.dat} file.
* Since entries are stored in a {@link java.util.SortedMap SortedMap},
* they are chronologically sorted and only one entry remains for a given date.</p>
* @param input data input stream
* @param name name of the file (or zip entry)
* @exception IOException if data can't be read
* @exception ParseException if data can't be parsed
* @exception OrekitException if some data is missing
* or if some loader specific error occurs
*/
public void loadData(final InputStream input, final String name)
throws OrekitException, IOException, ParseException {
entries.clear();
// set up a reader for line-oriented file
final BufferedReader reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
// read all file, ignoring not recognized lines
boolean foundEntries = false;
int lineNumber = 0;
DateComponents lastDate = null;
for (String line = reader.readLine(); line != null; line = reader.readLine()) {
++lineNumber;
// check matching for data lines
final Matcher matcher = dataPattern.matcher(line);
if (matcher.matches()) {
try {
// build an entry from the extracted fields
final DateComponents dc1 = new DateComponents(Integer.parseInt(matcher.group(1)),
Month.parseMonth(matcher.group(2)),
Integer.parseInt(matcher.group(3)));
final DateComponents dc2 = new DateComponents(DateComponents.JULIAN_EPOCH,
(int) FastMath.ceil(Double.parseDouble(matcher.group(4))));
if (!dc1.equals(dc2)) {
throw new OrekitException(OrekitMessages.INCONSISTENT_DATES_IN_IERS_FILE,
name, dc1.getYear(), dc1.getMonth(), dc1.getDay(), dc2.getMJD());
}
if ((lastDate != null) && dc1.compareTo(lastDate) <= 0) {
throw new OrekitException(OrekitMessages.NON_CHRONOLOGICAL_DATES_IN_FILE,
name, lineNumber);
}
lastDate = dc1;
// keep only the fixed offsets starting 1972-01-01
final double offset = Double.parseDouble(matcher.group(5));
final double mjdRef = Double.parseDouble(matcher.group(6));
final double slope = Double.parseDouble(matcher.group(7));
if (FastMath.abs(offset - FastMath.rint(offset)) < 1.0e-10 &&
FastMath.abs(mjdRef - 41317.0) < 1.0e-10 &&
FastMath.abs(slope) < 1.0e-10) {
foundEntries = true;
entries.put(dc1, (int) FastMath.rint(offset));
}
} catch (NumberFormatException nfe) {
throw new OrekitException(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE,
lineNumber, name, line);
}
}
}
if (!foundEntries) {
throw new OrekitException(OrekitMessages.NO_ENTRIES_IN_IERS_UTC_TAI_HISTORY_FILE, name);
}
}
}
......@@ -87,6 +87,9 @@ public class TimeScalesFactory implements Serializable {
/** Add a loader for UTC-TAI offsets history files.
* @param loader custom loader to add
* @see TAIUTCDatFilesLoader
* @see UTCTAIHistoryFilesLoader
* @see UTCTAIBulletinAFilesLoader
* @see #getUTC()
* @see #clearUTCTAILoaders()
*/
......@@ -94,23 +97,33 @@ public class TimeScalesFactory implements Serializable {
loaders.add(loader);
}
/** Add the default loader for UTC-TAI offsets history files.
/** Add the default loaders for UTC-TAI offsets history files.
* <p>
* The default loader looks for a file named {@code UTC-TAI.history}
* that must be in the IERS format.
* The default loaders are {@link TAIUTCDatFilesLoader} that looks for
* a file named {@code tai-utc.dat} that must be in USNO format and
* {@link UTCTAIHistoryFilesLoader} that looks fir a file named
* {@code UTC-TAI.history} that must be in the IERS format. The
* {@link UTCTAIBulletinAFilesLoader} is <em>not</em> added by default
* as it is not recommended. USNO warned us that the TAI-UTC data present
* in bulletin A was for convenience only and was not reliable, there
* have been errors in several bulletins regarding these data.
* </p>
* @see <a href="http://maia.usno.navy.mil/ser7/tai-utc.dat">USNO tai-utc.dat file</a>
* @see <a href="http://hpiers.obspm.fr/eoppc/bul/bulc/UTC-TAI.history">IERS UTC-TAI.history file</a>
* @see TAIUTCDatFilesLoader
* @see UTCTAIHistoryFilesLoader
* @see #getUTC()
* @see #clearUTCTAILoaders()
*/
public static void addDefaultUTCTAILoader() {
public static void addDefaultUTCTAILoaders() {
addUTCTAILoader(new TAIUTCDatFilesLoader(TAIUTCDatFilesLoader.DEFAULT_SUPPORTED_NAMES));
addUTCTAILoader(new UTCTAIHistoryFilesLoader());
}
/** Clear loaders for UTC-TAI offsets history files.
* @see #getUTC()
* @see #addUTCTAILoader(UTCTAILoader)
* @see #addDefaultUTCTAILoader()
* @see #addDefaultUTCTAILoaders()
*/
public static void clearUTCTAILoaders() {
loaders.clear();
......@@ -136,7 +149,7 @@ public class TimeScalesFactory implements Serializable {
* If no {@link UTCTAILoader} has been added by calling {@link
* #addUTCTAILoader(UTCTAILoader) addUTCTAILoader} or if {@link
* #clearUTCTAILoaders() clearUTCTAILoaders} has been called afterwards,
* the {@link #addDefaultUTCTAILoader() addDefaultUTCTAILoader} method
* the {@link #addDefaultUTCTAILoaders() addDefaultUTCTAILoaders} method
* will be called automatically.
* </p>
* @return Universal Time Coordinate scale
......@@ -144,7 +157,7 @@ public class TimeScalesFactory implements Serializable {
* file content is corrupted
* @see #addUTCTAILoader(UTCTAILoader)
* @see #clearUTCTAILoaders()
* @see #addDefaultUTCTAILoader()
* @see #addDefaultUTCTAILoaders()
*/
public static UTCScale getUTC() throws OrekitException {
synchronized (TimeScalesFactory.class) {
......@@ -152,7 +165,7 @@ public class TimeScalesFactory implements Serializable {
if (utc == null) {
SortedMap<DateComponents, Integer> entries = null;
if (loaders.isEmpty()) {
addDefaultUTCTAILoader();
addDefaultUTCTAILoaders();
}
for (UTCTAILoader loader : loaders) {
DataProvidersManager.getInstance().feed(loader.getSupportedNames(), loader);
......
......@@ -241,8 +241,8 @@ download on orekit forge:
[https://www.orekit.org/forge/projects/orekit/files](https://www.orekit.org/forge/projects/orekit/files).
Setting the `orekit.data.path` property to the location of this file on a local computer is enough to
use Orekit efficiently, but the preferred setup is to expand the zip file in the user
home folder so that new IERS files can be added easily when they become avialble. In this
case, data is loaded by puttin the following code in the main application:
home folder so that new IERS files can be added easily when they become available. In this
case, data is loaded by putting the following code in the main application:
final File home = new File(System.getProperty("user.home"));
final File orekitDir = new File(home, "orekit-data");
......@@ -275,8 +275,9 @@ the XML format and the columns format.
| default naming pattern | format | data type | source |
|------------------------------------------|--------------------|------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------|
| tai-utc.dat[.gz] | USNO tai-utc | leap seconds introduction history | [http://maia.usno.navy.mil/ser7/tai-utc.dat](http://maia.usno.navy.mil/ser7/tai-utc.dat) |
| UTC-TAI.history[.gz] | IERS history | leap seconds introduction history | [http://hpiers.obspm.fr/eoppc/bul/bulc/UTC-TAI.history](http://hpiers.obspm.fr/eoppc/bul/bulc/UTC-TAI.history) |
| bulletina-xxxx-\#\#\#.txt[.gz] | IERS Bulletin A | weekly Earth Orientation Parameters, IAU-1980 and IAU-2000, rapid service and prediction | [ftp://ftp.iers.org/products/eop/rapid/bulletina/](ftp://ftp.iers.org/products/eop/rapid/bulletina/) |
| bulletina-xxxx-\#\#\#.txt[.gz] | IERS Bulletin A | weekly Earth Orientation Parameters, IAU-1980 and IAU-2000, rapid service and prediction | [ftp://ftp.iers.org/products/eop/rapid/bulletina/](ftp://ftp.iers.org/products/eop/rapid/bulletina/) |
| bulletinb.\#\#\#[.gz] | IERS Bulletin B | monthly Earth Orientation Parameters model IAU 2006/2000A, final values | [ftp://ftp.iers.org/products/eop/bulletinb/format_2009/](ftp://ftp.iers.org/products/eop/bulletinb/format_2009/) |
| eopc04\_08\_IAU2000.\#\#[.gz] | IERS EOP 08 C04 | yearly Earth Orientation Parameters model IAU 2006/2000A | [ftp://ftp.iers.org/products/eop/long-term/c04\_08/iau2000/](ftp://ftp.iers.org/products/eop/long-term/c04_08/iau2000/) |
| eopc04\_08.\#\#[.gz] | IERS EOP 08 C04 | yearly Earth Orientation Parameters model IAU 1980 | [ftp://ftp.iers.org/products/eop/long-term/c04\_08/iau1980/](ftp://ftp.iers.org/products/eop/long-term/c04_08/iau1980/) |
......
......@@ -134,13 +134,15 @@ Runtime errors
This error is probably *the* most frequent one, or at least it's the first one new users encounter.
Orekit needs some external data to be loaded in order to run. This includes UTC-TAI history for leap
seconds handling, Earth Orientation Parameters for transforms to and from Earth fixed frames, or planetar
seconds handling, Earth Orientation Parameters for transforms to and from Earth fixed frames, or planetary
ephemerides for Sun direction, for example.
The error message "no IERS UTC-TAI history data loaded" means the UTC-TAI history file which is used for leap
seconds management was not found. As leap seconds are used each time a UTC date is used, this message is
often seen very early and is the first one unsuspecting users experience. It often means the user forgot
to configure Orekit to load data.
to configure Orekit to load data. Orekit supports by default either the IERS UTC-TAI.history file or the
USNO tai-utc.dat file. If either file is found in the Orekit configuration, it will be automatically loaded
and the message should not appear.
Configuring data loading is explained in the configuration page For a start, the simplest configuration
is to download the orekit-data.zip file from the download page and to either set the "orekit.data.path" Java
......
......@@ -21,6 +21,11 @@
</properties>
<body>
<release version="7.1" date="TBD" description="TBD">
<action dev="luc" type="add">
Added support for USNO tai-utc.dat file, enabled by default, in
addition to the legacy support for IERS UTC-TAI.history file
which is still supported and also enabled by default.
</action>
<action dev="luc" type="add">
Added a way to load TAI-UTC data from Bulletin A. Using this feature
is however NOT recommended as there are known issues in TAI-UTC data
......
/* Copyright 2002-2015 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.orekit.time;
import org.junit.Assert;
import org.junit.Test;
import org.orekit.Utils;
import org.orekit.errors.OrekitException;
import org.orekit.errors.OrekitMessages;
public class TAIUTCDatAFilesLoaderTest {
@Test
public void testRegularFile() throws OrekitException {
Utils.setDataRoot("USNO");
// we arbitrary put UTC == TAI before 1961-01-01
checkOffset(1950, 1, 1, 0);
// linear models between 1961 and 1972, not really parsed from the file
checkOffset(1961, 1, 2, -(1.422818 + 1 * 0.001296)); // MJD 37300 + 1
checkOffset(1961, 8, 2, -(1.372818 + 213 * 0.001296)); // MJD 37300 + 213
checkOffset(1962, 1, 2, -(1.845858 + 1 * 0.0011232)); // MJD 37665 + 1
checkOffset(1963, 11, 2, -(1.945858 + 670 * 0.0011232)); // MJD 37665 + 670
checkOffset(1964, 1, 2, -(3.240130 - 365 * 0.001296)); // MJD 38761 - 365
checkOffset(1964, 4, 2, -(3.340130 - 274 * 0.001296)); // MJD 38761 - 274
checkOffset(1964, 9, 2, -(3.440130 - 121 * 0.001296)); // MJD 38761 - 121
checkOffset(1965, 1, 2, -(3.540130 + 1 * 0.001296)); // MJD 38761 + 1
checkOffset(1965, 3, 2, -(3.640130 + 60 * 0.001296)); // MJD 38761 + 60
checkOffset(1965, 7, 2, -(3.740130 + 182 * 0.001296)); // MJD 38761 + 182
checkOffset(1965, 9, 2, -(3.840130 + 244 * 0.001296)); // MJD 38761 + 244
checkOffset(1966, 1, 2, -(4.313170 + 1 * 0.002592)); // MJD 39126 + 1
checkOffset(1968, 2, 2, -(4.213170 + 762 * 0.002592)); // MJD 39126 + 762
// since 1972-01-01, offsets are only whole seconds
checkOffset(1972, 3, 5, -10);
checkOffset(1972, 7, 14, -11);
checkOffset(1979, 12, 31, -18);
checkOffset(1980, 1, 22, -19);
checkOffset(2006, 7, 7, -33);
checkOffset(2010, 7, 7, -34);
checkOffset(2012, 7, 7, -35);
checkOffset(2015, 7, 7, -36);
}
@Test
public void testInconsistentDate() throws OrekitException {
checkException("tai-utc-inconsistent-date.dat",
OrekitMessages.INCONSISTENT_DATES_IN_IERS_FILE);
}
@Test
public void testNonChronological() throws OrekitException {
checkException("tai-utc-non-chronological.dat",
OrekitMessages.NON_CHRONOLOGICAL_DATES_IN_FILE);
}
@Test
public void testFormatError() throws OrekitException {
checkException("tai-utc-format-error.dat",
OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE);
}
@Test
public void testMissingData() throws OrekitException {
checkException("tai-utc-only-pre-1972-data.dat",
OrekitMessages.NO_ENTRIES_IN_IERS_UTC_TAI_HISTORY_FILE);
}
private void checkOffset(int year, int month, int day, double offset) throws OrekitException {
TimeScale utc = TimeScalesFactory.getUTC();
AbsoluteDate date = new AbsoluteDate(year, month, day, utc);
Assert.assertEquals(offset, utc.offsetFromTAI(date), 1.0e-10);
}
private void checkException(String name, OrekitMessages message) {
Utils.setDataRoot("USNO");
TimeScalesFactory.addUTCTAILoader(new TAIUTCDatFilesLoader(name));
try {
TimeScalesFactory.getUTC();
Assert.fail("an exception should have been thrown");
} catch (OrekitException oe) {
Assert.assertEquals(message, oe.getSpecifier());
}
}
}
1965 JAN 1 =JD 2438761.5 TAI-UTC= 3.5401300 S + (MJD - 38761.) X 0.001296 S
1965 MAR 1 =JD 2438820.5 TAI-UTC= 3.6401300 S + (MJD - 38761.) X 0.001296 S
1965 JUL 1 =JD 2438942.5 TAI-UTC= 3.7401300 S + (MJD - 38761.) X 0.001296 S
1965 SEP 1 =JD 2439004.5 TAI-UTC= 3.8401300 S + (MJD - 38761.) X 0.001296 S
1966 JAN 1 =JD 2439126.5 TAI-UTC= 4.3131700 S + (MJD - 39126.) X 0.002592 S
1968 FEB 1 =JD 2439887.5 TAI-UTC= 4.2131700 S + (MJD - 39126.) X 0.002592 S
1972 JAN 99999999999999999999999 =JD 2441317.5 TAI-UTC= 10.0 S + (MJD - 41317.) X 0.0 S
1972 JUL 1 =JD 2441499.5 TAI-UTC= 11.0 S + (MJD - 41317.) X 0.0 S
1973 JAN 1 =JD 2441683.5 TAI-UTC= 12.0 S + (MJD - 41317.) X 0.0 S
1974 JAN 1 =JD 2442048.5 TAI-UTC= 13.0 S + (MJD - 41317.) X 0.0 S
1975 JAN 1 =JD 2442413.5 TAI-UTC= 14.0 S + (MJD - 41317.) X 0.0 S
1976 JAN 1 =JD 2442778.5 TAI-UTC= 15.0 S + (MJD - 41317.) X 0.0 S
1961 JAN 1 =JD 2437300.5 TAI-UTC= 1.4228180 S + (MJD - 37300.) X 0.001296 S
1961 AUG 1 =JD 2437512.5 TAI-UTC= 1.3728180 S + (MJD - 37300.) X 0.001296 S
1962 JAN 1 =JD 2437665.5 TAI-UTC= 1.8458580 S + (MJD - 37665.) X 0.0011232S
1963 NOV 1 =JD 2438334.5 TAI-UTC= 1.9458580 S + (MJD - 37665.) X 0.0011232S
1964 JAN 1 =JD 2438395.5 TAI-UTC= 3.2401300 S + (MJD - 38761.) X 0.001296 S
1964 APR 1 =JD 2438486.5 TAI-UTC= 3.3401300 S + (MJD - 38761.) X 0.001296 S
1964 SEP 1 =JD 2438639.5 TAI-UTC= 3.4401300 S + (MJD - 38761.) X 0.001296 S
1965 JAN 1 =JD 2438761.5 TAI-UTC= 3.5401300 S + (MJD - 38761.) X 0.001296 S
1965 MAR 1 =JD 2438820.5 TAI-UTC= 3.6401300 S + (MJD - 38761.) X 0.001296 S
1965 JUL 1 =JD 2438942.5 TAI-UTC= 3.7401300 S + (MJD - 38761.) X 0.001296 S
1965 SEP 1 =JD 2439004.5 TAI-UTC= 3.8401300 S + (MJD - 38761.) X 0.001296 S
1966 JAN 1 =JD 2439126.5 TAI-UTC= 4.3131700 S + (MJD - 39126.) X 0.002592 S
1968 FEB 1 =JD 2439887.5 TAI-UTC= 4.2131700 S + (MJD - 39126.) X 0.002592 S
1972 JAN 1 =JD 2441317.5 TAI-UTC= 10.0 S + (MJD - 41317.) X 0.0 S
1972 JUL 1 =JD 2441499.5 TAI-UTC= 11.0 S + (MJD - 41317.) X 0.0 S
1973 JAN 1 =JD 2499999.5 TAI-UTC= 12.0 S + (MJD - 41317.) X 0.0 S
1974 JAN 1 =JD 2442048.5 TAI-UTC= 13.0 S + (MJD - 41317.) X 0.0 S
1975 JAN 1 =JD 2442413.5 TAI-UTC= 14.0 S + (MJD - 41317.) X 0.0 S
1965 MAR 1 =JD 2438820.5 TAI-UTC= 3.6401300 S + (MJD - 38761.) X 0.001296 S
1965 JUL 1 =JD 2438942.5 TAI-UTC= 3.7401300 S + (MJD - 38761.) X 0.001296 S
1965 SEP 1 =JD 2439004.5 TAI-UTC= 3.8401300 S + (MJD - 38761.) X 0.001296 S
1966 JAN 1 =JD 2439126.5 TAI-UTC= 4.3131700 S + (MJD - 39126.) X 0.002592 S
1968 FEB 1 =JD 2439887.5 TAI-UTC= 4.2131700 S + (MJD - 39126.) X 0.002592 S
1972 JAN 1 =JD 2441317.5 TAI-UTC= 10.0 S + (MJD - 41317.) X 0.0 S
1972 JUL 1 =JD 2441499.5 TAI-UTC= 11.0 S + (MJD - 41317.) X 0.0 S
1975 JAN 1 =JD 2442413.5 TAI-UTC= 14.0 S + (MJD - 41317.) X 0.0 S
1973 JAN 1 =JD 2441683.5 TAI-UTC= 12.0 S + (MJD - 41317.) X 0.0 S
1974 JAN 1 =JD 2442048.5 TAI-UTC= 13.0 S + (MJD - 41317.) X 0.0 S
1976 JAN 1 =JD 2442778.5 TAI-UTC= 15.0 S + (MJD - 41317.) X 0.0 S
1977 JAN 1 =JD 2443144.5 TAI-UTC= 16.0 S + (MJD - 41317.) X 0.0 S
1961 JAN 1 =JD 2437300.5 TAI-UTC= 1.4228180 S + (MJD - 37300.) X 0.001296 S
1961 AUG 1 =JD 2437512.5 TAI-UTC= 1.3728180 S + (MJD - 37300.) X 0.001296 S
1962 JAN 1 =JD 2437665.5 TAI-UTC= 1.8458580 S + (MJD - 37665.) X 0.0011232S
1963 NOV 1 =JD 2438334.5 TAI-UTC= 1.9458580 S + (MJD - 37665.) X 0.0011232S
1964 JAN 1 =JD 2438395.5 TAI-UTC= 3.2401300 S + (MJD - 38761.) X 0.001296 S
1964 APR 1 =JD 2438486.5 TAI-UTC= 3.3401300 S + (MJD - 38761.) X 0.001296 S
1964 SEP 1 =JD 2438639.5 TAI-UTC= 3.4401300 S + (MJD - 38761.) X 0.001296 S
1965 JAN 1 =JD 2438761.5 TAI-UTC= 3.5401300 S + (MJD - 38761.) X 0.001296 S
1965 MAR 1 =JD 2438820.5 TAI-UTC= 3.6401300 S + (MJD - 38761.) X 0.001296 S
1965 JUL 1 =JD 2438942.5 TAI-UTC= 3.7401300 S + (MJD - 38761.) X 0.001296 S
1965 SEP 1 =JD 2439004.5 TAI-UTC= 3.8401300 S + (MJD - 38761.) X 0.001296 S
1966 JAN 1 =JD 2439126.5 TAI-UTC= 4.3131700 S + (MJD - 39126.) X 0.002592 S
1968 FEB 1 =JD 2439887.5 TAI-UTC= 4.2131700 S + (MJD - 39126.) X 0.002592 S
1961 JAN 1 =JD 2437300.5 TAI-UTC= 1.4228180 S + (MJD - 37300.) X 0.001296 S
1961 AUG 1 =JD 2437512.5 TAI-UTC= 1.3728180 S + (MJD - 37300.) X 0.001296 S
1962 JAN 1 =JD 2437665.5 TAI-UTC= 1.8458580 S + (MJD - 37665.) X 0.0011232S
1963 NOV 1 =JD 2438334.5 TAI-UTC= 1.9458580 S + (MJD - 37665.) X 0.0011232S
1964 JAN 1 =JD 2438395.5 TAI-UTC= 3.2401300 S + (MJD - 38761.) X 0.001296 S
1964 APR 1 =JD 2438486.5 TAI-UTC= 3.3401300 S + (MJD - 38761.) X 0.001296 S
1964 SEP 1 =JD 2438639.5 TAI-UTC= 3.4401300 S + (MJD - 38761.) X 0.001296 S
1965 JAN 1 =JD 2438761.5 TAI-UTC= 3.5401300 S + (MJD - 38761.) X 0.001296 S
1965 MAR 1 =JD 2438820.5 TAI-UTC= 3.6401300 S + (MJD - 38761.) X 0.001296 S
1965 JUL 1 =JD 2438942.5 TAI-UTC= 3.7401300 S + (MJD - 38761.) X 0.001296 S
1965 SEP 1 =JD 2439004.5 TAI-UTC= 3.8401300 S + (MJD - 38761.) X 0.001296 S
1966 JAN 1 =JD 2439126.5 TAI-UTC= 4.3131700 S + (MJD - 39126.) X 0.002592 S
1968 FEB 1 =JD 2439887.5 TAI-UTC= 4.2131700 S + (MJD - 39126.) X 0.002592 S
These lines have been manually inserted into USNO file for testing purpose
They are simply ignored by Orekit and should not trigger any error
The real USNO file does not contain them
1972 JAN 1 =JD 2441317.5 TAI-UTC= 10.0 S + (MJD - 41317.) X 0.0 S
1972 JUL 1 =JD 2441499.5 TAI-UTC= 11.0 S + (MJD - 41317.) X 0.0 S
1973 JAN 1 =JD 2441683.5 TAI-UTC= 12.0 S + (MJD - 41317.) X 0.0 S
1974 JAN 1 =JD 2442048.5 TAI-UTC= 13.0 S + (MJD - 41317.) X 0.0 S
1975 JAN 1 =JD 2442413.5 TAI-UTC= 14.0 S + (MJD - 41317.) X 0.0 S
1976 JAN 1 =JD 2442778.5 TAI-UTC= 15.0 S + (MJD - 41317.) X 0.0 S
1977 JAN 1 =JD 2443144.5 TAI-UTC= 16.0 S + (MJD - 41317.) X 0.0 S
1978 JAN 1 =JD 2443509.5 TAI-UTC= 17.0 S + (MJD - 41317.) X 0.0 S
1979 JAN 1 =JD 2443874.5 TAI-UTC= 18.0 S + (MJD - 41317.) X 0.0 S
1980 JAN 1 =JD 2444239.5 TAI-UTC= 19.0 S + (MJD - 41317.) X 0.0 S
1981 JUL 1 =JD 2444786.5 TAI-UTC= 20.0 S + (MJD - 41317.) X 0.0 S
1982 JUL 1 =JD 2445151.5 TAI-UTC= 21.0 S + (MJD - 41317.) X 0.0 S
1983 JUL 1 =JD 2445516.5 TAI-UTC= 22.0 S + (MJD - 41317.) X 0.0 S
1985 JUL 1 =JD 2446247.5 TAI-UTC= 23.0 S + (MJD - 41317.) X 0.0 S
1988 JAN 1 =JD 2447161.5 TAI-UTC= 24.0 S + (MJD - 41317.) X 0.0 S
1990 JAN 1 =JD 2447892.5 TAI-UTC= 25.0 S + (MJD - 41317.) X 0.0 S
1991 JAN 1 =JD 2448257.5 TAI-UTC= 26.0 S + (MJD - 41317.) X 0.0 S
1992 JUL 1 =JD 2448804.5 TAI-UTC= 27.0 S + (MJD - 41317.) X 0.0 S
1993 JUL 1 =JD 2449169.5 TAI-UTC= 28.0 S + (MJD - 41317.) X 0.0 S
1994 JUL 1 =JD 2449534.5 TAI-UTC= 29.0 S + (MJD - 41317.) X 0.0 S
1996 JAN 1 =JD 2450083.5 TAI-UTC= 30.0 S + (MJD - 41317.) X 0.0 S
1997 JUL 1 =JD 2450630.5 TAI-UTC= 31.0 S + (MJD - 41317.) X 0.0 S
1999 JAN 1 =JD 2451179.5 TAI-UTC= 32.0 S + (MJD - 41317.) X 0.0 S
2006 JAN 1 =JD 2453736.5 TAI-UTC= 33.0 S + (MJD - 41317.) X 0.0 S
2009 JAN 1 =JD 2454832.5 TAI-UTC= 34.0 S + (MJD - 41317.) X 0.0 S
2012 JUL 1 =JD 2456109.5 TAI-UTC= 35.0 S + (MJD - 41317.) X 0.0 S
2015 JUL 1 =JD 2457204.5 TAI-UTC= 36.0 S + (MJD - 41317.) X 0.0 S
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment