1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.control.indirect.adjoint.cost;
18
19 import org.hipparchus.geometry.euclidean.threed.Vector3D;
20 import org.junit.jupiter.api.Assertions;
21 import org.junit.jupiter.api.Test;
22 import org.junit.jupiter.params.ParameterizedTest;
23 import org.junit.jupiter.params.provider.ValueSource;
24 import org.mockito.Mockito;
25 import org.orekit.propagation.events.EventDetectionSettings;
26 import org.orekit.propagation.events.EventDetector;
27 import org.orekit.propagation.events.handlers.ResetDerivativesOnEvent;
28
29 import java.util.List;
30 import java.util.stream.Collectors;
31 import java.util.stream.Stream;
32
33 class CartesianFuelCostTest {
34
35 @Test
36 void testConstructor() {
37
38 final EventDetectionSettings expectedDetectionSettings = EventDetectionSettings.getDefaultEventDetectionSettings();
39
40 final CartesianFuelCost cartesianFuel = new CartesianFuelCost("", 1., 2.);
41
42 final EventDetectionSettings actualDetectionSettings = cartesianFuel.getEventDetectionSettings();
43 Assertions.assertEquals(expectedDetectionSettings.getMaxIterationCount(),
44 actualDetectionSettings.getMaxIterationCount());
45 Assertions.assertEquals(expectedDetectionSettings.getThreshold(), actualDetectionSettings.getThreshold());
46 }
47
48 @ParameterizedTest
49 @ValueSource(doubles = {-1e1, 1, 1e1})
50 void testUpdateAdjointDerivatives(final double adjointMass) {
51
52 final double rateFactor = 1.;
53 final double maximumThrust = 2.;
54 final CartesianFuelCost cartesianFuel = new CartesianFuelCost("", rateFactor, maximumThrust);
55 final double[] adjoint = new double[] {0, 0, 0, 1, 0, 0, adjointMass};
56 final double mass = 100;
57 final double[] derivatives = new double[7];
58
59 cartesianFuel.updateAdjointDerivatives(adjoint, mass, derivatives);
60
61 if (derivatives[6] != 0) {
62 Assertions.assertEquals(maximumThrust / mass / mass, derivatives[6]);
63 }
64 }
65
66 @ParameterizedTest
67 @ValueSource(doubles = {-1e1, 1, 1e1})
68 void testGetThrustAccelerationVector(final double adjointMass) {
69
70 final double rateFactor = 1.;
71 final double maximumThrust = 2.;
72 final CartesianFuelCost cartesianFuel = new CartesianFuelCost("", rateFactor, maximumThrust);
73 final double[] adjoint = new double[] {0, 0, 0, 1, 0, 0, adjointMass};
74 final double mass = 100;
75
76 final Vector3D actual = cartesianFuel.getThrustAccelerationVector(adjoint, mass);
77
78 if (actual.getNorm() != 0) {
79 Assertions.assertEquals(Vector3D.PLUS_I.scalarMultiply(maximumThrust / mass), actual);
80 }
81 }
82
83 @Test
84 void testGetHamiltonianContribution() {
85
86 final CartesianFuelCost cartesianFuel = Mockito.mock(CartesianFuelCost.class);
87 final double[] adjoint = new double[0];
88 final double mass = 1;
89 final Vector3D accelerationVector = new Vector3D(1, 2, 3);
90 Mockito.when(cartesianFuel.getThrustAccelerationVector(adjoint, mass)).thenReturn(accelerationVector);
91 Mockito.when(cartesianFuel.getHamiltonianContribution(adjoint, mass)).thenCallRealMethod();
92
93 final double actual = cartesianFuel.getHamiltonianContribution(adjoint, mass);
94
95 Assertions.assertEquals(accelerationVector.scalarMultiply(mass).getNorm(), -actual);
96 }
97
98 @Test
99 void testGetEventDetectors() {
100
101 final EventDetectionSettings mockedDetectionSettings = Mockito.mock(EventDetectionSettings.class);
102 final CartesianFuelCost cartesianFuel = new CartesianFuelCost("", 1., 2.,
103 mockedDetectionSettings);
104
105 final Stream<EventDetector> detectorStream = cartesianFuel.getEventDetectors();
106
107 final List<EventDetector> detectorList = detectorStream.collect(Collectors.toList());
108 Assertions.assertEquals(1, detectorList.size());
109 Assertions.assertEquals(mockedDetectionSettings, detectorList.get(0).getDetectionSettings());
110 Assertions.assertInstanceOf(ResetDerivativesOnEvent.class, detectorList.get(0).getHandler());
111 }
112
113 }
114