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.util.Binary64;
20 import org.hipparchus.util.Binary64Field;
21 import org.hipparchus.util.MathArrays;
22 import org.junit.jupiter.api.Assertions;
23 import org.junit.jupiter.api.Test;
24 import org.mockito.Mockito;
25 import org.orekit.frames.Frame;
26 import org.orekit.frames.FramesFactory;
27 import org.orekit.time.AbsoluteDate;
28 import org.orekit.time.FieldAbsoluteDate;
29 import org.orekit.utils.Constants;
30
31 class CartesianAdjointJ2TermTest {
32
33 @Test
34 void testGetters() {
35
36 final double expectedMu = 1.;
37 final double expectedrEq = 2.;
38 final double expectedJ2 = 3.;
39 final Frame frame = Mockito.mock(Frame.class);
40 final CartesianAdjointJ2Term cartesianAdjointJ2Term = new CartesianAdjointJ2Term(expectedMu, expectedrEq,
41 expectedJ2, frame);
42
43 final double actualMu = cartesianAdjointJ2Term.getMu();
44 final double actualrEq = cartesianAdjointJ2Term.getrEq();
45 final double actualJ2 = cartesianAdjointJ2Term.getJ2();
46
47 Assertions.assertEquals(expectedJ2, actualJ2);
48 Assertions.assertEquals(expectedMu, actualMu);
49 Assertions.assertEquals(expectedrEq, actualrEq);
50 }
51
52 @Test
53 void testGetPositionAdjointContributionLinearity() {
54
55 final Frame frame = FramesFactory.getGCRF();
56 final CartesianAdjointJ2Term j2Term = new CartesianAdjointJ2Term(Constants.EGM96_EARTH_MU,
57 Constants.EGM96_EARTH_EQUATORIAL_RADIUS, -Constants.EGM96_EARTH_C20, frame);
58 final double[] adjoint = new double[] {1, 2, 3, 4, 5, 6};
59 final AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
60 final double[] positionVelocity = new double[] {1, 1, 1, 1, 1, 1};
61
62 final double[] contribution = j2Term.getPositionAdjointContribution(date, positionVelocity, adjoint, frame);
63
64 final double[] doubleAdjoint = new double[6];
65 for (int i = 0; i < 6; i++) {
66 doubleAdjoint[i] = adjoint[i] * 2;
67 }
68 final double[] contributionDouble = j2Term.getPositionAdjointContribution(date, positionVelocity, doubleAdjoint,
69 frame);
70 for (int i = 0; i < contribution.length; i++) {
71 Assertions.assertEquals(contribution[i] * 2, contributionDouble[i]);
72 }
73 }
74
75 @Test
76 void testGetPositionAdjointFieldContribution() {
77
78 final Frame frame = FramesFactory.getGCRF();
79 final CartesianAdjointJ2Term j2Term = new CartesianAdjointJ2Term(Constants.EGM96_EARTH_MU,
80 Constants.EGM96_EARTH_EQUATORIAL_RADIUS, -Constants.EGM96_EARTH_C20, frame);
81 final Binary64Field field = Binary64Field.getInstance();
82 final Binary64[] fieldAdjoint = MathArrays.buildArray(field, 6);
83 final Binary64[] fieldState = MathArrays.buildArray(field, 6);
84 for (int i = 0; i < fieldAdjoint.length; i++) {
85 fieldState[i] = field.getZero().newInstance(-i+1);
86 fieldAdjoint[i] = field.getZero().newInstance(i);
87 }
88 final FieldAbsoluteDate<Binary64> fieldDate = FieldAbsoluteDate.getArbitraryEpoch(field);
89
90 final Binary64[] fieldContribution = j2Term.getPositionAdjointFieldContribution(fieldDate, fieldState,
91 fieldAdjoint, frame);
92
93 final double[] state = new double[fieldState.length];
94 for (int i = 0; i < fieldState.length; i++) {
95 state[i] = fieldState[i].getReal();
96 }
97 final double[] adjoint = new double[fieldAdjoint.length];
98 for (int i = 0; i < fieldAdjoint.length; i++) {
99 adjoint[i] = fieldAdjoint[i].getReal();
100 }
101 final double[] contribution = j2Term.getPositionAdjointContribution(fieldDate.toAbsoluteDate(), state, adjoint,
102 frame);
103 for (int i = 0; i < contribution.length; i++) {
104 Assertions.assertEquals(fieldContribution[i].getReal(), contribution[i]);
105 }
106 }
107
108 @Test
109 void testGetFieldHamiltonianContribution() {
110
111 final Frame frame = FramesFactory.getGCRF();
112 final CartesianAdjointJ2Term cartesianAdjointJ2Term = new CartesianAdjointJ2Term(1., 1., 0.001, frame);
113 final Binary64Field field = Binary64Field.getInstance();
114 final Binary64[] fieldAdjoint = MathArrays.buildArray(field, 6);
115 final Binary64[] fieldState = MathArrays.buildArray(field, 6);
116 for (int i = 0; i < fieldAdjoint.length; i++) {
117 fieldState[i] = field.getZero().newInstance(-i + 1);
118 fieldAdjoint[i] = field.getZero().newInstance(i);
119 }
120 final FieldAbsoluteDate<Binary64> fieldDate = FieldAbsoluteDate.getArbitraryEpoch(field);
121
122 final Binary64 fieldContribution = cartesianAdjointJ2Term.getFieldHamiltonianContribution(fieldDate,
123 fieldState, fieldAdjoint, frame);
124
125 final double[] adjoint = new double[fieldAdjoint.length];
126 final double[] state = adjoint.clone();
127 for (int i = 0; i < fieldAdjoint.length; i++) {
128 state[i] = fieldState[i].getReal();
129 adjoint[i] = fieldAdjoint[i].getReal();
130 }
131 final double contribution = cartesianAdjointJ2Term.getHamiltonianContribution(fieldDate.toAbsoluteDate(),
132 state, adjoint, frame);
133 Assertions.assertEquals(contribution, fieldContribution.getReal());
134 }
135
136 }