1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.orekit.utils;
19
20 import org.hipparchus.CalculusFieldElement;
21 import org.hipparchus.Field;
22 import org.hipparchus.analysis.differentiation.FieldUnivariateDerivative2;
23 import org.hipparchus.analysis.differentiation.UnivariateDerivative2;
24 import org.hipparchus.analysis.differentiation.UnivariateDerivative2Field;
25 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
26 import org.hipparchus.geometry.euclidean.threed.Vector3D;
27 import org.orekit.frames.Frame;
28 import org.orekit.time.AbsoluteDate;
29 import org.orekit.time.FieldAbsoluteDate;
30
31
32
33
34
35
36
37 public interface ExtendedPositionProvider extends PVCoordinatesProvider {
38
39
40
41
42
43
44
45 <T extends CalculusFieldElement<T>> FieldVector3D<T> getPosition(FieldAbsoluteDate<T> date, Frame frame);
46
47
48 @Override
49 default TimeStampedPVCoordinates getPVCoordinates(final AbsoluteDate date, final Frame frame) {
50 final UnivariateDerivative2Field ud2Field = UnivariateDerivative2Field.getInstance();
51 final UnivariateDerivative2 ud2Shift = new UnivariateDerivative2(0., 1., 0.);
52 final FieldAbsoluteDate<UnivariateDerivative2> fieldDate = new FieldAbsoluteDate<>(ud2Field, date).shiftedBy(ud2Shift);
53 final FieldVector3D<UnivariateDerivative2> ud2Position = getPosition(fieldDate, frame);
54 final Vector3D position = ud2Position.toVector3D();
55 final Vector3D velocity = new Vector3D(ud2Position.getX().getFirstDerivative(), ud2Position.getY().getFirstDerivative(),
56 ud2Position.getZ().getFirstDerivative());
57 final Vector3D acceleration = new Vector3D(ud2Position.getX().getSecondDerivative(), ud2Position.getY().getSecondDerivative(),
58 ud2Position.getZ().getSecondDerivative());
59 return new TimeStampedPVCoordinates(date, new PVCoordinates(position, velocity, acceleration));
60 }
61
62
63
64
65
66
67
68 default <T extends CalculusFieldElement<T>> TimeStampedFieldPVCoordinates<T> getPVCoordinates(final FieldAbsoluteDate<T> date,
69 final Frame frame) {
70 final FieldAbsoluteDate<FieldUnivariateDerivative2<T>> fud2Date = date.toFUD2Field();
71 final FieldVector3D<FieldUnivariateDerivative2<T>> fud2Position = getPosition(fud2Date, frame);
72 final FieldVector3D<T> position = new FieldVector3D<>(fud2Position.getX().getValue(), fud2Position.getY().getValue(),
73 fud2Position.getZ().getValue());
74 final FieldVector3D<T> velocity = new FieldVector3D<>(fud2Position.getX().getFirstDerivative(), fud2Position.getY().getFirstDerivative(),
75 fud2Position.getZ().getFirstDerivative());
76 final FieldVector3D<T> acceleration = new FieldVector3D<>(fud2Position.getX().getSecondDerivative(), fud2Position.getY().getSecondDerivative(),
77 fud2Position.getZ().getSecondDerivative());
78 return new TimeStampedFieldPVCoordinates<>(date, position, velocity, acceleration);
79 }
80
81
82
83
84
85
86 default <T extends CalculusFieldElement<T>> FieldPVCoordinatesProvider<T> toFieldPVCoordinatesProvider(Field<T> field) {
87 return new FieldPVCoordinatesProvider<T>() {
88
89 @Override
90 public FieldVector3D<T> getPosition(final FieldAbsoluteDate<T> date, final Frame frame) {
91 return ExtendedPositionProvider.this.getPosition(date, frame);
92 }
93
94 @Override
95 public TimeStampedFieldPVCoordinates<T> getPVCoordinates(final FieldAbsoluteDate<T> date,
96 final Frame frame) {
97 return ExtendedPositionProvider.this.getPVCoordinates(date, frame);
98 }
99 };
100 }
101
102
103
104
105
106
107
108 @Deprecated
109 default ExtendedPVCoordinatesProvider toExtendedPVCoordinatesProvider() {
110 return ExtendedPositionProvider.this::getPVCoordinates;
111 }
112 }