1   /* Copyright 2022-2025 Romain Serra
2    * Licensed to CS GROUP (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * CS licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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.Orbit;
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.FieldAbsoluteDate;
46  import org.orekit.utils.FieldAbsolutePVCoordinates;
47  
48  class ShootingIntegrationSettingsFactoryTest {
49  
50      @Test
51      void testGetMidpointIntegratorSettings() {
52          // GIVEN
53          final double expectedStep = 1.;
54          // WHEN
55          final ShootingIntegrationSettings integrationSettings = ShootingIntegrationSettingsFactory
56                  .getMidpointIntegratorSettings(expectedStep);
57          final ODEIntegratorBuilder builder = integrationSettings.getIntegratorBuilder();
58          // THEN
59          Assertions.assertInstanceOf(MidpointIntegratorBuilder.class, builder);
60          final ODEIntegrator integrator = builder.buildIntegrator(Mockito.mock(Orbit.class),
61                  Mockito.mock(OrbitType.class));
62          Assertions.assertEquals(expectedStep, ((MidpointIntegrator) integrator).getDefaultStep());
63      }
64  
65      @Test
66      void testGetClassicalRungeKuttaIntegratorSettings() {
67          // GIVEN
68          final double expectedStep = 1.;
69          // WHEN
70          final ShootingIntegrationSettings integrationSettings = ShootingIntegrationSettingsFactory
71                  .getClassicalRungeKuttaIntegratorSettings(expectedStep);
72          final ODEIntegratorBuilder builder = integrationSettings.getIntegratorBuilder();
73          // THEN
74          Assertions.assertInstanceOf(ClassicalRungeKuttaIntegratorBuilder.class, builder);
75          final ODEIntegrator integrator = builder.buildIntegrator(Mockito.mock(Orbit.class),
76                  Mockito.mock(OrbitType.class));
77          Assertions.assertEquals(expectedStep, ((ClassicalRungeKuttaIntegrator) integrator).getDefaultStep());
78      }
79  
80      @Test
81      void testGetClassicalRungeKuttaIntegratorSettingsField() {
82          // GIVEN
83          final double expectedStep = 1.;
84          // WHEN
85          final ShootingIntegrationSettings integrationSettings = ShootingIntegrationSettingsFactory
86                  .getClassicalRungeKuttaIntegratorSettings(expectedStep);
87          final FieldODEIntegratorBuilder<Complex> builder = integrationSettings.getFieldIntegratorBuilder(ComplexField.getInstance());
88          // THEN
89          Assertions.assertInstanceOf(ClassicalRungeKuttaFieldIntegratorBuilder.class, builder);
90          final FieldOrbit<Complex> mockedFieldOrbit = mockFieldOrbit();
91          final FieldODEIntegrator<Complex> integrator = builder.buildIntegrator(mockedFieldOrbit, Mockito.mock(OrbitType.class));
92          Assertions.assertEquals(expectedStep, ((ClassicalRungeKuttaFieldIntegrator<Complex>) integrator).getDefaultStep().getReal());
93      }
94  
95      @Test
96      void testGetLutherIntegratorSettings() {
97          // GIVEN
98          final double expectedStep = 1.;
99          // WHEN
100         final ShootingIntegrationSettings integrationSettings = ShootingIntegrationSettingsFactory
101                 .getLutherIntegratorSettings(expectedStep);
102         final ODEIntegratorBuilder builder = integrationSettings.getIntegratorBuilder();
103         // THEN
104         Assertions.assertInstanceOf(LutherIntegratorBuilder.class, builder);
105         final ODEIntegrator integrator = builder.buildIntegrator(Mockito.mock(Orbit.class),
106                 Mockito.mock(OrbitType.class));
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         // WHEN
122         final ShootingIntegrationSettings integrationSettings = ShootingIntegrationSettingsFactory
123                 .getDormandPrince54IntegratorSettings(1., 10.,
124                         ToleranceProvider.of(1, 2));
125         final FieldODEIntegratorBuilder<Complex> builder = integrationSettings.getFieldIntegratorBuilder(field);
126         // THEN
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         // WHEN
138         final ShootingIntegrationSettings integrationSettings = ShootingIntegrationSettingsFactory
139                 .getDormandPrince853IntegratorSettings(1., 10.,
140                         ToleranceProvider.of(1, 2));
141         final FieldODEIntegratorBuilder<Complex> builder = integrationSettings.getFieldIntegratorBuilder(field);
142         // THEN
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 }