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.propagation.integration;
18  
19  import org.hipparchus.analysis.differentiation.Gradient;
20  import org.hipparchus.geometry.euclidean.threed.Vector3D;
21  import org.junit.jupiter.api.Assertions;
22  import org.junit.jupiter.api.Test;
23  import org.mockito.Mockito;
24  import org.orekit.attitudes.AttitudeProvider;
25  import org.orekit.attitudes.FrameAlignedProvider;
26  import org.orekit.frames.Frame;
27  import org.orekit.frames.FramesFactory;
28  import org.orekit.orbits.CartesianOrbit;
29  import org.orekit.propagation.FieldSpacecraftState;
30  import org.orekit.propagation.SpacecraftState;
31  import org.orekit.time.AbsoluteDate;
32  import org.orekit.utils.AbsolutePVCoordinates;
33  import org.orekit.utils.Constants;
34  import org.orekit.utils.ParameterDriver;
35  import org.orekit.utils.ParameterDriversProvider;
36  import org.orekit.utils.TimeStampedPVCoordinates;
37  
38  import java.util.ArrayList;
39  import java.util.List;
40  
41  class AbstractGradientConverterTest {
42  
43      @Test
44      void getStateOrbitTest() {
45          templateGetStateTest(true);
46      }
47  
48      @Test
49      void getStateAPVTest() {
50          templateGetStateTest(false);
51      }
52  
53      private void templateGetStateTest(final boolean isOrbitDefined) {
54          // GIVEN
55          final int freeParameters = 6;
56          final FieldSpacecraftState<Gradient> initGradientState = createGradientState(isOrbitDefined, freeParameters);
57          final TestGradientConverter testGradientConverter = new TestGradientConverter(freeParameters);
58          testGradientConverter.initStates(initGradientState);
59          final ParameterDriversProvider mockedDriversProvider = mockParameterDriversProvider();
60          // WHEN
61          final FieldSpacecraftState<Gradient> actualGradientState = testGradientConverter.getState(mockedDriversProvider);
62          // THEN
63          Assertions.assertEquals(isOrbitDefined, actualGradientState.isOrbitDefined());
64          Assertions.assertEquals(initGradientState.getFrame(), actualGradientState.getFrame());
65          Assertions.assertEquals(initGradientState.getMass().getReal(), actualGradientState.getMass().getReal());
66          Assertions.assertEquals(initGradientState.getDate().toAbsoluteDate(),
67                  actualGradientState.getDate().toAbsoluteDate());
68          Assertions.assertEquals(initGradientState.getPosition().toVector3D(),
69                  actualGradientState.getPosition().toVector3D());
70          Assertions.assertTrue(freeParameters < actualGradientState.getMass().getGradient().length);
71      }
72  
73      @Test
74      void testBuildBasicGradientSpacecraftStateOrbit() {
75          templateTestBuildBasicGradientSpacecraftState(true);
76      }
77  
78      @Test
79      void testBuildBasicGradientSpacecraftStateAPV() {
80          templateTestBuildBasicGradientSpacecraftState(false);
81      }
82  
83      private void templateTestBuildBasicGradientSpacecraftState(final boolean isOrbitDefined) {
84          // GIVEN
85          final int freeParameters = 6;
86          final Frame frame = FramesFactory.getGCRF();
87          final SpacecraftState state = buildState(isOrbitDefined, frame);
88          final AttitudeProvider provider = new FrameAlignedProvider(frame);
89          // WHEN
90          final FieldSpacecraftState<Gradient> fieldState = AbstractGradientConverter
91                  .buildBasicGradientSpacecraftState(state, freeParameters, provider);
92          // THEN
93          Assertions.assertEquals(state.getFrame(), fieldState.getFrame());
94          Assertions.assertEquals(state.getDate(), fieldState.getDate().toAbsoluteDate());
95          Assertions.assertEquals(state.getPosition(), fieldState.getPosition().toVector3D());
96          Assertions.assertEquals(state.isOrbitDefined(), fieldState.isOrbitDefined());
97          if (isOrbitDefined) {
98              Assertions.assertEquals(state.getOrbit().getMu(), fieldState.getOrbit().getMu().getReal());
99          }
100         final Gradient expectedFieldZero = Gradient.constant(freeParameters, 0.);
101         Assertions.assertEquals(expectedFieldZero, fieldState.getDate().getField().getZero());
102         final Gradient expectedFieldMass = Gradient.constant(freeParameters, state.getMass());
103         Assertions.assertEquals(expectedFieldMass, fieldState.getMass());
104     }
105 
106     private SpacecraftState buildState(final boolean isOrbitDefined, final Frame frame) {
107         final AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
108         if (isOrbitDefined) {
109             final TimeStampedPVCoordinates pvCoordinates = new TimeStampedPVCoordinates(date, new Vector3D(1e7, 0, 0), new Vector3D(0, 7e3, 1));
110             return new SpacecraftState(new CartesianOrbit(pvCoordinates, frame, Constants.EGM96_EARTH_MU)).withMass(1000.);
111         }
112         final SpacecraftState state = buildState(true, frame);
113         return new SpacecraftState(new AbsolutePVCoordinates(state.getFrame(), state.getDate(), state.getPVCoordinates()))
114                 .withMass(state.getMass()).withAttitude(state.getAttitude());
115     }
116 
117     private FieldSpacecraftState<Gradient> createGradientState(final boolean isOrbitDefined,
118                                                                final int freeParameters) {
119         final Frame frame = FramesFactory.getGCRF();
120         final AttitudeProvider provider = new FrameAlignedProvider(frame);
121         final SpacecraftState state = buildState(isOrbitDefined, frame);
122         return AbstractGradientConverter.buildBasicGradientSpacecraftState(state, freeParameters, provider);
123     }
124 
125     private ParameterDriversProvider mockParameterDriversProvider() {
126         final int nonZeroNumberOfValues = 1;
127         final ParameterDriver mockedParameterDriver = Mockito.mock(ParameterDriver.class);
128         Mockito.when(mockedParameterDriver.isSelected()).thenReturn(true);
129         Mockito.when(mockedParameterDriver.getNbOfValues()).thenReturn(nonZeroNumberOfValues);
130         final ParameterDriversProvider mockedDriversProvider = Mockito.mock(ParameterDriversProvider.class);
131         final List<ParameterDriver> parameterDriverList = new ArrayList<>();
132         parameterDriverList.add(mockedParameterDriver);
133         Mockito.when(mockedDriversProvider.getParametersDrivers()).thenReturn(parameterDriverList);
134         return mockedDriversProvider;
135     }
136 
137     private static class TestGradientConverter extends AbstractGradientConverter{
138 
139         protected TestGradientConverter(int freeStateParameters) {
140             super(freeStateParameters);
141         }
142 
143     }
144 
145 }