1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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