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.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.orekit.bodies.CelestialBodies;
24 import org.orekit.bodies.CelestialBody;
25 import org.orekit.propagation.FieldSpacecraftState;
26 import org.orekit.propagation.SpacecraftState;
27 import org.orekit.utils.ExtendedPositionProvider;
28
29
30
31
32
33
34 public class ThirdBodyAttraction extends AbstractBodyAttraction {
35
36
37
38
39
40
41
42 public ThirdBodyAttraction(final ExtendedPositionProvider positionProvider, final String name, final double mu) {
43 super(positionProvider, name, mu);
44 }
45
46
47
48
49
50
51 public ThirdBodyAttraction(final CelestialBody body) {
52 this(body, body.getName(), body.getGM());
53 }
54
55
56 @Override
57 public Vector3D acceleration(final SpacecraftState s, final double[] parameters) {
58
59 final double gm = parameters[0];
60
61
62 final Vector3D centralToBody = getBodyPosition(s.getDate(), s.getFrame());
63 final double r2Central = centralToBody.getNormSq();
64 final Vector3D satToBody = centralToBody.subtract(s.getPosition());
65 final double r2Sat = satToBody.getNormSq();
66
67
68 return new Vector3D(gm / (r2Sat * FastMath.sqrt(r2Sat)), satToBody,
69 -gm / (r2Central * FastMath.sqrt(r2Central)), centralToBody);
70
71 }
72
73
74 @Override
75 public <T extends CalculusFieldElement<T>> FieldVector3D<T> acceleration(final FieldSpacecraftState<T> s,
76 final T[] parameters) {
77
78 final T gm = parameters[0];
79
80
81 final FieldVector3D<T> centralToBody = getBodyPosition(s.getDate(), s.getFrame());
82 final T r2Central = centralToBody.getNormSq();
83 final FieldVector3D<T> satToBody = centralToBody.subtract(s.getPosition());
84 final T r2Sat = satToBody.getNormSq();
85
86
87 return new FieldVector3D<>(r2Sat.multiply(r2Sat.sqrt()).reciprocal().multiply(gm), satToBody,
88 r2Central.multiply(r2Central.sqrt()).reciprocal().multiply(gm).negate(), centralToBody);
89
90 }
91
92 }