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.Field;
20 import org.hipparchus.CalculusFieldElement;
21 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
22 import org.hipparchus.util.Decimal64Field;
23 import org.hipparchus.util.FastMath;
24 import org.hipparchus.util.MathUtils;
25 import org.junit.Assert;
26 import org.junit.Before;
27 import org.junit.Test;
28 import org.orekit.Utils;
29 import org.orekit.frames.FramesFactory;
30 import org.orekit.orbits.FieldCartesianOrbit;
31 import org.orekit.orbits.FieldKeplerianOrbit;
32 import org.orekit.orbits.FieldOrbit;
33 import org.orekit.orbits.OrbitType;
34 import org.orekit.propagation.analytical.FieldEcksteinHechlerPropagator;
35 import org.orekit.propagation.events.FieldEventsLogger.FieldLoggedEvent;
36 import org.orekit.propagation.events.handlers.FieldContinueOnEvent;
37 import org.orekit.time.FieldAbsoluteDate;
38 import org.orekit.time.TimeScale;
39 import org.orekit.time.TimeScalesFactory;
40 import org.orekit.utils.Constants;
41 import org.orekit.utils.FieldPVCoordinates;
42
43 public class FieldApsideDetectorTest {
44
45 @Test
46 public void testSimple() {
47 doTestSimple(Decimal64Field.getInstance());
48 }
49
50 private <T extends CalculusFieldElement<T>> void doTestSimple(Field<T> field) {
51 final T zero = field.getZero();
52
53 final TimeScale utc = TimeScalesFactory.getUTC();
54 final FieldVector3D<T> position = new FieldVector3D<>(zero.add(-6142438.668), zero.add(3492467.56), zero.add(-25767.257));
55 final FieldVector3D<T> velocity = new FieldVector3D<>(zero.add(506.0), zero.add(943.0), zero.add(7450));
56 final FieldAbsoluteDate<T> date = new FieldAbsoluteDate<>(field, 2003, 9, 16, utc);
57 final FieldOrbit<T> orbit = new FieldCartesianOrbit<>(new FieldPVCoordinates<>(position, velocity),
58 FramesFactory.getEME2000(), date,
59 zero.add(Constants.EIGEN5C_EARTH_MU));
60 FieldEcksteinHechlerPropagator<T> propagator =
61 new FieldEcksteinHechlerPropagator<>(orbit,
62 Constants.EIGEN5C_EARTH_EQUATORIAL_RADIUS,
63 zero.add(Constants.EIGEN5C_EARTH_MU),
64 Constants.EIGEN5C_EARTH_C20,
65 Constants.EIGEN5C_EARTH_C30,
66 Constants.EIGEN5C_EARTH_C40,
67 Constants.EIGEN5C_EARTH_C50,
68 Constants.EIGEN5C_EARTH_C60);
69
70 FieldEventDetector<T> detector = new FieldApsideDetector<>(propagator.getInitialState().getOrbit()).
71 withMaxCheck(zero.add(600.0)).
72 withThreshold(zero.add(1.0e-12)).
73 withHandler(new FieldContinueOnEvent<FieldApsideDetector<T>, T>());
74
75 Assert.assertEquals(600.0, detector.getMaxCheckInterval().getReal(), 1.0e-15);
76 Assert.assertEquals(1.0e-12, detector.getThreshold().getReal(), 1.0e-15);
77 Assert.assertEquals(AbstractDetector.DEFAULT_MAX_ITER, detector.getMaxIterationCount());
78
79 FieldEventsLogger<T> logger = new FieldEventsLogger<>();
80 propagator.addEventDetector(logger.monitorDetector(detector));
81
82 propagator.propagate(propagator.getInitialState().getOrbit().getDate().shiftedBy(Constants.JULIAN_DAY));
83
84 Assert.assertEquals(30, logger.getLoggedEvents().size());
85 for (FieldLoggedEvent<T> e : logger.getLoggedEvents()) {
86 FieldKeplerianOrbit<T> o = (FieldKeplerianOrbit<T>) OrbitType.KEPLERIAN.convertType(e.getState().getOrbit());
87 double expected = e.isIncreasing() ? 0.0 : FastMath.PI;
88 Assert.assertEquals(expected, MathUtils.normalizeAngle(o.getMeanAnomaly().getReal(), expected), 4.0e-14);
89 }
90
91 }
92
93 @Before
94 public void setUp() {
95 Utils.setDataRoot("regular-data");
96 }
97
98 }
99