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.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          // GIVEN
56          final double expectedStep = 1.;
57          // WHEN
58          final ShootingIntegrationSettings integrationSettings = ShootingIntegrationSettingsFactory
59                  .getMidpointIntegratorSettings(expectedStep);
60          final ODEIntegratorBuilder builder = integrationSettings.getIntegratorBuilder();
61          // THEN
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          // GIVEN
70          final double expectedStep = 1.;
71          // WHEN
72          final ShootingIntegrationSettings integrationSettings = ShootingIntegrationSettingsFactory
73                  .getClassicalRungeKuttaIntegratorSettings(expectedStep);
74          final ODEIntegratorBuilder builder = integrationSettings.getIntegratorBuilder();
75          // THEN
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          // GIVEN
84          final double expectedStep = 1.;
85          // WHEN
86          final ShootingIntegrationSettings integrationSettings = ShootingIntegrationSettingsFactory
87                  .getClassicalRungeKuttaIntegratorSettings(expectedStep);
88          final FieldODEIntegratorBuilder<Complex> builder = integrationSettings.getFieldIntegratorBuilder(ComplexField.getInstance());
89          // THEN
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          // GIVEN
99          final double expectedStep = 1.;
100         // WHEN
101         final ShootingIntegrationSettings integrationSettings = ShootingIntegrationSettingsFactory
102                 .getLutherIntegratorSettings(expectedStep);
103         final ODEIntegratorBuilder builder = integrationSettings.getIntegratorBuilder();
104         // THEN
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         // 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 
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 }