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 java.util.Collections;
20 import java.util.List;
21
22 import org.hipparchus.CalculusFieldElement;
23 import org.hipparchus.Field;
24 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
25 import org.hipparchus.geometry.euclidean.threed.Vector3D;
26 import org.hipparchus.util.FastMath;
27 import org.orekit.forces.ForceModel;
28 import org.orekit.propagation.FieldSpacecraftState;
29 import org.orekit.propagation.SpacecraftState;
30 import org.orekit.propagation.numerical.FieldTimeDerivativesEquations;
31 import org.orekit.propagation.numerical.TimeDerivativesEquations;
32 import org.orekit.time.AbsoluteDate;
33 import org.orekit.time.FieldAbsoluteDate;
34 import org.orekit.utils.ParameterDriver;
35
36
37
38
39 public class NewtonianAttraction implements ForceModel {
40
41
42 public static final String CENTRAL_ATTRACTION_COEFFICIENT = "central attraction coefficient";
43
44
45
46
47
48
49
50 private static final double MU_SCALE = FastMath.scalb(1.0, 32);
51
52
53 private final ParameterDriver gmParameterDriver;
54
55
56
57
58 public NewtonianAttraction(final double mu) {
59 gmParameterDriver = new ParameterDriver(NewtonianAttraction.CENTRAL_ATTRACTION_COEFFICIENT,
60 mu, MU_SCALE,
61 0.0, Double.POSITIVE_INFINITY);
62 }
63
64
65 @Override
66 public boolean dependsOnPositionOnly() {
67 return true;
68 }
69
70
71
72
73
74 public double getMu(final AbsoluteDate date) {
75 return gmParameterDriver.getValue(date);
76 }
77
78
79
80
81
82
83
84 public <T extends CalculusFieldElement<T>> T getMu(final Field<T> field, final FieldAbsoluteDate<T> date) {
85 final T zero = field.getZero();
86 return zero.newInstance(gmParameterDriver.getValue(date.toAbsoluteDate()));
87 }
88
89
90 @Override
91 public void addContribution(final SpacecraftState s, final TimeDerivativesEquations adder) {
92 adder.addKeplerContribution(getMu(s.getDate()));
93 }
94
95
96 @Override
97 public <T extends CalculusFieldElement<T>> void addContribution(final FieldSpacecraftState<T> s,
98 final FieldTimeDerivativesEquations<T> adder) {
99 final Field<T> field = s.getDate().getField();
100 adder.addKeplerContribution(getMu(field, s.getDate()));
101 }
102
103
104 @Override
105 public Vector3D acceleration(final SpacecraftState s, final double[] parameters) {
106 final double mu = parameters[0];
107 final double r2 = s.getPosition().getNormSq();
108 return new Vector3D(-mu / (FastMath.sqrt(r2) * r2), s.getPosition());
109 }
110
111
112 @Override
113 public <T extends CalculusFieldElement<T>> FieldVector3D<T> acceleration(final FieldSpacecraftState<T> s,
114 final T[] parameters) {
115 final T mu = parameters[0];
116 final T r2 = s.getPosition().getNormSq();
117 return new FieldVector3D<>(r2.sqrt().multiply(r2).reciprocal().multiply(mu).negate(), s.getPosition());
118 }
119
120
121 @Override
122 public List<ParameterDriver> getParametersDrivers() {
123 return Collections.singletonList(gmParameterDriver);
124 }
125
126 }
127