1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.forces.empirical;
18
19 import org.hipparchus.CalculusFieldElement;
20 import org.hipparchus.Field;
21 import org.hipparchus.geometry.euclidean.threed.FieldRotation;
22 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
23 import org.hipparchus.geometry.euclidean.threed.Rotation;
24 import org.hipparchus.geometry.euclidean.threed.Vector3D;
25 import org.orekit.attitudes.AttitudeProvider;
26 import org.orekit.forces.ForceModel;
27 import org.orekit.propagation.FieldSpacecraftState;
28 import org.orekit.propagation.SpacecraftState;
29 import org.orekit.propagation.events.EventDetector;
30 import org.orekit.propagation.events.FieldEventDetector;
31
32 import java.util.stream.Stream;
33
34
35
36
37
38
39
40 public abstract class AbstractParametricAcceleration implements ForceModel {
41
42
43 private final Vector3D direction;
44
45
46 private final boolean isInertial;
47
48
49 private final AttitudeProvider attitudeOverride;
50
51 protected AbstractParametricAcceleration(final Vector3D direction, final boolean isInertial,
52 final AttitudeProvider attitudeOverride) {
53 this.direction = direction;
54 this.isInertial = isInertial;
55 this.attitudeOverride = attitudeOverride;
56 }
57
58
59
60
61
62 public AttitudeProvider getAttitudeOverride() {
63 return attitudeOverride;
64 }
65
66
67 @Override
68 public boolean dependsOnPositionOnly() {
69 return isInertial;
70 }
71
72
73
74
75
76
77 protected Vector3D getAccelerationDirection(final SpacecraftState state) {
78 if (isInertial) {
79
80 return direction;
81 } else {
82 final Rotation rotation;
83 if (attitudeOverride == null) {
84
85 rotation = state.getAttitude().getRotation();
86 } else {
87
88 rotation = attitudeOverride.getAttitudeRotation(state.isOrbitDefined() ? state.getOrbit() : state.getAbsPVA(),
89 state.getDate(), state.getFrame());
90 }
91 return rotation.applyInverseTo(direction);
92 }
93 }
94
95
96
97
98
99
100
101 protected <T extends CalculusFieldElement<T>> FieldVector3D<T> getAccelerationDirection(final FieldSpacecraftState<T> state) {
102 if (isInertial) {
103
104 return new FieldVector3D<>(state.getDate().getField(), direction);
105 } else {
106 final FieldRotation<T> rotation;
107 if (attitudeOverride == null) {
108
109 rotation = state.getAttitude().getRotation();
110 } else {
111
112 rotation = attitudeOverride.getAttitudeRotation(state.getOrbit(), state.getDate(), state.getFrame());
113 }
114 return rotation.applyInverseTo(direction);
115 }
116 }
117
118
119 @Override
120 public Stream<EventDetector> getEventDetectors() {
121 return attitudeOverride == null ? Stream.of() : attitudeOverride.getEventDetectors();
122 }
123
124
125 @Override
126 public <T extends CalculusFieldElement<T>> Stream<FieldEventDetector<T>> getFieldEventDetectors(final Field<T> field) {
127 return attitudeOverride == null ? Stream.of() : attitudeOverride.getFieldEventDetectors(field);
128 }
129 }