1   /* Copyright 2022-2025 Romain Serra
2    * Licensed to CS GROUP (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * CS licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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          // GIVEN
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          // WHEN
43          final double actualMu = cartesianAdjointJ2Term.getMu();
44          final double actualrEq = cartesianAdjointJ2Term.getrEq();
45          final double actualJ2 = cartesianAdjointJ2Term.getJ2();
46          // THEN
47          Assertions.assertEquals(expectedJ2, actualJ2);
48          Assertions.assertEquals(expectedMu, actualMu);
49          Assertions.assertEquals(expectedrEq, actualrEq);
50      }
51  
52      @Test
53      void testGetPositionAdjointContributionLinearity() {
54          // GIVEN
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          // WHEN
62          final double[] contribution = j2Term.getPositionAdjointContribution(date, positionVelocity, adjoint, frame);
63          // THEN
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          // GIVEN
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          // WHEN
90          final Binary64[] fieldContribution = j2Term.getPositionAdjointFieldContribution(fieldDate, fieldState,
91                  fieldAdjoint, frame);
92          // THEN
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         // GIVEN
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         // WHEN
122         final Binary64 fieldContribution = cartesianAdjointJ2Term.getFieldHamiltonianContribution(fieldDate,
123                 fieldState, fieldAdjoint, frame);
124         // THEN
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 }