1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.orekit.forces.maneuvers.propulsion;
19
20 import java.util.Arrays;
21 import java.util.Collections;
22 import java.util.List;
23
24 import org.hipparchus.CalculusFieldElement;
25 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
26 import org.hipparchus.geometry.euclidean.threed.Vector3D;
27 import org.hipparchus.util.FastMath;
28 import org.orekit.time.AbsoluteDate;
29 import org.orekit.utils.ParameterDriver;
30
31
32
33
34
35
36 public class ScaledConstantThrustPropulsionModel extends AbstractConstantThrustPropulsionModel {
37
38
39 public static final String THRUSTX_SCALE_FACTOR = "TX scale factor";
40
41 public static final String THRUSTY_SCALE_FACTOR = "TY scale factor";
42
43 public static final String THRUSTZ_SCALE_FACTOR = "TZ scale factor";
44
45
46
47
48
49
50
51 private static final double THRUST_SCALE = FastMath.scalb(1.0, -5);
52
53
54 private final ParameterDriver scaleFactorThrustXDriver;
55
56 private final ParameterDriver scaleFactorThrustYDriver;
57
58 private final ParameterDriver scaleFactorThrustZDriver;
59
60
61
62
63
64
65
66
67
68 public ScaledConstantThrustPropulsionModel(final double thrust,
69 final double isp,
70 final Vector3D direction,
71 final String name) {
72 super(thrust, isp, direction, name);
73
74
75 this.scaleFactorThrustXDriver = new ParameterDriver(name + THRUSTX_SCALE_FACTOR, 1., THRUST_SCALE,
76 Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY);
77 this.scaleFactorThrustYDriver = new ParameterDriver(name + THRUSTY_SCALE_FACTOR, 1., THRUST_SCALE,
78 Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY);
79 this.scaleFactorThrustZDriver = new ParameterDriver(name + THRUSTZ_SCALE_FACTOR, 1., THRUST_SCALE,
80 Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY);
81 }
82
83
84
85
86
87
88
89 private Vector3D getThrustVector(final double scaleFactorX,
90 final double scaleFactorY,
91 final double scaleFactorZ) {
92 return new Vector3D(getInitialThrustVector().getX() * scaleFactorX,
93 getInitialThrustVector().getY() * scaleFactorY,
94 getInitialThrustVector().getZ() * scaleFactorZ);
95 }
96
97
98 @Override
99 public Vector3D getThrustVector() {
100
101 return getThrustVector(scaleFactorThrustXDriver.getValue(),
102 scaleFactorThrustYDriver.getValue(),
103 scaleFactorThrustZDriver.getValue());
104 }
105
106
107 @Override
108 public Vector3D getThrustVector(final AbsoluteDate date) {
109 return getThrustVector(scaleFactorThrustXDriver.getValue(date),
110 scaleFactorThrustYDriver.getValue(date),
111 scaleFactorThrustZDriver.getValue(date));
112 }
113
114
115 @Override
116 public double getFlowRate() {
117 return getInitialFlowRate();
118 }
119
120
121 @Override
122 public double getFlowRate(final AbsoluteDate date) {
123 return getInitialFlowRate();
124 }
125
126
127 @Override
128 public List<ParameterDriver> getParametersDrivers() {
129 return Collections.unmodifiableList(Arrays.asList(scaleFactorThrustXDriver,
130 scaleFactorThrustYDriver,
131 scaleFactorThrustZDriver));
132 }
133
134
135 @Override
136 public Vector3D getThrustVector(final double[] parameters) {
137 return getThrustVector(parameters[0], parameters[1], parameters[2]);
138 }
139
140
141 @Override
142 public double getFlowRate(final double[] parameters) {
143 return getInitialFlowRate();
144 }
145
146
147 @Override
148 public <T extends CalculusFieldElement<T>> FieldVector3D<T> getThrustVector(final T[] parameters) {
149 return new FieldVector3D<>(parameters[0].multiply(getInitialThrustVector().getX()),
150 parameters[1].multiply(getInitialThrustVector().getY()),
151 parameters[2].multiply(getInitialThrustVector().getZ()));
152 }
153
154
155 @Override
156 public <T extends CalculusFieldElement<T>> T getFlowRate(final T[] parameters) {
157 return parameters[0].getField().getZero().newInstance(getInitialFlowRate());
158 }
159 }