1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.frames;
18
19 import org.hipparchus.CalculusFieldElement;
20 import org.hipparchus.geometry.euclidean.threed.FieldRotation;
21 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
22 import org.hipparchus.geometry.euclidean.threed.Rotation;
23 import org.hipparchus.geometry.euclidean.threed.RotationConvention;
24 import org.hipparchus.geometry.euclidean.threed.Vector3D;
25 import org.hipparchus.util.MathUtils;
26 import org.orekit.time.AbsoluteDate;
27 import org.orekit.time.DateComponents;
28 import org.orekit.time.FieldAbsoluteDate;
29 import org.orekit.time.TimeScales;
30 import org.orekit.utils.Constants;
31
32
33
34
35
36
37 class VEISProvider implements TransformProvider {
38
39
40 private static final double VST0 = 1.746647708617871;
41
42
43 private static final double VST1 = 0.17202179573714597e-1;
44
45
46 private static final double VSTD = 7.292115146705209e-5;
47
48
49 private final TimeScales timeScales;
50
51
52 private final AbsoluteDate vstReference;
53
54
55
56
57
58
59 VEISProvider(final TimeScales timeScales) {
60 this.timeScales = timeScales;
61 this.vstReference =
62 new AbsoluteDate(DateComponents.FIFTIES_EPOCH, timeScales.getTAI());
63 }
64
65
66 @Override
67 public Transform getTransform(final AbsoluteDate date) {
68
69
70 final double dtai = date.durationFrom(vstReference);
71 final double dutc = timeScales.getUTC().offsetFromTAI(date).toDouble();
72 final double dut1 = 0.0;
73
74 final double tut1 = dtai + dutc + dut1;
75 final double ttd = tut1 / Constants.JULIAN_DAY;
76 final double rdtt = ttd - (int) ttd;
77
78
79 final double vst = (VST0 + VST1 * ttd + MathUtils.TWO_PI * rdtt) % MathUtils.TWO_PI;
80
81
82 final Vector3D rotationRate = new Vector3D(-VSTD, Vector3D.PLUS_K);
83
84
85 return new Transform(date,
86 new Rotation(Vector3D.PLUS_K, vst, RotationConvention.VECTOR_OPERATOR),
87 rotationRate);
88
89 }
90
91
92 @Override
93 public <T extends CalculusFieldElement<T>> FieldTransform<T> getTransform(final FieldAbsoluteDate<T> date) {
94
95
96 final T dtai = date.durationFrom(vstReference);
97 final double dutc = timeScales.getUTC().offsetFromTAI(date.toAbsoluteDate()).toDouble();
98 final double dut1 = 0.0;
99
100 final T tut1 = dtai.add(dutc + dut1);
101 final T ttd = tut1.divide(Constants.JULIAN_DAY);
102 final T rdtt = ttd.subtract((int) ttd.getReal());
103
104
105 final T vst = ttd.multiply(VST1).add(rdtt.multiply(MathUtils.TWO_PI)).add(VST0).remainder(MathUtils.TWO_PI);
106
107
108 final FieldVector3D<T> rotationRate = new FieldVector3D<>(date.getField().getZero().newInstance(-VSTD),
109 Vector3D.PLUS_K);
110
111
112 return new FieldTransform<>(date,
113 new FieldRotation<>(FieldVector3D.getPlusK(date.getField()), vst,
114 RotationConvention.VECTOR_OPERATOR),
115 rotationRate);
116
117 }
118
119 }