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.FastMath;
23 import org.hipparchus.util.MathArrays;
24
25
26
27
28
29
30
31
32 public abstract class AbstractCartesianAdjointNewtonianTerm extends AbstractCartesianAdjointGravitationalTerm {
33
34
35 private static final double MINUS_THREE = -3;
36
37
38
39
40
41 protected AbstractCartesianAdjointNewtonianTerm(final double mu) {
42 super(mu);
43 }
44
45
46
47
48
49
50
51 protected double[] getNewtonianVelocityAdjointContribution(final double[] relativePosition,
52 final double[] adjointVariables) {
53 final double[] contribution = new double[3];
54 final double x = relativePosition[0];
55 final double y = relativePosition[1];
56 final double z = relativePosition[2];
57 final double x2 = x * x;
58 final double y2 = y * y;
59 final double z2 = z * z;
60 final double r2 = x2 + y2 + z2;
61 final double r = FastMath.sqrt(r2);
62 final double factor = getMu() / (r2 * r2 * r);
63 final double xy = x * y;
64 final double xz = x * z;
65 final double yz = y * z;
66 final double pvx = adjointVariables[3];
67 final double pvy = adjointVariables[4];
68 final double pvz = adjointVariables[5];
69 contribution[0] = ((x2 * MINUS_THREE + r2) * pvx + xy * MINUS_THREE * pvy + xz * MINUS_THREE * pvz) * factor;
70 contribution[1] = ((y2 * MINUS_THREE + r2) * pvy + xy * MINUS_THREE * pvx + yz * MINUS_THREE * pvz) * factor;
71 contribution[2] = ((z2 * MINUS_THREE + r2) * pvz + yz * MINUS_THREE * pvy + xz * MINUS_THREE * pvx) * factor;
72 return contribution;
73 }
74
75
76
77
78
79
80
81
82 protected <T extends CalculusFieldElement<T>> T[] getFieldNewtonianVelocityAdjointContribution(final T[] relativePosition,
83 final T[] adjointVariables) {
84 final T[] contribution = MathArrays.buildArray(adjointVariables[0].getField(), 3);
85 final T x = relativePosition[0];
86 final T y = relativePosition[1];
87 final T z = relativePosition[2];
88 final T x2 = x.multiply(x);
89 final T y2 = y.multiply(y);
90 final T z2 = z.multiply(z);
91 final T r2 = x2.add(y2).add(z2);
92 final T r = r2.sqrt();
93 final T factor = (r2.multiply(r2).multiply(r)).reciprocal().multiply(getMu());
94 final T xy = x.multiply(y);
95 final T xz = x.multiply(z);
96 final T yz = y.multiply(z);
97 final T pvx = adjointVariables[3];
98 final T pvy = adjointVariables[4];
99 final T pvz = adjointVariables[5];
100 contribution[0] = ((x2.multiply(MINUS_THREE).add(r2)).multiply(pvx).
101 add((xy.multiply(MINUS_THREE)).multiply(pvy)).
102 add((xz.multiply(MINUS_THREE)).multiply(pvz))).multiply(factor);
103 contribution[1] = ((xy.multiply(MINUS_THREE)).multiply(pvx).
104 add((y2.multiply(MINUS_THREE).add(r2)).multiply(pvy)).
105 add((yz.multiply(MINUS_THREE)).multiply(pvz))).multiply(factor);
106 contribution[2] = ((xz.multiply(MINUS_THREE)).multiply(pvx).
107 add((yz.multiply(MINUS_THREE)).multiply(pvy)).
108 add((z2.multiply(MINUS_THREE).add(r2)).multiply(pvz))).multiply(factor);
109 return contribution;
110 }
111
112
113
114
115
116
117 protected Vector3D getNewtonianAcceleration(final double[] position) {
118 final Vector3D positionVector = new Vector3D(position[0], position[1], position[2]);
119 final double squaredRadius = positionVector.getNormSq();
120 final double factor = -getMu() / (squaredRadius * FastMath.sqrt(squaredRadius));
121 return positionVector.scalarMultiply(factor);
122 }
123
124
125
126
127
128
129
130 protected <T extends CalculusFieldElement<T>> FieldVector3D<T> getFieldNewtonianAcceleration(final T[] position) {
131 final FieldVector3D<T> positionVector = new FieldVector3D<>(position[0], position[1], position[2]);
132 final T squaredRadius = positionVector.getNormSq();
133 final T factor = (squaredRadius.multiply(FastMath.sqrt(squaredRadius))).reciprocal().multiply(-getMu());
134 return positionVector.scalarMultiply(factor);
135 }
136 }