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.errors.OrekitException;
36  import org.orekit.forces.AbstractForceModel;
37  import org.orekit.forces.ForceModel;
38  import org.orekit.frames.Frame;
39  import org.orekit.frames.FramesFactory;
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.AbsolutePVCoordinates;
46  import org.orekit.utils.PVCoordinates;
47  import org.orekit.utils.ParameterDriver;
48  
49  /** Unit tests for {@link AbsolutePartialDerivativesEquations}. */
50  @Deprecated
51  public class AbsolutePartialDerivativesEquationsTest {
52  
53      /** arbitrary date */
54      private static final AbsoluteDate date = AbsoluteDate.J2000_EPOCH;
55      /** arbitrary inertial frame */
56      private static final Frame eci = FramesFactory.getGCRF();
57  
58      /** unused propagator */
59      private NumericalPropagator propagator;
60      /** mock force model */
61      private MockForceModel forceModel;
62      /** arbitrary PV */
63      private PVCoordinates pv;
64      /** arbitrary state */
65      private SpacecraftState state;
66      /** subject under test */
67      private AbsolutePartialDerivativesEquations pde;
68  
69      /**
70       * set up {@link #pde} and dependencies.
71       */
72      @Before
73      public void setUp() {
74          propagator = new NumericalPropagator(new DormandPrince54Integrator(1, 500, 0.001, 0.001));
75          forceModel = new MockForceModel();
76          propagator.addForceModel(forceModel);
77          pde = new AbsolutePartialDerivativesEquations("pde", propagator);
78          Vector3D p = new Vector3D(7378137, 0, 0);
79          Vector3D v = new Vector3D(0, 7500, 0);
80          pv = new PVCoordinates(p, v);
81          state = new SpacecraftState(new AbsolutePVCoordinates(eci,date,pv))
82                  .addAdditionalState("pde", new double[2 * 3 * 6]);
83          pde.setInitialJacobians(state);
84  
85      }
86  
87      /**
88       * check {@link PartialDerivativesEquations#derivatives(SpacecraftState)} correctly sets the satellite velocity.
89       */
90      @Test
91      public void testComputeDerivativesStateVelocity() {
92          //action
93          pde.derivatives(state);
94  
95          //verify
96          MatcherAssert.assertThat(forceModel.accelerationDerivativesPosition.toVector3D(), is(pv.getPosition()));
97          MatcherAssert.assertThat(forceModel.accelerationDerivativesVelocity.toVector3D(), is(pv.getVelocity()));
98  
99      }
100 
101     @Test(expected=OrekitException.class)
102     public void testNotInitialized() {
103         new AbsolutePartialDerivativesEquations("partials", propagator).getMapper();
104     }
105 
106     /** Mock {@link ForceModel}. */
107     private static class MockForceModel extends AbstractForceModel {
108 
109         /**
110          * argument for {@link #accelerationDerivatives(AbsoluteDate, Frame,
111          * FieldVector3D, FieldVector3D, FieldRotation, DerivativeStructure)}.
112          */
113         public FieldVector3D<DerivativeStructure> accelerationDerivativesPosition;
114         /**
115          * argument for {@link #accelerationDerivatives(AbsoluteDate, Frame,
116          * FieldVector3D, FieldVector3D, FieldRotation, DerivativeStructure)}.
117          */
118         public FieldVector3D<DerivativeStructure> accelerationDerivativesVelocity;
119 
120         /** {@inheritDoc} */
121         @Override
122         public boolean dependsOnPositionOnly() {
123             return false;
124         }
125 
126         @Override
127         public <T extends CalculusFieldElement<T>> void
128             addContribution(FieldSpacecraftState<T> s,
129                             FieldTimeDerivativesEquations<T> adder) {
130         }
131 
132         @Override
133         public Vector3D acceleration(final SpacecraftState s, final double[] parameters)
134             {
135             return s.getPVCoordinates().getPosition();
136         }
137 
138         @SuppressWarnings("unchecked")
139         @Override
140         public <T extends CalculusFieldElement<T>> FieldVector3D<T> acceleration(final FieldSpacecraftState<T> s,
141                                                                              final T[] parameters)
142             {
143             this.accelerationDerivativesPosition = (FieldVector3D<DerivativeStructure>) s.getPVCoordinates().getPosition();
144             this.accelerationDerivativesVelocity = (FieldVector3D<DerivativeStructure>) s.getPVCoordinates().getVelocity();
145             return s.getPVCoordinates().getPosition();
146         }
147 
148         @Override
149         public Stream<EventDetector> getEventsDetectors() {
150             return Stream.empty();
151         }
152 
153         @Override
154         public List<ParameterDriver> getParametersDrivers() {
155             return Collections.emptyList();
156         }
157 
158         @Override
159         public <T extends CalculusFieldElement<T>> Stream<FieldEventDetector<T>> getFieldEventsDetectors(final Field<T> field) {
160             return Stream.empty();
161         }
162 
163     }
164 
165 }