1   /* Copyright 2002-2025 CS GROUP
2    * Licensed to CS GROUP (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * CS licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.orekit.utils;
18  
19  import org.hipparchus.analysis.differentiation.DerivativeStructure;
20  import org.hipparchus.analysis.differentiation.UnivariateDerivative1;
21  import org.hipparchus.analysis.differentiation.UnivariateDerivative2;
22  import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
23  import org.hipparchus.geometry.euclidean.threed.Vector3D;
24  import org.junit.jupiter.api.Assertions;
25  import org.junit.jupiter.api.BeforeEach;
26  import org.junit.jupiter.api.Test;
27  import org.orekit.TestUtils;
28  import org.orekit.Utils;
29  import org.orekit.errors.OrekitIllegalArgumentException;
30  import org.orekit.errors.OrekitMessages;
31  import org.orekit.frames.Frame;
32  import org.orekit.frames.FramesFactory;
33  import org.orekit.frames.Transform;
34  import org.orekit.time.AbsoluteDate;
35  
36  public class AbsolutePVCoordinatesTest {
37  
38      @BeforeEach
39      public void setUp() {
40          Utils.setDataRoot("regular-data");
41      }
42  
43      @Test
44      public void testPVOnlyConstructor() {
45          //setup
46          AbsoluteDate date = AbsoluteDate.J2000_EPOCH;
47          Frame frame = FramesFactory.getEME2000();
48          Vector3D p = new Vector3D(1, 2, 3);
49          Vector3D v = new Vector3D(4, 5, 6);
50  
51          //action
52          AbsolutePVCoordinates actual = new AbsolutePVCoordinates(frame, date, p, v);
53  
54          //verify
55          Assertions.assertEquals(date, actual.getDate());
56          Assertions.assertEquals(1, actual.getPosition().getX(), 0);
57          Assertions.assertEquals(2, actual.getPosition().getY(), 0);
58          Assertions.assertEquals(3, actual.getPosition().getZ(), 0);
59          Assertions.assertEquals(4, actual.getVelocity().getX(), 0);
60          Assertions.assertEquals(5, actual.getVelocity().getY(), 0);
61          Assertions.assertEquals(6, actual.getVelocity().getZ(), 0);
62          Assertions.assertEquals(Vector3D.ZERO, actual.getAcceleration());
63      }
64  
65      @Test
66      public void testPVCoordinatesCopyConstructor() {
67          //setup
68          AbsoluteDate date = AbsoluteDate.J2000_EPOCH;
69          Frame frame = FramesFactory.getEME2000();
70          PVCoordinates pv = new PVCoordinates(new Vector3D(1, 2, 3), new Vector3D(4, 5, 6));
71  
72          //action
73          AbsolutePVCoordinates actual = new AbsolutePVCoordinates(frame, date, pv);
74  
75          //verify
76          Assertions.assertEquals(date, actual.getDate());
77          Assertions.assertEquals(1, actual.getPosition().getX(), 0);
78          Assertions.assertEquals(2, actual.getPosition().getY(), 0);
79          Assertions.assertEquals(3, actual.getPosition().getZ(), 0);
80          Assertions.assertEquals(4, actual.getVelocity().getX(), 0);
81          Assertions.assertEquals(5, actual.getVelocity().getY(), 0);
82          Assertions.assertEquals(6, actual.getVelocity().getZ(), 0);
83          Assertions.assertEquals(Vector3D.ZERO, actual.getAcceleration());
84      }
85  
86      @Test
87      public void testLinearConstructors() {
88          Frame frame = FramesFactory.getEME2000();
89          AbsolutePVCoordinates pv1 = new AbsolutePVCoordinates(frame,
90                                                                AbsoluteDate.CCSDS_EPOCH,
91                                                                new Vector3D( 1,  0.1,   10),
92                                                                new Vector3D(-1, -0.1,  -10),
93                                                                new Vector3D(10, -1.0, -100));
94          AbsolutePVCoordinates pv2 = new AbsolutePVCoordinates(frame,
95                                                                AbsoluteDate.FIFTIES_EPOCH,
96                                                                new Vector3D( 2,  0.2,   20),
97                                                                new Vector3D(-2, -0.2,  -20),
98                                                                new Vector3D(20, -2.0, -200));
99          AbsolutePVCoordinates pv3 = new AbsolutePVCoordinates(frame,
100                                                               AbsoluteDate.GALILEO_EPOCH,
101                                                               new Vector3D( 3,  0.3,   30),
102                                                               new Vector3D(-3, -0.3,  -30),
103                                                               new Vector3D(30, -3.0, -300));
104         AbsolutePVCoordinates pv4 = new AbsolutePVCoordinates(frame,
105                                                               AbsoluteDate.JULIAN_EPOCH,
106                                                               new Vector3D( 4,  0.4,   40),
107                                                               new Vector3D(-4, -0.4,  -40),
108                                                               new Vector3D(40, -4.0, -400));
109         assertPV(pv4, new AbsolutePVCoordinates(AbsoluteDate.JULIAN_EPOCH, 4, pv1), 1.0e-15);
110         assertPV(pv2, new AbsolutePVCoordinates(AbsoluteDate.FIFTIES_EPOCH, pv1, pv3), 1.0e-15);
111         assertPV(pv3, new AbsolutePVCoordinates(AbsoluteDate.GALILEO_EPOCH, 1, pv1, 1, pv2), 1.0e-15);
112         assertPV(new AbsolutePVCoordinates(AbsoluteDate.J2000_EPOCH, 2, pv4),
113                  new AbsolutePVCoordinates(AbsoluteDate.J2000_EPOCH, 3, pv1, 1, pv2, 1, pv3),
114                  1.0e-15);
115         assertPV(new AbsolutePVCoordinates(AbsoluteDate.J2000_EPOCH, 3, pv3),
116                  new AbsolutePVCoordinates(AbsoluteDate.J2000_EPOCH, 3, pv1, 1, pv2, 1, pv4),
117                  1.0e-15);
118         assertPV(new AbsolutePVCoordinates(AbsoluteDate.J2000_EPOCH, 5, pv4),
119                  new AbsolutePVCoordinates(AbsoluteDate.J2000_EPOCH, 4, pv1, 3, pv2, 2, pv3, 1, pv4),
120                  1.0e-15);
121     }
122 
123     @Test
124     public void testDifferentFrames() {
125         final AbsolutePVCoordinates apv1 = new AbsolutePVCoordinates(FramesFactory.getEME2000(),
126                                                                      AbsoluteDate.ARBITRARY_EPOCH,
127                                                                      Vector3D.ZERO, Vector3D.ZERO, Vector3D.ZERO);
128         final AbsolutePVCoordinates apv2 = new AbsolutePVCoordinates(FramesFactory.getGCRF(),
129                                                                      AbsoluteDate.ARBITRARY_EPOCH,
130                                                                      Vector3D.ZERO, Vector3D.ZERO, Vector3D.ZERO);
131         try {
132             new AbsolutePVCoordinates(AbsoluteDate.ARBITRARY_EPOCH, apv1, apv2);
133             Assertions.fail("an exception should have been thrown");
134         } catch (OrekitIllegalArgumentException oe) {
135             Assertions.assertEquals(OrekitMessages.INCOMPATIBLE_FRAMES, oe.getSpecifier());
136             Assertions.assertEquals(apv1.getFrame().getName(), oe.getParts()[0]);
137             Assertions.assertEquals(apv2.getFrame().getName(), oe.getParts()[1]);
138         }
139     }
140 
141     @Test
142     public void testToDerivativeStructureVector1() {
143         FieldVector3D<DerivativeStructure> fv =
144                 new AbsolutePVCoordinates(FramesFactory.getEME2000(),
145                                           AbsoluteDate.GALILEO_EPOCH,
146                                           new Vector3D( 1,  0.1,  10),
147                                           new Vector3D(-1, -0.1, -10),
148                                           new Vector3D(10, -1.0, -100)).toDerivativeStructureVector(1);
149         Assertions.assertEquals(1, fv.getX().getFreeParameters());
150         Assertions.assertEquals(1, fv.getX().getOrder());
151         Assertions.assertEquals(   1.0, fv.getX().getReal(), 1.0e-10);
152         Assertions.assertEquals(   0.1, fv.getY().getReal(), 1.0e-10);
153         Assertions.assertEquals(  10.0, fv.getZ().getReal(), 1.0e-10);
154         Assertions.assertEquals(  -1.0, fv.getX().getPartialDerivative(1), 1.0e-15);
155         Assertions.assertEquals(  -0.1, fv.getY().getPartialDerivative(1), 1.0e-15);
156         Assertions.assertEquals( -10.0, fv.getZ().getPartialDerivative(1), 1.0e-15);
157         assertPV(new AbsolutePVCoordinates(FramesFactory.getEME2000(),
158                                            AbsoluteDate.GALILEO_EPOCH,
159                                            new Vector3D( 1,  0.1,  10),
160                                            new Vector3D(-1, -0.1, -10),
161                                            Vector3D.ZERO),
162                  new AbsolutePVCoordinates(FramesFactory.getEME2000(),
163                                           AbsoluteDate.GALILEO_EPOCH, fv), 1.0e-15);
164 
165         for (double dt = 0; dt < 10; dt += 0.125) {
166             Vector3D p = new PVCoordinates(new Vector3D( 1,  0.1,  10),
167                                            new Vector3D(-1, -0.1, -10)).shiftedBy(dt).getPosition();
168             Assertions.assertEquals(p.getX(), fv.getX().taylor(dt), 1.0e-14);
169             Assertions.assertEquals(p.getY(), fv.getY().taylor(dt), 1.0e-14);
170             Assertions.assertEquals(p.getZ(), fv.getZ().taylor(dt), 1.0e-14);
171         }
172 
173         AbsolutePVCoordinates pv = new AbsolutePVCoordinates(FramesFactory.getEME2000(),
174                                                              AbsoluteDate.GALILEO_EPOCH,
175                                                              fv);
176         Assertions.assertEquals(   1.0, pv.getPosition().getX(), 1.0e-10);
177         Assertions.assertEquals(   0.1, pv.getPosition().getY(), 1.0e-10);
178         Assertions.assertEquals(  10.0, pv.getPosition().getZ(), 1.0e-10);
179         Assertions.assertEquals(  -1.0, pv.getVelocity().getX(), 1.0e-15);
180         Assertions.assertEquals(  -0.1, pv.getVelocity().getY(), 1.0e-15);
181         Assertions.assertEquals( -10.0, pv.getVelocity().getZ(), 1.0e-15);
182 
183     }
184 
185     @Test
186     public void testToDerivativeStructureVector2() {
187         FieldVector3D<DerivativeStructure> fv =
188                 new AbsolutePVCoordinates(FramesFactory.getEME2000(),
189                                           AbsoluteDate.GALILEO_EPOCH,
190                                           new Vector3D( 1,  0.1,  10),
191                                           new Vector3D(-1, -0.1, -10),
192                                           new Vector3D(10, -1.0, -100)).toDerivativeStructureVector(2);
193         Assertions.assertEquals(1, fv.getX().getFreeParameters());
194         Assertions.assertEquals(2, fv.getX().getOrder());
195         Assertions.assertEquals(   1.0, fv.getX().getReal(), 1.0e-10);
196         Assertions.assertEquals(   0.1, fv.getY().getReal(), 1.0e-10);
197         Assertions.assertEquals(  10.0, fv.getZ().getReal(), 1.0e-10);
198         Assertions.assertEquals(  -1.0, fv.getX().getPartialDerivative(1), 1.0e-15);
199         Assertions.assertEquals(  -0.1, fv.getY().getPartialDerivative(1), 1.0e-15);
200         Assertions.assertEquals( -10.0, fv.getZ().getPartialDerivative(1), 1.0e-15);
201         Assertions.assertEquals(  10.0, fv.getX().getPartialDerivative(2), 1.0e-15);
202         Assertions.assertEquals(  -1.0, fv.getY().getPartialDerivative(2), 1.0e-15);
203         Assertions.assertEquals(-100.0, fv.getZ().getPartialDerivative(2), 1.0e-15);
204         assertPV(new AbsolutePVCoordinates(FramesFactory.getEME2000(),
205                                            AbsoluteDate.GALILEO_EPOCH,
206                                            new Vector3D( 1,  0.1,  10),
207                                            new Vector3D(-1, -0.1, -10),
208                                            new Vector3D(10, -1.0, -100)),
209                  new AbsolutePVCoordinates(FramesFactory.getEME2000(),
210                                           AbsoluteDate.GALILEO_EPOCH, fv), 1.0e-15);
211 
212         for (double dt = 0; dt < 10; dt += 0.125) {
213             Vector3D p = new PVCoordinates(new Vector3D( 1,  0.1,  10),
214                                            new Vector3D(-1, -0.1, -10),
215                                            new Vector3D(10, -1.0, -100)).shiftedBy(dt).getPosition();
216             Assertions.assertEquals(p.getX(), fv.getX().taylor(dt), 1.0e-14);
217             Assertions.assertEquals(p.getY(), fv.getY().taylor(dt), 1.0e-14);
218             Assertions.assertEquals(p.getZ(), fv.getZ().taylor(dt), 1.0e-14);
219         }
220 
221         AbsolutePVCoordinates pv = new AbsolutePVCoordinates(FramesFactory.getEME2000(),
222                                                              AbsoluteDate.GALILEO_EPOCH,
223                                                              fv);
224         Assertions.assertEquals(   1.0, pv.getPosition().getX(), 1.0e-10);
225         Assertions.assertEquals(   0.1, pv.getPosition().getY(), 1.0e-10);
226         Assertions.assertEquals(  10.0, pv.getPosition().getZ(), 1.0e-10);
227         Assertions.assertEquals(  -1.0, pv.getVelocity().getX(), 1.0e-15);
228         Assertions.assertEquals(  -0.1, pv.getVelocity().getY(), 1.0e-15);
229         Assertions.assertEquals( -10.0, pv.getVelocity().getZ(), 1.0e-15);
230         Assertions.assertEquals(  10.0, pv.getAcceleration().getX(), 1.0e-15);
231         Assertions.assertEquals(  -1.0, pv.getAcceleration().getY(), 1.0e-15);
232         Assertions.assertEquals(-100.0, pv.getAcceleration().getZ(), 1.0e-15);
233 
234     }
235 
236     @Test
237     public void testToUnivariateDerivative1Vector() {
238         FieldVector3D<UnivariateDerivative1> fv =
239                 new AbsolutePVCoordinates(FramesFactory.getEME2000(),
240                                           AbsoluteDate.GALILEO_EPOCH,
241                                           new Vector3D( 1,  0.1,  10),
242                                           new Vector3D(-1, -0.1, -10),
243                                           new Vector3D(10, -1.0, -100)).toUnivariateDerivative1Vector();
244         Assertions.assertEquals(1, fv.getX().getFreeParameters());
245         Assertions.assertEquals(1, fv.getX().getOrder());
246         Assertions.assertEquals(   1.0, fv.getX().getReal(), 1.0e-10);
247         Assertions.assertEquals(   0.1, fv.getY().getReal(), 1.0e-10);
248         Assertions.assertEquals(  10.0, fv.getZ().getReal(), 1.0e-10);
249         Assertions.assertEquals(  -1.0, fv.getX().getPartialDerivative(1), 1.0e-15);
250         Assertions.assertEquals(  -0.1, fv.getY().getPartialDerivative(1), 1.0e-15);
251         Assertions.assertEquals( -10.0, fv.getZ().getPartialDerivative(1), 1.0e-15);
252         assertPV(new AbsolutePVCoordinates(FramesFactory.getEME2000(),
253                                            AbsoluteDate.GALILEO_EPOCH,
254                                            new Vector3D( 1,  0.1,  10),
255                                            new Vector3D(-1, -0.1, -10),
256                                            Vector3D.ZERO),
257                  new AbsolutePVCoordinates(FramesFactory.getEME2000(),
258                                           AbsoluteDate.GALILEO_EPOCH, fv), 1.0e-15);
259 
260         for (double dt = 0; dt < 10; dt += 0.125) {
261             Vector3D p = new PVCoordinates(new Vector3D( 1,  0.1,  10),
262                                            new Vector3D(-1, -0.1, -10)).shiftedBy(dt).getPosition();
263             Assertions.assertEquals(p.getX(), fv.getX().taylor(dt), 1.0e-14);
264             Assertions.assertEquals(p.getY(), fv.getY().taylor(dt), 1.0e-14);
265             Assertions.assertEquals(p.getZ(), fv.getZ().taylor(dt), 1.0e-14);
266         }
267 
268         AbsolutePVCoordinates pv = new AbsolutePVCoordinates(FramesFactory.getEME2000(),
269                                                              AbsoluteDate.GALILEO_EPOCH,
270                                                              fv);
271         Assertions.assertEquals(   1.0, pv.getPosition().getX(), 1.0e-10);
272         Assertions.assertEquals(   0.1, pv.getPosition().getY(), 1.0e-10);
273         Assertions.assertEquals(  10.0, pv.getPosition().getZ(), 1.0e-10);
274         Assertions.assertEquals(  -1.0, pv.getVelocity().getX(), 1.0e-15);
275         Assertions.assertEquals(  -0.1, pv.getVelocity().getY(), 1.0e-15);
276         Assertions.assertEquals( -10.0, pv.getVelocity().getZ(), 1.0e-15);
277 
278     }
279 
280     @Test
281     public void testToUnivariateDerivative2Vector() {
282         FieldVector3D<UnivariateDerivative2> fv =
283                 new AbsolutePVCoordinates(FramesFactory.getEME2000(),
284                                           AbsoluteDate.GALILEO_EPOCH,
285                                           new Vector3D( 1,  0.1,  10),
286                                           new Vector3D(-1, -0.1, -10),
287                                           new Vector3D(10, -1.0, -100)).toUnivariateDerivative2Vector();
288         Assertions.assertEquals(1, fv.getX().getFreeParameters());
289         Assertions.assertEquals(2, fv.getX().getOrder());
290         Assertions.assertEquals(   1.0, fv.getX().getReal(), 1.0e-10);
291         Assertions.assertEquals(   0.1, fv.getY().getReal(), 1.0e-10);
292         Assertions.assertEquals(  10.0, fv.getZ().getReal(), 1.0e-10);
293         Assertions.assertEquals(  -1.0, fv.getX().getPartialDerivative(1), 1.0e-15);
294         Assertions.assertEquals(  -0.1, fv.getY().getPartialDerivative(1), 1.0e-15);
295         Assertions.assertEquals( -10.0, fv.getZ().getPartialDerivative(1), 1.0e-15);
296         Assertions.assertEquals(  10.0, fv.getX().getPartialDerivative(2), 1.0e-15);
297         Assertions.assertEquals(  -1.0, fv.getY().getPartialDerivative(2), 1.0e-15);
298         Assertions.assertEquals(-100.0, fv.getZ().getPartialDerivative(2), 1.0e-15);
299         assertPV(new AbsolutePVCoordinates(FramesFactory.getEME2000(),
300                                            AbsoluteDate.GALILEO_EPOCH,
301                                            new Vector3D( 1,  0.1,  10),
302                                            new Vector3D(-1, -0.1, -10),
303                                            new Vector3D(10, -1.0, -100)),
304                  new AbsolutePVCoordinates(FramesFactory.getEME2000(),
305                                           AbsoluteDate.GALILEO_EPOCH, fv), 1.0e-15);
306 
307         for (double dt = 0; dt < 10; dt += 0.125) {
308             Vector3D p = new PVCoordinates(new Vector3D( 1,  0.1,  10),
309                                            new Vector3D(-1, -0.1, -10),
310                                            new Vector3D(10, -1.0, -100)).shiftedBy(dt).getPosition();
311             Assertions.assertEquals(p.getX(), fv.getX().taylor(dt), 1.0e-14);
312             Assertions.assertEquals(p.getY(), fv.getY().taylor(dt), 1.0e-14);
313             Assertions.assertEquals(p.getZ(), fv.getZ().taylor(dt), 1.0e-14);
314         }
315 
316         AbsolutePVCoordinates pv = new AbsolutePVCoordinates(FramesFactory.getEME2000(),
317                                                              AbsoluteDate.GALILEO_EPOCH,
318                                                              fv);
319         Assertions.assertEquals(   1.0, pv.getPosition().getX(), 1.0e-10);
320         Assertions.assertEquals(   0.1, pv.getPosition().getY(), 1.0e-10);
321         Assertions.assertEquals(  10.0, pv.getPosition().getZ(), 1.0e-10);
322         Assertions.assertEquals(  -1.0, pv.getVelocity().getX(), 1.0e-15);
323         Assertions.assertEquals(  -0.1, pv.getVelocity().getY(), 1.0e-15);
324         Assertions.assertEquals( -10.0, pv.getVelocity().getZ(), 1.0e-15);
325         Assertions.assertEquals(  10.0, pv.getAcceleration().getX(), 1.0e-15);
326         Assertions.assertEquals(  -1.0, pv.getAcceleration().getY(), 1.0e-15);
327         Assertions.assertEquals(-100.0, pv.getAcceleration().getZ(), 1.0e-15);
328 
329     }
330 
331     @Test
332     public void testShift() {
333         Vector3D p1 = new Vector3D(  1,  0.1,   10);
334         Vector3D v1 = new Vector3D( -1, -0.1,  -10);
335         Vector3D a1 = new Vector3D( 10,  1.0,  100);
336         Vector3D p2 = new Vector3D(  7,  0.7,   70);
337         Vector3D v2 = new Vector3D(-11, -1.1, -110);
338         Vector3D a2 = new Vector3D( 10,  1.0,  100);
339         assertPV(new AbsolutePVCoordinates(FramesFactory.getEME2000(), AbsoluteDate.J2000_EPOCH, p2, v2, a2),
340                  new AbsolutePVCoordinates(FramesFactory.getEME2000(), AbsoluteDate.J2000_EPOCH.shiftedBy(1.0), p1, v1, a1).shiftedBy(-1.0), 1.0e-15);
341         Assertions.assertEquals(0.0, AbsolutePVCoordinates.estimateVelocity(p1, p2, -1.0).subtract(new Vector3D(-6, -0.6, -60)).getNorm(), 1.0e-15);
342     }
343 
344     @Test
345     public void testToString() {
346         AbsolutePVCoordinates pv =
347             new AbsolutePVCoordinates(FramesFactory.getEME2000(),
348                                       AbsoluteDate.J2000_EPOCH,
349                                       new Vector3D( 1,   0.1,  10),
350                                       new Vector3D(-1,  -0.1, -10),
351                                       new Vector3D(10,   1.0, 100));
352         Assertions.assertEquals("{2000-01-01T11:58:55.816, P(1.0, 0.1, 10.0), V(-1.0, -0.1, -10.0), A(10.0, 1.0, 100.0)}", pv.toString());
353     }
354 
355     @Test
356     public void testSamePV() {
357         //setup
358         AbsoluteDate date = AbsoluteDate.J2000_EPOCH;
359         Frame frame = FramesFactory.getEME2000();
360         Vector3D p = new Vector3D(1, 2, 3);
361         Vector3D v = new Vector3D(4, 5, 6);
362         Frame otherEme2000 = new Frame(frame, Transform.IDENTITY, "other-EME2000");
363 
364         //action
365         AbsolutePVCoordinates actual = new AbsolutePVCoordinates(frame, date, p, v);
366 
367         //verify
368         Assertions.assertSame(actual.getPosition(), actual.getPosition(frame));
369         Assertions.assertNotSame(actual.getPosition(), actual.getPosition(otherEme2000));
370         Assertions.assertEquals(0.0,
371                                 Vector3D.distance(actual.getPosition(frame),
372                                                   actual.getPosition(otherEme2000)),
373                                 1.0e-15);
374         Assertions.assertEquals(0.0,
375                                 Vector3D.distance(actual.getPVCoordinates(frame).getPosition(),
376                                                   actual.getPVCoordinates(date, frame).getPosition()),
377                                 1.0e-15);
378         Assertions.assertEquals(0.0,
379                                 Vector3D.distance(actual.getPVCoordinates(frame).getVelocity(),
380                                                   actual.getPVCoordinates(date, frame).getVelocity()),
381                                 1.0e-15);
382         Assertions.assertEquals(0.0,
383                                 Vector3D.distance(actual.getPVCoordinates(frame).getAcceleration(),
384                                                   actual.getPVCoordinates(date, frame).getAcceleration()),
385                                 1.0e-15);
386         Assertions.assertEquals(0.0,
387                                 Vector3D.distance(actual.getPVCoordinates(frame).getPosition(),
388                                                   actual.getPVCoordinates(date, otherEme2000).getPosition()),
389                                 1.0e-15);
390         Assertions.assertEquals(0.0,
391                                 Vector3D.distance(actual.getPVCoordinates(frame).getVelocity(),
392                                                   actual.getPVCoordinates(date, otherEme2000).getVelocity()),
393                                 1.0e-15);
394         Assertions.assertEquals(0.0,
395                                 Vector3D.distance(actual.getPVCoordinates(frame).getAcceleration(),
396                                                   actual.getPVCoordinates(date, otherEme2000).getAcceleration()),
397                                 1.0e-15);
398     }
399 
400     @Test
401     public void testIssue1557(){
402         // GIVEN
403         final AbsolutePVCoordinates absPV = TestUtils.getFakeAbsolutePVCoordinates();
404 
405         // WHEN
406         final Vector3D velocity = absPV.getVelocity(absPV.getDate(), absPV.getFrame());
407 
408         // THEN
409         final PVCoordinates refPV = absPV.getPVCoordinates();
410         Assertions.assertEquals(refPV.getVelocity(), velocity);
411     }
412 
413     @Test
414     public void testTaylorProvider() {
415         //setup
416         AbsoluteDate date = AbsoluteDate.J2000_EPOCH;
417         Frame frame = FramesFactory.getEME2000();
418         Vector3D p = new Vector3D(1, 2, 3);
419         Vector3D v = new Vector3D(4, 5, 6);
420 
421         //action
422         AbsolutePVCoordinates actual = new AbsolutePVCoordinates(frame, date, p, v);
423         final PVCoordinatesProvider pv = actual.toTaylorProvider();
424 
425         //verify 
426         Assertions.assertEquals(0.0,
427                                 Vector3D.distance(actual.getPosition(date, frame), pv.getPosition(date, frame)),
428                                 1.0e-15);
429         Assertions.assertEquals(actual.getPVCoordinates(date, frame).toString(), pv.getPVCoordinates(date, frame).toString());
430 
431     }
432 
433     public static void assertPV(TimeStampedPVCoordinates expected, TimeStampedPVCoordinates real, double epsilon) {
434         Assertions.assertTrue(expected.getDate().isCloseTo(real.getDate(), epsilon));
435         Assertions.assertEquals(expected.getPosition().getX(), real.getPosition().getX(), epsilon);
436         Assertions.assertEquals(expected.getPosition().getY(), real.getPosition().getY(), epsilon);
437         Assertions.assertEquals(expected.getPosition().getZ(), real.getPosition().getZ(), epsilon);
438         Assertions.assertEquals(expected.getVelocity().getX(), real.getVelocity().getX(), epsilon);
439         Assertions.assertEquals(expected.getVelocity().getY(), real.getVelocity().getY(), epsilon);
440         Assertions.assertEquals(expected.getVelocity().getZ(), real.getVelocity().getZ(), epsilon);
441         Assertions.assertEquals(expected.getAcceleration().getX(), real.getAcceleration().getX(), epsilon);
442         Assertions.assertEquals(expected.getAcceleration().getY(), real.getAcceleration().getY(), epsilon);
443         Assertions.assertEquals(expected.getAcceleration().getZ(), real.getAcceleration().getZ(), epsilon);
444     }
445 
446 }