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.events;
18  
19  import org.hipparchus.Field;
20  import org.hipparchus.CalculusFieldElement;
21  import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
22  import org.hipparchus.util.Decimal64Field;
23  import org.hipparchus.util.FastMath;
24  import org.hipparchus.util.MathUtils;
25  import org.junit.Assert;
26  import org.junit.Before;
27  import org.junit.Test;
28  import org.orekit.Utils;
29  import org.orekit.frames.FramesFactory;
30  import org.orekit.orbits.FieldCartesianOrbit;
31  import org.orekit.orbits.FieldKeplerianOrbit;
32  import org.orekit.orbits.FieldOrbit;
33  import org.orekit.orbits.OrbitType;
34  import org.orekit.propagation.analytical.FieldEcksteinHechlerPropagator;
35  import org.orekit.propagation.events.FieldEventsLogger.FieldLoggedEvent;
36  import org.orekit.propagation.events.handlers.FieldContinueOnEvent;
37  import org.orekit.time.FieldAbsoluteDate;
38  import org.orekit.time.TimeScale;
39  import org.orekit.time.TimeScalesFactory;
40  import org.orekit.utils.Constants;
41  import org.orekit.utils.FieldPVCoordinates;
42  
43  public class FieldApsideDetectorTest {
44  
45      @Test
46      public void testSimple() {
47          doTestSimple(Decimal64Field.getInstance());
48      }
49  
50      private <T extends CalculusFieldElement<T>> void doTestSimple(Field<T> field) {
51          final T zero = field.getZero();
52  
53          final TimeScale utc = TimeScalesFactory.getUTC();
54          final FieldVector3D<T> position = new FieldVector3D<>(zero.add(-6142438.668), zero.add(3492467.56), zero.add(-25767.257));
55          final FieldVector3D<T> velocity = new FieldVector3D<>(zero.add(506.0), zero.add(943.0), zero.add(7450));
56          final FieldAbsoluteDate<T> date = new FieldAbsoluteDate<>(field, 2003, 9, 16, utc);
57          final FieldOrbit<T> orbit = new FieldCartesianOrbit<>(new FieldPVCoordinates<>(position,  velocity),
58                                                                FramesFactory.getEME2000(), date,
59                                                                zero.add(Constants.EIGEN5C_EARTH_MU));
60          FieldEcksteinHechlerPropagator<T> propagator =
61                          new FieldEcksteinHechlerPropagator<>(orbit,
62                                                               Constants.EIGEN5C_EARTH_EQUATORIAL_RADIUS,
63                                                               zero.add(Constants.EIGEN5C_EARTH_MU),
64                                                               Constants.EIGEN5C_EARTH_C20,
65                                                               Constants.EIGEN5C_EARTH_C30,
66                                                               Constants.EIGEN5C_EARTH_C40,
67                                                               Constants.EIGEN5C_EARTH_C50,
68                                                               Constants.EIGEN5C_EARTH_C60);
69  
70          FieldEventDetector<T> detector = new FieldApsideDetector<>(propagator.getInitialState().getOrbit()).
71                                   withMaxCheck(zero.add(600.0)).
72                                   withThreshold(zero.add(1.0e-12)).
73                                   withHandler(new FieldContinueOnEvent<FieldApsideDetector<T>, T>());
74  
75          Assert.assertEquals(600.0, detector.getMaxCheckInterval().getReal(), 1.0e-15);
76          Assert.assertEquals(1.0e-12, detector.getThreshold().getReal(), 1.0e-15);
77          Assert.assertEquals(AbstractDetector.DEFAULT_MAX_ITER, detector.getMaxIterationCount());
78  
79          FieldEventsLogger<T> logger = new FieldEventsLogger<>();
80          propagator.addEventDetector(logger.monitorDetector(detector));
81  
82          propagator.propagate(propagator.getInitialState().getOrbit().getDate().shiftedBy(Constants.JULIAN_DAY));
83  
84          Assert.assertEquals(30, logger.getLoggedEvents().size());
85          for (FieldLoggedEvent<T> e : logger.getLoggedEvents()) {
86              FieldKeplerianOrbit<T> o = (FieldKeplerianOrbit<T>) OrbitType.KEPLERIAN.convertType(e.getState().getOrbit());
87              double expected = e.isIncreasing() ? 0.0 : FastMath.PI;
88              Assert.assertEquals(expected, MathUtils.normalizeAngle(o.getMeanAnomaly().getReal(), expected), 4.0e-14);
89          }
90  
91      }
92  
93      @Before
94      public void setUp() {
95          Utils.setDataRoot("regular-data");
96      }
97  
98  }
99