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.orekit.propagation.events.EventDetectionSettings;
22 import org.orekit.propagation.events.FieldEventDetectionSettings;
23 import org.orekit.propagation.events.FieldEventDetector;
24
25 import java.util.stream.Stream;
26
27
28
29
30
31
32
33
34
35
36
37
38 public class FieldUnboundedCartesianEnergy<T extends CalculusFieldElement<T>> extends FieldCartesianEnergyConsideringMass<T> {
39
40
41
42
43
44
45
46 public FieldUnboundedCartesianEnergy(final String name, final T massFlowRateFactor,
47 final FieldEventDetectionSettings<T> eventDetectionSettings) {
48 super(name, massFlowRateFactor, eventDetectionSettings);
49 }
50
51
52
53
54
55
56 public FieldUnboundedCartesianEnergy(final String name, final T massFlowRateFactor) {
57 this(name, massFlowRateFactor, new FieldEventDetectionSettings<>(massFlowRateFactor.getField(),
58 EventDetectionSettings.getDefaultEventDetectionSettings()));
59 }
60
61
62 @Override
63 protected T getFieldThrustForceNorm(final T[] adjointVariables, final T mass) {
64 final T adjointVelocityNorm = getFieldAdjointVelocityNorm(adjointVariables);
65 T factor = adjointVelocityNorm.divide(mass);
66 if (getAdjointDimension() > 6) {
67 factor = factor.subtract(adjointVariables[6].multiply(getMassFlowRateFactor()));
68 }
69 if (factor.getReal() < 0.) {
70 return adjointVelocityNorm.getField().getZero();
71 } else {
72 return factor;
73 }
74 }
75
76
77 @Override
78 public Stream<FieldEventDetector<T>> getFieldEventDetectors(final Field<T> field) {
79 return Stream.of(new FieldSingularityDetector(getEventDetectionSettings(), field.getZero()));
80 }
81
82
83 @Override
84 public UnboundedCartesianEnergy toCartesianCost() {
85 return new UnboundedCartesianEnergy(getAdjointName(), getMassFlowRateFactor().getReal(),
86 getEventDetectionSettings().toEventDetectionSettings());
87 }
88 }