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.FieldUnivariateDerivative2Field;
24 import org.hipparchus.analysis.differentiation.UnivariateDerivative2;
25 import org.hipparchus.analysis.differentiation.UnivariateDerivative2Field;
26 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
27 import org.hipparchus.geometry.euclidean.threed.Vector3D;
28 import org.orekit.frames.Frame;
29 import org.orekit.time.AbsoluteDate;
30 import org.orekit.time.FieldAbsoluteDate;
31
32
33
34
35
36
37
38 public interface ExtendedPositionProvider extends PVCoordinatesProvider {
39
40
41
42
43
44
45
46 <T extends CalculusFieldElement<T>> FieldVector3D<T> getPosition(FieldAbsoluteDate<T> date, Frame frame);
47
48
49 @Override
50 default TimeStampedPVCoordinates getPVCoordinates(final AbsoluteDate date, final Frame frame) {
51 final UnivariateDerivative2Field ud2Field = UnivariateDerivative2Field.getInstance();
52 final UnivariateDerivative2 ud2Shift = new UnivariateDerivative2(0., 1., 0.);
53 final FieldAbsoluteDate<UnivariateDerivative2> fieldDate = new FieldAbsoluteDate<>(ud2Field, date).shiftedBy(ud2Shift);
54 final FieldVector3D<UnivariateDerivative2> ud2Position = getPosition(fieldDate, frame);
55 final Vector3D position = ud2Position.toVector3D();
56 final Vector3D velocity = new Vector3D(ud2Position.getX().getFirstDerivative(), ud2Position.getY().getFirstDerivative(),
57 ud2Position.getZ().getFirstDerivative());
58 final Vector3D acceleration = new Vector3D(ud2Position.getX().getSecondDerivative(), ud2Position.getY().getSecondDerivative(),
59 ud2Position.getZ().getSecondDerivative());
60 return new TimeStampedPVCoordinates(date, new PVCoordinates(position, velocity, acceleration));
61 }
62
63
64
65
66
67
68
69 default <T extends CalculusFieldElement<T>> TimeStampedFieldPVCoordinates<T> getPVCoordinates(final FieldAbsoluteDate<T> date,
70 final Frame frame) {
71 final Field<T> field = date.getField();
72 final FieldUnivariateDerivative2Field<T> fud2Field = FieldUnivariateDerivative2Field.getUnivariateDerivative2Field(field);
73 final T fieldShift = date.durationFrom(date.toAbsoluteDate());
74 final FieldUnivariateDerivative2<T> fud2Shift = new FieldUnivariateDerivative2<>(fieldShift, field.getOne(),
75 field.getZero());
76 final FieldAbsoluteDate<FieldUnivariateDerivative2<T>> fud2Date = new FieldAbsoluteDate<>(fud2Field,
77 date.toAbsoluteDate()).shiftedBy(fud2Shift);
78 final FieldVector3D<FieldUnivariateDerivative2<T>> fud2Position = getPosition(fud2Date, frame);
79 final FieldVector3D<T> position = new FieldVector3D<>(fud2Position.getX().getValue(), fud2Position.getY().getValue(),
80 fud2Position.getZ().getValue());
81 final FieldVector3D<T> velocity = new FieldVector3D<>(fud2Position.getX().getFirstDerivative(), fud2Position.getY().getFirstDerivative(),
82 fud2Position.getZ().getFirstDerivative());
83 final FieldVector3D<T> acceleration = new FieldVector3D<>(fud2Position.getX().getSecondDerivative(), fud2Position.getY().getSecondDerivative(),
84 fud2Position.getZ().getSecondDerivative());
85 return new TimeStampedFieldPVCoordinates<>(date, position, velocity, acceleration);
86 }
87
88
89
90
91
92
93 default <T extends CalculusFieldElement<T>> FieldPVCoordinatesProvider<T> toFieldPVCoordinatesProvider(Field<T> field) {
94 return new FieldPVCoordinatesProvider<T>() {
95
96 @Override
97 public FieldVector3D<T> getPosition(final FieldAbsoluteDate<T> date, final Frame frame) {
98 return ExtendedPositionProvider.this.getPosition(date, frame);
99 }
100
101 @Override
102 public TimeStampedFieldPVCoordinates<T> getPVCoordinates(final FieldAbsoluteDate<T> date,
103 final Frame frame) {
104 return ExtendedPositionProvider.this.getPVCoordinates(date, frame);
105 }
106 };
107 }
108 }