1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.forces.gravity;
18
19 import org.hipparchus.analysis.differentiation.Gradient;
20 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
21 import org.hipparchus.geometry.euclidean.threed.Vector3D;
22 import org.orekit.bodies.CelestialBody;
23 import org.orekit.propagation.SpacecraftState;
24
25
26
27
28
29
30
31
32
33
34 public class ThirdBodyAttractionEpoch extends ThirdBodyAttraction {
35
36
37
38
39
40
41 public ThirdBodyAttractionEpoch(final CelestialBody body) {
42 super(body);
43 }
44
45
46
47
48
49
50 private FieldVector3D<Gradient> accelerationToEpoch(final SpacecraftState s, final double[] parameters) {
51
52 final double gm = parameters[0];
53
54
55 final Vector3D centralToBody = getBodyPosition(s.getDate(), s.getFrame());
56
57
58 final double rx = centralToBody.getX();
59 final double ry = centralToBody.getY();
60 final double rz = centralToBody.getZ();
61
62 final int freeParameters = 3;
63 final Gradient fpx = Gradient.variable(freeParameters, 0, rx);
64 final Gradient fpy = Gradient.variable(freeParameters, 1, ry);
65 final Gradient fpz = Gradient.variable(freeParameters, 2, rz);
66
67 final FieldVector3D<Gradient> centralToBodyFV = new FieldVector3D<>(new Gradient[] {fpx, fpy, fpz});
68
69
70 final Gradient r2Central = centralToBodyFV.getNormSq();
71 final FieldVector3D<Gradient> satToBody = centralToBodyFV.subtract(s.getPosition());
72 final Gradient r2Sat = satToBody.getNormSq();
73
74 return new FieldVector3D<>(gm, satToBody.scalarMultiply(r2Sat.multiply(r2Sat.sqrt()).reciprocal()),
75 -gm, centralToBodyFV.scalarMultiply(r2Central.multiply(r2Central.sqrt()).reciprocal()));
76 }
77
78
79
80
81
82
83 public double[] getDerivativesToEpoch(final SpacecraftState s, final double[] parameters) {
84
85 final FieldVector3D<Gradient> acc = accelerationToEpoch(s, parameters);
86 final Vector3D centralToBodyVelocity = getBodyPVCoordinates(s.getDate(), s.getFrame()).getVelocity();
87
88 final double[] dAccxdR1i = acc.getX().getGradient();
89 final double[] dAccydR1i = acc.getY().getGradient();
90 final double[] dAcczdR1i = acc.getZ().getGradient();
91 final double[] v = centralToBodyVelocity.toArray();
92
93 return new double[] {
94 dAccxdR1i[0] * v[0] + dAccxdR1i[1] * v[1] + dAccxdR1i[2] * v[2],
95 dAccydR1i[0] * v[0] + dAccydR1i[1] * v[1] + dAccydR1i[2] * v[2],
96 dAcczdR1i[0] * v[0] + dAcczdR1i[1] * v[1] + dAcczdR1i[2] * v[2]
97 };
98
99 }
100
101 }