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.CalculusFieldElement;
20 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
21 import org.hipparchus.geometry.euclidean.threed.Vector3D;
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.Test;
27 import org.mockito.Mockito;
28 import org.orekit.frames.Frame;
29 import org.orekit.frames.FramesFactory;
30 import org.orekit.time.AbsoluteDate;
31 import org.orekit.time.FieldAbsoluteDate;
32 import org.orekit.utils.Constants;
33 import org.orekit.utils.ExtendedPositionProvider;
34
35 class AbstractCartesianAdjointNonCentralBodyTermTest {
36
37 @Test
38 void testGetPositionAdjointFieldContribution() {
39
40 final double mu = Constants.JPL_SSD_SUN_GM;
41 final Frame frame = FramesFactory.getGCRF();
42 final Binary64Field field = Binary64Field.getInstance();
43 final FieldAbsoluteDate<Binary64> fieldDate = FieldAbsoluteDate.getArbitraryEpoch(field);
44 final AbsoluteDate date = fieldDate.toAbsoluteDate();
45 final ExtendedPositionProvider mockedPositionProvider = Mockito.mock(ExtendedPositionProvider.class);
46 final Vector3D position = new Vector3D(1e3, 2e4, -3e5);
47 Mockito.when(mockedPositionProvider.getPosition(date, frame)).thenReturn(position);
48 Mockito.when(mockedPositionProvider.getPosition(fieldDate, frame)).thenReturn(new FieldVector3D<>(field, position));
49 final TestNonCentralBodyTerm centralBodyTerm = new TestNonCentralBodyTerm(mu,
50 mockedPositionProvider);
51 final Binary64[] fieldAdjoint = MathArrays.buildArray(field, 6);
52 final Binary64[] fieldState = MathArrays.buildArray(field, 6);
53 for (int i = 0; i < fieldAdjoint.length; i++) {
54 fieldState[i] = field.getZero().newInstance(100 * i);
55 fieldAdjoint[i] = field.getZero().newInstance(-i+3);
56 }
57
58 final Binary64[] fieldContribution = centralBodyTerm.getPositionAdjointFieldContribution(fieldDate,
59 fieldState, fieldAdjoint, frame);
60
61 final double[] state = new double[fieldState.length];
62 final double[] adjoint = new double[fieldAdjoint.length];
63 for (int i = 0; i < fieldAdjoint.length; i++) {
64 state[i] = fieldState[i].getReal();
65 adjoint[i] = fieldAdjoint[i].getReal();
66 }
67 final double[] contribution = centralBodyTerm.getPositionAdjointContribution(date, state, adjoint, frame);
68 for (int i = 0; i < contribution.length; i++) {
69 Assertions.assertEquals(fieldContribution[i].getReal(), contribution[i]);
70 }
71 }
72
73 @Test
74 void testGetPositionAdjointFieldContributionAgainstKeplerian() {
75
76 final double mu = Constants.JPL_SSD_SUN_GM;
77 final Frame frame = FramesFactory.getGCRF();
78 final Binary64Field field = Binary64Field.getInstance();
79 final FieldAbsoluteDate<Binary64> fieldDate = FieldAbsoluteDate.getArbitraryEpoch(field);
80 final ExtendedPositionProvider mockedPositionProvider = Mockito.mock(ExtendedPositionProvider.class);
81 Mockito.when(mockedPositionProvider.getPosition(fieldDate, frame)).thenReturn(FieldVector3D.getZero(field));
82 final TestNonCentralBodyTerm centralBodyTerm = new TestNonCentralBodyTerm(mu,
83 mockedPositionProvider);
84 final Binary64[] fieldAdjoint = MathArrays.buildArray(field, 6);
85 final Binary64[] fieldState = MathArrays.buildArray(field, 6);
86 for (int i = 0; i < fieldAdjoint.length; i++) {
87 fieldState[i] = field.getZero().newInstance(-i+1);
88 fieldAdjoint[i] = field.getZero().newInstance(i);
89 }
90
91 final Binary64[] fieldContribution = centralBodyTerm.getPositionAdjointFieldContribution(fieldDate,
92 fieldState, fieldAdjoint, frame);
93
94 final CartesianAdjointKeplerianTerm keplerianTerm = new CartesianAdjointKeplerianTerm(mu);
95 final Binary64[] contribution = keplerianTerm.getPositionAdjointFieldContribution(fieldDate, fieldState,
96 fieldAdjoint, frame);
97 for (int i = 0; i < contribution.length; i++) {
98 Assertions.assertEquals(fieldContribution[i], contribution[i]);
99 }
100 }
101
102 private static class TestNonCentralBodyTerm extends AbstractCartesianAdjointNonCentralBodyTerm {
103
104 protected TestNonCentralBodyTerm(double mu, ExtendedPositionProvider bodyPositionProvider) {
105 super(mu, bodyPositionProvider);
106 }
107
108 @Override
109 protected Vector3D getAcceleration(AbsoluteDate date, double[] stateVariables, Frame frame) {
110 return null;
111 }
112
113 @Override
114 protected <T extends CalculusFieldElement<T>> FieldVector3D<T> getFieldAcceleration(FieldAbsoluteDate<T> date, T[] stateVariables, Frame frame) {
115 return null;
116 }
117 }
118 }