Commit e962327a authored by Bryan Cazabonne's avatar Bryan Cazabonne
Browse files

Added support for loading EOP from SINEX files.

parent d26a3e09
/* Copyright 2002-2022 CS GROUP
* Licensed to CS GROUP (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.files.sinex;
import org.orekit.frames.EOPEntry;
import org.orekit.frames.ITRFVersion;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.TimeScale;
import org.orekit.time.TimeStamped;
import org.orekit.utils.IERSConventions;
/**
* Container for EOP entry read in a Sinex file.
*
* @author Bryan Cazabonne
* @since 11.2
*/
public class SinexEopEntry implements TimeStamped {
/** Length of day. */
private double lod;
/** UT1-UTC. */
private double ut1MinusUtc;
/** X polar motion (radians). */
private double xPo;
/** Y polar motion (radians). */
private double yPo;
/** Nutation correction in longitude (radians). */
private double nutLn;
/** Nutation correction in obliquity (radians). */
private double nutOb;
/** Nutation correction X (radians). */
private double nutX;
/** Nutation correction Y (radians). */
private double nutY;
/** EOP entry reference epoch. */
private final AbsoluteDate epoch;
/**
* Constructor.
* @param epoch epoch of the data
*/
public SinexEopEntry(final AbsoluteDate epoch) {
this.epoch = epoch;
}
/** {@inheritDoc} */
@Override
public AbsoluteDate getDate() {
return epoch;
}
/**
* Get the length of day.
* @return the length of day
*/
public double getLod() {
return lod;
}
/**
* Set the length of day.
* @param lod the length of day to set
*/
public void setLod(final double lod) {
this.lod = lod;
}
/**
* Get the UT1-UTC offset.
* @return the UT1-UTC offset
*/
public double getUt1MinusUtc() {
return ut1MinusUtc;
}
/**
* Set the UT1-UTC offset.
* @param ut1MinusUtc the value to set
*/
public void setUt1MinusUtc(final double ut1MinusUtc) {
this.ut1MinusUtc = ut1MinusUtc;
}
/**
* Get the X polar motion.
* @return the X polar motion in radians
*/
public double getXPo() {
return xPo;
}
/**
* Set the X polar motion.
* @param xPo the X polar motion to set in radians
*/
public void setxPo(final double xPo) {
this.xPo = xPo;
}
/**
* Get the Y polar motion.
* @return the Y polar motion in radians
*/
public double getYPo() {
return yPo;
}
/**
* Set the Y polar motion.
* @param yPo the Y polar motion to set in radians
*/
public void setyPo(final double yPo) {
this.yPo = yPo;
}
/**
* Get the nutation correction in longitude.
* @return the nutation correction in longitude
*/
public double getNutLn() {
return nutLn;
}
/**
* Set the nutation correction in longitude.
* @param nutLn the nutation correction in longitude to set
*/
public void setNutLn(final double nutLn) {
this.nutLn = nutLn;
}
/**
* Get the nutation correction in obliquity.
* @return the nutation correction in obliquity in radians
*/
public double getNutOb() {
return nutOb;
}
/**
* Set the nutation correction in obliquity.
* @param nutOb the nutation correction in obliquity to set in radians
*/
public void setNutOb(final double nutOb) {
this.nutOb = nutOb;
}
/**
* Get the nutation correction X.
* @return the nutation correction X in radians
*/
public double getNutX() {
return nutX;
}
/**
* Set the nutation correction X.
* @param nutX the nutation correction X to set in radians
*/
public void setNutX(final double nutX) {
this.nutX = nutX;
}
/**
* Get the nutation correction Y.
* @return the nutation correction Y in radians
*/
public double getNutY() {
return nutY;
}
/**
* Set the nutation correction Y.
* @param nutY the nutation correction Y to set in radians
*/
public void setNutY(final double nutY) {
this.nutY = nutY;
}
/**
* Converts to an {@link EOPEntry}.
* @param converter converter to use for nutation corrections
* @param version ITRF version
* @param scale time scale for epochs
* @return an {@code EOPEntry}
*/
public EOPEntry toEopEntry(final IERSConventions.NutationCorrectionConverter converter,
final ITRFVersion version, final TimeScale scale) {
// Modified Julian Day
final int mjd = epoch.getComponents(scale).getDate().getMJD();
// Array for equinox and non rotating origin
final double[] nro = (nutX != 0 && nutY != 0) ? new double[] {nutX, nutY} : converter.toNonRotating(epoch, nutLn, nutOb);
final double[] equinox = (nutLn != 0 && nutOb != 0) ? new double[] {nutLn, nutOb} : converter.toEquinox(epoch, nutX, nutY);
// Create a new EOPEntry object storing the extracted data, then add it to the list of EOPEntries.
return new EOPEntry(mjd, ut1MinusUtc, lod,
xPo, yPo,
equinox[0], equinox[1],
nro[0], nro[1],
version, epoch);
}
}
......@@ -28,6 +28,7 @@ import java.util.stream.Stream;
import org.hipparchus.CalculusFieldElement;
import org.hipparchus.analysis.interpolation.FieldHermiteInterpolator;
import org.hipparchus.analysis.interpolation.HermiteInterpolator;
import org.hipparchus.util.FastMath;
import org.hipparchus.util.MathArrays;
import org.orekit.annotation.DefaultDataContext;
import org.orekit.data.DataContext;
......@@ -126,9 +127,9 @@ public class EOPHistory implements Serializable {
this.conventions = conventions;
this.tidalCorrection = tidalCorrection;
this.timeScales = timeScales;
if (data.size() >= INTERPOLATION_POINTS) {
if (data.size() >= 1) {
// enough data to interpolate
cache = new ImmutableTimeStampedCache<EOPEntry>(INTERPOLATION_POINTS, data);
cache = new ImmutableTimeStampedCache<EOPEntry>(FastMath.min(INTERPOLATION_POINTS, data.size()), data);
hasData = true;
} else {
// not enough data to interpolate -> always use null correction
......
......@@ -17,7 +17,6 @@
package org.orekit.files.sinex;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.SortedSet;
......@@ -68,10 +67,12 @@ public class SinexLoaderEopTest {
loader.fillHistory(converter, history);
final UnitsConverter unitConvRad = new UnitsConverter(Unit.parse("mas"), Unit.RADIAN);
AbsoluteDate date = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (351 - 1)).shiftedBy(0);
AbsoluteDate date1 = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (350));
AbsoluteDate date2 = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (352));
// Check size of set
Assert.assertEquals(4, history.size());
Assert.assertEquals(4, loader.getParsedEop().size());
// Test if the values are correctly extracted
EOPEntry firstEntry = history.first();
......@@ -81,19 +82,30 @@ public class SinexLoaderEopTest {
// Test if a valid EOPHistory object can be built
EOPHistory eopHistory = new EOPHistory(IERSConventions.IERS_2010, history, true, DataContext.getDefault().getTimeScales());
Assert.assertEquals(-0.172046001405041E+03, eopHistory.getUT1MinusUTC(date)*1000, 1e-15);
Assert.assertEquals(unitConvRad.convert(0.994323310003336E+02), eopHistory.getPoleCorrection(date).getXp(), 1e-15);
Assert.assertEquals(unitConvRad.convert(0.275001985187467E+03), eopHistory.getPoleCorrection(date).getYp(), 1e-15);
Assert.assertEquals(0, eopHistory.getEquinoxNutationCorrection(date)[0], 1e-15);
Assert.assertEquals(0, eopHistory.getEquinoxNutationCorrection(date)[1], 1e-15);
Assert.assertEquals(0, eopHistory.getNonRotatinOriginNutationCorrection(date)[0], 1e-15);
Assert.assertEquals(0, eopHistory.getNonRotatinOriginNutationCorrection(date)[1], 1e-15);
Assert.assertEquals(-0.172046001405041, eopHistory.getUT1MinusUTC(date1), 1e-15);
Assert.assertEquals(unitConvRad.convert(0.994323310003336E+02), eopHistory.getPoleCorrection(date1).getXp(), 1e-15);
Assert.assertEquals(unitConvRad.convert(0.275001985187467E+03), eopHistory.getPoleCorrection(date1).getYp(), 1e-15);
Assert.assertEquals(0, eopHistory.getEquinoxNutationCorrection(date1)[0], 1e-15);
Assert.assertEquals(0, eopHistory.getEquinoxNutationCorrection(date1)[1], 1e-15);
Assert.assertEquals(0, eopHistory.getNonRotatinOriginNutationCorrection(date1)[0], 1e-15);
Assert.assertEquals(0, eopHistory.getNonRotatinOriginNutationCorrection(date1)[1], 1e-15);
Assert.assertEquals(-.172731650844468, eopHistory.getUT1MinusUTC(date2), 1e-15);
Assert.assertEquals(unitConvRad.convert(0.958035125590580E+02), eopHistory.getPoleCorrection(date2).getXp(), 1e-15);
Assert.assertEquals(unitConvRad.convert(0.275653571617736E+03), eopHistory.getPoleCorrection(date2).getYp(), 1e-15);
Assert.assertEquals(0, eopHistory.getEquinoxNutationCorrection(date2)[0], 1e-15);
Assert.assertEquals(0, eopHistory.getEquinoxNutationCorrection(date2)[1], 1e-15);
Assert.assertEquals(0, eopHistory.getNonRotatinOriginNutationCorrection(date2)[0], 1e-15);
Assert.assertEquals(0, eopHistory.getNonRotatinOriginNutationCorrection(date2)[1], 1e-15);
// Checking start and end dates
AbsoluteDate firstDate = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (350 - 1)).shiftedBy(0);
// 19:350:00000
AbsoluteDate firstDate = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (349));
Assert.assertEquals(firstDate, eopHistory.getStartDate());
AbsoluteDate endDate = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (353 - 1)).shiftedBy(0);
// 19:353:00000
AbsoluteDate endDate = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (352));
Assert.assertEquals(endDate, eopHistory.getEndDate());
}
......@@ -116,19 +128,23 @@ public class SinexLoaderEopTest {
final UnitsConverter unitConvRad = new UnitsConverter(Unit.parse("mas"), Unit.RADIAN);
// Setting up the date, and generating elements not present at first for check
AbsoluteDate date = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (351 - 1)).shiftedBy(43185);
double[] equinox = converter.toEquinox(date, unitConvRad.convert(-1.10122731910265E+03), unitConvRad.convert(-4.00387630903350E+03));
AbsoluteDate date = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * 350 + 43185.0);
// Test if the values are correctly extracted
EOPEntry firstEntry = history.first();
Assert.assertEquals(unitConvRad.convert(7.68783442726072E+01), firstEntry.getX(), 1e-15);
Assert.assertEquals(unitConvRad.convert(3.47286203337827E+02), firstEntry.getY(), 1e-15);
double xPo = unitConvRad.convert(7.68783442726072E+01);
double yPo = unitConvRad.convert(3.47286203337827E+02);
double nutX = unitConvRad.convert(-1.10122731910265E+03);
double nutY = unitConvRad.convert(-4.00387630903350E+03);
double[] equinox = converter.toEquinox(date, nutX, nutY);
Assert.assertEquals(xPo, firstEntry.getX(), 1e-15);
Assert.assertEquals(yPo, firstEntry.getY(), 1e-15);
Assert.assertEquals(-3.17284190690589E+04, firstEntry.getUT1MinusUTC() * 1000, 1e-15);
Assert.assertEquals(1.32354538674901E+00, firstEntry.getLOD() * 1000, 1e-15);
Assert.assertEquals(unitConvRad.convert(-1.10122731910265E+03), firstEntry.getDx(), 1e-15);
Assert.assertEquals(unitConvRad.convert(-4.00387630903350E+03), firstEntry.getDy(), 1e-15);
Assert.assertEquals(equinox[0], firstEntry.getDdPsi(), 1e-15);
Assert.assertEquals(equinox[1], firstEntry.getDdEps(), 1e-15);
Assert.assertEquals(nutX, firstEntry.getDx(), 1e-15);
Assert.assertEquals(nutY, firstEntry.getDy(), 1e-15);
Assert.assertEquals(equinox[0], firstEntry.getDdPsi(), 4.5e-11);
Assert.assertEquals(equinox[1], firstEntry.getDdEps(), 4.8e-12);
// Test if a valid EOPHistory object can be built
EOPHistory eopHistory = new EOPHistory(IERSConventions.IERS_2010, history, true, DataContext.getDefault().getTimeScales());
......@@ -139,8 +155,8 @@ public class SinexLoaderEopTest {
Assert.assertEquals( 1.32354538674901E+00, eopHistory.getLOD(date.shiftedBy(10))* 1000, 1e-15);
Assert.assertEquals(unitConvRad.convert(-1.10122731910265E+03), eopHistory.getNonRotatinOriginNutationCorrection(date.shiftedBy(10))[0], 1e-15);
Assert.assertEquals(unitConvRad.convert(-4.00387630903350E+03), eopHistory.getNonRotatinOriginNutationCorrection(date.shiftedBy(10))[1], 1e-15);
Assert.assertEquals(equinox[0], eopHistory.getEquinoxNutationCorrection(date.shiftedBy(10))[0], 1e-15);
Assert.assertEquals(equinox[1], eopHistory.getEquinoxNutationCorrection(date.shiftedBy(10))[1], 1e-15);
Assert.assertEquals(equinox[0], eopHistory.getEquinoxNutationCorrection(date.shiftedBy(10))[0], 4.5e-11);
Assert.assertEquals(equinox[1], eopHistory.getEquinoxNutationCorrection(date.shiftedBy(10))[1], 4.8e-12);
}
@Test
......@@ -209,43 +225,14 @@ public class SinexLoaderEopTest {
Assert.assertEquals(1.32354538674901E+00, firstEntry.getLOD() * 1000, 1e-15);
Assert.assertEquals(unitConvRad.convert(-1.10122731910265E+03), firstEntry.getDdPsi(), 1e-15);
Assert.assertEquals(unitConvRad.convert(-4.00387630903350E+03), firstEntry.getDdEps(), 1e-15);
Assert.assertEquals(nro[0], firstEntry.getDx(), 1e-15);
Assert.assertEquals(nro[1], firstEntry.getDy(), 1e-15);
Assert.assertEquals(nro[0], firstEntry.getDx(), 1.8e-11);
Assert.assertEquals(nro[1], firstEntry.getDy(), 2.0e-12);
}
@Test
// Case NUT_X, NUT_Y == null, NUT_LN, NUT_OB != null
public void testSmallSinexEopSynth4File() {
// Setting up the Sinex loader
SinexLoader loader = new SinexLoader("cod20842-small-synthEOP4.snx");
loader.setITRFVersion(2014);
Assert.assertEquals(ITRFVersion.ITRF_2014, loader.getITRFVersion());
IERSConventions.NutationCorrectionConverter converter =
IERSConventions.IERS_2010.getNutationCorrectionConverter();
SortedSet<EOPEntry> history = new TreeSet<EOPEntry>(new ChronologicalComparator());
loader.fillHistory(converter, history);
final UnitsConverter unitConvRad = new UnitsConverter(Unit.parse("mas"), Unit.RADIAN);
EOPEntry firstEntry = history.first();
Assert.assertEquals(unitConvRad.convert(7.68783442726072E+01), firstEntry.getX(), 1e-15);
Assert.assertEquals(unitConvRad.convert(3.47286203337827E+02), firstEntry.getY(), 1e-15);
Assert.assertEquals(-3.17284190690589E+04, firstEntry.getUT1MinusUTC() * 1000, 1e-15);
Assert.assertEquals(1.32354538674901E+00, firstEntry.getLOD() * 1000, 1e-15);
Assert.assertEquals(unitConvRad.convert(-1.10122731910265E+03), firstEntry.getDx(), 1e-15);
Assert.assertEquals(unitConvRad.convert(0), firstEntry.getDy(), 1e-15);
Assert.assertEquals(unitConvRad.convert(0), firstEntry.getDdPsi(), 1e-15);
Assert.assertEquals(unitConvRad.convert(-4.00387630903350E+03), firstEntry.getDdEps(), 1e-15);
}
@Test
// Test to check if the closest date if condition is respected for the definition of the interpolated points,
// in the case of a single eop entry parsed from the Sinex file.
public void testSmallSinexEopClosestEnd() {
// Test the number of EOP entries and epochs
public void testEpochsInFile() {
// Setting up the Sinex loader
SinexLoader loader = new SinexLoader("cod_ifCloseEnd.snx");
loader.setITRFVersion(2014);
......@@ -256,18 +243,18 @@ public class SinexLoaderEopTest {
SortedSet<EOPEntry> history = new TreeSet<EOPEntry>(new ChronologicalComparator());
loader.fillHistory(converter, history);
AbsoluteDate dateStart = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (351 - 1)).shiftedBy(0);
AbsoluteDate dateInFile = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (351 - 1)).shiftedBy(45000);
AbsoluteDate dateInterp = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (351 - 1)).shiftedBy(41400);
AbsoluteDate dateEnd = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (352 - 1)).shiftedBy(0);
AbsoluteDate dateStart = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * 350);
AbsoluteDate dateInFile = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * 350 + 45000.0);
AbsoluteDate dateEnd = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * 351);
List<AbsoluteDate> listDates = Arrays.asList(dateStart, dateInterp, dateInFile, dateEnd);
List<AbsoluteDate> listDates = Arrays.asList(dateStart, dateInFile, dateEnd);
int cpt = 0;
for (EOPEntry entry : history) {
Assert.assertEquals(listDates.get(cpt), entry.getDate());
cpt = cpt+1;
}
}
@Test
......@@ -326,22 +313,18 @@ public class SinexLoaderEopTest {
EOPHistory eopHistory = DataContext.getDefault().getFrames().getEOPHistory(IERSConventions.IERS_2010, true);
// Setting up dates for further checks
AbsoluteDate startDate = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (351 - 1)).shiftedBy(0);
AbsoluteDate endDate = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (354 - 1)).shiftedBy(0);
AbsoluteDate date = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (351 - 1)).shiftedBy(43185);
AbsoluteDate dateInterp = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (351 - 1)).shiftedBy(43215);
AbsoluteDate date2 = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (352 - 1)).shiftedBy(43185);
AbsoluteDate dateInterp2 = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (352 - 1)).shiftedBy(43215);
AbsoluteDate date3 = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (353 - 1)).shiftedBy(43185);
AbsoluteDate dateInterp3 = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (353 - 1)).shiftedBy(43215);
AbsoluteDate startDate = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (350));
AbsoluteDate endDate = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (353));
AbsoluteDate date = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * 350 + 43185.0);
AbsoluteDate date2 = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * 351 + 43185.0);
AbsoluteDate date3 = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * 352 + 43185.0);
// Intermediate shared date between two files
AbsoluteDate dateI12 = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (352 - 1)).shiftedBy(0);
AbsoluteDate dateI23 = new AbsoluteDate(new DateComponents(2019, 1, 1), utc).shiftedBy(Constants.JULIAN_DAY * (353 - 1)).shiftedBy(0);
List<AbsoluteDate> listDates = Arrays.asList(startDate, date, dateInterp, dateI12, date2, dateInterp2, dateI23, date3, dateInterp3, endDate);
List<AbsoluteDate> listDates = Arrays.asList(startDate, date, dateI12, date2, dateI23, date3, endDate);
// Simplify checks to stay in the units of Orekit.
final UnitsConverter unitConvRad = new UnitsConverter(Unit.parse("mas"), Unit.RADIAN);
......@@ -403,10 +386,11 @@ public class SinexLoaderEopTest {
// Last entry
Assert.assertEquals(unitConvRad.convert(5.68783442726072E+01), eopHistory.getPoleCorrection(endDate).getXp(), 1e-15);
Assert.assertEquals(unitConvRad.convert(1.47286203337827E+02), eopHistory.getPoleCorrection(endDate).getYp(), 1e-15);
Assert.assertEquals(-5.17284190690589E+04, eopHistory.getUT1MinusUTC(endDate) * 1000, 1e-15);
Assert.assertEquals(-5.17284190690589E+01, eopHistory.getUT1MinusUTC(endDate), 1e-14);
Assert.assertEquals( 3.32354538674901E+00, eopHistory.getLOD(endDate)* 1000, 1e-15);
Assert.assertEquals(unitConvRad.convert(-3.10122731910265E+03), eopHistory.getNonRotatinOriginNutationCorrection(endDate)[0], 1e-15);
Assert.assertEquals(unitConvRad.convert(-6.00387630903350E+03), eopHistory.getNonRotatinOriginNutationCorrection(endDate)[1], 1e-15);
}
}
%=SNX 2.01 COD 19:356:05790 IGS 19:350:00000 19:353:00000 P 00815 1 S E A
*-------------------------------------------------------------------------------
*CODE'S FINAL 3-DAY SOLUTION FOR (MIDDLE) DAY 351, 2019 22-DEC-19 01:36
*-------------------------------------------------------------------------------
+FILE/REFERENCE
*INFO_TYPE_________ INFO________________________________________________________
DESCRIPTION CODE, Astronomical Institute, University of Bern
OUTPUT CODE IGS 3-day solution
CONTACT code@aiub.unibe.ch
SOFTWARE Bernese GNSS Software Version 5.3
HARDWARE UBELIX: Linux, x86_64
INPUT CODE IGS 1-day solutions
-FILE/REFERENCE
*-------------------------------------------------------------------------------
+INPUT/ACKNOWLEDGMENTS
*AGY DESCRIPTION________________________________________________________________
COD Center for Orbit Determination in Europe, AIUB, Switzerland
IGS International GNSS Service
-INPUT/ACKNOWLEDGMENTS
*-------------------------------------------------------------------------------
+SOLUTION/STATISTICS
*_STATISTICAL PARAMETER________ __VALUE(S)____________
NUMBER OF OBSERVATIONS 5029555
NUMBER OF UNKNOWNS 49843
NUMBER OF DEGREES OF FREEDOM 4979712
PHASE MEASUREMENTS SIGMA 0.00100
SAMPLING INTERVAL (SECONDS) 180
WEIGHTED SQUARE SUM OF O-C 11.270804735010838
-SOLUTION/STATISTICS
*-------------------------------------------------------------------------------
+SITE/ID
*CODE PT __DOMES__ T _STATION DESCRIPTION__ APPROX_LON_ APPROX_LAT_ _APP_H_
ABMF A 97103M001 P Les Abymes, FR 298 28 20.9 16 15 44.3 -25.6
ABPO A 33302M001 P Antananarivo, MG 47 13 45.2 -19 1 5.9 1553.0
-SITE/ID
*-------------------------------------------------------------------------------
+SITE/RECEIVER
*SITE PT SOLN T DATA_START__ DATA_END____ DESCRIPTION_________ S/N__ FIRMWARE___
ABMF A 1 P 19:350:00000 19:352:86370 SEPT POLARX5 ----- -----------
ABPO A 1 P 19:350:00000 19:352:86370 SEPT POLARX5 ----- -----------
-SITE/RECEIVER
*-------------------------------------------------------------------------------
+SITE/ANTENNA
*SITE PT SOLN T DATA_START__ DATA_END____ DESCRIPTION_________ S/N__
ABMF A 1 P 19:350:00000 19:352:86370 TRM57971.00 NONE -----
ABPO A 1 P 19:350:00000 19:352:86370 ASH701945G_M SCIT -----
-SITE/ANTENNA
*-------------------------------------------------------------------------------
+SITE/ECCENTRICITY
* UP______ NORTH___ EAST____
*SITE PT SOLN T DATA_START__ DATA_END____ AXE ARP->BENCHMARK(M)_________
ABMF A 1 P 19:350:00000 19:352:86370 UNE 0.0000 0.0000 0.0000
ABPO A 1 P 19:350:00000 19:352:86370 UNE 0.0083 0.0000 0.0000
-SITE/ECCENTRICITY
*-------------------------------------------------------------------------------
+SATELLITE/ID
*SITE PR COSPAR___ T DATA_START__ DATA_END____ ANTENNA_____________
G063 01 2011-036A P 11:197:00000 00:000:00000 BLOCK IIF
G061 02 2004-045A P 04:311:00000 00:000:00000 BLOCK IIR-B
G069 03 2014-068A P 14:302:00000 00:000:00000 BLOCK IIF
G074 04 2018-109A P 19:282:00000 00:000:00000 BLOCK IIIA
G050 05 2009-043A P 09:229:00000 00:000:00000 BLOCK IIR-M
G067 06 2014-026A P 14:137:00000 00:000:00000 BLOCK IIF
G048 07 2008-012A P 08:075:00000 00:000:00000 BLOCK IIR-M
G072 08 2015-033A P 15:196:00000 00:000:00000 BLOCK IIF
G068 09 2014-045A P 14:214:00000 00:000:00000 BLOCK IIF
G073 10 2015-062A P 15:304:00000 00:000:00000 BLOCK IIF
G046 11 1999-055A P 99:280:00000 00:000:00000 BLOCK IIR-A
G058 12 2006-052A P 06:321:00000 00:000:00000 BLOCK IIR-M
G043 13 1997-035A P 97:204:00000 00:000:00000 BLOCK IIR-A
G041 14 2000-071A P 00:315:00000 00:000:00000 BLOCK IIR-A
G055 15 2007-047A P 07:290:00000 00:000:00000 BLOCK IIR-M
G056 16 2003-005A P 03:029:00000 00:000:00000 BLOCK IIR-A
G053 17 2005-038A P 05:269:00000 00:000:00000 BLOCK IIR-M
G034 18 1993-068A P 18:024:00000 00:000:00000 BLOCK IIA
G059 19 2004-009A P 04:080:00000 00:000:00000 BLOCK IIR-B
G051 20 2000-025A P 00:132:00000 00:000:00000 BLOCK IIR-A
G045 21 2003-010A P 03:090:00000 00:000:00000 BLOCK IIR-A
G047 22 2003-058A P 03:355:00000 00:000:00000 BLOCK IIR-B
G060 23 2004-023A P 04:175:00000 00:000:00000 BLOCK IIR-B
G065 24 2012-053A P 12:278:00000 00:000:00000 BLOCK IIF
G062 25 2010-022A P 10:148:00000 00:000:00000 BLOCK IIF
G071 26 2015-013A P 15:084:00000 00:000:00000 BLOCK IIF
G066 27 2013-023A P 13:135:00000 00:000:00000 BLOCK IIF
G044 28 2000-040A P 00:198:00000 00:000:00000 BLOCK IIR-A
G057 29 2007-062A P 07:354:00000 00:000:00000 BLOCK IIR-M
G064 30 2014-008A P 14:052:00000 00:000:00000 BLOCK IIF
G052 31 2006-042A P 06:268:00000 00:000:00000 BLOCK IIR-M
G070 32 2016-007A P 16:036:00000 00:000:00000 BLOCK IIF
R730 01 2009-070A P 09:348:00000 00:000:00000 GLONASS-M
R747 02 2013-019A P 13:182:00000 00:000:00000 GLONASS-M
R744 03 2011-064A P 11:335:00000 00:000:00000 GLONASS-M
R856 05 2018-053A P 18:234:00000 00:000:00000 GLONASS-M
R745 07 2011-064B P 11:349:00000 00:000:00000 GLONASS-M
R743 08 2011-064C P 13:054:00000 00:000:00000 GLONASS-M
R802 09 2014-075A P 16:323:00000 00:000:00000 GLONASS-K1
R853 11 2016-032A P 16:176:00000 00:000:00000 GLONASS-M
R858 12 2019-030A P 19:170:00000 00:000:00000 GLONASS-M
R721 13 2007-065A P 07:359:00000 00:000:00000 GLONASS-M
R852 14 2017-055A P 17:283:00000 00:000:00000 GLONASS-M
R857 15 2018-086A P 18:328:00000 00:000:00000 GLONASS-M
R736 16 2010-041C P 16:069:00000 00:000:00000 GLONASS-M