1   /* Copyright 2002-2025 CS GROUP
2    * Licensed to CS GROUP (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * CS licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.orekit.propagation.events;
18  
19  import org.hipparchus.ode.nonstiff.AdaptiveStepsizeIntegrator;
20  import org.hipparchus.ode.nonstiff.DormandPrince853Integrator;
21  import org.hipparchus.util.FastMath;
22  import org.junit.jupiter.api.Assertions;
23  import org.junit.jupiter.api.BeforeEach;
24  import org.junit.jupiter.api.Test;
25  import org.orekit.Utils;
26  import org.orekit.frames.Frame;
27  import org.orekit.frames.FramesFactory;
28  import org.orekit.orbits.KeplerianOrbit;
29  import org.orekit.orbits.PositionAngleType;
30  import org.orekit.propagation.BoundedPropagator;
31  import org.orekit.propagation.EphemerisGenerator;
32  import org.orekit.propagation.SpacecraftState;
33  import org.orekit.propagation.ToleranceProvider;
34  import org.orekit.propagation.events.handlers.ContinueOnEvent;
35  import org.orekit.propagation.numerical.NumericalPropagator;
36  import org.orekit.time.AbsoluteDate;
37  import org.orekit.time.TimeScalesFactory;
38  import org.orekit.utils.Constants;
39  
40  public class NodeDetectorTest {
41  
42      @Test
43      public void testIssue138() {
44          double a = 800000 + Constants.WGS84_EARTH_EQUATORIAL_RADIUS;
45          double e = 0.0001;
46          double i = FastMath.toRadians(98);
47          double w = -90;
48          double raan = 0;
49          double v = 0;
50          Frame inertialFrame = FramesFactory.getEME2000();
51          AbsoluteDate initialDate = new AbsoluteDate(2014, 01, 01, 0, 0, 0, TimeScalesFactory.getUTC());
52          AbsoluteDate finalDate = initialDate.shiftedBy(5000);
53          KeplerianOrbit initialOrbit = new KeplerianOrbit(a, e, i, w, raan, v, PositionAngleType.TRUE, inertialFrame, initialDate, Constants.WGS84_EARTH_MU);
54          SpacecraftState initialState = new SpacecraftState(initialOrbit, 1000);
55  
56          double[][] tol = ToleranceProvider.getDefaultToleranceProvider(10.).getTolerances(initialOrbit, initialOrbit.getType());
57          AdaptiveStepsizeIntegrator integrator = new DormandPrince853Integrator(0.001, 1000, tol[0], tol[1]);
58          NumericalPropagator propagator = new NumericalPropagator(integrator);
59          propagator.setInitialState(initialState);
60  
61          // Define 2 instances of NodeDetector:
62          EventDetector rawDetector =
63                  new NodeDetector(1e-6, initialState.getOrbit(), initialState.getFrame()).
64                  withHandler(new ContinueOnEvent());
65  
66          EventsLogger logger1 = new EventsLogger();
67          EventDetector node1 = logger1.monitorDetector(rawDetector);
68          EventsLogger logger2 = new EventsLogger();
69          EventDetector node2 = logger2.monitorDetector(rawDetector);
70  
71          propagator.addEventDetector(node1);
72          propagator.addEventDetector(node2);
73  
74          // First propagation
75          final EphemerisGenerator generator = propagator.getEphemerisGenerator();
76          propagator.propagate(finalDate);
77          Assertions.assertEquals(2, logger1.getLoggedEvents().size());
78          Assertions.assertEquals(2, logger2.getLoggedEvents().size());
79          logger1.clearLoggedEvents();
80          logger2.clearLoggedEvents();
81  
82          BoundedPropagator postpro = generator.getGeneratedEphemeris();
83  
84          // Post-processing
85          postpro.addEventDetector(node1);
86          postpro.addEventDetector(node2);
87          postpro.propagate(finalDate);
88          Assertions.assertEquals(2, logger1.getLoggedEvents().size());
89          Assertions.assertEquals(2, logger2.getLoggedEvents().size());
90  
91      }
92  
93      @Test
94      public void testIssue158() {
95  
96          double a          = 3.0e7;
97          double e1         =  0.8;
98          double e2         =  1.0e-4;
99          double i          = 1.0;
100         double pa         = 1.5 * FastMath.PI;
101         double raan       = 5.0;
102         double m          = 0;
103         AbsoluteDate date = AbsoluteDate.J2000_EPOCH;
104         Frame frame       = FramesFactory.getEME2000();
105         double mu         = Constants.EIGEN5C_EARTH_MU;
106 
107         // highly eccentric, inclined orbit
108         final KeplerianOrbit orbit1 =
109                 new KeplerianOrbit(a, e1, i, pa, raan, m, PositionAngleType.MEAN, frame, date, mu);
110         EventDetector detector1 = new NodeDetector(orbit1, orbit1.getFrame());
111         double t1 = orbit1.getKeplerianPeriod();
112         Assertions.assertEquals(t1 / 28.82, detector1.getMaxCheckInterval().currentInterval(null, true), t1 / 10000);
113 
114         // nearly circular, inclined orbit
115         final KeplerianOrbit orbit2 =
116                 new KeplerianOrbit(a, e2, i, pa, raan, m, PositionAngleType.MEAN, frame, date, mu);
117         EventDetector detector2 = new NodeDetector(orbit2, orbit2.getFrame());
118         double t2 = orbit2.getKeplerianPeriod();
119         Assertions.assertEquals(t1, t2, t1 / 10000);
120         Assertions.assertEquals(t2 / 3, detector2.getMaxCheckInterval().currentInterval(null, true), t2 / 10000);
121 
122     }
123 
124     @Test
125     public void testIssue728() {
126 
127         NodeDetector detector1 = new NodeDetector(FramesFactory.getEME2000());
128         Assertions.assertEquals(1800.0, detector1.getMaxCheckInterval().currentInterval(null, true), 1.0e-3);
129         Assertions.assertEquals(1.0e-3, detector1.getThreshold(), 1.0e-12);
130 
131         NodeDetector detector2 = detector1.withMaxCheck(3000.0).withThreshold(1.0e-6);
132         Assertions.assertEquals(3000.0, detector2.getMaxCheckInterval().currentInterval(null, true), 1.0e-3);
133         Assertions.assertEquals(1.0e-6, detector2.getThreshold(), 1.0e-12);
134 
135     }
136 
137     @BeforeEach
138     public void setUp() {
139         Utils.setDataRoot("regular-data");
140     }
141 
142 }
143