1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.numerical;
18
19 import org.hipparchus.geometry.euclidean.threed.Vector3D;
20 import org.hipparchus.linear.MatrixUtils;
21 import org.hipparchus.linear.RealMatrix;
22 import org.hipparchus.ode.nonstiff.AdaptiveStepsizeIntegrator;
23 import org.hipparchus.ode.nonstiff.DormandPrince853Integrator;
24 import org.junit.jupiter.api.AfterEach;
25 import org.junit.jupiter.api.Assertions;
26 import org.junit.jupiter.api.BeforeEach;
27 import org.junit.jupiter.api.Test;
28 import org.orekit.errors.OrekitException;
29 import org.orekit.errors.OrekitMessages;
30 import org.orekit.forces.maneuvers.Maneuver;
31 import org.orekit.forces.maneuvers.propulsion.BasicConstantThrustPropulsionModel;
32 import org.orekit.forces.maneuvers.propulsion.PropulsionModel;
33 import org.orekit.forces.maneuvers.trigger.DateBasedManeuverTriggers;
34 import org.orekit.frames.FramesFactory;
35 import org.orekit.orbits.KeplerianOrbit;
36 import org.orekit.orbits.Orbit;
37 import org.orekit.orbits.OrbitType;
38 import org.orekit.orbits.PositionAngleType;
39 import org.orekit.propagation.SpacecraftState;
40 import org.orekit.propagation.ToleranceProvider;
41 import org.orekit.time.AbsoluteDate;
42 import org.orekit.utils.AbsolutePVCoordinates;
43 import org.orekit.utils.Constants;
44 import org.orekit.utils.DoubleArrayDictionary;
45
46 import java.util.List;
47
48 public class NumericalPropagationHarvesterTest {
49
50 @Test
51 void testNullStmName() {
52 try {
53 propagator.setupMatricesComputation(null, null, null);
54 Assertions.fail("an exception should have been thrown");
55 } catch (OrekitException oe) {
56 Assertions.assertEquals(OrekitMessages.NULL_ARGUMENT, oe.getSpecifier());
57 Assertions.assertEquals("stmName", oe.getParts()[0]);
58 }
59 }
60
61 @Test
62 void testUnknownStmName() {
63 NumericalPropagationHarvester harvester =
64 (NumericalPropagationHarvester) propagator.setupMatricesComputation("stm",
65 MatrixUtils.createRealIdentityMatrix(6),
66 new DoubleArrayDictionary());
67 Assertions.assertNull(harvester.getStateTransitionMatrix(propagator.getInitialState()));
68 }
69
70 @Test
71 void testUnknownColumnName() {
72 NumericalPropagationHarvester harvester =
73 (NumericalPropagationHarvester) propagator.setupMatricesComputation("stm",
74 MatrixUtils.createRealIdentityMatrix(6),
75 new DoubleArrayDictionary());
76 Assertions.assertNull(harvester.getParametersJacobian(propagator.getInitialState()));
77 }
78
79 @Test
80 void testDefaultNonNullInitialJacobian() {
81 NumericalPropagationHarvester harvester =
82 (NumericalPropagationHarvester) propagator.setupMatricesComputation("stm",
83 MatrixUtils.createRealIdentityMatrix(6),
84 new DoubleArrayDictionary());
85 Assertions.assertNotNull(harvester.getInitialJacobianColumn("xyz"));
86 }
87
88 @Test
89 void testInitialStmCartesian() {
90 doTestInitialStm(OrbitType.CARTESIAN, 0.0);
91 }
92
93 @Test
94 void testInitialStmKeplerian() {
95 doTestInitialStm(OrbitType.KEPLERIAN, 2160.746);
96 }
97
98 @Test
99 void testInitialStmAbsPV() {
100 SpacecraftState state = propagator.getInitialState();
101 SpacecraftState absPV =
102 new SpacecraftState(new AbsolutePVCoordinates(state.getFrame(),
103 state.getPVCoordinates()));
104 propagator.setInitialState(absPV);
105 doTestInitialStm(null, 0.0);
106 }
107
108 @Test
109 void testColumnsNames() {
110
111 NumericalPropagationHarvester harvester =
112 (NumericalPropagationHarvester) propagator.setupMatricesComputation("stm",
113 MatrixUtils.createRealIdentityMatrix(6),
114 new DoubleArrayDictionary());
115 Assertions.assertTrue(harvester.getJacobiansColumnsNames().isEmpty());
116
117 DateBasedManeuverTriggers triggers = new DateBasedManeuverTriggers("apogee_boost", propagator.getInitialState().getDate().shiftedBy(60.0), 120.0);
118 PropulsionModel propulsion = new BasicConstantThrustPropulsionModel(400.0, 350.0, Vector3D.PLUS_I, "ABM-");
119 propagator.addForceModel(new Maneuver(null, triggers, propulsion));
120 Assertions.assertTrue(harvester.getJacobiansColumnsNames().isEmpty());
121
122 triggers.getParametersDrivers().get(1).setSelected(true);
123 propulsion.getParametersDrivers().get(0).setSelected(true);
124 List<String> columnsNames = harvester.getJacobiansColumnsNames();
125 Assertions.assertEquals(2, columnsNames.size());
126 Assertions.assertEquals("SpanABM-" + BasicConstantThrustPropulsionModel.THRUST + Integer.toString(0), columnsNames.get(0));
127 Assertions.assertEquals("Spanapogee_boost_STOP" + Integer.toString(0), columnsNames.get(1));
128
129 }
130
131 private void doTestInitialStm(OrbitType type, double deltaId) {
132 PositionAngleType angle = PositionAngleType.TRUE;
133 final RealMatrix identity7 = MatrixUtils.createRealIdentityMatrix(7);
134 NumericalPropagationHarvester harvester =
135 (NumericalPropagationHarvester) propagator.setupMatricesComputation("stm", identity7, null);
136 propagator.setOrbitType(type);
137 propagator.setPositionAngleType(angle);
138 double[] p = new double[49];
139 for (int i = 0; i < p.length; i += 8) {
140 p[i] = 1.0;
141 }
142 SpacecraftState s = propagator.getInitialState().addAdditionalData(harvester.getStmName(), p);
143 RealMatrix stm = harvester.getStateTransitionMatrix(s);
144 Assertions.assertEquals(deltaId, stm.subtract(identity7).getNorm1(), 1.0e-3);
145 Assertions.assertEquals(type, harvester.getOrbitType());
146 Assertions.assertEquals(angle, harvester.getPositionAngleType());
147 }
148
149 @BeforeEach
150 public void setUp() {
151 Orbit initialOrbit =
152 new KeplerianOrbit(8000000.0, 0.01, 0.1, 0.7, 0, 1.2, PositionAngleType.TRUE,
153 FramesFactory.getEME2000(), AbsoluteDate.J2000_EPOCH,
154 Constants.EIGEN5C_EARTH_MU);
155 double minStep = 0.0001;
156 double maxStep = 60;
157 double[][] tolerances = ToleranceProvider.getDefaultToleranceProvider(0.001).getTolerances(initialOrbit, initialOrbit.getType());
158 AdaptiveStepsizeIntegrator integrator = new DormandPrince853Integrator(minStep, maxStep, tolerances[0], tolerances[1]);
159 integrator.setInitialStepSize(1.0);
160 propagator = new NumericalPropagator(integrator);
161 propagator.setInitialState(new SpacecraftState(initialOrbit));
162 }
163
164 @AfterEach
165 public void tearDown() {
166 propagator = null;
167 }
168
169 private NumericalPropagator propagator;
170
171 }