1   /* Copyright 2002-2022 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  package org.orekit.propagation.numerical;
18  
19  import static org.hamcrest.CoreMatchers.is;
20  
21  import java.util.Collections;
22  import java.util.List;
23  import java.util.stream.Stream;
24  
25  import org.hamcrest.MatcherAssert;
26  import org.hipparchus.Field;
27  import org.hipparchus.CalculusFieldElement;
28  import org.hipparchus.analysis.differentiation.DerivativeStructure;
29  import org.hipparchus.geometry.euclidean.threed.FieldRotation;
30  import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
31  import org.hipparchus.geometry.euclidean.threed.Vector3D;
32  import org.hipparchus.ode.nonstiff.DormandPrince54Integrator;
33  import org.junit.Before;
34  import org.junit.Test;
35  import org.orekit.forces.AbstractForceModel;
36  import org.orekit.forces.ForceModel;
37  import org.orekit.frames.Frame;
38  import org.orekit.frames.FramesFactory;
39  import org.orekit.orbits.CartesianOrbit;
40  import org.orekit.propagation.FieldSpacecraftState;
41  import org.orekit.propagation.SpacecraftState;
42  import org.orekit.propagation.events.EventDetector;
43  import org.orekit.propagation.events.FieldEventDetector;
44  import org.orekit.time.AbsoluteDate;
45  import org.orekit.utils.Constants;
46  import org.orekit.utils.PVCoordinates;
47  import org.orekit.utils.ParameterDriver;
48  
49  /** Unit tests for {@link PartialDerivativesEquations}. */
50  @Deprecated
51  public class PartialDerivativesEquationsTest {
52  
53      /** arbitrary date */
54      private static final AbsoluteDate date = AbsoluteDate.J2000_EPOCH;
55      /** Earth gravitational parameter */
56      private static final double gm = Constants.EIGEN5C_EARTH_MU;
57      /** arbitrary inertial frame */
58      private static final Frame eci = FramesFactory.getGCRF();
59  
60      /** unused propagator */
61      private NumericalPropagator propagator;
62      /** mock force model */
63      private MockForceModel forceModel;
64      /** arbitrary PV */
65      private PVCoordinates pv;
66      /** arbitrary state */
67      private SpacecraftState state;
68      /** subject under test */
69      private PartialDerivativesEquations pde;
70  
71      /**
72       * set up {@link #pde} and dependencies.
73       */
74      @Before
75      public void setUp() {
76          propagator = new NumericalPropagator(new DormandPrince54Integrator(1, 500, 0.001, 0.001));
77          forceModel = new MockForceModel();
78          propagator.addForceModel(forceModel);
79          pde = new PartialDerivativesEquations("pde", propagator);
80          Vector3D p = new Vector3D(7378137, 0, 0);
81          Vector3D v = new Vector3D(0, 7500, 0);
82          pv = new PVCoordinates(p, v);
83          state = new SpacecraftState(new CartesianOrbit(pv, eci, date, gm))
84                  .addAdditionalState("pde", new double[2 * 3 * 6]);
85          pde.setInitialJacobians(state);
86  
87      }
88  
89      /**
90       * check {@link PartialDerivativesEquations#derivatives(SpacecraftState)} correctly sets the satellite velocity.
91       */
92      @Test
93      public void testDerivativesStateVelocity() {
94          //action
95          pde.derivatives(state);
96  
97          //verify
98          MatcherAssert.assertThat(forceModel.accelerationDerivativesPosition.toVector3D(), is(pv.getPosition()));
99          MatcherAssert.assertThat(forceModel.accelerationDerivativesVelocity.toVector3D(), is(pv.getVelocity()));
100 
101     }
102 
103     /** Mock {@link ForceModel}. */
104     private static class MockForceModel extends AbstractForceModel {
105 
106         /**
107          * argument for {@link #accelerationDerivatives(AbsoluteDate, Frame,
108          * FieldVector3D, FieldVector3D, FieldRotation, DerivativeStructure)}.
109          */
110         public FieldVector3D<DerivativeStructure> accelerationDerivativesPosition;
111         /**
112          * argument for {@link #accelerationDerivatives(AbsoluteDate, Frame,
113          * FieldVector3D, FieldVector3D, FieldRotation, DerivativeStructure)}.
114          */
115         public FieldVector3D<DerivativeStructure> accelerationDerivativesVelocity;
116 
117         /** {@inheritDoc} */
118         @Override
119         public boolean dependsOnPositionOnly() {
120             return false;
121         }
122 
123         @Override
124         public <T extends CalculusFieldElement<T>> void
125             addContribution(FieldSpacecraftState<T> s,
126                             FieldTimeDerivativesEquations<T> adder) {
127         }
128 
129         @Override
130         public Vector3D acceleration(final SpacecraftState s, final double[] parameters)
131             {
132             return s.getPVCoordinates().getPosition();
133         }
134 
135         @SuppressWarnings("unchecked")
136         @Override
137         public <T extends CalculusFieldElement<T>> FieldVector3D<T> acceleration(final FieldSpacecraftState<T> s,
138                                                                              final T[] parameters)
139             {
140             this.accelerationDerivativesPosition = (FieldVector3D<DerivativeStructure>) s.getPVCoordinates().getPosition();
141             this.accelerationDerivativesVelocity = (FieldVector3D<DerivativeStructure>) s.getPVCoordinates().getVelocity();
142             return s.getPVCoordinates().getPosition();
143         }
144 
145         @Override
146         public Stream<EventDetector> getEventsDetectors() {
147             return Stream.empty();
148         }
149 
150         @Override
151         public List<ParameterDriver> getParametersDrivers() {
152             return Collections.emptyList();
153         }
154 
155         @Override
156         public <T extends CalculusFieldElement<T>> Stream<FieldEventDetector<T>> getFieldEventsDetectors(final Field<T> field) {
157             return Stream.empty();
158         }
159 
160     }
161 
162 }