1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.numerical;
18
19 import org.hipparchus.Field;
20 import org.hipparchus.analysis.differentiation.Gradient;
21 import org.hipparchus.analysis.differentiation.GradientField;
22 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
23 import org.hipparchus.geometry.euclidean.threed.Vector3D;
24 import org.orekit.attitudes.AttitudeProvider;
25 import org.orekit.attitudes.FieldAttitude;
26 import org.orekit.orbits.FieldCartesianOrbit;
27 import org.orekit.orbits.FieldOrbit;
28 import org.orekit.propagation.FieldSpacecraftState;
29 import org.orekit.propagation.SpacecraftState;
30 import org.orekit.propagation.integration.AbstractGradientConverter;
31 import org.orekit.utils.TimeStampedFieldPVCoordinates;
32
33
34
35
36
37 class NumericalGradientConverter extends AbstractGradientConverter {
38
39
40
41
42
43
44 NumericalGradientConverter(final SpacecraftState state, final int freeStateParameters,
45 final AttitudeProvider provider) {
46
47 super(freeStateParameters);
48
49
50 final Field<Gradient> field = GradientField.getField(freeStateParameters);
51
52
53 final Vector3D pos = state.getPVCoordinates().getPosition();
54 final FieldVector3D<Gradient> posG = new FieldVector3D<>(Gradient.variable(freeStateParameters, 0, pos.getX()),
55 Gradient.variable(freeStateParameters, 1, pos.getY()),
56 Gradient.variable(freeStateParameters, 2, pos.getZ()));
57
58
59 final Vector3D vel = state.getPVCoordinates().getVelocity();
60 final FieldVector3D<Gradient> velG;
61 if (freeStateParameters > 3) {
62 velG = new FieldVector3D<>(Gradient.variable(freeStateParameters, 3, vel.getX()),
63 Gradient.variable(freeStateParameters, 4, vel.getY()),
64 Gradient.variable(freeStateParameters, 5, vel.getZ()));
65 } else {
66 velG = new FieldVector3D<>(Gradient.constant(freeStateParameters, vel.getX()),
67 Gradient.constant(freeStateParameters, vel.getY()),
68 Gradient.constant(freeStateParameters, vel.getZ()));
69 }
70
71
72 final Vector3D acc = state.getPVCoordinates().getAcceleration();
73 final FieldVector3D<Gradient> accG = new FieldVector3D<>(Gradient.constant(freeStateParameters, acc.getX()),
74 Gradient.constant(freeStateParameters, acc.getY()),
75 Gradient.constant(freeStateParameters, acc.getZ()));
76
77
78 final Gradient gM = Gradient.constant(freeStateParameters, state.getMass());
79
80 final Gradient gMu = Gradient.constant(freeStateParameters, state.getMu());
81
82 final FieldOrbit<Gradient> gOrbit =
83 new FieldCartesianOrbit<>(new TimeStampedFieldPVCoordinates<>(state.getDate(), posG, velG, accG),
84 state.getFrame(), gMu);
85
86 final FieldAttitude<Gradient> gAttitude;
87 if (freeStateParameters > 3) {
88
89 gAttitude = provider.getAttitude(gOrbit, gOrbit.getDate(), gOrbit.getFrame());
90 } else {
91
92 gAttitude = new FieldAttitude<>(field, state.getAttitude());
93 }
94
95
96 initStates(new FieldSpacecraftState<>(gOrbit, gAttitude, gM));
97
98 }
99
100 }