diff --git a/src/main/java/org/orekit/propagation/events/PositionAngleDetector.java b/src/main/java/org/orekit/propagation/events/PositionAngleDetector.java index 3f6eec41df1d046c1b00ec1d5f4b7ed3840902f6..d26be12f959b3e87b523beb79aeefb39c0b032d9 100644 --- a/src/main/java/org/orekit/propagation/events/PositionAngleDetector.java +++ b/src/main/java/org/orekit/propagation/events/PositionAngleDetector.java @@ -32,7 +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.StopOnIncreasing; +import org.orekit.propagation.events.handlers.StopOnEvent; import org.orekit.time.AbsoluteDate; import org.orekit.utils.TimeSpanMap; @@ -81,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 @@ -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 a06a12e13a40b92049f803aa75a83d3cf4b570bf..4d41bec81e31522b2f4cc8c6742180696597bd4f 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; @@ -44,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; @@ -247,6 +250,75 @@ 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); + + + + + // 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) + Propagator np1 = new KeplerianPropagator(orbit); + PositionAngleDetector detectorDefault = new PositionAngleDetector(maxCheck, + threshold, + OrbitType.KEPLERIAN, + PositionAngle.MEAN, + FastMath.toRadians(angle)); + + // Create and add event logger + EventsLogger logger1 = new EventsLogger(); + np1.addEventDetector(logger1.monitorDetector(detectorDefault)); + + // Propagate + np1.propagate(initialDate.shiftedBy(Constants.JULIAN_DAY)); + + + + // Then, repeat the test with a Continue On Event handler + Propagator np2 = new KeplerianPropagator(orbit); + + // 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(); + np2.addEventDetector(logger2.monitorDetector(detectorContinue)); + + // Propagate + np2.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) {