1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.control.indirect.shooting.propagation;
18
19 import org.hipparchus.complex.Complex;
20 import org.hipparchus.complex.ComplexField;
21 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
22 import org.hipparchus.geometry.euclidean.threed.Vector3D;
23 import org.hipparchus.ode.FieldODEIntegrator;
24 import org.hipparchus.ode.ODEIntegrator;
25 import org.hipparchus.ode.nonstiff.ClassicalRungeKuttaFieldIntegrator;
26 import org.hipparchus.ode.nonstiff.ClassicalRungeKuttaIntegrator;
27 import org.hipparchus.ode.nonstiff.DormandPrince54FieldIntegrator;
28 import org.hipparchus.ode.nonstiff.DormandPrince853FieldIntegrator;
29 import org.hipparchus.ode.nonstiff.LutherIntegrator;
30 import org.hipparchus.ode.nonstiff.MidpointIntegrator;
31 import org.junit.jupiter.api.Assertions;
32 import org.junit.jupiter.api.Test;
33 import org.mockito.Mockito;
34 import org.orekit.frames.FramesFactory;
35 import org.orekit.orbits.FieldOrbit;
36 import org.orekit.orbits.CartesianOrbit;
37 import org.orekit.orbits.OrbitType;
38 import org.orekit.propagation.ToleranceProvider;
39 import org.orekit.propagation.conversion.ClassicalRungeKuttaFieldIntegratorBuilder;
40 import org.orekit.propagation.conversion.ClassicalRungeKuttaIntegratorBuilder;
41 import org.orekit.propagation.conversion.FieldODEIntegratorBuilder;
42 import org.orekit.propagation.conversion.LutherIntegratorBuilder;
43 import org.orekit.propagation.conversion.MidpointIntegratorBuilder;
44 import org.orekit.propagation.conversion.ODEIntegratorBuilder;
45 import org.orekit.time.AbsoluteDate;
46 import org.orekit.time.FieldAbsoluteDate;
47 import org.orekit.utils.Constants;
48 import org.orekit.utils.FieldAbsolutePVCoordinates;
49 import org.orekit.utils.TimeStampedPVCoordinates;
50
51 class ShootingIntegrationSettingsFactoryTest {
52
53 @Test
54 void testGetMidpointIntegratorSettings() {
55
56 final double expectedStep = 1.;
57
58 final ShootingIntegrationSettings integrationSettings = ShootingIntegrationSettingsFactory
59 .getMidpointIntegratorSettings(expectedStep);
60 final ODEIntegratorBuilder builder = integrationSettings.getIntegratorBuilder();
61
62 Assertions.assertInstanceOf(MidpointIntegratorBuilder.class, builder);
63 final ODEIntegrator integrator = builder.buildIntegrator(buildOrbit(), OrbitType.CARTESIAN);
64 Assertions.assertEquals(expectedStep, ((MidpointIntegrator) integrator).getDefaultStep());
65 }
66
67 @Test
68 void testGetClassicalRungeKuttaIntegratorSettings() {
69
70 final double expectedStep = 1.;
71
72 final ShootingIntegrationSettings integrationSettings = ShootingIntegrationSettingsFactory
73 .getClassicalRungeKuttaIntegratorSettings(expectedStep);
74 final ODEIntegratorBuilder builder = integrationSettings.getIntegratorBuilder();
75
76 Assertions.assertInstanceOf(ClassicalRungeKuttaIntegratorBuilder.class, builder);
77 final ODEIntegrator integrator = builder.buildIntegrator(buildOrbit(), OrbitType.CARTESIAN);
78 Assertions.assertEquals(expectedStep, ((ClassicalRungeKuttaIntegrator) integrator).getDefaultStep());
79 }
80
81 @Test
82 void testGetClassicalRungeKuttaIntegratorSettingsField() {
83
84 final double expectedStep = 1.;
85
86 final ShootingIntegrationSettings integrationSettings = ShootingIntegrationSettingsFactory
87 .getClassicalRungeKuttaIntegratorSettings(expectedStep);
88 final FieldODEIntegratorBuilder<Complex> builder = integrationSettings.getFieldIntegratorBuilder(ComplexField.getInstance());
89
90 Assertions.assertInstanceOf(ClassicalRungeKuttaFieldIntegratorBuilder.class, builder);
91 final FieldOrbit<Complex> mockedFieldOrbit = mockFieldOrbit();
92 final FieldODEIntegrator<Complex> integrator = builder.buildIntegrator(mockedFieldOrbit, OrbitType.CARTESIAN);
93 Assertions.assertEquals(expectedStep, ((ClassicalRungeKuttaFieldIntegrator<Complex>) integrator).getDefaultStep().getReal());
94 }
95
96 @Test
97 void testGetLutherIntegratorSettings() {
98
99 final double expectedStep = 1.;
100
101 final ShootingIntegrationSettings integrationSettings = ShootingIntegrationSettingsFactory
102 .getLutherIntegratorSettings(expectedStep);
103 final ODEIntegratorBuilder builder = integrationSettings.getIntegratorBuilder();
104
105 Assertions.assertInstanceOf(LutherIntegratorBuilder.class, builder);
106 final ODEIntegrator integrator = builder.buildIntegrator(buildOrbit(), OrbitType.CARTESIAN);
107 Assertions.assertEquals(expectedStep, ((LutherIntegrator) integrator).getDefaultStep());
108 }
109
110 @SuppressWarnings("unchecked")
111 private static FieldOrbit<Complex> mockFieldOrbit() {
112 final FieldOrbit<Complex> mockedFieldOrbit = Mockito.mock(FieldOrbit.class);
113 Mockito.when(mockedFieldOrbit.getA()).thenReturn(Complex.ONE);
114 return mockedFieldOrbit;
115 }
116
117 @Test
118 void testGetDormandPrince54IntegratorSettings() {
119
120 final ComplexField field = ComplexField.getInstance();
121
122 final ShootingIntegrationSettings integrationSettings = ShootingIntegrationSettingsFactory
123 .getDormandPrince54IntegratorSettings(1., 10.,
124 ToleranceProvider.of(1, 2));
125 final FieldODEIntegratorBuilder<Complex> builder = integrationSettings.getFieldIntegratorBuilder(field);
126
127 final FieldODEIntegrator<Complex> fieldIntegrator = builder.buildIntegrator(new FieldAbsolutePVCoordinates<>(FramesFactory.getGCRF(),
128 FieldAbsoluteDate.getArbitraryEpoch(field), new FieldVector3D<>(field, Vector3D.PLUS_I),
129 new FieldVector3D<>(field, Vector3D.MINUS_J)));
130 Assertions.assertInstanceOf(DormandPrince54FieldIntegrator.class, fieldIntegrator);
131 }
132
133 @Test
134 void testGetDormandPrince853IntegratorSettings() {
135
136 final ComplexField field = ComplexField.getInstance();
137
138 final ShootingIntegrationSettings integrationSettings = ShootingIntegrationSettingsFactory
139 .getDormandPrince853IntegratorSettings(1., 10.,
140 ToleranceProvider.of(1, 2));
141 final FieldODEIntegratorBuilder<Complex> builder = integrationSettings.getFieldIntegratorBuilder(field);
142
143 final FieldODEIntegrator<Complex> fieldIntegrator = builder.buildIntegrator(new FieldAbsolutePVCoordinates<>(FramesFactory.getGCRF(),
144 FieldAbsoluteDate.getArbitraryEpoch(field), new FieldVector3D<>(field, Vector3D.PLUS_I),
145 new FieldVector3D<>(field, Vector3D.MINUS_J)));
146 Assertions.assertInstanceOf(DormandPrince853FieldIntegrator.class, fieldIntegrator);
147 }
148
149 private CartesianOrbit buildOrbit() {
150 return new CartesianOrbit(new TimeStampedPVCoordinates(AbsoluteDate.ARBITRARY_EPOCH,
151 new Vector3D(1.0e7, 0, 0),
152 new Vector3D(5e3, 6e3, 100)),
153 FramesFactory.getEME2000(),
154 Constants.EIGEN5C_EARTH_MU);
155 }
156
157 }