1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.forces.inertia;
18
19 import java.util.Collections;
20 import java.util.List;
21 import java.util.stream.Stream;
22
23 import org.hipparchus.Field;
24 import org.hipparchus.CalculusFieldElement;
25 import org.hipparchus.geometry.euclidean.threed.FieldRotation;
26 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
27 import org.hipparchus.geometry.euclidean.threed.Rotation;
28 import org.hipparchus.geometry.euclidean.threed.Vector3D;
29 import org.orekit.errors.OrekitException;
30 import org.orekit.errors.OrekitIllegalArgumentException;
31 import org.orekit.errors.OrekitMessages;
32 import org.orekit.forces.AbstractForceModel;
33 import org.orekit.frames.FieldTransform;
34 import org.orekit.frames.Frame;
35 import org.orekit.frames.Transform;
36 import org.orekit.propagation.FieldSpacecraftState;
37 import org.orekit.propagation.SpacecraftState;
38 import org.orekit.propagation.events.EventDetector;
39 import org.orekit.propagation.events.FieldEventDetector;
40 import org.orekit.utils.AbsolutePVCoordinates;
41 import org.orekit.utils.ParameterDriver;
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 public class InertialForces extends AbstractForceModel {
70
71
72 private Frame referenceInertialFrame;
73
74
75
76
77
78
79 public InertialForces(final Frame referenceInertialFrame)
80 throws OrekitIllegalArgumentException {
81 if (!referenceInertialFrame.isPseudoInertial()) {
82 throw new OrekitIllegalArgumentException(OrekitMessages.NON_PSEUDO_INERTIAL_FRAME_NOT_SUITABLE_AS_REFERENCE_FOR_INERTIAL_FORCES,
83 referenceInertialFrame.getName());
84 }
85 this.referenceInertialFrame = referenceInertialFrame;
86 }
87
88
89 @Override
90 public boolean dependsOnPositionOnly() {
91 return false;
92 }
93
94
95 @Override
96 public Vector3D acceleration(final SpacecraftState s, final double[] parameters) {
97
98 final Transform inertToStateFrame = referenceInertialFrame.getTransformTo(s.getFrame(), s.getDate());
99 final Vector3D a1 = inertToStateFrame.getCartesian().getAcceleration();
100 final Rotation r1 = inertToStateFrame.getAngular().getRotation();
101 final Vector3D o1 = inertToStateFrame.getAngular().getRotationRate();
102 final Vector3D oDot1 = inertToStateFrame.getAngular().getRotationAcceleration();
103
104 final Vector3D p2 = s.getPVCoordinates().getPosition();
105 final Vector3D v2 = s.getPVCoordinates().getVelocity();
106
107 final Vector3D crossCrossP = Vector3D.crossProduct(o1, Vector3D.crossProduct(o1, p2));
108 final Vector3D crossV = Vector3D.crossProduct(o1, v2);
109 final Vector3D crossDotP = Vector3D.crossProduct(oDot1, p2);
110
111
112
113 return r1.applyTo(a1).subtract(new Vector3D(2, crossV, 1, crossCrossP, 1, crossDotP));
114
115 }
116
117
118 @Override
119 public <T extends CalculusFieldElement<T>> FieldVector3D<T> acceleration(final FieldSpacecraftState<T> s,
120 final T[] parameters) {
121
122 final FieldTransform<T> inertToStateFrame = referenceInertialFrame.getTransformTo(s.getFrame(), s.getDate());
123 final FieldVector3D<T> a1 = inertToStateFrame.getCartesian().getAcceleration();
124 final FieldRotation<T> r1 = inertToStateFrame.getAngular().getRotation();
125 final FieldVector3D<T> o1 = inertToStateFrame.getAngular().getRotationRate();
126 final FieldVector3D<T> oDot1 = inertToStateFrame.getAngular().getRotationAcceleration();
127
128 final FieldVector3D<T> p2 = s.getPVCoordinates().getPosition();
129 final FieldVector3D<T> v2 = s.getPVCoordinates().getVelocity();
130
131 final FieldVector3D<T> crossCrossP = FieldVector3D.crossProduct(o1, FieldVector3D.crossProduct(o1, p2));
132 final FieldVector3D<T> crossV = FieldVector3D.crossProduct(o1, v2);
133 final FieldVector3D<T> crossDotP = FieldVector3D.crossProduct(oDot1, p2);
134
135
136
137 return r1.applyTo(a1).subtract(new FieldVector3D<>(2, crossV, 1, crossCrossP, 1, crossDotP));
138
139 }
140
141
142 @Override
143 public Stream<EventDetector> getEventsDetectors() {
144 return Stream.empty();
145 }
146
147
148 @Override
149 public <T extends CalculusFieldElement<T>> Stream<FieldEventDetector<T>>
150 getFieldEventsDetectors(final Field<T> field) {
151 return Stream.empty();
152 }
153
154
155 @Override
156 public List<ParameterDriver> getParametersDrivers() {
157 return Collections.emptyList();
158 }
159
160
161 @Override
162 public ParameterDriver getParameterDriver(final String name) {
163 throw new OrekitException(OrekitMessages.UNSUPPORTED_PARAMETER_NAME, "<none>");
164 }
165
166 }