From 240e60f8dba2f376ded5749a2605733324c86bf6 Mon Sep 17 00:00:00 2001
From: GC <865-g.c@users.noreply.gitlab.orekit.org>
Date: Tue, 10 May 2022 17:07:43 +0200
Subject: [PATCH 1/6] Initial commit issue-779: Default handler for
PositionAngleDetector has improperly defined behavior on EventOccurred -
Replaced StopOnIncreasing handler with StopOnEvent handler in
PositionAngleDetector. - Added test
---
.../events/PositionAngleDetector.java | 3 +-
.../events/PositionAngleDetectorTest.java | 94 +++++++++++++++++++
2 files changed, 96 insertions(+), 1 deletion(-)
diff --git a/src/main/java/org/orekit/propagation/events/PositionAngleDetector.java b/src/main/java/org/orekit/propagation/events/PositionAngleDetector.java
index 3f6eec41d..6ec607f11 100644
--- a/src/main/java/org/orekit/propagation/events/PositionAngleDetector.java
+++ b/src/main/java/org/orekit/propagation/events/PositionAngleDetector.java
@@ -32,6 +32,7 @@ import org.orekit.orbits.OrbitType;
import org.orekit.orbits.PositionAngle;
import org.orekit.propagation.SpacecraftState;
import org.orekit.propagation.events.handlers.EventHandler;
+import org.orekit.propagation.events.handlers.StopOnEvent;
import org.orekit.propagation.events.handlers.StopOnIncreasing;
import org.orekit.time.AbsoluteDate;
import org.orekit.utils.TimeSpanMap;
@@ -92,7 +93,7 @@ public class PositionAngleDetector extends AbstractDetector(),
+ this(maxCheck, threshold, DEFAULT_MAX_ITER, new StopOnEvent(),
orbitType, positionAngle, angle);
}
diff --git a/src/test/java/org/orekit/propagation/events/PositionAngleDetectorTest.java b/src/test/java/org/orekit/propagation/events/PositionAngleDetectorTest.java
index a06a12e13..972cf020a 100644
--- a/src/test/java/org/orekit/propagation/events/PositionAngleDetectorTest.java
+++ b/src/test/java/org/orekit/propagation/events/PositionAngleDetectorTest.java
@@ -17,6 +17,7 @@
package org.orekit.propagation.events;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
+import org.hipparchus.ode.ODEIntegrator;
import org.hipparchus.ode.nonstiff.AdaptiveStepsizeIntegrator;
import org.hipparchus.ode.nonstiff.DormandPrince853Integrator;
import org.hipparchus.util.FastMath;
@@ -25,6 +26,7 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.orekit.Utils;
+import org.orekit.bodies.OneAxisEllipsoid;
import org.orekit.errors.OrekitIllegalArgumentException;
import org.orekit.errors.OrekitMessages;
import org.orekit.forces.ForceModel;
@@ -247,6 +249,98 @@ public class PositionAngleDetectorTest {
}
+
+ @Test
+ public void testIssue779() {
+
+ final TimeScale utc = TimeScalesFactory.getUTC();
+ final AbsoluteDate initialDate = new AbsoluteDate(2022, 05, 10, 00, 00, 00.000, utc);
+
+ // General orbit
+ double a = 24396159; // semi major axis in meters
+ double e = 0.72831215; // eccentricity
+ double i = FastMath.toRadians(7); // inclination
+ double omega = FastMath.toRadians(180); // perigee argument
+ double raan = FastMath.toRadians(261); // right ascension of ascending node
+ double lM = 0; // mean anomaly
+
+ Orbit orbit = new KeplerianOrbit(a, e, i, omega, raan, lM, PositionAngle.MEAN,
+ FramesFactory.getEME2000(), initialDate,
+ Constants.WGS84_EARTH_MU);
+
+ final SpacecraftState initialState = new SpacecraftState(orbit);
+
+ // Create and configure propagator
+ final double minStep = 0.001;
+ final double maxStep = 120.0;
+ final double positionTolerance = 0.1;
+ final int degree = 10;
+ final int order = 10;
+
+ final double[][] tol = NumericalPropagator.tolerances(positionTolerance, orbit, OrbitType.KEPLERIAN);
+ final ODEIntegrator integrator = new DormandPrince853Integrator(minStep, maxStep, tol[0], tol[1]);
+ final NumericalPropagator np = new NumericalPropagator(integrator);
+ np.setOrbitType(OrbitType.KEPLERIAN);
+ np.setPositionAngleType(PositionAngle.TRUE);
+
+ // Earth gravity field
+ GravityFieldFactory.addPotentialCoefficientsReader(new ICGEMFormatReader("eigen-6s-truncated", false));
+ final NormalizedSphericalHarmonicsProvider provider = GravityFieldFactory.getNormalizedProvider(degree, order);
+ final ForceModel holmesFeatherstone =
+ new HolmesFeatherstoneAttractionModel(FramesFactory.getITRF(IERSConventions.IERS_2010,true), provider);
+ np.addForceModel(holmesFeatherstone);
+
+
+ // Event detectors configurations
+ final double maxCheck = 600.0;
+ final double threshold = 1.0e-6;
+ final double angle = 90.0;
+
+
+ // First, configure a propagation with the default event handler (expected to stop on event)
+ PositionAngleDetector detectorDefault = new PositionAngleDetector(maxCheck,
+ threshold,
+ OrbitType.KEPLERIAN,
+ PositionAngle.MEAN,
+ FastMath.toRadians(angle));
+
+ // Create and add event logger
+ EventsLogger logger1 = new EventsLogger();
+ np.addEventDetector(logger1.monitorDetector(detectorDefault));
+
+ // Propagate
+ np.setInitialState(initialState);
+ np.propagate(initialDate.shiftedBy(Constants.JULIAN_DAY));
+
+
+
+ // Then, repeat the test with a Continue On Event handler
+ np.clearEventsDetectors();
+
+ // Create and configure the Continue On Event handler
+ PositionAngleDetector detectorContinue = new PositionAngleDetector(maxCheck,
+ threshold,
+ OrbitType.KEPLERIAN,
+ PositionAngle.MEAN,
+ FastMath.toRadians(angle)).
+ withHandler(new ContinueOnEvent<>());
+
+ // Create and add the event logger
+ EventsLogger logger2 = new EventsLogger();
+ np.addEventDetector(logger2.monitorDetector(detectorContinue));
+
+
+ // Propagate
+ np.resetInitialState(initialState);
+ np.propagate(initialDate.shiftedBy(Constants.JULIAN_DAY));
+
+
+ // Check test results
+ Assert.assertEquals(1, logger1.getLoggedEvents().size());
+ Assert.assertTrue(logger2.getLoggedEvents().size() > 1);
+ }
+
+
private void doTest(final OrbitType orbitType, final PositionAngle positionAngle,
final double angle, final double deltaT, final int expectedCrossings) {
--
GitLab
From b8c98db702329aa2f4a5fc1d1dbbddf33d865f3a Mon Sep 17 00:00:00 2001
From: GC <865-g.c@users.noreply.gitlab.orekit.org>
Date: Thu, 12 May 2022 10:24:18 +0200
Subject: [PATCH 2/6] - Replaced NumericalPropagator by KeplerianPropagator -
Small improvements to test
---
.../events/PositionAngleDetectorTest.java | 44 +++++--------------
1 file changed, 11 insertions(+), 33 deletions(-)
diff --git a/src/test/java/org/orekit/propagation/events/PositionAngleDetectorTest.java b/src/test/java/org/orekit/propagation/events/PositionAngleDetectorTest.java
index 972cf020a..4d41bec81 100644
--- a/src/test/java/org/orekit/propagation/events/PositionAngleDetectorTest.java
+++ b/src/test/java/org/orekit/propagation/events/PositionAngleDetectorTest.java
@@ -46,6 +46,7 @@ import org.orekit.propagation.EphemerisGenerator;
import org.orekit.propagation.Propagator;
import org.orekit.propagation.SpacecraftState;
import org.orekit.propagation.analytical.EcksteinHechlerPropagator;
+import org.orekit.propagation.analytical.KeplerianPropagator;
import org.orekit.propagation.events.EventsLogger.LoggedEvent;
import org.orekit.propagation.events.handlers.ContinueOnEvent;
import org.orekit.propagation.numerical.NumericalPropagator;
@@ -267,30 +268,10 @@ public class PositionAngleDetectorTest {
Orbit orbit = new KeplerianOrbit(a, e, i, omega, raan, lM, PositionAngle.MEAN,
FramesFactory.getEME2000(), initialDate,
Constants.WGS84_EARTH_MU);
+
+
- final SpacecraftState initialState = new SpacecraftState(orbit);
-
- // Create and configure propagator
- final double minStep = 0.001;
- final double maxStep = 120.0;
- final double positionTolerance = 0.1;
- final int degree = 10;
- final int order = 10;
-
- final double[][] tol = NumericalPropagator.tolerances(positionTolerance, orbit, OrbitType.KEPLERIAN);
- final ODEIntegrator integrator = new DormandPrince853Integrator(minStep, maxStep, tol[0], tol[1]);
- final NumericalPropagator np = new NumericalPropagator(integrator);
- np.setOrbitType(OrbitType.KEPLERIAN);
- np.setPositionAngleType(PositionAngle.TRUE);
-
- // Earth gravity field
- GravityFieldFactory.addPotentialCoefficientsReader(new ICGEMFormatReader("eigen-6s-truncated", false));
- final NormalizedSphericalHarmonicsProvider provider = GravityFieldFactory.getNormalizedProvider(degree, order);
- final ForceModel holmesFeatherstone =
- new HolmesFeatherstoneAttractionModel(FramesFactory.getITRF(IERSConventions.IERS_2010,true), provider);
- np.addForceModel(holmesFeatherstone);
-
-
+
// Event detectors configurations
final double maxCheck = 600.0;
final double threshold = 1.0e-6;
@@ -298,6 +279,7 @@ public class PositionAngleDetectorTest {
// First, configure a propagation with the default event handler (expected to stop on event)
+ Propagator np1 = new KeplerianPropagator(orbit);
PositionAngleDetector detectorDefault = new PositionAngleDetector(maxCheck,
threshold,
OrbitType.KEPLERIAN,
@@ -306,16 +288,15 @@ public class PositionAngleDetectorTest {
// Create and add event logger
EventsLogger logger1 = new EventsLogger();
- np.addEventDetector(logger1.monitorDetector(detectorDefault));
+ np1.addEventDetector(logger1.monitorDetector(detectorDefault));
// Propagate
- np.setInitialState(initialState);
- np.propagate(initialDate.shiftedBy(Constants.JULIAN_DAY));
+ np1.propagate(initialDate.shiftedBy(Constants.JULIAN_DAY));
// Then, repeat the test with a Continue On Event handler
- np.clearEventsDetectors();
+ Propagator np2 = new KeplerianPropagator(orbit);
// Create and configure the Continue On Event handler
PositionAngleDetector detectorContinue = new PositionAngleDetector(maxCheck,
@@ -323,17 +304,14 @@ public class PositionAngleDetectorTest {
OrbitType.KEPLERIAN,
PositionAngle.MEAN,
FastMath.toRadians(angle)).
- withHandler(new ContinueOnEvent<>());
+ withHandler(new ContinueOnEvent<>());
// Create and add the event logger
EventsLogger logger2 = new EventsLogger();
- np.addEventDetector(logger2.monitorDetector(detectorContinue));
-
+ np2.addEventDetector(logger2.monitorDetector(detectorContinue));
// Propagate
- np.resetInitialState(initialState);
- np.propagate(initialDate.shiftedBy(Constants.JULIAN_DAY));
-
+ np2.propagate(initialDate.shiftedBy(Constants.JULIAN_DAY));
// Check test results
Assert.assertEquals(1, logger1.getLoggedEvents().size());
--
GitLab
From 59adf24c99aec4e4adc04a62a94a9abe50b95307 Mon Sep 17 00:00:00 2001
From: GC <865-g.c@users.noreply.gitlab.orekit.org>
Date: Thu, 12 May 2022 10:25:42 +0200
Subject: [PATCH 3/6] - Removed unused import "StopOnIncreasing" - Added
description about default handler
---
.../org/orekit/propagation/events/PositionAngleDetector.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/org/orekit/propagation/events/PositionAngleDetector.java b/src/main/java/org/orekit/propagation/events/PositionAngleDetector.java
index 6ec607f11..d26be12f9 100644
--- a/src/main/java/org/orekit/propagation/events/PositionAngleDetector.java
+++ b/src/main/java/org/orekit/propagation/events/PositionAngleDetector.java
@@ -33,7 +33,6 @@ import org.orekit.orbits.PositionAngle;
import org.orekit.propagation.SpacecraftState;
import org.orekit.propagation.events.handlers.EventHandler;
import org.orekit.propagation.events.handlers.StopOnEvent;
-import org.orekit.propagation.events.handlers.StopOnIncreasing;
import org.orekit.time.AbsoluteDate;
import org.orekit.utils.TimeSpanMap;
@@ -82,6 +81,7 @@ public class PositionAngleDetector extends AbstractDetector This instance uses by default the {@link StopOnEvent} handler
* @param maxCheck maximal checking interval (s)
* @param threshold convergence threshold (s)
* @param orbitType orbit type defining the angle type
--
GitLab
From 9c8e2458ea8522fdfdff9e6ae5ed40014abd0c23 Mon Sep 17 00:00:00 2001
From: GC <865-g.c@users.noreply.gitlab.orekit.org>
Date: Thu, 12 May 2022 12:07:10 +0200
Subject: [PATCH 4/6] First commit concerning issue-790. - Added CPFWriter
constructor with optional velocity flag - Added writeEphemerisLine method
with optional velocity flag
---
.../java/org/orekit/files/ilrs/CPFWriter.java | 18 ++++++++--
.../orekit/files/ilrs/StreamingCpfWriter.java | 34 ++++++++++++++++++-
2 files changed, 49 insertions(+), 3 deletions(-)
diff --git a/src/main/java/org/orekit/files/ilrs/CPFWriter.java b/src/main/java/org/orekit/files/ilrs/CPFWriter.java
index 22e62b118..6595e87d3 100644
--- a/src/main/java/org/orekit/files/ilrs/CPFWriter.java
+++ b/src/main/java/org/orekit/files/ilrs/CPFWriter.java
@@ -51,16 +51,30 @@ public class CPFWriter implements EphemerisFileWriter {
/** Time scale for dates. */
private final TimeScale timescale;
+ /** Flag for optional velocity record. */
+ private final boolean velocityFlag;
+
/**
* Constructor.
* @param header container for header data
* @param timescale time scale for dates
*/
public CPFWriter(final CPFHeader header, final TimeScale timescale) {
+ this(header, timescale, false);
+ }
+
+ /**
+ * Constructor.
+ * @param header container for header data
+ * @param timescale time scale for dates
+ * @param velocityFlag the flag for the optional velocity record
+ */
+ public CPFWriter(final CPFHeader header, final TimeScale timescale, final boolean velocityFlag) {
this.header = header;
this.timescale = timescale;
- }
+ this.velocityFlag = velocityFlag;
+ }
/** {@inheritDoc} */
@Override
@@ -93,7 +107,7 @@ public class CPFWriter implements EphemerisFileWriter {
final Segment segmentWriter = cpfWriter.newSegment(header.getRefFrame());
// Loop on coordinates
for (final TimeStampedPVCoordinates coordinates : segment.getCoordinates()) {
- segmentWriter.writeEphemerisLine(coordinates);
+ segmentWriter.writeEphemerisLine(coordinates, velocityFlag);
}
}
diff --git a/src/main/java/org/orekit/files/ilrs/StreamingCpfWriter.java b/src/main/java/org/orekit/files/ilrs/StreamingCpfWriter.java
index 20d79bf03..fd1c0535a 100644
--- a/src/main/java/org/orekit/files/ilrs/StreamingCpfWriter.java
+++ b/src/main/java/org/orekit/files/ilrs/StreamingCpfWriter.java
@@ -91,6 +91,9 @@ public class StreamingCpfWriter {
/** Real 17.3 Format. */
private static final String F17_3 = "%17.3f";
+ /** Real 19.6 Format. */
+ private static final String F19_6 = "%19.6f";
+
/** Space. */
private static final String SPACE = " ";
@@ -278,7 +281,7 @@ public class StreamingCpfWriter {
}
/**
- * Write a single ephemeris line This method does not
+ * Write a single ephemeris line with position record. This method does not
* write the velocity terms.
*
* @param pv the time, position, and velocity to write.
@@ -286,6 +289,18 @@ public class StreamingCpfWriter {
*/
public void writeEphemerisLine(final TimeStampedPVCoordinates pv)
throws IOException {
+ writeEphemerisLine(pv, false);
+ }
+
+ /**
+ * Write two ephemeris lines with position and velocity records.
+ *
+ * @param pv the time, position, and velocity to write.
+ * @param velocityFlag flag for the optional velocity record.
+ * @throws IOException if the output stream throws one while writing.
+ */
+ public void writeEphemerisLine(final TimeStampedPVCoordinates pv, final boolean velocityFlag)
+ throws IOException {
// Record type and direction flag
writeValue(writer, A2, "10", true);
@@ -309,6 +324,23 @@ public class StreamingCpfWriter {
// New line
writer.append(NEW_LINE);
+ // Write the velocity record
+ if (velocityFlag) {
+
+ // Record type and direction flag
+ writeValue(writer, A2, "20", true);
+ writeValue(writer, I1, DEFAULT_DIRECTION_FLAG, true);
+
+ // Velocity
+ final Vector3D velocity = pv.getVelocity();
+ writeValue(writer, F19_6, velocity.getX(), true);
+ writeValue(writer, F19_6, velocity.getY(), true);
+ writeValue(writer, F19_6, velocity.getZ(), false);
+
+ // New line
+ writer.append(NEW_LINE);
+ }
+
}
}
--
GitLab
From f25d77a93b24dfea4a4587617f21b19c49b919ef Mon Sep 17 00:00:00 2001
From: GC <865-g.c@users.noreply.gitlab.orekit.org>
Date: Thu, 12 May 2022 14:53:17 +0200
Subject: [PATCH 5/6] First commit for issue-790.
Added optional velocity vector to both CPF parser and writer.
---
src/main/java/org/orekit/files/ilrs/CPF.java | 19 +++++++++++++++++++
.../java/org/orekit/files/ilrs/CPFParser.java | 13 ++++++++++++-
2 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/src/main/java/org/orekit/files/ilrs/CPF.java b/src/main/java/org/orekit/files/ilrs/CPF.java
index 629f30881..79622e9d8 100644
--- a/src/main/java/org/orekit/files/ilrs/CPF.java
+++ b/src/main/java/org/orekit/files/ilrs/CPF.java
@@ -141,6 +141,25 @@ public class CPF implements EphemerisFile {
ephemeris.get(id).coordinates.add(coord);
}
+ /**
+ * Add the velocity to the last CPF coordinate entry.
+ * @param id satellite ILRS identifier
+ * @param velocity the velocity vector of the satellite
+ */
+ public void addSatelliteVelocityToCPFCoordinate(final String id, final Vector3D velocity) {
+ // Get the last coordinate entry, which contains the position vector
+ final CPFCoordinate lastCoordinate = ephemeris.get(id).coordinates.get(ephemeris.get(id).coordinates.size() - 1);
+
+ // Create a new CPFCoordinate object with both position and velocity information
+ final CPFCoordinate CPFCoordUpdated = new CPFCoordinate(lastCoordinate.getDate(),
+ lastCoordinate.getPosition(),
+ velocity,
+ lastCoordinate.getLeap());
+
+ // Patch the last record
+ ephemeris.get(id).coordinates.set(ephemeris.get(id).coordinates.size() - 1, CPFCoordUpdated);
+ }
+
/**
* Set the interpolation sample.
* @param interpolationSample interpolation sample
diff --git a/src/main/java/org/orekit/files/ilrs/CPFParser.java b/src/main/java/org/orekit/files/ilrs/CPFParser.java
index 3d070309e..4a579816b 100644
--- a/src/main/java/org/orekit/files/ilrs/CPFParser.java
+++ b/src/main/java/org/orekit/files/ilrs/CPFParser.java
@@ -496,7 +496,18 @@ public class CPFParser implements EphemerisFileParser {
/** {@inheritDoc} */
@Override
public void parse(final String line, final ParseInfo pi) {
- // Not implemented yet
+
+ // Data contained in the line
+ final String[] values = SEPARATOR.split(line);
+
+ // Coordinates
+ final double x = Double.parseDouble(values[2]);
+ final double y = Double.parseDouble(values[3]);
+ final double z = Double.parseDouble(values[4]);
+ final Vector3D velocity = new Vector3D(x, y, z);
+
+ // CPF coordinate
+ pi.file.addSatelliteVelocityToCPFCoordinate(pi.file.getHeader().getIlrsSatelliteId(), velocity);
}
/** {@inheritDoc} */
--
GitLab
From 7882288552690688c578ba0fb73f0c5fc911c03c Mon Sep 17 00:00:00 2001
From: GC <865-g.c@users.noreply.gitlab.orekit.org>
Date: Fri, 13 May 2022 10:50:06 +0200
Subject: [PATCH 6/6] Issue-790
Added test for CPF writer.
---
.../org/orekit/files/ilrs/CPFWriterTest.java | 114 ++++++++++++++++++
1 file changed, 114 insertions(+)
diff --git a/src/test/java/org/orekit/files/ilrs/CPFWriterTest.java b/src/test/java/org/orekit/files/ilrs/CPFWriterTest.java
index 8c78b822b..c04cff6a3 100644
--- a/src/test/java/org/orekit/files/ilrs/CPFWriterTest.java
+++ b/src/test/java/org/orekit/files/ilrs/CPFWriterTest.java
@@ -22,6 +22,7 @@ import static org.junit.Assert.fail;
import java.io.BufferedReader;
import java.io.BufferedWriter;
+import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@@ -29,10 +30,12 @@ import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
+import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
+import org.hipparchus.util.FastMath;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
@@ -42,11 +45,22 @@ import org.orekit.Utils;
import org.orekit.data.DataSource;
import org.orekit.errors.OrekitIllegalArgumentException;
import org.orekit.errors.OrekitMessages;
+import org.orekit.files.general.OrekitEphemerisFile;
+import org.orekit.files.general.OrekitEphemerisFile.OrekitSatelliteEphemeris;
import org.orekit.files.ilrs.CPF.CPFCoordinate;
import org.orekit.files.ilrs.CPF.CPFEphemeris;
+import org.orekit.frames.FramesFactory;
+import org.orekit.orbits.KeplerianOrbit;
+import org.orekit.orbits.Orbit;
+import org.orekit.orbits.PositionAngle;
+import org.orekit.propagation.Propagator;
+import org.orekit.propagation.SpacecraftState;
+import org.orekit.propagation.analytical.KeplerianPropagator;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.DateComponents;
+import org.orekit.time.TimeScale;
import org.orekit.time.TimeScalesFactory;
+import org.orekit.utils.Constants;
public class CPFWriterTest {
@@ -288,6 +302,106 @@ public class CPFWriterTest {
assertEquals(0.0, Vector3D.PLUS_K.distance(coordinatesInFile.get(2).getPosition()), 1.0e-10);
}
+
+ /** Test for issue #790 (https://gitlab.orekit.org/orekit/orekit/-/issues/790).
+ * @throws URISyntaxException */
+ @Test
+ public void testIssue790() throws IOException, URISyntaxException {
+
+ final TimeScale utc = TimeScalesFactory.getUTC();
+ final AbsoluteDate date = new AbsoluteDate(2022, 05, 10, 00, 00, 00.000, utc);
+
+ // General orbit
+ double a = 24396159; // semi major axis in meters
+ double e = 0.72831215; // eccentricity
+ double i = FastMath.toRadians(7); // inclination
+ double omega = FastMath.toRadians(180); // perigee argument
+ double raan = FastMath.toRadians(261); // right ascension of ascending node
+ double lM = 0; // mean anomaly
+
+ Orbit orbit = new KeplerianOrbit(a, e, i, omega, raan, lM, PositionAngle.MEAN,
+ FramesFactory.getEME2000(), date,
+ Constants.WGS84_EARTH_MU);
+
+ // First, configure a propagation with the default event handler (expected to stop on event)
+ Propagator propagator = new KeplerianPropagator(orbit);
+
+ final double propagationDurationSeconds = 86400.0;
+ final double stepSizeSeconds = 60.0;
+ List states = new ArrayList();
+
+ for (double dt = 0.0; dt < propagationDurationSeconds; dt += stepSizeSeconds) {
+ states.add(propagator.propagate(date.shiftedBy(dt)));
+ }
+
+ OrekitEphemerisFile ephemerisFile = new OrekitEphemerisFile();
+ OrekitSatelliteEphemeris satellite = ephemerisFile.addSatellite("070595");
+ satellite.addNewSegment(states);
+
+ // Create header
+ final CPFHeader header = new CPFHeader();
+ header.setSource("orekit");
+ header.setStep(300);
+ header.setStartEpoch(date);
+ header.setEndEpoch(date.shiftedBy(86400.0));
+ header.setIlrsSatelliteId("070595");
+ header.setName("tag");
+ header.setNoradId("0705");
+ header.setProductionEpoch(date.getComponents(utc).getDate());
+ header.setProductionHour(12);
+ header.setSequenceNumber(0705);
+ header.setSic("0705");
+ final CPFHeader headerV1 = header;
+ headerV1.setVersion(1);
+
+ // First launch the test with velocity flag enabled
+ boolean velocityFlag = true;
+
+ // Write the CPF file from the generated ephemeris
+ String tempCPFFilePath = tempFolder.newFile("TestWriteCPF.cpf").toString();
+ CPFWriter writer = new CPFWriter(headerV1, TimeScalesFactory.getUTC(), velocityFlag);
+ writer.write(tempCPFFilePath, ephemerisFile);
+
+ // Parse the generated CPF file
+ final CPF generatedCpfFile = new CPFParser().parse(new DataSource(tempCPFFilePath));
+
+
+ // Extract the coordinates from the generated CPF file
+ final CPFEphemeris ephemeris = generatedCpfFile.getSatellites().get("070595");
+ final List coord = ephemeris.getCoordinates();
+
+ // Verify first coordinate and that it includes the velocity components
+ final AbsoluteDate firstEpoch = AbsoluteDate.createMJDDate(59709, 0.0, generatedCpfFile.getTimeScale());
+ final Vector3D firstPos = new Vector3D(1036869.533, 6546536.585, 0.000);
+ final Vector3D firstVel = new Vector3D(-9994.355199, 1582.950355, -1242.449125);
+ Assert.assertEquals(0, coord.get(0).getLeap());
+ Assert.assertEquals(0.0, firstPos.distance(coord.get(0).getPosition()), 1.0e-15);
+ Assert.assertEquals(0.0, firstVel.distance(coord.get(0).getVelocity()), 1.0e-15);
+ Assert.assertEquals(0.0, firstEpoch.durationFrom(coord.get(0).getDate()), 1.0e-15);
+
+
+ // Repeat without velocity components for regression testing
+
+ // Write the CPF file from the generated ephemeris
+ String tempCPFFilePathReg = tempFolder.newFile("TestWriteCPFReg.cpf").toString();
+ CPFWriter writerReg = new CPFWriter(headerV1, TimeScalesFactory.getUTC());
+ writerReg.write(tempCPFFilePathReg, ephemerisFile);
+
+ // Parse the generated CPF file
+ final CPF generatedCpfFileReg = new CPFParser().parse(new DataSource(tempCPFFilePathReg));
+
+
+ // Extract the coordinates from the generated CPF file
+ final CPFEphemeris ephemerisReg = generatedCpfFileReg.getSatellites().get("070595");
+ final List coordReg = ephemerisReg.getCoordinates();
+
+ // Verify first coordinate and that the velocity components are zero
+ Assert.assertEquals(0, coordReg.get(0).getLeap());
+ Assert.assertEquals(0.0, firstPos.distance(coordReg.get(0).getPosition()), 1.0e-15);
+ Assert.assertEquals(0.0, coordReg.get(0).getVelocity().getNorm(), 1.0e-15);
+ Assert.assertEquals(0.0, firstEpoch.durationFrom(coordReg.get(0).getDate()), 1.0e-15);
+
+ }
@Test
@Deprecated
--
GitLab