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 org.hipparchus.CalculusFieldElement;
20 import org.hipparchus.Field;
21 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
22 import org.hipparchus.util.Binary64Field;
23 import org.junit.jupiter.api.Assertions;
24 import org.junit.jupiter.api.BeforeEach;
25 import org.junit.jupiter.api.Test;
26 import org.orekit.Utils;
27 import org.orekit.frames.FramesFactory;
28 import org.orekit.orbits.FieldCartesianOrbit;
29 import org.orekit.orbits.FieldOrbit;
30 import org.orekit.propagation.analytical.FieldEcksteinHechlerPropagator;
31 import org.orekit.propagation.events.handlers.FieldContinueOnEvent;
32 import org.orekit.time.AbsoluteDate;
33 import org.orekit.time.FieldAbsoluteDate;
34 import org.orekit.time.TimeScale;
35 import org.orekit.time.TimeScalesFactory;
36 import org.orekit.utils.Constants;
37 import org.orekit.utils.FieldPVCoordinates;
38
39 public class FieldParameterDrivenDateIntervalDetectorTest {
40
41 @Test
42 public void testNoShift() {
43 doTestNoShift(Binary64Field.getInstance());
44 }
45
46 @Test
47 public void testSmallShift() {
48 doTestSmallShift(Binary64Field.getInstance());
49 }
50
51 @Test
52 public void testLargeShift() {
53 doTestLargeShift(Binary64Field.getInstance());
54 }
55
56 private <T extends CalculusFieldElement<T>> void doTestNoShift(Field<T> field) {
57 final T zero = field.getZero();
58
59 final TimeScale utc = TimeScalesFactory.getUTC();
60 final FieldVector3D<T> position = new FieldVector3D<>(zero.add(-6142438.668), zero.add(3492467.56), zero.add(-25767.257));
61 final FieldVector3D<T> velocity = new FieldVector3D<>(zero.add(506.0), zero.add(943.0), zero.add(7450));
62 final FieldAbsoluteDate<T> date = new FieldAbsoluteDate<>(field, 2003, 9, 16, utc);
63 final FieldOrbit<T> orbit = new FieldCartesianOrbit<>(new FieldPVCoordinates<>(position, velocity),
64 FramesFactory.getEME2000(), date,
65 zero.add(Constants.EIGEN5C_EARTH_MU));
66 FieldEcksteinHechlerPropagator<T> propagator =
67 new FieldEcksteinHechlerPropagator<>(orbit,
68 Constants.EIGEN5C_EARTH_EQUATORIAL_RADIUS,
69 zero.add(Constants.EIGEN5C_EARTH_MU),
70 Constants.EIGEN5C_EARTH_C20,
71 Constants.EIGEN5C_EARTH_C30,
72 Constants.EIGEN5C_EARTH_C40,
73 Constants.EIGEN5C_EARTH_C50,
74 Constants.EIGEN5C_EARTH_C60);
75
76 final AbsoluteDate t0 = propagator.getInitialState().getDate().toAbsoluteDate();
77 final AbsoluteDate start = t0.shiftedBy( 120);
78 final AbsoluteDate stop = t0.shiftedBy(1120);
79 FieldParameterDrivenDateIntervalDetector<T> detector =
80 new FieldParameterDrivenDateIntervalDetector<>(field, "no-shift", start, stop).
81 withMaxCheck(10.0).
82 withThreshold(zero.newInstance(1.0e-12)).
83 withHandler(new FieldContinueOnEvent<>());
84
85 Assertions.assertEquals(10.0, detector.getMaxCheckInterval().currentInterval(null, true), 1.0e-15);
86 Assertions.assertEquals(1.0e-12, detector.getThreshold().getReal(), 1.0e-15);
87 Assertions.assertEquals(AbstractDetector.DEFAULT_MAX_ITER, detector.getMaxIterationCount());
88 Assertions.assertEquals("no-shift_START", detector.getStartDriver().getName());
89 Assertions.assertEquals("no-shift_STOP", detector.getStopDriver().getName());
90
91 FieldEventsLogger<T> logger = new FieldEventsLogger<>();
92 propagator.addEventDetector(logger.monitorDetector(detector));
93
94 propagator.propagate(propagator.getInitialState().getOrbit().getDate().shiftedBy(Constants.JULIAN_DAY));
95
96 Assertions.assertEquals(2, logger.getLoggedEvents().size());
97 Assertions.assertEquals(0.0, logger.getLoggedEvents().get(0).getState().getDate().durationFrom(start).getReal(), 1.0e-10);
98 Assertions.assertEquals(0.0, logger.getLoggedEvents().get(1).getState().getDate().durationFrom(stop).getReal(), 1.0e-10);
99
100 }
101
102 private <T extends CalculusFieldElement<T>> void doTestSmallShift(Field<T> field) {
103 final T zero = field.getZero();
104
105 final TimeScale utc = TimeScalesFactory.getUTC();
106 final FieldVector3D<T> position = new FieldVector3D<>(zero.add(-6142438.668), zero.add(3492467.56), zero.add(-25767.257));
107 final FieldVector3D<T> velocity = new FieldVector3D<>(zero.add(506.0), zero.add(943.0), zero.add(7450));
108 final FieldAbsoluteDate<T> date = new FieldAbsoluteDate<>(field, 2003, 9, 16, utc);
109 final FieldOrbit<T> orbit = new FieldCartesianOrbit<>(new FieldPVCoordinates<>(position, velocity),
110 FramesFactory.getEME2000(), date,
111 zero.add(Constants.EIGEN5C_EARTH_MU));
112 FieldEcksteinHechlerPropagator<T> propagator =
113 new FieldEcksteinHechlerPropagator<>(orbit,
114 Constants.EIGEN5C_EARTH_EQUATORIAL_RADIUS,
115 zero.add(Constants.EIGEN5C_EARTH_MU),
116 Constants.EIGEN5C_EARTH_C20,
117 Constants.EIGEN5C_EARTH_C30,
118 Constants.EIGEN5C_EARTH_C40,
119 Constants.EIGEN5C_EARTH_C50,
120 Constants.EIGEN5C_EARTH_C60);
121
122 final AbsoluteDate t0 = propagator.getInitialState().getDate().toAbsoluteDate();
123 final AbsoluteDate start = t0.shiftedBy( 120);
124 final AbsoluteDate stop = t0.shiftedBy(1120);
125 FieldParameterDrivenDateIntervalDetector<T> detector =
126 new FieldParameterDrivenDateIntervalDetector<>(field, "no-shift", start, stop).
127 withMaxCheck(10.0).
128 withThreshold(zero.newInstance(1.0e-12)).
129 withHandler(new FieldContinueOnEvent<>());
130
131 Assertions.assertEquals(10.0, detector.getMaxCheckInterval().currentInterval(null, true), 1.0e-15);
132 Assertions.assertEquals(1.0e-12, detector.getThreshold().getReal(), 1.0e-15);
133 Assertions.assertEquals(AbstractDetector.DEFAULT_MAX_ITER, detector.getMaxIterationCount());
134 Assertions.assertEquals("no-shift_START", detector.getStartDriver().getName());
135 Assertions.assertEquals("no-shift_STOP", detector.getStopDriver().getName());
136
137 FieldEventsLogger<T> logger = new FieldEventsLogger<>();
138 propagator.addEventDetector(logger.monitorDetector(detector));
139
140 final double startShift = 5.5;
141 detector.getStartDriver().setValue(startShift);
142 final double stopShift = -0.5;
143 detector.getStopDriver().setValue(stopShift, null);
144 propagator.propagate(propagator.getInitialState().getOrbit().getDate().shiftedBy(Constants.JULIAN_DAY));
145
146 Assertions.assertEquals(2, logger.getLoggedEvents().size());
147 Assertions.assertEquals(startShift, logger.getLoggedEvents().get(0).getState().getDate().durationFrom(start).getReal(), 1.0e-10);
148 Assertions.assertEquals(stopShift, logger.getLoggedEvents().get(1).getState().getDate().durationFrom(stop).getReal(), 1.0e-10);
149
150 }
151
152 private <T extends CalculusFieldElement<T>> void doTestLargeShift(Field<T> field) {
153 final T zero = field.getZero();
154
155 final TimeScale utc = TimeScalesFactory.getUTC();
156 final FieldVector3D<T> position = new FieldVector3D<>(zero.add(-6142438.668), zero.add(3492467.56), zero.add(-25767.257));
157 final FieldVector3D<T> velocity = new FieldVector3D<>(zero.add(506.0), zero.add(943.0), zero.add(7450));
158 final FieldAbsoluteDate<T> date = new FieldAbsoluteDate<>(field, 2003, 9, 16, utc);
159 final FieldOrbit<T> orbit = new FieldCartesianOrbit<>(new FieldPVCoordinates<>(position, velocity),
160 FramesFactory.getEME2000(), date,
161 zero.add(Constants.EIGEN5C_EARTH_MU));
162 FieldEcksteinHechlerPropagator<T> propagator =
163 new FieldEcksteinHechlerPropagator<>(orbit,
164 Constants.EIGEN5C_EARTH_EQUATORIAL_RADIUS,
165 zero.add(Constants.EIGEN5C_EARTH_MU),
166 Constants.EIGEN5C_EARTH_C20,
167 Constants.EIGEN5C_EARTH_C30,
168 Constants.EIGEN5C_EARTH_C40,
169 Constants.EIGEN5C_EARTH_C50,
170 Constants.EIGEN5C_EARTH_C60);
171
172 final AbsoluteDate t0 = propagator.getInitialState().getDate().toAbsoluteDate();
173 final AbsoluteDate start = t0.shiftedBy( 120);
174 final AbsoluteDate stop = t0.shiftedBy(1120);
175 FieldParameterDrivenDateIntervalDetector<T> detector =
176 new FieldParameterDrivenDateIntervalDetector<>(field, "no-shift", start, stop).
177 withMaxCheck(10.0).
178 withThreshold(zero.newInstance(1.0e-12)).
179 withHandler(new FieldContinueOnEvent<>());
180
181 Assertions.assertEquals(10.0, detector.getMaxCheckInterval().currentInterval(null, true), 1.0e-15);
182 Assertions.assertEquals(1.0e-12, detector.getThreshold().getReal(), 1.0e-15);
183 Assertions.assertEquals(AbstractDetector.DEFAULT_MAX_ITER, detector.getMaxIterationCount());
184 Assertions.assertEquals("no-shift_START", detector.getStartDriver().getName());
185 Assertions.assertEquals("no-shift_STOP", detector.getStopDriver().getName());
186
187 FieldEventsLogger<T> logger = new FieldEventsLogger<>();
188 propagator.addEventDetector(logger.monitorDetector(detector));
189
190 final double startShift = 500.5;
191 detector.getStartDriver().setValue(startShift);
192 final double stopShift = -500.5;
193 detector.getStopDriver().setValue(stopShift);
194 propagator.propagate(propagator.getInitialState().getOrbit().getDate().shiftedBy(Constants.JULIAN_DAY));
195
196 Assertions.assertEquals(0, logger.getLoggedEvents().size());
197
198 }
199
200 @BeforeEach
201 public void setUp() {
202 Utils.setDataRoot("regular-data");
203 }
204
205 }
206