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.geometry.euclidean.threed.FieldVector3D;
21 import org.hipparchus.util.FastMath;
22
23
24
25
26
27
28
29 public class FieldLogarithmicBarrierCartesianFuel<T extends CalculusFieldElement<T>>
30 extends FieldPenalizedCartesianFuelCost<T> {
31
32
33
34
35
36
37
38
39
40 public FieldLogarithmicBarrierCartesianFuel(final String name, final T massFlowRateFactor,
41 final T maximumThrustMagnitude, final T epsilon) {
42 super(name, massFlowRateFactor, maximumThrustMagnitude, epsilon);
43 }
44
45
46 @Override
47 public T evaluateFieldPenaltyFunction(final T controlNorm) {
48 return FastMath.log(controlNorm).add(FastMath.log(controlNorm.negate().add(1)));
49 }
50
51
52 @Override
53 public FieldVector3D<T> getFieldThrustAccelerationVector(final T[] adjointVariables, final T mass) {
54 final T thrustForceMagnitude = getThrustForceMagnitude(adjointVariables, mass);
55 return getFieldThrustDirection(adjointVariables).scalarMultiply(thrustForceMagnitude.divide(mass));
56 }
57
58
59 @Override
60 public void updateFieldAdjointDerivatives(final T[] adjointVariables, final T mass, final T[] adjointDerivatives) {
61 if (getAdjointDimension() > 6) {
62 adjointDerivatives[6] = adjointDerivatives[6].add(getFieldAdjointVelocityNorm(adjointVariables)
63 .multiply(getThrustForceMagnitude(adjointVariables, mass)).divide(mass.square()));
64 }
65 }
66
67
68
69
70
71
72
73 private T getThrustForceMagnitude(final T[] adjointVariables, final T mass) {
74 final T twoEpsilon = getEpsilon().multiply(2);
75 T otherTerm = getFieldAdjointVelocityNorm(adjointVariables).divide(mass).subtract(1.);
76 if (getAdjointDimension() > 6) {
77 otherTerm = otherTerm.subtract(getMassFlowRateFactor().multiply(adjointVariables[6]));
78 }
79 return twoEpsilon.multiply(getMaximumThrustMagnitude())
80 .divide(twoEpsilon.add(otherTerm).add(FastMath.sqrt(otherTerm.square().add(twoEpsilon.square()))));
81 }
82
83
84 @Override
85 public LogarithmicBarrierCartesianFuel toCartesianCost() {
86 return new LogarithmicBarrierCartesianFuel(getAdjointName(), getMassFlowRateFactor().getReal(),
87 getMaximumThrustMagnitude().getReal(), getEpsilon().getReal());
88 }
89 }