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/3] 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/3] - 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/3] - 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