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  package org.orekit.propagation.events;
18  
19  import org.hipparchus.CalculusFieldElement;
20  import org.hipparchus.Field;
21  import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
22  import org.hipparchus.util.Binary64Field;
23  import org.junit.jupiter.api.Assertions;
24  import org.junit.jupiter.api.BeforeEach;
25  import org.junit.jupiter.api.Test;
26  import org.orekit.Utils;
27  import org.orekit.frames.FramesFactory;
28  import org.orekit.orbits.FieldCartesianOrbit;
29  import org.orekit.orbits.FieldOrbit;
30  import org.orekit.propagation.analytical.FieldEcksteinHechlerPropagator;
31  import org.orekit.propagation.events.handlers.FieldContinueOnEvent;
32  import org.orekit.time.AbsoluteDate;
33  import org.orekit.time.FieldAbsoluteDate;
34  import org.orekit.time.TimeScale;
35  import org.orekit.time.TimeScalesFactory;
36  import org.orekit.utils.Constants;
37  import org.orekit.utils.FieldPVCoordinates;
38  
39  public class FieldParameterDrivenDateIntervalDetectorTest {
40  
41      @Test
42      public void testNoShift() {
43          doTestNoShift(Binary64Field.getInstance());
44      }
45  
46      @Test
47      public void testSmallShift() {
48          doTestSmallShift(Binary64Field.getInstance());
49      }
50  
51      @Test
52      public void testLargeShift() {
53          doTestLargeShift(Binary64Field.getInstance());
54      }
55  
56      private <T extends CalculusFieldElement<T>> void doTestNoShift(Field<T> field) {
57          final T zero = field.getZero();
58  
59          final TimeScale utc = TimeScalesFactory.getUTC();
60          final FieldVector3D<T> position = new FieldVector3D<>(zero.add(-6142438.668), zero.add(3492467.56), zero.add(-25767.257));
61          final FieldVector3D<T> velocity = new FieldVector3D<>(zero.add(506.0), zero.add(943.0), zero.add(7450));
62          final FieldAbsoluteDate<T> date = new FieldAbsoluteDate<>(field, 2003, 9, 16, utc);
63          final FieldOrbit<T> orbit = new FieldCartesianOrbit<>(new FieldPVCoordinates<>(position,  velocity),
64                                                                FramesFactory.getEME2000(), date,
65                                                                zero.add(Constants.EIGEN5C_EARTH_MU));
66          FieldEcksteinHechlerPropagator<T> propagator =
67                          new FieldEcksteinHechlerPropagator<>(orbit,
68                                                               Constants.EIGEN5C_EARTH_EQUATORIAL_RADIUS,
69                                                               zero.add(Constants.EIGEN5C_EARTH_MU),
70                                                               Constants.EIGEN5C_EARTH_C20,
71                                                               Constants.EIGEN5C_EARTH_C30,
72                                                               Constants.EIGEN5C_EARTH_C40,
73                                                               Constants.EIGEN5C_EARTH_C50,
74                                                               Constants.EIGEN5C_EARTH_C60);
75  
76          final AbsoluteDate t0    = propagator.getInitialState().getDate().toAbsoluteDate();
77          final AbsoluteDate start = t0.shiftedBy( 120);
78          final AbsoluteDate stop  = t0.shiftedBy(1120);
79          FieldParameterDrivenDateIntervalDetector<T> detector =
80                          new FieldParameterDrivenDateIntervalDetector<>(field, "no-shift", start, stop).
81                          withMaxCheck(10.0).
82                          withThreshold(zero.newInstance(1.0e-12)).
83                          withHandler(new FieldContinueOnEvent<>());
84  
85          Assertions.assertEquals(10.0, detector.getMaxCheckInterval().currentInterval(null, true), 1.0e-15);
86          Assertions.assertEquals(1.0e-12, detector.getThreshold().getReal(), 1.0e-15);
87          Assertions.assertEquals(AbstractDetector.DEFAULT_MAX_ITER, detector.getMaxIterationCount());
88          Assertions.assertEquals("no-shift_START", detector.getStartDriver().getName());
89          Assertions.assertEquals("no-shift_STOP", detector.getStopDriver().getName());
90  
91          FieldEventsLogger<T> logger = new FieldEventsLogger<>();
92          propagator.addEventDetector(logger.monitorDetector(detector));
93  
94          propagator.propagate(propagator.getInitialState().getOrbit().getDate().shiftedBy(Constants.JULIAN_DAY));
95  
96          Assertions.assertEquals(2, logger.getLoggedEvents().size());
97          Assertions.assertEquals(0.0, logger.getLoggedEvents().get(0).getState().getDate().durationFrom(start).getReal(), 1.0e-10);
98          Assertions.assertEquals(0.0, logger.getLoggedEvents().get(1).getState().getDate().durationFrom(stop).getReal(), 1.0e-10);
99  
100     }
101 
102     private <T extends CalculusFieldElement<T>> void doTestSmallShift(Field<T> field) {
103         final T zero = field.getZero();
104 
105         final TimeScale utc = TimeScalesFactory.getUTC();
106         final FieldVector3D<T> position = new FieldVector3D<>(zero.add(-6142438.668), zero.add(3492467.56), zero.add(-25767.257));
107         final FieldVector3D<T> velocity = new FieldVector3D<>(zero.add(506.0), zero.add(943.0), zero.add(7450));
108         final FieldAbsoluteDate<T> date = new FieldAbsoluteDate<>(field, 2003, 9, 16, utc);
109         final FieldOrbit<T> orbit = new FieldCartesianOrbit<>(new FieldPVCoordinates<>(position,  velocity),
110                                                               FramesFactory.getEME2000(), date,
111                                                               zero.add(Constants.EIGEN5C_EARTH_MU));
112         FieldEcksteinHechlerPropagator<T> propagator =
113                         new FieldEcksteinHechlerPropagator<>(orbit,
114                                                              Constants.EIGEN5C_EARTH_EQUATORIAL_RADIUS,
115                                                              zero.add(Constants.EIGEN5C_EARTH_MU),
116                                                              Constants.EIGEN5C_EARTH_C20,
117                                                              Constants.EIGEN5C_EARTH_C30,
118                                                              Constants.EIGEN5C_EARTH_C40,
119                                                              Constants.EIGEN5C_EARTH_C50,
120                                                              Constants.EIGEN5C_EARTH_C60);
121 
122         final AbsoluteDate t0    = propagator.getInitialState().getDate().toAbsoluteDate();
123         final AbsoluteDate start = t0.shiftedBy( 120);
124         final AbsoluteDate stop  = t0.shiftedBy(1120);
125         FieldParameterDrivenDateIntervalDetector<T> detector =
126                         new FieldParameterDrivenDateIntervalDetector<>(field, "no-shift", start, stop).
127                         withMaxCheck(10.0).
128                         withThreshold(zero.newInstance(1.0e-12)).
129                         withHandler(new FieldContinueOnEvent<>());
130 
131         Assertions.assertEquals(10.0, detector.getMaxCheckInterval().currentInterval(null, true), 1.0e-15);
132         Assertions.assertEquals(1.0e-12, detector.getThreshold().getReal(), 1.0e-15);
133         Assertions.assertEquals(AbstractDetector.DEFAULT_MAX_ITER, detector.getMaxIterationCount());
134         Assertions.assertEquals("no-shift_START", detector.getStartDriver().getName());
135         Assertions.assertEquals("no-shift_STOP", detector.getStopDriver().getName());
136 
137         FieldEventsLogger<T> logger = new FieldEventsLogger<>();
138         propagator.addEventDetector(logger.monitorDetector(detector));
139 
140         final double startShift = 5.5;
141         detector.getStartDriver().setValue(startShift);
142         final double stopShift  = -0.5;
143         detector.getStopDriver().setValue(stopShift, null);
144         propagator.propagate(propagator.getInitialState().getOrbit().getDate().shiftedBy(Constants.JULIAN_DAY));
145 
146         Assertions.assertEquals(2, logger.getLoggedEvents().size());
147         Assertions.assertEquals(startShift, logger.getLoggedEvents().get(0).getState().getDate().durationFrom(start).getReal(), 1.0e-10);
148         Assertions.assertEquals(stopShift,  logger.getLoggedEvents().get(1).getState().getDate().durationFrom(stop).getReal(),  1.0e-10);
149 
150     }
151 
152     private <T extends CalculusFieldElement<T>> void doTestLargeShift(Field<T> field) {
153         final T zero = field.getZero();
154 
155         final TimeScale utc = TimeScalesFactory.getUTC();
156         final FieldVector3D<T> position = new FieldVector3D<>(zero.add(-6142438.668), zero.add(3492467.56), zero.add(-25767.257));
157         final FieldVector3D<T> velocity = new FieldVector3D<>(zero.add(506.0), zero.add(943.0), zero.add(7450));
158         final FieldAbsoluteDate<T> date = new FieldAbsoluteDate<>(field, 2003, 9, 16, utc);
159         final FieldOrbit<T> orbit = new FieldCartesianOrbit<>(new FieldPVCoordinates<>(position,  velocity),
160                                                               FramesFactory.getEME2000(), date,
161                                                               zero.add(Constants.EIGEN5C_EARTH_MU));
162         FieldEcksteinHechlerPropagator<T> propagator =
163                         new FieldEcksteinHechlerPropagator<>(orbit,
164                                                              Constants.EIGEN5C_EARTH_EQUATORIAL_RADIUS,
165                                                              zero.add(Constants.EIGEN5C_EARTH_MU),
166                                                              Constants.EIGEN5C_EARTH_C20,
167                                                              Constants.EIGEN5C_EARTH_C30,
168                                                              Constants.EIGEN5C_EARTH_C40,
169                                                              Constants.EIGEN5C_EARTH_C50,
170                                                              Constants.EIGEN5C_EARTH_C60);
171 
172         final AbsoluteDate t0    = propagator.getInitialState().getDate().toAbsoluteDate();
173         final AbsoluteDate start = t0.shiftedBy( 120);
174         final AbsoluteDate stop  = t0.shiftedBy(1120);
175         FieldParameterDrivenDateIntervalDetector<T> detector =
176                         new FieldParameterDrivenDateIntervalDetector<>(field, "no-shift", start, stop).
177                         withMaxCheck(10.0).
178                         withThreshold(zero.newInstance(1.0e-12)).
179                         withHandler(new FieldContinueOnEvent<>());
180 
181         Assertions.assertEquals(10.0, detector.getMaxCheckInterval().currentInterval(null, true), 1.0e-15);
182         Assertions.assertEquals(1.0e-12, detector.getThreshold().getReal(), 1.0e-15);
183         Assertions.assertEquals(AbstractDetector.DEFAULT_MAX_ITER, detector.getMaxIterationCount());
184         Assertions.assertEquals("no-shift_START", detector.getStartDriver().getName());
185         Assertions.assertEquals("no-shift_STOP", detector.getStopDriver().getName());
186 
187         FieldEventsLogger<T> logger = new FieldEventsLogger<>();
188         propagator.addEventDetector(logger.monitorDetector(detector));
189 
190         final double startShift = 500.5;
191         detector.getStartDriver().setValue(startShift);
192         final double stopShift  = -500.5;
193         detector.getStopDriver().setValue(stopShift);
194         propagator.propagate(propagator.getInitialState().getOrbit().getDate().shiftedBy(Constants.JULIAN_DAY));
195 
196         Assertions.assertEquals(0, logger.getLoggedEvents().size());
197 
198     }
199 
200     @BeforeEach
201     public void setUp() {
202         Utils.setDataRoot("regular-data");
203     }
204 
205 }
206