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.geometry.euclidean.threed.Vector3D;
20 import org.hipparchus.util.FastMath;
21 import org.junit.Assert;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.orekit.Utils;
25 import org.orekit.bodies.GeodeticPoint;
26 import org.orekit.bodies.OneAxisEllipsoid;
27 import org.orekit.frames.FramesFactory;
28 import org.orekit.orbits.EquinoctialOrbit;
29 import org.orekit.orbits.KeplerianOrbit;
30 import org.orekit.orbits.Orbit;
31 import org.orekit.orbits.PositionAngle;
32 import org.orekit.propagation.Propagator;
33 import org.orekit.propagation.SpacecraftState;
34 import org.orekit.propagation.analytical.EcksteinHechlerPropagator;
35 import org.orekit.propagation.analytical.KeplerianPropagator;
36 import org.orekit.propagation.events.handlers.ContinueOnEvent;
37 import org.orekit.time.AbsoluteDate;
38 import org.orekit.time.TimeScale;
39 import org.orekit.time.TimeScalesFactory;
40 import org.orekit.utils.Constants;
41 import org.orekit.utils.IERSConventions;
42 import org.orekit.utils.PVCoordinates;
43
44 public class LongitudeExtremumDetectorTest {
45
46 @Test
47 public void testNoCrossing() {
48
49 final OneAxisEllipsoid earth = new OneAxisEllipsoid(Constants.WGS84_EARTH_EQUATORIAL_RADIUS,
50 Constants.WGS84_EARTH_FLATTENING,
51 FramesFactory.getITRF(IERSConventions.IERS_2010, true));
52
53 LongitudeExtremumDetector d =
54 new LongitudeExtremumDetector(earth).
55 withMaxCheck(60).
56 withThreshold(1.e-6).
57 withHandler(new ContinueOnEvent<LongitudeExtremumDetector>());
58
59 Assert.assertEquals(60.0, d.getMaxCheckInterval(), 1.0e-15);
60 Assert.assertEquals(1.0e-6, d.getThreshold(), 1.0e-15);
61 Assert.assertEquals(AbstractDetector.DEFAULT_MAX_ITER, d.getMaxIterationCount());
62 Assert.assertSame(earth, d.getBody());
63
64 final TimeScale utc = TimeScalesFactory.getUTC();
65 final Vector3D position = new Vector3D(-6142438.668, 3492467.56, -25767.257);
66 final Vector3D velocity = new Vector3D(505.848, 942.781, 7435.922);
67 final AbsoluteDate date = new AbsoluteDate(2003, 9, 16, utc);
68 final Orbit orbit = new EquinoctialOrbit(new PVCoordinates(position, velocity),
69 FramesFactory.getEME2000(), date,
70 Constants.EIGEN5C_EARTH_MU);
71
72 Propagator propagator =
73 new EcksteinHechlerPropagator(orbit,
74 Constants.EIGEN5C_EARTH_EQUATORIAL_RADIUS,
75 Constants.EIGEN5C_EARTH_MU,
76 Constants.EIGEN5C_EARTH_C20,
77 Constants.EIGEN5C_EARTH_C30,
78 Constants.EIGEN5C_EARTH_C40,
79 Constants.EIGEN5C_EARTH_C50,
80 Constants.EIGEN5C_EARTH_C60);
81
82 EventsLogger logger = new EventsLogger();
83 propagator.addEventDetector(logger.monitorDetector(d));
84
85 propagator.propagate(date.shiftedBy(Constants.JULIAN_DAY));
86 Assert.assertEquals(0, logger.getLoggedEvents().size());
87
88 }
89
90 @Test
91 public void testZigZag() {
92
93 final OneAxisEllipsoid earth = new OneAxisEllipsoid(Constants.WGS84_EARTH_EQUATORIAL_RADIUS,
94 Constants.WGS84_EARTH_FLATTENING,
95 FramesFactory.getITRF(IERSConventions.IERS_2010, true));
96
97 LongitudeExtremumDetector d =
98 new LongitudeExtremumDetector(600.0, 1.e-6, earth).
99 withHandler(new ContinueOnEvent<LongitudeExtremumDetector>());
100
101 Assert.assertEquals(600.0, d.getMaxCheckInterval(), 1.0e-15);
102 Assert.assertEquals(1.0e-6, d.getThreshold(), 1.0e-15);
103 Assert.assertEquals(AbstractDetector.DEFAULT_MAX_ITER, d.getMaxIterationCount());
104
105 KeplerianOrbit orbit =
106 new KeplerianOrbit(24464560.0, 0.7311, 0.122138, 3.10686, 1.00681,
107 0.048363, PositionAngle.MEAN,
108 FramesFactory.getEME2000(),
109 AbsoluteDate.J2000_EPOCH,
110 Constants.EIGEN5C_EARTH_MU);
111
112
113 Propagator propagator = new KeplerianPropagator(orbit);
114
115 EventsLogger logger = new EventsLogger();
116 propagator.addEventDetector(logger.monitorDetector(d));
117
118 propagator.propagate(orbit.getDate().shiftedBy(Constants.JULIAN_DAY));
119 double[] expectedLongitudes = new double[] {
120 74.85115958654778, 39.51032449280883, -84.25729072475329, -119.598124966418, 116.63425894645886
121 };
122 double[] expectedLatitudes = new double[] {
123 -3.8404256460679336, 3.4237236065561536, -3.840419828222964, 3.4237214483413734, -3.840413360572555
124 };
125 Assert.assertEquals(5, logger.getLoggedEvents().size());
126 for (int i = 0; i < 5; ++i) {
127 SpacecraftState state = logger.getLoggedEvents().get(i).getState();
128 GeodeticPoint gp = earth.transform(state.getPVCoordinates(earth.getBodyFrame()).getPosition(),
129 earth.getBodyFrame(), null);
130 Assert.assertEquals(expectedLongitudes[i], FastMath.toDegrees(gp.getLongitude()), 1.0e-10);
131 Assert.assertEquals(expectedLatitudes[i], FastMath.toDegrees(gp.getLatitude()), 1.0e-10);
132 }
133
134 }
135
136 @Before
137 public void setUp() {
138 Utils.setDataRoot("regular-data");
139 }
140
141 }
142