1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.conversion;
18
19 import static org.orekit.propagation.conversion.AbstractPropagatorBuilderTest.assertPropagatorBuilderIsACopy;
20
21 import org.hipparchus.geometry.euclidean.threed.Vector3D;
22 import org.hipparchus.util.FastMath;
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.forces.gravity.potential.GravityFieldFactory;
28 import org.orekit.forces.gravity.potential.TideSystem;
29 import org.orekit.forces.gravity.potential.UnnormalizedSphericalHarmonicsProvider;
30 import org.orekit.forces.gravity.potential.UnnormalizedSphericalHarmonicsProvider.UnnormalizedSphericalHarmonics;
31 import org.orekit.frames.Frame;
32 import org.orekit.frames.FramesFactory;
33 import org.orekit.orbits.CartesianOrbit;
34 import org.orekit.orbits.KeplerianOrbit;
35 import org.orekit.orbits.Orbit;
36 import org.orekit.orbits.OrbitType;
37 import org.orekit.orbits.PositionAngleType;
38 import org.orekit.propagation.Propagator;
39 import org.orekit.propagation.analytical.BrouwerLyddanePropagator;
40 import org.orekit.time.AbsoluteDate;
41 import org.orekit.utils.Constants;
42 import org.orekit.utils.PVCoordinates;
43 import org.orekit.utils.ParameterDriver;
44 import org.orekit.utils.TimeStampedPVCoordinates;
45
46 public class BrouwerLyddanePropagatorBuilderTest {
47
48 private Orbit orbit;
49 private UnnormalizedSphericalHarmonicsProvider provider;
50
51 @Test
52 public void doTestBuildPropagator() {
53
54 final double eps = 2.0e-10;
55
56
57 AbsoluteDate initDate = AbsoluteDate.J2000_EPOCH.shiftedBy(583.);
58 BrouwerLyddanePropagator propagator = new BrouwerLyddanePropagator(orbit, provider, BrouwerLyddanePropagator.M2);
59
60 final Orbit orbitWithPropagator = propagator.propagate(initDate.shiftedBy(60000)).getOrbit();
61
62
63 UnnormalizedSphericalHarmonics harmonics = provider.onDate(orbit.getDate());
64
65
66
67 BrouwerLyddanePropagatorBuilder builder = new BrouwerLyddanePropagatorBuilder(orbit,
68 provider.getAe(),
69 provider.getMu(),
70 provider.getTideSystem(),
71 harmonics.getUnnormalizedCnm(2, 0),
72 harmonics.getUnnormalizedCnm(3, 0),
73 harmonics.getUnnormalizedCnm(4, 0),
74 harmonics.getUnnormalizedCnm(5, 0),
75 OrbitType.KEPLERIAN,
76 PositionAngleType.TRUE,
77 1.0,
78 BrouwerLyddanePropagator.M2);
79
80 final Propagator prop = builder.buildPropagator();
81 final Orbit orbitWithBuilder = prop.propagate(initDate.shiftedBy(60000)).getOrbit();
82
83
84 Assertions.assertEquals(orbitWithPropagator.getA(), orbitWithBuilder.getA(), 1.e-1);
85 Assertions.assertEquals(orbitWithPropagator.getEquinoctialEx(), orbitWithBuilder.getEquinoctialEx(), eps);
86 Assertions.assertEquals(orbitWithPropagator.getEquinoctialEy(), orbitWithBuilder.getEquinoctialEy(), eps);
87 Assertions.assertEquals(orbitWithPropagator.getHx(), orbitWithBuilder.getHx(), eps);
88 Assertions.assertEquals(orbitWithPropagator.getHy(), orbitWithBuilder.getHy(), eps);
89 Assertions.assertEquals(orbitWithPropagator.getLM(), orbitWithBuilder.getLM(), 8.0e-10);
90
91 }
92
93 @Test
94 public void doTestBuildPropagatorWithDrag() {
95
96
97 final double M2 = 1.0e-15;
98
99
100 UnnormalizedSphericalHarmonics harmonics = provider.onDate(orbit.getDate());
101
102
103 BrouwerLyddanePropagatorBuilder builder = new BrouwerLyddanePropagatorBuilder(orbit,
104 provider.getAe(),
105 provider.getMu(),
106 provider.getTideSystem(),
107 harmonics.getUnnormalizedCnm(2, 0),
108 harmonics.getUnnormalizedCnm(3, 0),
109 harmonics.getUnnormalizedCnm(4, 0),
110 harmonics.getUnnormalizedCnm(5, 0),
111 OrbitType.KEPLERIAN,
112 PositionAngleType.TRUE,
113 1.0,
114 M2);
115
116
117 for (ParameterDriver driver : builder.getPropagationParametersDrivers().getDrivers()) {
118 if (BrouwerLyddanePropagator.M2_NAME.equals(driver.getName())) {
119 driver.setSelected(true);
120 }
121 }
122
123
124 final BrouwerLyddanePropagator prop = builder.buildPropagator();
125
126
127 Assertions.assertEquals(M2, prop.getM2(), Double.MIN_VALUE);
128 Assertions.assertTrue(prop.getParametersDrivers().get(0).isSelected());
129
130 }
131
132 @BeforeEach
133 public void setUp() {
134 Utils.setDataRoot("potential:regular-data");
135
136 AbsoluteDate initDate = AbsoluteDate.J2000_EPOCH.shiftedBy(583.);
137 final Frame inertialFrame = FramesFactory.getEME2000();
138
139
140 double mu = 3.9860047e14;
141 double ae = 6.378137e6;
142 double[][] cnm = new double[][] {
143 { 0 }, { 0 }, { -1.08263e-3 }, { 2.54e-6 }, { 1.62e-6 }, { 2.3e-7 }
144 };
145 double[][] snm = new double[][] {
146 { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }
147 };
148 provider = GravityFieldFactory.getUnnormalizedProvider(ae, mu, TideSystem.UNKNOWN, cnm, snm);
149
150
151 final double a = 24396159;
152 final double e = 0.01;
153 final double i = FastMath.toRadians(47.);
154 final double omega = FastMath.toRadians(180);
155 final double raan = FastMath.toRadians(261);
156 final double lM = 0;
157 orbit = new KeplerianOrbit(a, e, i, omega, raan, lM, PositionAngleType.TRUE, inertialFrame, initDate, mu);
158 }
159
160 @Test
161 void testClone() {
162
163
164 final Orbit orbit = new CartesianOrbit(new PVCoordinates(
165 new Vector3D(Constants.EIGEN5C_EARTH_EQUATORIAL_RADIUS + 400000, 0, 0),
166 new Vector3D(10, 7668.6, 3)), FramesFactory.getGCRF(),
167 new AbsoluteDate(), Constants.EIGEN5C_EARTH_MU);
168 final UnnormalizedSphericalHarmonicsProvider harmonicsProvider = GravityFieldFactory.getUnnormalizedProvider(5, 0);
169
170 final BrouwerLyddanePropagatorBuilder builder = new BrouwerLyddanePropagatorBuilder(orbit, harmonicsProvider,
171 PositionAngleType.MEAN, 10.0, 1.0e-8);
172 builder.getPropagationParametersDrivers().getDrivers().forEach(driver -> driver.setSelected(true));
173
174
175 final BrouwerLyddanePropagatorBuilder copyBuilder = builder.clone();
176
177
178 assertPropagatorBuilderIsACopy(builder, copyBuilder);
179 Assertions.assertEquals(builder.getM2Value(), copyBuilder.getM2Value());
180 Assertions.assertTrue(builder.getPropagationParametersDrivers().getDrivers().get(0).isSelected());
181 Assertions.assertTrue(copyBuilder.getPropagationParametersDrivers().getDrivers().get(0).isSelected());
182 }
183
184
185
186
187
188 @Test
189 void testIssue1741() {
190
191
192 final Orbit orbit = new CartesianOrbit(new PVCoordinates(
193 new Vector3D(Constants.EIGEN5C_EARTH_EQUATORIAL_RADIUS + 400000, 0, 0),
194 new Vector3D(10, 7668.6, 3)), FramesFactory.getGCRF(),
195 new AbsoluteDate(), Constants.EIGEN5C_EARTH_MU);
196 final UnnormalizedSphericalHarmonicsProvider harmonicsProvider = GravityFieldFactory.getUnnormalizedProvider(5, 0);
197
198 final BrouwerLyddanePropagatorBuilder builder = new BrouwerLyddanePropagatorBuilder(orbit, harmonicsProvider,
199 PositionAngleType.MEAN, 10.0, 1.0e-8);
200 builder.getPropagationParametersDrivers().getDrivers().forEach(driver -> driver.setSelected(true));
201
202
203 final BrouwerLyddanePropagatorBuilder copyBuilder = builder.clone();
204
205
206 final TimeStampedPVCoordinates modifiedPv = orbit.shiftedBy(3600.).getPVCoordinates();
207 copyBuilder.resetOrbit(new CartesianOrbit(modifiedPv, orbit.getFrame(), orbit.getDate(), orbit.getMu()));
208
209
210
211 final PVCoordinates originalPv = orbit.getPVCoordinates();
212 final PVCoordinates initialPv = builder.createInitialOrbit().getPVCoordinates();
213 final double dP = originalPv.getPosition().distance(initialPv.getPosition());
214 final double dV = originalPv.getVelocity().distance(initialPv.getVelocity());
215 final double dA = originalPv.getAcceleration().distance(initialPv.getAcceleration());
216 Assertions.assertEquals(0., dP, 0.);
217 Assertions.assertEquals(0., dV, 0.);
218 Assertions.assertEquals(0., dA, 0.);
219 }
220 }