1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.control.indirect.adjoint.cost;
18
19 import org.hipparchus.CalculusFieldElement;
20 import org.hipparchus.Field;
21 import org.hipparchus.util.FastMath;
22 import org.orekit.propagation.events.EventDetectionSettings;
23 import org.orekit.propagation.events.FieldEventDetectionSettings;
24 import org.orekit.propagation.events.FieldEventDetector;
25
26 import java.util.stream.Stream;
27
28
29
30
31
32
33
34
35
36
37
38
39
40 public class FieldBoundedCartesianEnergy<T extends CalculusFieldElement<T>> extends FieldCartesianEnergyConsideringMass<T> {
41
42
43 private final T maximumThrustMagnitude;
44
45
46
47
48
49
50
51
52 public FieldBoundedCartesianEnergy(final String name, final T massFlowRateFactor,
53 final T maximumThrustMagnitude,
54 final FieldEventDetectionSettings<T> eventDetectionSettings) {
55 super(name, massFlowRateFactor, eventDetectionSettings);
56 this.maximumThrustMagnitude = FastMath.abs(maximumThrustMagnitude);
57 }
58
59
60
61
62
63
64
65 public FieldBoundedCartesianEnergy(final String name, final T massFlowRateFactor,
66 final T maximumThrustMagnitude) {
67 this(name, massFlowRateFactor, maximumThrustMagnitude, new FieldEventDetectionSettings<>(massFlowRateFactor.getField(),
68 EventDetectionSettings.getDefaultEventDetectionSettings()));
69 }
70
71
72
73
74 public T getMaximumThrustMagnitude() {
75 return maximumThrustMagnitude;
76 }
77
78
79 @Override
80 protected T getFieldThrustForceNorm(final T[] adjointVariables, final T mass) {
81 final T adjointVelocityNorm = getFieldAdjointVelocityNorm(adjointVariables);
82 T factor = adjointVelocityNorm.divide(mass);
83 if (getAdjointDimension() > 6) {
84 factor = factor.subtract(adjointVariables[6].multiply(getMassFlowRateFactor()));
85 }
86 final double factorReal = factor.getReal();
87 final T zero = mass.getField().getZero();
88 if (factorReal > maximumThrustMagnitude.getReal()) {
89 return maximumThrustMagnitude;
90 } else if (factorReal < 0.) {
91 return zero;
92 } else {
93 return factor;
94 }
95 }
96
97
98 @Override
99 public Stream<FieldEventDetector<T>> getFieldEventDetectors(final Field<T> field) {
100 final T zero = field.getZero();
101 return Stream.of(new FieldSingularityDetector(getEventDetectionSettings(), zero),
102 new FieldSingularityDetector(getEventDetectionSettings(), maximumThrustMagnitude));
103 }
104
105
106 @Override
107 public BoundedCartesianEnergy toCartesianCost() {
108 return new BoundedCartesianEnergy(getAdjointName(), getMassFlowRateFactor().getReal(),
109 maximumThrustMagnitude.getReal(), getEventDetectionSettings().toEventDetectionSettings());
110 }
111
112 }