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 java.util.List;
20  
21  import org.hipparchus.geometry.euclidean.threed.Vector3D;
22  import org.hipparchus.ode.events.Action;
23  import org.hipparchus.ode.nonstiff.AdaptiveStepsizeIntegrator;
24  import org.hipparchus.ode.nonstiff.DormandPrince853Integrator;
25  import org.junit.After;
26  import org.junit.Assert;
27  import org.junit.Before;
28  import org.junit.Test;
29  import org.orekit.Utils;
30  import org.orekit.bodies.CelestialBodyFactory;
31  import org.orekit.bodies.OneAxisEllipsoid;
32  import org.orekit.errors.OrekitException;
33  import org.orekit.frames.FramesFactory;
34  import org.orekit.orbits.EquinoctialOrbit;
35  import org.orekit.orbits.Orbit;
36  import org.orekit.propagation.SpacecraftState;
37  import org.orekit.propagation.events.handlers.EventHandler;
38  import org.orekit.propagation.numerical.NumericalPropagator;
39  import org.orekit.time.AbsoluteDate;
40  import org.orekit.time.TimeScalesFactory;
41  import org.orekit.utils.IERSConventions;
42  import org.orekit.utils.PVCoordinates;
43  
44  public class EventsLoggerTest {
45  
46      private double               mu;
47      private AbsoluteDate         iniDate;
48      private SpacecraftState      initialState;
49      private NumericalPropagator  propagator;
50      private int                  count;
51      private EventDetector        umbraDetector;
52      private EventDetector        penumbraDetector;
53  
54      @Test
55      public void testLogUmbra() {
56          EventsLogger logger = new EventsLogger();
57          EventDetector monitored = ((AbstractDetector<?>) logger.monitorDetector(umbraDetector)).
58                  withMaxIter(200);
59          Assert.assertEquals(100, umbraDetector.getMaxIterationCount());
60          Assert.assertEquals(200, monitored.getMaxIterationCount());
61          propagator.addEventDetector(monitored);
62          propagator.addEventDetector(penumbraDetector);
63          count = 0;
64          propagator.propagate(iniDate.shiftedBy(16215)).getDate();
65          Assert.assertEquals(11, count);
66          checkCounts(logger, 3, 3, 0, 0);
67      }
68  
69      @Test
70      public void testLogPenumbra() {
71          EventsLogger logger = new EventsLogger();
72          propagator.addEventDetector(umbraDetector);
73          propagator.addEventDetector(logger.monitorDetector(penumbraDetector));
74          count = 0;
75          propagator.propagate(iniDate.shiftedBy(16215)).getDate();
76          Assert.assertEquals(11, count);
77          checkCounts(logger, 0, 0, 2, 3);
78      }
79  
80      @Test
81      public void testLogAll() {
82          EventsLogger logger = new EventsLogger();
83          propagator.addEventDetector(logger.monitorDetector(umbraDetector));
84          propagator.addEventDetector(logger.monitorDetector(penumbraDetector));
85          count = 0;
86          propagator.propagate(iniDate.shiftedBy(16215));
87          Assert.assertEquals(11, count);
88          checkCounts(logger, 3, 3, 2, 3);
89      }
90  
91      @Test
92      public void testImmutableList() {
93          EventsLogger logger = new EventsLogger();
94          propagator.addEventDetector(logger.monitorDetector(umbraDetector));
95          propagator.addEventDetector(logger.monitorDetector(penumbraDetector));
96          count = 0;
97          propagator.propagate(iniDate.shiftedBy(16215));
98          List<EventsLogger.LoggedEvent> firstList = logger.getLoggedEvents();
99          Assert.assertEquals(11, firstList.size());
100         propagator.propagate(iniDate.shiftedBy(30000));
101         List<EventsLogger.LoggedEvent> secondList = logger.getLoggedEvents();
102         Assert.assertEquals(11, firstList.size());
103         Assert.assertEquals(20, secondList.size());
104         for (int i = 0; i < firstList.size(); ++i) {
105 
106             EventsLogger.LoggedEvent e1 = firstList.get(i);
107             EventsLogger.LoggedEvent e2 = secondList.get(i);
108             PVCoordinates pv1 = e1.getState().getPVCoordinates();
109             PVCoordinates pv2 = e2.getState().getPVCoordinates();
110 
111             Assert.assertTrue(e1.getEventDetector() == e2.getEventDetector());
112             Assert.assertEquals(0, pv1.getPosition().subtract(pv2.getPosition()).getNorm(), 1.0e-10);
113             Assert.assertEquals(0, pv1.getVelocity().subtract(pv2.getVelocity()).getNorm(), 1.0e-10);
114             Assert.assertEquals(e1.isIncreasing(), e2.isIncreasing());
115 
116         }
117     }
118 
119     @Test
120     public void testClearLog() {
121         EventsLogger logger = new EventsLogger();
122         propagator.addEventDetector(logger.monitorDetector(umbraDetector));
123         propagator.addEventDetector(logger.monitorDetector(penumbraDetector));
124         count = 0;
125         propagator.propagate(iniDate.shiftedBy(16215));
126         List<EventsLogger.LoggedEvent> firstList = logger.getLoggedEvents();
127         Assert.assertEquals(11, firstList.size());
128         logger.clearLoggedEvents();
129         propagator.propagate(iniDate.shiftedBy(30000));
130         List<EventsLogger.LoggedEvent> secondList = logger.getLoggedEvents();
131         Assert.assertEquals(11, firstList.size());
132         Assert.assertEquals( 9, secondList.size());
133     }
134 
135     private void checkCounts(EventsLogger logger,
136                              int expectedUmbraIncreasingCount, int expectedUmbraDecreasingCount,
137                              int expectedPenumbraIncreasingCount, int expectedPenumbraDecreasingCount) {
138         int umbraIncreasingCount = 0;
139         int umbraDecreasingCount = 0;
140         int penumbraIncreasingCount = 0;
141         int penumbraDecreasingCount = 0;
142         for (EventsLogger.LoggedEvent event : logger.getLoggedEvents()) {
143             if (event.getEventDetector() == umbraDetector) {
144                 if (event.isIncreasing()) {
145                     ++umbraIncreasingCount;
146                 } else {
147                     ++umbraDecreasingCount;
148                 }
149             }
150             if (event.getEventDetector() == penumbraDetector) {
151                 if (event.isIncreasing()) {
152                     ++penumbraIncreasingCount;
153                 } else {
154                     ++penumbraDecreasingCount;
155                 }
156             }
157         }
158         Assert.assertEquals(expectedUmbraIncreasingCount,    umbraIncreasingCount);
159         Assert.assertEquals(expectedUmbraDecreasingCount,    umbraDecreasingCount);
160         Assert.assertEquals(expectedPenumbraIncreasingCount, penumbraIncreasingCount);
161         Assert.assertEquals(expectedPenumbraDecreasingCount, penumbraDecreasingCount);
162     }
163 
164     private EventDetector buildDetector(final boolean totalEclipse) {
165 
166         EclipseDetector detector =
167                 new EclipseDetector(CelestialBodyFactory.getSun(), 696000000,
168                                     new OneAxisEllipsoid(6400000,
169                                                          0.0,
170                                                          FramesFactory.getITRF(IERSConventions.IERS_2010, true))).
171                 withMaxCheck(60.0).
172                 withThreshold(1.0e-3);
173 
174         if (totalEclipse) {
175             detector = detector.withUmbra();
176         } else {
177             detector = detector.withPenumbra();
178         }
179 
180         detector = detector.withHandler(new EventHandler<EclipseDetector>() {
181 
182             public Action eventOccurred(SpacecraftState s, EclipseDetector detector, boolean increasing) {
183                 ++count;
184                 return Action.CONTINUE;
185             }
186 
187         });
188 
189         return detector;
190 
191     }
192 
193     @Before
194     public void setUp() {
195         try {
196             Utils.setDataRoot("regular-data");
197             mu  = 3.9860047e14;
198             final Vector3D position  = new Vector3D(-6142438.668, 3492467.560, -25767.25680);
199             final Vector3D velocity  = new Vector3D(505.8479685, 942.7809215, 7435.922231);
200             iniDate = new AbsoluteDate(1969, 7, 28, 4, 0, 0.0, TimeScalesFactory.getTT());
201             final Orbit orbit = new EquinoctialOrbit(new PVCoordinates(position,  velocity),
202                                                      FramesFactory.getEME2000(), iniDate, mu);
203             initialState = new SpacecraftState(orbit);
204             double[] absTolerance = {
205                 0.001, 1.0e-9, 1.0e-9, 1.0e-6, 1.0e-6, 1.0e-6, 0.001
206             };
207             double[] relTolerance = {
208                 1.0e-7, 1.0e-4, 1.0e-4, 1.0e-7, 1.0e-7, 1.0e-7, 1.0e-7
209             };
210             AdaptiveStepsizeIntegrator integrator =
211                 new DormandPrince853Integrator(0.001, 1000, absTolerance, relTolerance);
212             integrator.setInitialStepSize(60);
213             propagator = new NumericalPropagator(integrator);
214             propagator.setInitialState(initialState);
215             count = 0;
216             umbraDetector = buildDetector(true);
217             penumbraDetector = buildDetector(false);
218         } catch (OrekitException oe) {
219             Assert.fail(oe.getLocalizedMessage());
220         }
221     }
222 
223     @After
224     public void tearDown() {
225         iniDate = null;
226         initialState = null;
227         propagator = null;
228         count = 0;
229         umbraDetector = null;
230         penumbraDetector = null;
231     }
232 
233 }
234