1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.control.indirect.adjoint;
18
19 import org.hipparchus.analysis.differentiation.Gradient;
20 import org.hipparchus.analysis.differentiation.GradientField;
21 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
22 import org.hipparchus.util.Binary64;
23 import org.hipparchus.util.Binary64Field;
24 import org.hipparchus.util.MathArrays;
25 import org.junit.jupiter.api.Assertions;
26 import org.junit.jupiter.api.BeforeEach;
27 import org.junit.jupiter.api.Test;
28 import org.mockito.Mockito;
29 import org.orekit.Utils;
30 import org.orekit.errors.OrekitIllegalArgumentException;
31 import org.orekit.forces.inertia.InertialForces;
32 import org.orekit.frames.Frame;
33 import org.orekit.frames.FramesFactory;
34 import org.orekit.propagation.FieldSpacecraftState;
35 import org.orekit.time.AbsoluteDate;
36 import org.orekit.time.FieldAbsoluteDate;
37 import org.orekit.utils.FieldAbsolutePVCoordinates;
38
39 class CartesianAdjointInertialTermTest {
40
41 @BeforeEach
42 void setUp() {
43 Utils.setDataRoot("regular-data");
44 }
45
46 @Test
47 void testConstructorException() {
48
49 final Frame referenceFrame = Mockito.mock(Frame.class);
50 Mockito.when(referenceFrame.isPseudoInertial()).thenReturn(false);
51
52 Assertions.assertThrows(OrekitIllegalArgumentException.class, () -> new CartesianAdjointInertialTerm(referenceFrame));
53 }
54
55 @Test
56 void testGetRatesContribution() {
57
58 final Frame referenceFrame = FramesFactory.getGCRF();
59 final Frame propagationFrame = FramesFactory.getGTOD(true);
60 final CartesianAdjointInertialTerm inertialTerm = new CartesianAdjointInertialTerm(referenceFrame);
61 final double[] adjoint = new double[6];
62 final double[] state = new double[6];
63 for (int i = 0; i < adjoint.length; i++) {
64 state[i] = -i+1;
65 adjoint[i] = i;
66 }
67 final AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
68
69 final double[] contribution = inertialTerm.getRatesContribution(date, state, adjoint, propagationFrame);
70
71 final InertialForces inertialForces = new InertialForces(referenceFrame);
72 final int dimension = 6;
73 final GradientField field = GradientField.getField(dimension);
74 final FieldVector3D<Gradient> fieldPosition = new FieldVector3D<>(
75 Gradient.variable(dimension, 0, state[0]),
76 Gradient.variable(dimension, 1, state[1]),
77 Gradient.variable(dimension, 2, state[2]));
78 final FieldVector3D<Gradient> fieldVelocity = new FieldVector3D<>(
79 Gradient.variable(dimension, 3, state[3]),
80 Gradient.variable(dimension, 4, state[4]),
81 Gradient.variable(dimension, 5, state[5]));
82 final FieldAbsolutePVCoordinates<Gradient> absolutePVCoordinates = new FieldAbsolutePVCoordinates<>(propagationFrame,
83 new FieldAbsoluteDate<>(field, date), fieldPosition, fieldVelocity);
84 final FieldSpacecraftState<Gradient> fieldState = new FieldSpacecraftState<>(absolutePVCoordinates);
85 final FieldVector3D<Gradient> acceleration = inertialForces.acceleration(fieldState, null);
86 Assertions.assertEquals(-contribution[0], acceleration.getX().getGradient()[0] * adjoint[3]
87 + acceleration.getY().getGradient()[0] * adjoint[4] + acceleration.getZ().getGradient()[0] * adjoint[5]);
88 Assertions.assertEquals(-contribution[1], acceleration.getX().getGradient()[1] * adjoint[3]
89 + acceleration.getY().getGradient()[1] * adjoint[4] + acceleration.getZ().getGradient()[1] * adjoint[5]);
90 Assertions.assertEquals(-contribution[2], acceleration.getX().getGradient()[2] * adjoint[3]
91 + acceleration.getY().getGradient()[2] * adjoint[4] + acceleration.getZ().getGradient()[2] * adjoint[5],
92 1e-20);
93 Assertions.assertEquals(-contribution[3], acceleration.getX().getGradient()[3] * adjoint[3]
94 + acceleration.getY().getGradient()[3] * adjoint[4] + acceleration.getZ().getGradient()[3] * adjoint[5]);
95 Assertions.assertEquals(-contribution[4], acceleration.getX().getGradient()[4] * adjoint[3]
96 + acceleration.getY().getGradient()[4] * adjoint[4] + acceleration.getZ().getGradient()[4] * adjoint[5]);
97 Assertions.assertEquals(-contribution[5], acceleration.getX().getGradient()[5] * adjoint[3]
98 + acceleration.getY().getGradient()[5] * adjoint[4] + acceleration.getZ().getGradient()[5] * adjoint[5],
99 1e-20);
100 }
101
102 @Test
103 void testGetFieldRatesContribution() {
104
105 final Frame referenceFrame = FramesFactory.getGCRF();
106 final Frame propagationFrame = FramesFactory.getGTOD(true);
107 final CartesianAdjointInertialTerm inertialTerm = new CartesianAdjointInertialTerm(referenceFrame);
108 final Binary64Field field = Binary64Field.getInstance();
109 final Binary64[] fieldAdjoint = MathArrays.buildArray(field, 6);
110 final Binary64[] fieldState = MathArrays.buildArray(field, 6);
111 for (int i = 0; i < fieldAdjoint.length; i++) {
112 fieldState[i] = field.getZero().newInstance(-i+1);
113 fieldAdjoint[i] = field.getZero().newInstance(i);
114 }
115 final FieldAbsoluteDate<Binary64> fieldDate = FieldAbsoluteDate.getArbitraryEpoch(field);
116
117 final Binary64[] fieldContribution = inertialTerm.getFieldRatesContribution(fieldDate, fieldState, fieldAdjoint,
118 propagationFrame);
119
120 final double[] state = new double[fieldState.length];
121 for (int i = 0; i < fieldState.length; i++) {
122 state[i] = fieldState[i].getReal();
123 }
124 final double[] adjoint = new double[fieldAdjoint.length];
125 for (int i = 0; i < fieldAdjoint.length; i++) {
126 adjoint[i] = fieldAdjoint[i].getReal();
127 }
128 final double[] contribution = inertialTerm.getRatesContribution(fieldDate.toAbsoluteDate(), state, adjoint,
129 propagationFrame);
130 for (int i = 0; i < contribution.length; i++) {
131 Assertions.assertEquals(fieldContribution[i].getReal(), contribution[i], 1e-22);
132 }
133 }
134
135 @Test
136 void testGetHamiltonianContribution() {
137
138 final Frame referenceFrame = FramesFactory.getGCRF();
139 final CartesianAdjointInertialTerm cartesianAdjointInertialTerm = new CartesianAdjointInertialTerm(referenceFrame);
140 final AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
141 final double[] adjoint = { -1, 2, -3, 4, -5, 6 };
142 final double[] state = {1, 3, 5, 7, 9, 11};
143
144 final double contribution = cartesianAdjointInertialTerm.getHamiltonianContribution(date, state, adjoint, referenceFrame);
145
146 Assertions.assertEquals(0., contribution);
147 }
148
149 @Test
150 void testGetFieldHamiltonianContribution() {
151
152 final CartesianAdjointInertialTerm cartesianAdjointInertialTerm = new CartesianAdjointInertialTerm(FramesFactory.getGCRF());
153 final Binary64Field field = Binary64Field.getInstance();
154 final Binary64[] fieldAdjoint = MathArrays.buildArray(field, 6);
155 final Binary64[] fieldState = MathArrays.buildArray(field, 6);
156 for (int i = 0; i < fieldAdjoint.length; i++) {
157 fieldState[i] = field.getZero().newInstance(-i + 1);
158 fieldAdjoint[i] = field.getZero().newInstance(i);
159 }
160 final FieldAbsoluteDate<Binary64> fieldDate = FieldAbsoluteDate.getArbitraryEpoch(field);
161 final Frame frame = FramesFactory.getGTOD(true);
162
163 final Binary64 fieldContribution = cartesianAdjointInertialTerm.getFieldHamiltonianContribution(fieldDate,
164 fieldState, fieldAdjoint, frame);
165
166 final double[] adjoint = new double[fieldAdjoint.length];
167 final double[] state = adjoint.clone();
168 for (int i = 0; i < fieldAdjoint.length; i++) {
169 state[i] = fieldState[i].getReal();
170 adjoint[i] = fieldAdjoint[i].getReal();
171 }
172 final double contribution = cartesianAdjointInertialTerm.getHamiltonianContribution(fieldDate.toAbsoluteDate(),
173 state, adjoint, frame);
174 Assertions.assertEquals(contribution, fieldContribution.getReal(), 1e-15);
175 }
176 }