1   package org.orekit.propagation.events;
2   
3   import org.hipparchus.Field;
4   import org.hipparchus.analysis.differentiation.FieldUnivariateDerivative1;
5   import org.hipparchus.analysis.differentiation.FieldUnivariateDerivative1Field;
6   import org.hipparchus.analysis.differentiation.UnivariateDerivative2;
7   import org.hipparchus.analysis.differentiation.UnivariateDerivative2Field;
8   import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
9   import org.hipparchus.util.Binary64;
10  import org.hipparchus.util.Binary64Field;
11  import org.junit.jupiter.api.BeforeAll;
12  import org.junit.jupiter.api.Test;
13  import org.orekit.TestUtils;
14  import org.orekit.Utils;
15  import org.orekit.bodies.AnalyticalSolarPositionProvider;
16  import org.orekit.bodies.GeodeticPoint;
17  import org.orekit.frames.FramesFactory;
18  import org.orekit.frames.TopocentricFrame;
19  import org.orekit.models.earth.ReferenceEllipsoid;
20  import org.orekit.propagation.FieldSpacecraftState;
21  import org.orekit.propagation.SpacecraftState;
22  import org.orekit.propagation.events.handlers.FieldStopOnEvent;
23  import org.orekit.propagation.events.handlers.StopOnEvent;
24  import org.orekit.time.AbsoluteDate;
25  import org.orekit.time.FieldAbsoluteDate;
26  import org.orekit.utils.ExtendedPositionProvider;
27  import org.orekit.utils.FieldPVCoordinates;
28  
29  import static org.junit.jupiter.api.Assertions.assertEquals;
30  import static org.junit.jupiter.api.Assertions.fail;
31  import static org.mockito.Mockito.mock;
32  
33  class FieldExtremumAngularSeparationDetectorTest {
34  
35      @BeforeAll
36      static void setUpBeforeClass() {
37          Utils.setDataRoot("regular-data");
38      }
39  
40      @Test
41      void testGetter() {
42          // GIVEN
43          final ExtendedPositionProvider mockedBeacon = mock();
44          final ExtendedPositionProvider mockedObserver = mock();
45          final FieldEventDetectionSettings<Binary64> detectionSettings = new FieldEventDetectionSettings<>(Binary64Field.getInstance(),
46                  EventDetectionSettings.getDefaultEventDetectionSettings());
47          // WHEN
48          
49          final FieldExtremumAngularSeparationDetector<Binary64> detector = new FieldExtremumAngularSeparationDetector<>(detectionSettings,
50                  new FieldStopOnEvent<>(), mockedBeacon, mockedObserver);
51          // THEN
52          assertEquals(mockedBeacon, detector.getBeacon());
53          assertEquals(mockedObserver, detector.getObserver());
54      }
55  
56      @Test
57      void testG() {
58          // GIVEN
59          final Binary64Field field = Binary64Field.getInstance();
60          final SpacecraftState state = new SpacecraftState(TestUtils.getDefaultOrbit(AbsoluteDate.ARBITRARY_EPOCH));
61          final ExtendedPositionProvider beacon = new AnalyticalSolarPositionProvider();
62          final ExtendedPositionProvider observer = new TopocentricFrame(ReferenceEllipsoid.getWgs84(FramesFactory.getGTOD(true)),
63                  new GeodeticPoint(0., 1., 2.), "");
64          final FieldEventDetectionSettings<Binary64> detectionSettings = new FieldEventDetectionSettings<>(field,
65                  EventDetectionSettings.getDefaultEventDetectionSettings());
66          final FieldExtremumAngularSeparationDetector<Binary64> detector = new FieldExtremumAngularSeparationDetector<>(detectionSettings,
67                  new FieldStopOnEvent<>(), beacon, observer);
68          final FieldSpacecraftState<Binary64> fieldState = new FieldSpacecraftState<>(field, state);
69          // WHEN
70          final Binary64 actualG = detector.g(fieldState);
71          // THEN
72          final FieldPVCoordinates<FieldUnivariateDerivative1<Binary64>> pv = fieldState.getPVCoordinates().toUnivariateDerivative1PV();
73          final FieldUnivariateDerivative1<Binary64> dt = new FieldUnivariateDerivative1<>(field.getZero(), field.getOne());
74          final FieldAbsoluteDate<FieldUnivariateDerivative1<Binary64>> fieldDate = new FieldAbsoluteDate<>(FieldUnivariateDerivative1Field.getUnivariateDerivative1Field(field),
75                  state.getDate()).shiftedBy(dt);
76          final FieldVector3D<FieldUnivariateDerivative1<Binary64>> bP = beacon.getPosition(fieldDate, fieldState.getFrame());
77          final FieldVector3D<FieldUnivariateDerivative1<Binary64>> oP = observer.getPosition(fieldDate, fieldState.getFrame());
78          final FieldUnivariateDerivative1<Binary64> separation = FieldVector3D.angle(pv.getPosition().subtract(oP), bP.subtract(oP));
79          final Binary64 expectedG = separation.getFirstDerivative();
80          assertEquals(expectedG, actualG);
81      }
82  }