1 package org.orekit.control.indirect.shooting.propagation;
2
3 import org.hipparchus.util.Binary64;
4 import org.hipparchus.util.Binary64Field;
5 import org.junit.jupiter.api.Assertions;
6 import org.junit.jupiter.api.Test;
7 import org.junit.jupiter.params.ParameterizedTest;
8 import org.junit.jupiter.params.provider.ValueSource;
9 import org.mockito.Mockito;
10 import org.orekit.control.indirect.adjoint.cost.BoundedCartesianEnergy;
11 import org.orekit.control.indirect.adjoint.cost.CartesianCost;
12 import org.orekit.control.indirect.adjoint.cost.CartesianFlightDurationCost;
13 import org.orekit.control.indirect.adjoint.cost.CartesianFuelCost;
14 import org.orekit.control.indirect.adjoint.cost.FieldBoundedCartesianEnergy;
15 import org.orekit.control.indirect.adjoint.cost.FieldCartesianCost;
16 import org.orekit.control.indirect.adjoint.cost.FieldCartesianFlightDurationCost;
17 import org.orekit.control.indirect.adjoint.cost.FieldCartesianFuelCost;
18 import org.orekit.control.indirect.adjoint.cost.FieldLogarithmicBarrierCartesianFuel;
19 import org.orekit.control.indirect.adjoint.cost.FieldQuadraticPenaltyCartesianFuel;
20 import org.orekit.control.indirect.adjoint.cost.FieldUnboundedCartesianEnergy;
21 import org.orekit.control.indirect.adjoint.cost.FieldUnboundedCartesianEnergyNeglectingMass;
22 import org.orekit.control.indirect.adjoint.cost.LogarithmicBarrierCartesianFuel;
23 import org.orekit.control.indirect.adjoint.cost.QuadraticPenaltyCartesianFuel;
24 import org.orekit.control.indirect.adjoint.cost.UnboundedCartesianEnergy;
25 import org.orekit.control.indirect.adjoint.cost.UnboundedCartesianEnergyNeglectingMass;
26 import org.orekit.propagation.events.EventDetectionSettings;
27
28 class CartesianAdjointDynamicsProviderFactoryTest {
29
30 private static final String ADJOINT_NAME = "adjoint";
31
32 @Test
33 void testBuildUnboundedEnergyProviderNeglectingMass() {
34
35
36
37 final CartesianAdjointDynamicsProvider provider = CartesianAdjointDynamicsProviderFactory.buildUnboundedEnergyProviderNeglectingMass(ADJOINT_NAME);
38
39 Assertions.assertEquals(provider.getDimension(), provider.buildAdditionalDerivativesProvider().getDimension());
40 Assertions.assertEquals(ADJOINT_NAME, provider.getAdjointName());
41 Assertions.assertInstanceOf(UnboundedCartesianEnergyNeglectingMass.class,
42 provider.buildAdditionalDerivativesProvider().getCost());
43 Assertions.assertEquals(0.,
44 provider.buildAdditionalDerivativesProvider().getCost().getMassFlowRateFactor());
45 final Binary64Field field = Binary64Field.getInstance();
46 Assertions.assertInstanceOf(FieldUnboundedCartesianEnergyNeglectingMass.class,
47 provider.buildFieldAdditionalDerivativesProvider(field).getCost());
48 Assertions.assertEquals(0.,
49 provider.buildFieldAdditionalDerivativesProvider(field).getCost().getMassFlowRateFactor().getReal());
50 }
51
52 @Test
53 void testBuildUnboundedEnergyProvider() {
54
55 final double massFlowRateFactor = 1.;
56
57 final CartesianAdjointDynamicsProvider provider = CartesianAdjointDynamicsProviderFactory.buildUnboundedEnergyProvider(ADJOINT_NAME,
58 massFlowRateFactor, EventDetectionSettings.getDefaultEventDetectionSettings());
59
60 Assertions.assertEquals(provider.getDimension(), provider.buildAdditionalDerivativesProvider().getDimension());
61 Assertions.assertEquals(ADJOINT_NAME, provider.getAdjointName());
62 Assertions.assertInstanceOf(UnboundedCartesianEnergy.class,
63 provider.buildAdditionalDerivativesProvider().getCost());
64 Assertions.assertEquals(massFlowRateFactor,
65 provider.buildAdditionalDerivativesProvider().getCost().getMassFlowRateFactor());
66 final Binary64Field field = Binary64Field.getInstance();
67 Assertions.assertInstanceOf(FieldUnboundedCartesianEnergy.class,
68 provider.buildFieldAdditionalDerivativesProvider(field).getCost());
69 Assertions.assertEquals(massFlowRateFactor,
70 provider.buildFieldAdditionalDerivativesProvider(field).getCost().getMassFlowRateFactor().getReal());
71 }
72
73 @ParameterizedTest
74 @ValueSource(doubles = {0., 1})
75 void testBuildFlightDurationProvider(final double massFlowRateFactor) {
76
77
78
79 final CartesianAdjointDynamicsProvider provider = CartesianAdjointDynamicsProviderFactory.buildFlightDurationProvider(ADJOINT_NAME,
80 massFlowRateFactor, 2.);
81
82 Assertions.assertEquals(provider.getDimension(), provider.buildAdditionalDerivativesProvider().getDimension());
83 Assertions.assertEquals(ADJOINT_NAME, provider.getAdjointName());
84 Assertions.assertInstanceOf(CartesianFlightDurationCost.class,
85 provider.buildAdditionalDerivativesProvider().getCost());
86 Assertions.assertEquals(massFlowRateFactor,
87 provider.buildAdditionalDerivativesProvider().getCost().getMassFlowRateFactor());
88 final Binary64Field field = Binary64Field.getInstance();
89 Assertions.assertInstanceOf(FieldCartesianFlightDurationCost.class,
90 provider.buildFieldAdditionalDerivativesProvider(field).getCost());
91 Assertions.assertEquals(massFlowRateFactor,
92 provider.buildFieldAdditionalDerivativesProvider(field).getCost().getMassFlowRateFactor().getReal());
93 }
94
95 @ParameterizedTest
96 @ValueSource(doubles = {0., 1})
97 void testBuildBoundedEnergyProvider(final double massFlowRateFactor) {
98
99 final EventDetectionSettings detectionSettings = Mockito.mock(EventDetectionSettings.class);
100
101 final CartesianAdjointDynamicsProvider provider = CartesianAdjointDynamicsProviderFactory.buildBoundedEnergyProvider(ADJOINT_NAME,
102 massFlowRateFactor, 2., detectionSettings);
103
104 Assertions.assertEquals(provider.getDimension(), provider.buildAdditionalDerivativesProvider().getDimension());
105 Assertions.assertEquals(ADJOINT_NAME, provider.getAdjointName());
106 Assertions.assertInstanceOf(BoundedCartesianEnergy.class,
107 provider.buildAdditionalDerivativesProvider().getCost());
108 Assertions.assertEquals(massFlowRateFactor,
109 provider.buildAdditionalDerivativesProvider().getCost().getMassFlowRateFactor());
110 final Binary64Field field = Binary64Field.getInstance();
111 Assertions.assertInstanceOf(FieldBoundedCartesianEnergy.class,
112 provider.buildFieldAdditionalDerivativesProvider(field).getCost());
113 Assertions.assertEquals(massFlowRateFactor,
114 provider.buildFieldAdditionalDerivativesProvider(field).getCost().getMassFlowRateFactor().getReal());
115 }
116
117 @Test
118 void testBuildBoundedFuelCostProvider() {
119
120 final double massFlowRateFactor = 1.;
121 final EventDetectionSettings detectionSettings = Mockito.mock(EventDetectionSettings.class);
122
123 final CartesianAdjointDynamicsProvider provider = CartesianAdjointDynamicsProviderFactory.buildBoundedFuelCostProvider(ADJOINT_NAME,
124 massFlowRateFactor, 2., detectionSettings);
125
126 Assertions.assertEquals(provider.getDimension(), provider.buildAdditionalDerivativesProvider().getDimension());
127 Assertions.assertEquals(ADJOINT_NAME, provider.getAdjointName());
128 Assertions.assertInstanceOf(CartesianFuelCost.class,
129 provider.buildAdditionalDerivativesProvider().getCost());
130 Assertions.assertEquals(massFlowRateFactor,
131 provider.buildAdditionalDerivativesProvider().getCost().getMassFlowRateFactor());
132 final Binary64Field field = Binary64Field.getInstance();
133 Assertions.assertInstanceOf(FieldCartesianFuelCost.class,
134 provider.buildFieldAdditionalDerivativesProvider(field).getCost());
135 Assertions.assertEquals(massFlowRateFactor,
136 provider.buildFieldAdditionalDerivativesProvider(field).getCost().getMassFlowRateFactor().getReal());
137 }
138
139 @Test
140 void testBuildQuadraticPenaltyFuelCostProvider() {
141
142 final double massFlowRateFactor = 1.;
143 final EventDetectionSettings detectionSettings = Mockito.mock(EventDetectionSettings.class);
144
145 final CartesianAdjointDynamicsProvider provider = CartesianAdjointDynamicsProviderFactory.buildQuadraticPenaltyFuelCostProvider(ADJOINT_NAME,
146 massFlowRateFactor, 2., 0.5, detectionSettings);
147
148 Assertions.assertEquals(provider.getDimension(), provider.buildAdditionalDerivativesProvider().getDimension());
149 Assertions.assertEquals(ADJOINT_NAME, provider.getAdjointName());
150 final CartesianCost cost = provider.buildAdditionalDerivativesProvider().getCost();
151 Assertions.assertInstanceOf(QuadraticPenaltyCartesianFuel.class, cost);
152 Assertions.assertEquals(massFlowRateFactor, cost.getMassFlowRateFactor());
153 final Binary64Field field = Binary64Field.getInstance();
154 final FieldCartesianCost<Binary64> fieldCartesianCost = provider.buildFieldAdditionalDerivativesProvider(field).getCost();
155 Assertions.assertInstanceOf(FieldQuadraticPenaltyCartesianFuel.class, fieldCartesianCost);
156 Assertions.assertEquals(massFlowRateFactor, fieldCartesianCost.getMassFlowRateFactor().getReal());
157 Assertions.assertEquals(((QuadraticPenaltyCartesianFuel) cost).getEpsilon(),
158 ((FieldQuadraticPenaltyCartesianFuel<Binary64>) fieldCartesianCost).getEpsilon().getReal());
159 }
160
161 @Test
162 void testBuildLogarithmicBarrierFuelCostProvider() {
163
164 final double massFlowRateFactor = 1.;
165
166 final CartesianAdjointDynamicsProvider provider = CartesianAdjointDynamicsProviderFactory.buildLogarithmicBarrierFuelCostProvider(ADJOINT_NAME,
167 massFlowRateFactor, 2., 0.5);
168
169 Assertions.assertEquals(provider.getDimension(), provider.buildAdditionalDerivativesProvider().getDimension());
170 Assertions.assertEquals(ADJOINT_NAME, provider.getAdjointName());
171 final CartesianCost cost = provider.buildAdditionalDerivativesProvider().getCost();
172 Assertions.assertInstanceOf(LogarithmicBarrierCartesianFuel.class, cost);
173 Assertions.assertEquals(massFlowRateFactor, cost.getMassFlowRateFactor());
174 final Binary64Field field = Binary64Field.getInstance();
175 final FieldCartesianCost<Binary64> fieldCartesianCost = provider.buildFieldAdditionalDerivativesProvider(field).getCost();
176 Assertions.assertInstanceOf(FieldLogarithmicBarrierCartesianFuel.class, fieldCartesianCost);
177 Assertions.assertEquals(massFlowRateFactor, fieldCartesianCost.getMassFlowRateFactor().getReal());
178 Assertions.assertEquals(((LogarithmicBarrierCartesianFuel) cost).getEpsilon(),
179 ((FieldLogarithmicBarrierCartesianFuel<Binary64>) fieldCartesianCost).getEpsilon().getReal());
180 }
181
182 }