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