1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.frames;
18
19 import java.io.Serializable;
20
21 import org.hipparchus.RealFieldElement;
22 import org.hipparchus.geometry.euclidean.threed.FieldRotation;
23 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
24 import org.hipparchus.geometry.euclidean.threed.Rotation;
25 import org.hipparchus.geometry.euclidean.threed.Vector3D;
26 import org.hipparchus.util.FastMath;
27 import org.orekit.errors.OrekitException;
28 import org.orekit.errors.OrekitInternalError;
29 import org.orekit.time.AbsoluteDate;
30 import org.orekit.time.FieldAbsoluteDate;
31 import org.orekit.time.TimeVectorFunction;
32
33
34
35
36
37
38
39
40
41
42
43
44 class CIRFProvider implements EOPBasedTransformProvider {
45
46
47 private static final long serialVersionUID = 20130806L;
48
49
50 private final transient TimeVectorFunction xysPxy2Function;
51
52
53 private final EOPHistory eopHistory;
54
55
56
57
58
59 CIRFProvider(final EOPHistory eopHistory) {
60
61
62 xysPxy2Function = eopHistory.getConventions()
63 .getXYSpXY2Function(eopHistory.getTimeScales());
64
65
66 this.eopHistory = eopHistory;
67
68 }
69
70
71 @Override
72 public EOPHistory getEOPHistory() {
73 return eopHistory;
74 }
75
76
77 @Override
78 public CIRFProvider getNonInterpolatingProvider() {
79 return new CIRFProvider(eopHistory.getNonInterpolatingEOPHistory());
80 }
81
82
83 @Override
84 public Transform getTransform(final AbsoluteDate date) {
85
86 final double[] xys = xysPxy2Function.value(date);
87 final double[] dxdy = eopHistory.getNonRotatinOriginNutationCorrection(date);
88
89
90 final double xCurrent = xys[0] + dxdy[0];
91 final double yCurrent = xys[1] + dxdy[1];
92
93
94 final double sCurrent = xys[2] - xCurrent * yCurrent / 2;
95
96
97 final double x2Py2 = xCurrent * xCurrent + yCurrent * yCurrent;
98 final double zP1 = 1 + FastMath.sqrt(1 - x2Py2);
99 final double r = FastMath.sqrt(x2Py2);
100 final double sPe2 = 0.5 * (sCurrent + FastMath.atan2(yCurrent, xCurrent));
101 final double cos = FastMath.cos(sPe2);
102 final double sin = FastMath.sin(sPe2);
103 final double xPr = xCurrent + r;
104 final double xPrCos = xPr * cos;
105 final double xPrSin = xPr * sin;
106 final double yCos = yCurrent * cos;
107 final double ySin = yCurrent * sin;
108 final Rotation bpn = new Rotation(zP1 * (xPrCos + ySin), -r * (yCos + xPrSin),
109 r * (xPrCos - ySin), zP1 * (yCos - xPrSin),
110 true);
111
112 return new Transform(date, bpn, Vector3D.ZERO);
113
114 }
115
116
117 @Override
118 public <T extends RealFieldElement<T>> FieldTransform<T> getTransform(final FieldAbsoluteDate<T> date) {
119
120 final T[] xys = xysPxy2Function.value(date);
121 final T[] dxdy = eopHistory.getNonRotatinOriginNutationCorrection(date);
122
123
124 final T xCurrent = xys[0].add(dxdy[0]);
125 final T yCurrent = xys[1].add(dxdy[1]);
126
127
128 final T sCurrent = xys[2].subtract(xCurrent.multiply(yCurrent).multiply(0.5));
129
130
131 final T x2Py2 = xCurrent.multiply(xCurrent).add(yCurrent.multiply(yCurrent));
132 final T zP1 = x2Py2.subtract(1).negate().sqrt().add(1);
133 final T r = x2Py2.sqrt();
134 final T sPe2 = sCurrent.add(yCurrent.atan2(xCurrent)).multiply(0.5);
135 final T cos = sPe2.cos();
136 final T sin = sPe2.sin();
137 final T xPr = xCurrent.add(r);
138 final T xPrCos = xPr.multiply(cos);
139 final T xPrSin = xPr.multiply(sin);
140 final T yCos = yCurrent.multiply(cos);
141 final T ySin = yCurrent.multiply(sin);
142 final FieldRotation<T> bpn = new FieldRotation<>(zP1.multiply(xPrCos.add(ySin)),
143 r.multiply(yCos.add(xPrSin)).negate(),
144 r.multiply(xPrCos.subtract(ySin)),
145 zP1.multiply(yCos.subtract(xPrSin)),
146 true);
147
148 return new FieldTransform<>(date, bpn, FieldVector3D.getZero(date.getField()));
149
150 }
151
152
153
154
155
156
157
158 private Object writeReplace() {
159 return new DataTransferObject(eopHistory);
160 }
161
162
163 private static class DataTransferObject implements Serializable {
164
165
166 private static final long serialVersionUID = 20131209L;
167
168
169 private final EOPHistory eopHistory;
170
171
172
173
174 DataTransferObject(final EOPHistory eopHistory) {
175 this.eopHistory = eopHistory;
176 }
177
178
179
180
181 private Object readResolve() {
182 try {
183
184 return new CIRFProvider(eopHistory);
185 } catch (OrekitException oe) {
186 throw new OrekitInternalError(oe);
187 }
188 }
189
190 }
191
192 }