1   /* Copyright 2002-2025 CS GROUP
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  
18  package org.orekit.propagation.conversion;
19  
20  import org.hipparchus.geometry.euclidean.threed.Vector3D;
21  import org.junit.jupiter.api.Assertions;
22  import org.junit.jupiter.api.BeforeAll;
23  import org.junit.jupiter.api.Test;
24  import org.mockito.Mockito;
25  import org.orekit.Utils;
26  import org.orekit.forces.ForceModel;
27  import org.orekit.forces.gravity.HolmesFeatherstoneAttractionModel;
28  import org.orekit.forces.gravity.potential.GravityFieldFactory;
29  import org.orekit.forces.maneuvers.ImpulseManeuver;
30  import org.orekit.frames.FramesFactory;
31  import org.orekit.orbits.CartesianOrbit;
32  import org.orekit.orbits.Orbit;
33  import org.orekit.orbits.PositionAngleType;
34  import org.orekit.propagation.Propagator;
35  import org.orekit.propagation.events.EventDetector;
36  import org.orekit.time.AbsoluteDate;
37  import org.orekit.utils.Constants;
38  import org.orekit.utils.IERSConventions;
39  import org.orekit.utils.PVCoordinates;
40  
41  import java.util.Collection;
42  import java.util.List;
43  
44  import static org.orekit.propagation.conversion.AbstractPropagatorBuilderTest.assertPropagatorBuilderIsACopy;
45  
46  public class NumericalPropagatorBuilderTest {
47  
48      @BeforeAll
49      public static void setUpBeforeClass() {
50          Utils.setDataRoot("regular-data:potential");
51      }
52  
53      @Test
54      void testClearImpulseManeuvers() {
55          // Given
56          final ODEIntegratorBuilder integratorBuilder = new ClassicalRungeKuttaIntegratorBuilder(60);
57          final Orbit orbit = getOrbit();
58          final NumericalPropagatorBuilder builder =
59                  new NumericalPropagatorBuilder(orbit, integratorBuilder, PositionAngleType.MEAN, 1.0, Utils.defaultLaw());
60          final ImpulseManeuver mockedManeuver = Mockito.mock(ImpulseManeuver.class);
61          builder.addImpulseManeuver(mockedManeuver);
62          // WHEN
63          builder.clearImpulseManeuvers();
64          // THEN
65          final Propagator propagator = builder.buildPropagator();
66          final Collection<EventDetector> detectors = propagator.getEventDetectors();
67          Assertions.assertTrue(detectors.isEmpty());
68      }
69  
70      @Test
71      void testAddImpulseManeuver() {
72          // Given
73          final ODEIntegratorBuilder integratorBuilder = new ClassicalRungeKuttaIntegratorBuilder(60);
74          final Orbit orbit = getOrbit();
75          final NumericalPropagatorBuilder builder =
76                  new NumericalPropagatorBuilder(orbit, integratorBuilder, PositionAngleType.MEAN, 1.0, Utils.defaultLaw());
77          final ImpulseManeuver mockedManeuver = Mockito.mock(ImpulseManeuver.class);
78          // WHEN
79          builder.addImpulseManeuver(mockedManeuver);
80          // THEN
81          final Propagator propagator = builder.buildPropagator();
82          final Collection<EventDetector> detectors = propagator.getEventDetectors();
83          Assertions.assertEquals(1, detectors.size());
84          Assertions.assertEquals(mockedManeuver, detectors.toArray()[0]);
85      }
86  
87      @Test
88      void testClone() {
89  
90          // Given
91          final ODEIntegratorBuilder integratorBuilder = new ClassicalRungeKuttaIntegratorBuilder(60);
92          final Orbit orbit = getOrbit();
93  
94          final NumericalPropagatorBuilder builder =
95                  new NumericalPropagatorBuilder(orbit, integratorBuilder, PositionAngleType.MEAN, 1.0, Utils.defaultLaw());
96  
97          builder.addForceModel(new HolmesFeatherstoneAttractionModel(FramesFactory.getITRF(IERSConventions.IERS_2010, true),
98                  GravityFieldFactory.getNormalizedProvider(2, 0)));
99  
100         // When
101         final NumericalPropagatorBuilder copyBuilder = (NumericalPropagatorBuilder) builder.clone();
102 
103         // Then
104         assertNumericalPropagatorBuilderIsACopy(builder, copyBuilder);
105 
106     }
107 
108     private static Orbit getOrbit() {
109         return new CartesianOrbit(new PVCoordinates(
110                 new Vector3D(Constants.EIGEN5C_EARTH_EQUATORIAL_RADIUS + 400000, 0, 0),
111                 new Vector3D(0, 7668.6, 0)), FramesFactory.getGCRF(),
112                 new AbsoluteDate(), Constants.EIGEN5C_EARTH_MU);
113     }
114 
115     private void assertNumericalPropagatorBuilderIsACopy(final NumericalPropagatorBuilder expected,
116                                                          final NumericalPropagatorBuilder actual) {
117         assertPropagatorBuilderIsACopy(expected, actual);
118 
119         // Assert force models
120         final List<ForceModel> expectedForceModelList = expected.getAllForceModels();
121         final List<ForceModel> actualForceModelList   = actual.getAllForceModels();
122         Assertions.assertEquals(expectedForceModelList.size(), actualForceModelList.size());
123         for (int i = 0; i < expectedForceModelList.size(); i++) {
124             Assertions.assertEquals(expectedForceModelList.get(i).getClass(), actualForceModelList.get(i).getClass());
125         }
126 
127         // Assert integrator builder
128         Assertions.assertEquals(expected.getIntegratorBuilder().getClass(), actual.getIntegratorBuilder().getClass());
129 
130         // Assert mass
131         Assertions.assertEquals(expected.getMass(), actual.getMass());
132     }
133 
134 }