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