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.FieldPVCoordinates;
27 import org.orekit.utils.PVCoordinates;
28
29
30
31
32
33 public class SingleBodyRelativeAttraction extends AbstractBodyAttraction {
34
35
36
37
38
39
40 public SingleBodyRelativeAttraction(final CelestialBody body) {
41 super(body);
42 }
43
44
45 public Vector3D acceleration(final SpacecraftState s, final double[] parameters) {
46
47
48 final PVCoordinates bodyPV = getBody().getPVCoordinates(s.getDate(), s.getFrame());
49 final Vector3D satToBody = bodyPV.getPosition().subtract(s.getPosition());
50 final double r2Sat = satToBody.getNormSq();
51
52
53 final double gm = parameters[0];
54 final double a = gm / r2Sat;
55 return new Vector3D(a, satToBody.normalize()).add(bodyPV.getAcceleration());
56
57 }
58
59
60 public <T extends CalculusFieldElement<T>> FieldVector3D<T> acceleration(final FieldSpacecraftState<T> s,
61 final T[] parameters) {
62
63
64 final FieldPVCoordinates<T> bodyPV = getBody().getPVCoordinates(s.getDate(), s.getFrame());
65 final FieldVector3D<T> satToBody = bodyPV.getPosition().subtract(s.getPosition());
66 final T r2Sat = satToBody.getNormSq();
67
68
69 final T gm = parameters[0];
70 final T a = gm.divide(r2Sat);
71 return new FieldVector3D<>(a, satToBody.normalize()).add(bodyPV.getAcceleration());
72
73 }
74
75 }