1   /* Copyright 2002-2022 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.Assert;
23  import org.junit.Before;
24  import org.junit.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.PositionAngle;
30  import org.orekit.propagation.BoundedPropagator;
31  import org.orekit.propagation.EphemerisGenerator;
32  import org.orekit.propagation.SpacecraftState;
33  import org.orekit.propagation.events.handlers.ContinueOnEvent;
34  import org.orekit.propagation.numerical.NumericalPropagator;
35  import org.orekit.time.AbsoluteDate;
36  import org.orekit.time.TimeScalesFactory;
37  import org.orekit.utils.Constants;
38  
39  public class NodeDetectorTest {
40  
41      @Test
42      public void testIssue138() {
43          double a = 800000 + Constants.WGS84_EARTH_EQUATORIAL_RADIUS;
44          double e = 0.0001;
45          double i = FastMath.toRadians(98);
46          double w = -90;
47          double raan = 0;
48          double v = 0;
49          Frame inertialFrame = FramesFactory.getEME2000();
50          AbsoluteDate initialDate = new AbsoluteDate(2014, 01, 01, 0, 0, 0, TimeScalesFactory.getUTC());
51          AbsoluteDate finalDate = initialDate.shiftedBy(5000);
52          KeplerianOrbit initialOrbit = new KeplerianOrbit(a, e, i, w, raan, v, PositionAngle.TRUE, inertialFrame, initialDate, Constants.WGS84_EARTH_MU);
53          SpacecraftState initialState = new SpacecraftState(initialOrbit, 1000);
54  
55          double[][] tol = NumericalPropagator.tolerances(10, initialOrbit, initialOrbit.getType());
56          AdaptiveStepsizeIntegrator integrator = new DormandPrince853Integrator(0.001, 1000, tol[0], tol[1]);
57          NumericalPropagator propagator = new NumericalPropagator(integrator);
58          propagator.setInitialState(initialState);
59  
60          // Define 2 instances of NodeDetector:
61          EventDetector rawDetector =
62                  new NodeDetector(1e-6, initialState.getOrbit(), initialState.getFrame()).
63                  withHandler(new ContinueOnEvent<NodeDetector>());
64  
65          EventsLogger logger1 = new EventsLogger();
66          EventDetector node1 = logger1.monitorDetector(rawDetector);
67          EventsLogger logger2 = new EventsLogger();
68          EventDetector node2 = logger2.monitorDetector(rawDetector);
69  
70          propagator.addEventDetector(node1);
71          propagator.addEventDetector(node2);
72  
73          // First propagation
74          final EphemerisGenerator generator = propagator.getEphemerisGenerator();
75          propagator.propagate(finalDate);
76          Assert.assertEquals(2, logger1.getLoggedEvents().size());
77          Assert.assertEquals(2, logger2.getLoggedEvents().size());
78          logger1.clearLoggedEvents();
79          logger2.clearLoggedEvents();
80  
81          BoundedPropagator postpro = generator.getGeneratedEphemeris();
82  
83          // Post-processing
84          postpro.addEventDetector(node1);
85          postpro.addEventDetector(node2);
86          postpro.propagate(finalDate);
87          Assert.assertEquals(2, logger1.getLoggedEvents().size());
88          Assert.assertEquals(2, logger2.getLoggedEvents().size());
89  
90      }
91  
92      @Test
93      public void testIssue158() {
94  
95          double a          = 3.0e7;
96          double e1         =  0.8;
97          double e2         =  1.0e-4;
98          double i          = 1.0;
99          double pa         = 1.5 * FastMath.PI;
100         double raan       = 5.0;
101         double m          = 0;
102         AbsoluteDate date = AbsoluteDate.J2000_EPOCH;
103         Frame frame       = FramesFactory.getEME2000();
104         double mu         = Constants.EIGEN5C_EARTH_MU;
105 
106         // highly eccentric, inclined orbit
107         final KeplerianOrbit orbit1 =
108                 new KeplerianOrbit(a, e1, i, pa, raan, m, PositionAngle.MEAN, frame, date, mu);
109         EventDetector detector1 = new NodeDetector(orbit1, orbit1.getFrame());
110         double t1 = orbit1.getKeplerianPeriod();
111         Assert.assertEquals(t1 / 28.82, detector1.getMaxCheckInterval(), t1 / 10000);
112 
113         // nearly circular, inclined orbit
114         final KeplerianOrbit orbit2 =
115                 new KeplerianOrbit(a, e2, i, pa, raan, m, PositionAngle.MEAN, frame, date, mu);
116         EventDetector detector2 = new NodeDetector(orbit2, orbit2.getFrame());
117         double t2 = orbit2.getKeplerianPeriod();
118         Assert.assertEquals(t1, t2, t1 / 10000);
119         Assert.assertEquals(t2 / 3, detector2.getMaxCheckInterval(), t2 / 10000);
120 
121     }
122 
123     @Test
124     public void testIssue728() {
125 
126         NodeDetector detector1 = new NodeDetector(FramesFactory.getEME2000());
127         Assert.assertEquals(1800.0, detector1.getMaxCheckInterval(), 1.0e-3);
128         Assert.assertEquals(1.0e-3, detector1.getThreshold(), 1.0e-12);
129 
130         NodeDetector detector2 = detector1.withMaxCheck(3000.0).withThreshold(1.0e-6);
131         Assert.assertEquals(3000.0, detector2.getMaxCheckInterval(), 1.0e-3);
132         Assert.assertEquals(1.0e-6, detector2.getThreshold(), 1.0e-12);
133 
134     }
135 
136     @Before
137     public void setUp() {
138         Utils.setDataRoot("regular-data");
139     }
140 
141 }
142