View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF 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    *      https://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  
18  /*
19   * This is not the original file distributed by the Apache Software Foundation
20   * It has been modified by the Hipparchus project
21   */
22  
23  package org.hipparchus.geometry.euclidean.threed;
24  
25  import org.hipparchus.Field;
26  import org.hipparchus.analysis.differentiation.DSFactory;
27  import org.hipparchus.analysis.differentiation.DerivativeStructure;
28  import org.hipparchus.exception.MathIllegalArgumentException;
29  import org.hipparchus.exception.MathRuntimeException;
30  import org.hipparchus.random.Well1024a;
31  import org.hipparchus.util.Binary64;
32  import org.hipparchus.util.Binary64Field;
33  import org.hipparchus.util.FastMath;
34  import org.hipparchus.util.Precision;
35  import org.junit.jupiter.api.Test;
36  
37  import java.text.DecimalFormat;
38  import java.text.DecimalFormatSymbols;
39  import java.text.NumberFormat;
40  import java.util.Locale;
41  
42  import static org.junit.jupiter.api.Assertions.assertEquals;
43  import static org.junit.jupiter.api.Assertions.assertFalse;
44  import static org.junit.jupiter.api.Assertions.assertNotEquals;
45  import static org.junit.jupiter.api.Assertions.assertNotSame;
46  import static org.junit.jupiter.api.Assertions.assertThrows;
47  import static org.junit.jupiter.api.Assertions.assertTrue;
48  import static org.junit.jupiter.api.Assertions.fail;
49  
50  class FieldVector3DTest {
51  
52      @Test
53      void testConstructors() throws MathIllegalArgumentException {
54          double cosAlpha = 1 / 2.0;
55          double sinAlpha = FastMath.sqrt(3) / 2.0;
56          double cosDelta = FastMath.sqrt(2) / 2.0;
57          double sinDelta = -FastMath.sqrt(2) / 2.0;
58          DSFactory factory21 = new DSFactory(2, 1);
59          DSFactory factory31 = new DSFactory(3, 1);
60          DSFactory factory41 = new DSFactory(4, 1);
61          FieldVector3D<DerivativeStructure> u = new FieldVector3D<>(2,
62                                                                     new FieldVector3D<>(factory21.variable(0,  FastMath.PI / 3),
63                                                                                         factory21.variable(1, -FastMath.PI / 4)));
64          checkVector(u, 2 * cosAlpha * cosDelta, 2 * sinAlpha * cosDelta, 2 * sinDelta);
65          assertEquals(-2 * sinAlpha * cosDelta, u.getX().getPartialDerivative(1, 0), 1.0e-12);
66          assertEquals(+2 * cosAlpha * cosDelta, u.getY().getPartialDerivative(1, 0), 1.0e-12);
67          assertEquals(0,                        u.getZ().getPartialDerivative(1, 0), 1.0e-12);
68          assertEquals(-2 * cosAlpha * sinDelta, u.getX().getPartialDerivative(0, 1), 1.0e-12);
69          assertEquals(-2 * sinAlpha * sinDelta, u.getY().getPartialDerivative(0, 1), 1.0e-12);
70          assertEquals(2 * cosDelta,             u.getZ().getPartialDerivative(0, 1), 1.0e-12);
71  
72          checkVector(new FieldVector3D<>(2, createVector(1, 0,  0, 3)),
73                      2, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2);
74          checkVector(new FieldVector3D<>(factory41.variable(3,  2.0),
75                                          createVector(1, 0,  0, 4)),
76                      2, 0, 0, 2, 0, 0, 1, 0, 2, 0, 0, 0, 0, 2, 0);
77          checkVector(new FieldVector3D<>(factory41.variable(3,  2.0),
78                                          new Vector3D(1, 0,  0)),
79                      2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0);
80  
81          checkVector(new FieldVector3D<>(2, createVector(1, 0,  0, 3),
82                                         -3, createVector(0, 0, -1, 3)),
83                      2, 0, 3, -1, 0, 0, 0, -1, 0, 0, 0, -1);
84          checkVector(new FieldVector3D<>(factory41.variable(3,  2.0),
85                                          createVector(1, 0,  0, 4),
86                                          factory41.variable(3, -3.0),
87                                          createVector(0, 0, -1, 4)),
88                      2, 0, 3, -1, 0, 0, 1, 0, -1, 0, 0, 0, 0, -1, -1);
89          checkVector(new FieldVector3D<>(factory41.variable(3,  2.0),
90                                          new Vector3D(1, 0,  0),
91                                          factory41.variable(3, -3.0),
92                                          new Vector3D(0, 0, -1)),
93                      2, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1);
94  
95          checkVector(new FieldVector3D<>(2, createVector(1, 0, 0, 3),
96                                          5, createVector(0, 1, 0, 3),
97                                         -3, createVector(0, 0, -1, 3)),
98                      2, 5, 3, 4, 0, 0, 0, 4, 0, 0, 0, 4);
99          checkVector(new FieldVector3D<>(factory41.variable(3,  2.0),
100                                         createVector(1, 0,  0, 4),
101                                         factory41.variable(3,  5.0),
102                                         createVector(0, 1,  0, 4),
103                                         factory41.variable(3, -3.0),
104                                         createVector(0, 0, -1, 4)),
105                     2, 5, 3, 4, 0, 0, 1, 0, 4, 0, 1, 0, 0, 4, -1);
106         checkVector(new FieldVector3D<>(factory41.variable(3,  2.0),
107                                         new Vector3D(1, 0,  0),
108                                         factory41.variable(3,  5.0),
109                                         new Vector3D(0, 1,  0),
110                                         factory41.variable(3, -3.0),
111                                         new Vector3D(0, 0, -1)),
112                     2, 5, 3, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, -1);
113 
114         checkVector(new FieldVector3D<>(2, createVector(1, 0, 0, 3),
115                                         5, createVector(0, 1, 0, 3),
116                                         5, createVector(0, -1, 0, 3),
117                                        -3, createVector(0, 0, -1, 3)),
118                     2, 0, 3, 9, 0, 0, 0, 9, 0, 0, 0, 9);
119         checkVector(new FieldVector3D<>(factory41.variable(3,  2.0),
120                                         createVector(1, 0,  0, 4),
121                                         factory41.variable(3,  5.0),
122                                         createVector(0, 1,  0, 4),
123                                         factory41.variable(3,  5.0),
124                                         createVector(0, -1,  0, 4),
125                                         factory41.variable(3, -3.0),
126                                         createVector(0, 0, -1, 4)),
127                     2, 0, 3, 9, 0, 0, 1, 0, 9, 0, 0, 0, 0, 9, -1);
128         checkVector(new FieldVector3D<>(factory41.variable(3,  2.0),
129                                         new Vector3D(1, 0,  0),
130                                         factory41.variable(3,  5.0),
131                                         new Vector3D(0, 1,  0),
132                                         factory41.variable(3,  5.0),
133                                         new Vector3D(0, -1,  0),
134                                         factory41.variable(3, -3.0),
135                                         new Vector3D(0, 0, -1)),
136                     2, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1);
137 
138         checkVector(new FieldVector3D<DerivativeStructure>(new DerivativeStructure[] {
139             factory31.variable(2,  2),
140             factory31.variable(1,  5),
141             factory31.variable(0, -3)
142         }),
143         2, 5, -3, 0, 0, 1, 0, 1, 0, 1, 0, 0);
144 
145     }
146 
147     @SuppressWarnings("unlikely-arg-type")
148     @Test
149     void testEquals() {
150         DSFactory factory31 = new DSFactory(3, 1);
151         FieldVector3D<DerivativeStructure> u1 = createVector(1, 2, 3, 3);
152         FieldVector3D<DerivativeStructure> v  = createVector(1, 2, 3 + 10 * Precision.EPSILON, 3);
153         assertEquals(u1, u1);
154         assertEquals(u1, new FieldVector3D<>(factory31.variable(0, 1.0),
155             factory31.variable(1, 2.0),
156             factory31.variable(2, 3.0)));
157         assertNotEquals(u1, new FieldVector3D<>(factory31.constant(1.0),
158             factory31.variable(1, 2.0),
159             factory31.variable(2, 3.0)));
160         assertNotEquals(u1, new FieldVector3D<>(factory31.variable(0, 1.0),
161             factory31.constant(2.0),
162             factory31.variable(2, 3.0)));
163         assertNotEquals(u1, new FieldVector3D<>(factory31.variable(0, 1.0),
164             factory31.variable(1, 2.0),
165             factory31.constant(3.0)));
166         assertNotEquals(u1, v);
167         assertNotEquals(u1, u1.toVector3D());
168         assertEquals(createVector(0, Double.NaN, 0, 3), createVector(0, 0, Double.NaN, 3));
169     }
170 
171     @Test
172     void testHash() {
173         assertEquals(createVector(0, Double.NaN, 0, 3).hashCode(), createVector(0, 0, Double.NaN, 3).hashCode());
174         FieldVector3D<DerivativeStructure> u = createVector(1, 2, 3, 3);
175         FieldVector3D<DerivativeStructure> v = createVector(1, 2, 3 + 10 * Precision.EPSILON, 3);
176         assertTrue(u.hashCode() != v.hashCode());
177     }
178 
179     @Test
180     void testInfinite() {
181         assertTrue(createVector(1, 1, Double.NEGATIVE_INFINITY, 3).isInfinite());
182         assertTrue(createVector(1, Double.NEGATIVE_INFINITY, 1, 3).isInfinite());
183         assertTrue(createVector(Double.NEGATIVE_INFINITY, 1, 1, 3).isInfinite());
184         assertFalse(createVector(1, 1, 2, 3).isInfinite());
185         assertFalse(createVector(1, Double.NaN, Double.NEGATIVE_INFINITY, 3).isInfinite());
186     }
187 
188     @Test
189     void testNaN() {
190         assertTrue(createVector(1, 1, Double.NaN, 3).isNaN());
191         assertTrue(createVector(1, Double.NaN, 1, 3).isNaN());
192         assertTrue(createVector(Double.NaN, 1, 1, 3).isNaN());
193         assertFalse(createVector(1, 1, 2, 3).isNaN());
194         assertFalse(createVector(1, 1, Double.NEGATIVE_INFINITY, 3).isNaN());
195     }
196 
197     @Test
198     void testCanonical() {
199 
200         final Field<Binary64> field = Binary64Field.getInstance();
201 
202         assertEquals(0.0, FieldVector3D.getZero(field).getNorm().getReal(), 1.0e-20);
203         assertEquals(0.0, FieldVector3D.angle(FieldVector3D.getPlusI(field), Vector3D.PLUS_I).getReal(),   1.0e-20);
204         assertEquals(0.0, FieldVector3D.angle(FieldVector3D.getMinusI(field), Vector3D.MINUS_I).getReal(), 1.0e-20);
205         assertEquals(0.0, FieldVector3D.angle(FieldVector3D.getPlusJ(field), Vector3D.PLUS_J).getReal(),   1.0e-20);
206         assertEquals(0.0, FieldVector3D.angle(FieldVector3D.getMinusJ(field), Vector3D.MINUS_J).getReal(), 1.0e-20);
207         assertEquals(0.0, FieldVector3D.angle(FieldVector3D.getPlusK(field), Vector3D.PLUS_K).getReal(),   1.0e-20);
208         assertEquals(0.0, FieldVector3D.angle(FieldVector3D.getMinusK(field), Vector3D.MINUS_K).getReal(), 1.0e-20);
209         assertTrue(FieldVector3D.getNaN(field).isNaN());
210         assertTrue(FieldVector3D.getPositiveInfinity(field).isInfinite());
211         assertTrue(FieldVector3D.getNegativeInfinity(field).isInfinite());
212 
213         // new instances are created each time
214         assertNotSame(FieldVector3D.getZero(field),            FieldVector3D.getZero(field));
215         assertNotSame(FieldVector3D.getPlusI(field),           FieldVector3D.getPlusI(field));
216         assertNotSame(FieldVector3D.getMinusI(field),          FieldVector3D.getMinusI(field));
217         assertNotSame(FieldVector3D.getPlusJ(field),           FieldVector3D.getPlusJ(field));
218         assertNotSame(FieldVector3D.getMinusJ(field),          FieldVector3D.getMinusJ(field));
219         assertNotSame(FieldVector3D.getPlusK(field),           FieldVector3D.getPlusK(field));
220         assertNotSame(FieldVector3D.getMinusK(field),          FieldVector3D.getMinusK(field));
221         assertNotSame(FieldVector3D.getNaN(field),             FieldVector3D.getNaN(field));
222         assertNotSame(FieldVector3D.getPositiveInfinity(field),FieldVector3D.getPositiveInfinity(field));
223         assertNotSame(FieldVector3D.getNegativeInfinity(field),FieldVector3D.getNegativeInfinity(field));
224 
225     }
226 
227     @Test
228     void testToString() {
229         assertEquals("{3; 2; 1}", createVector(3, 2, 1, 3).toString());
230         NumberFormat format = new DecimalFormat("0.000", new DecimalFormatSymbols(Locale.US));
231         assertEquals("{3.000; 2.000; 1.000}", createVector(3, 2, 1, 3).toString(format));
232     }
233 
234     @Test
235     void testWrongDimension() throws MathIllegalArgumentException {
236         assertThrows(MathIllegalArgumentException.class, () -> {
237             DSFactory factory31 = new DSFactory(3, 1);
238             new FieldVector3D<DerivativeStructure>(new DerivativeStructure[]{
239                 factory31.variable(0, 2),
240                 factory31.variable(0, 5)
241             });
242         });
243     }
244 
245     @Test
246     void testCoordinates() {
247         FieldVector3D<DerivativeStructure> v = createVector(1, 2, 3, 3);
248         assertTrue(FastMath.abs(v.getX().getReal() - 1) < 1.0e-12);
249         assertTrue(FastMath.abs(v.getY().getReal() - 2) < 1.0e-12);
250         assertTrue(FastMath.abs(v.getZ().getReal() - 3) < 1.0e-12);
251         DerivativeStructure[] coordinates = v.toArray();
252         assertTrue(FastMath.abs(coordinates[0].getReal() - 1) < 1.0e-12);
253         assertTrue(FastMath.abs(coordinates[1].getReal() - 2) < 1.0e-12);
254         assertTrue(FastMath.abs(coordinates[2].getReal() - 3) < 1.0e-12);
255     }
256 
257     @Test
258     void testNorm1() {
259         assertEquals( 0.0, createVector(0, 0, 0, 3).getNorm1().getReal(), 0);
260         assertEquals( 6.0, createVector(1, -2, 3, 3).getNorm1().getReal(), 0);
261         assertEquals( 1.0, createVector(1, -2, 3, 3).getNorm1().getPartialDerivative(1, 0, 0), 0);
262         assertEquals(-1.0, createVector(1, -2, 3, 3).getNorm1().getPartialDerivative(0, 1, 0), 0);
263         assertEquals( 1.0, createVector(1, -2, 3, 3).getNorm1().getPartialDerivative(0, 0, 1), 0);
264     }
265 
266     @Test
267     void testNorm() {
268         double r = FastMath.sqrt(14);
269         assertEquals(0.0, createVector(0, 0, 0, 3).getNorm().getReal(), 0);
270         assertEquals(r, createVector(1, 2, 3, 3).getNorm().getReal(), 1.0e-12);
271         assertEquals( 1.0 / r, createVector(1, 2, 3, 3).getNorm().getPartialDerivative(1, 0, 0), 0);
272         assertEquals( 2.0 / r, createVector(1, 2, 3, 3).getNorm().getPartialDerivative(0, 1, 0), 0);
273         assertEquals( 3.0 / r, createVector(1, 2, 3, 3).getNorm().getPartialDerivative(0, 0, 1), 0);
274     }
275 
276     @Test
277     void testNormSq() {
278         assertEquals(0.0, createVector(0, 0, 0, 3).getNormSq().getReal(), 0);
279         assertEquals(14, createVector(1, 2, 3, 3).getNormSq().getReal(), 1.0e-12);
280         assertEquals( 2, createVector(1, 2, 3, 3).getNormSq().getPartialDerivative(1, 0, 0), 0);
281         assertEquals( 4, createVector(1, 2, 3, 3).getNormSq().getPartialDerivative(0, 1, 0), 0);
282         assertEquals( 6, createVector(1, 2, 3, 3).getNormSq().getPartialDerivative(0, 0, 1), 0);
283     }
284 
285     @Test
286     void testNormInf() {
287         assertEquals( 0.0, createVector(0, 0, 0, 3).getNormInf().getReal(), 0);
288         assertEquals( 3.0, createVector(1, -2, 3, 3).getNormInf().getReal(), 0);
289         assertEquals( 0.0, createVector(1, -2, 3, 3).getNormInf().getPartialDerivative(1, 0, 0), 0);
290         assertEquals( 0.0, createVector(1, -2, 3, 3).getNormInf().getPartialDerivative(0, 1, 0), 0);
291         assertEquals( 1.0, createVector(1, -2, 3, 3).getNormInf().getPartialDerivative(0, 0, 1), 0);
292         assertEquals( 3.0, createVector(2, -1, 3, 3).getNormInf().getReal(), 0);
293         assertEquals( 0.0, createVector(2, -1, 3, 3).getNormInf().getPartialDerivative(1, 0, 0), 0);
294         assertEquals( 0.0, createVector(2, -1, 3, 3).getNormInf().getPartialDerivative(0, 1, 0), 0);
295         assertEquals( 1.0, createVector(2, -1, 3, 3).getNormInf().getPartialDerivative(0, 0, 1), 0);
296         assertEquals( 3.0, createVector(1, -3, 2, 3).getNormInf().getReal(), 0);
297         assertEquals( 0.0, createVector(1, -3, 2, 3).getNormInf().getPartialDerivative(1, 0, 0), 0);
298         assertEquals(-1.0, createVector(1, -3, 2, 3).getNormInf().getPartialDerivative(0, 1, 0), 0);
299         assertEquals( 0.0, createVector(1, -3, 2, 3).getNormInf().getPartialDerivative(0, 0, 1), 0);
300         assertEquals( 3.0, createVector(2, -3, 1, 3).getNormInf().getReal(), 0);
301         assertEquals( 0.0, createVector(2, -3, 1, 3).getNormInf().getPartialDerivative(1, 0, 0), 0);
302         assertEquals(-1.0, createVector(2, -3, 1, 3).getNormInf().getPartialDerivative(0, 1, 0), 0);
303         assertEquals( 0.0, createVector(2, -3, 1, 3).getNormInf().getPartialDerivative(0, 0, 1), 0);
304         assertEquals( 3.0, createVector(3, -1, 2, 3).getNormInf().getReal(), 0);
305         assertEquals( 1.0, createVector(3, -1, 2, 3).getNormInf().getPartialDerivative(1, 0, 0), 0);
306         assertEquals( 0.0, createVector(3, -1, 2, 3).getNormInf().getPartialDerivative(0, 1, 0), 0);
307         assertEquals( 0.0, createVector(3, -1, 2, 3).getNormInf().getPartialDerivative(0, 0, 1), 0);
308         assertEquals( 3.0, createVector(3, -2, 1, 3).getNormInf().getReal(), 0);
309         assertEquals( 1.0, createVector(3, -2, 1, 3).getNormInf().getPartialDerivative(1, 0, 0), 0);
310         assertEquals( 0.0, createVector(3, -2, 1, 3).getNormInf().getPartialDerivative(0, 1, 0), 0);
311         assertEquals( 0.0, createVector(3, -2, 1, 3).getNormInf().getPartialDerivative(0, 0, 1), 0);
312     }
313 
314     @Test
315     void testDistance1() {
316         FieldVector3D<DerivativeStructure> v1 = createVector(1, -2, 3, 3);
317         FieldVector3D<DerivativeStructure> v2 = createVector(-4, 2, 0, 3);
318         assertEquals(0.0, FieldVector3D.distance1(createVector(-1, 0, 0, 3), createVector(-1, 0, 0, 3)).getReal(), 0);
319         DerivativeStructure distance = FieldVector3D.distance1(v1, v2);
320         assertEquals(12.0, distance.getReal(), 1.0e-12);
321         assertEquals(0, distance.getPartialDerivative(1, 0, 0), 1.0e-12);
322         assertEquals(0, distance.getPartialDerivative(0, 1, 0), 1.0e-12);
323         assertEquals(0, distance.getPartialDerivative(0, 0, 1), 1.0e-12);
324         distance = FieldVector3D.distance1(v1, new Vector3D(-4, 2, 0));
325         assertEquals(12.0, distance.getReal(), 1.0e-12);
326         assertEquals( 1, distance.getPartialDerivative(1, 0, 0), 1.0e-12);
327         assertEquals(-1, distance.getPartialDerivative(0, 1, 0), 1.0e-12);
328         assertEquals( 1, distance.getPartialDerivative(0, 0, 1), 1.0e-12);
329         distance = FieldVector3D.distance1(new Vector3D(-4, 2, 0), v1);
330         assertEquals(12.0, distance.getReal(), 1.0e-12);
331         assertEquals( 1, distance.getPartialDerivative(1, 0, 0), 1.0e-12);
332         assertEquals(-1, distance.getPartialDerivative(0, 1, 0), 1.0e-12);
333         assertEquals( 1, distance.getPartialDerivative(0, 0, 1), 1.0e-12);
334     }
335 
336     @Test
337     void testDistance() {
338         FieldVector3D<DerivativeStructure> v1 = createVector(1, -2, 3, 3);
339         FieldVector3D<DerivativeStructure> v2 = createVector(-4, 2, 0, 3);
340         assertEquals(0.0, FieldVector3D.distance(createVector(-1, 0, 0, 3), createVector(-1, 0, 0, 3)).getReal(), 0);
341         DerivativeStructure distance = FieldVector3D.distance(v1, v2);
342         assertEquals(FastMath.sqrt(50), distance.getReal(), 1.0e-12);
343         assertEquals(0, distance.getPartialDerivative(1, 0, 0), 1.0e-12);
344         assertEquals(0, distance.getPartialDerivative(0, 1, 0), 1.0e-12);
345         assertEquals(0, distance.getPartialDerivative(0, 0, 1), 1.0e-12);
346         distance = FieldVector3D.distance(v1, new Vector3D(-4, 2, 0));
347         assertEquals(FastMath.sqrt(50), distance.getReal(), 1.0e-12);
348         assertEquals( 5 / FastMath.sqrt(50), distance.getPartialDerivative(1, 0, 0), 1.0e-12);
349         assertEquals(-4 / FastMath.sqrt(50), distance.getPartialDerivative(0, 1, 0), 1.0e-12);
350         assertEquals( 3 / FastMath.sqrt(50), distance.getPartialDerivative(0, 0, 1), 1.0e-12);
351         distance = FieldVector3D.distance(new Vector3D(-4, 2, 0), v1);
352         assertEquals(FastMath.sqrt(50), distance.getReal(), 1.0e-12);
353         assertEquals( 5 / FastMath.sqrt(50), distance.getPartialDerivative(1, 0, 0), 1.0e-12);
354         assertEquals(-4 / FastMath.sqrt(50), distance.getPartialDerivative(0, 1, 0), 1.0e-12);
355         assertEquals( 3 / FastMath.sqrt(50), distance.getPartialDerivative(0, 0, 1), 1.0e-12);
356     }
357 
358     @Test
359     void testDistanceSq() {
360         FieldVector3D<DerivativeStructure> v1 = createVector(1, -2, 3, 3);
361         FieldVector3D<DerivativeStructure> v2 = createVector(-4, 2, 0, 3);
362         assertEquals(0.0, FieldVector3D.distanceSq(createVector(-1, 0, 0, 3), createVector(-1, 0, 0, 3)).getReal(), 0);
363         DerivativeStructure distanceSq = FieldVector3D.distanceSq(v1, v2);
364         assertEquals(50.0, distanceSq.getReal(), 1.0e-12);
365         assertEquals(0, distanceSq.getPartialDerivative(1, 0, 0), 1.0e-12);
366         assertEquals(0, distanceSq.getPartialDerivative(0, 1, 0), 1.0e-12);
367         assertEquals(0, distanceSq.getPartialDerivative(0, 0, 1), 1.0e-12);
368         distanceSq = FieldVector3D.distanceSq(v1, new Vector3D(-4, 2, 0));
369         assertEquals(50.0, distanceSq.getReal(), 1.0e-12);
370         assertEquals(10, distanceSq.getPartialDerivative(1, 0, 0), 1.0e-12);
371         assertEquals(-8, distanceSq.getPartialDerivative(0, 1, 0), 1.0e-12);
372         assertEquals( 6, distanceSq.getPartialDerivative(0, 0, 1), 1.0e-12);
373         distanceSq = FieldVector3D.distanceSq(new Vector3D(-4, 2, 0), v1);
374         assertEquals(50.0, distanceSq.getReal(), 1.0e-12);
375         assertEquals(10, distanceSq.getPartialDerivative(1, 0, 0), 1.0e-12);
376         assertEquals(-8, distanceSq.getPartialDerivative(0, 1, 0), 1.0e-12);
377         assertEquals( 6, distanceSq.getPartialDerivative(0, 0, 1), 1.0e-12);
378   }
379 
380     @Test
381     void testDistanceInf() {
382         FieldVector3D<DerivativeStructure> v1 = createVector(1, -2, 3, 3);
383         FieldVector3D<DerivativeStructure> v2 = createVector(-4, 2, 0, 3);
384         assertEquals(0.0, FieldVector3D.distanceInf(createVector(-1, 0, 0, 3), createVector(-1, 0, 0, 3)).getReal(), 0);
385         DerivativeStructure distance = FieldVector3D.distanceInf(v1, v2);
386         assertEquals(5.0, distance.getReal(), 1.0e-12);
387         assertEquals(0, distance.getPartialDerivative(1, 0, 0), 1.0e-12);
388         assertEquals(0, distance.getPartialDerivative(0, 1, 0), 1.0e-12);
389         assertEquals(0, distance.getPartialDerivative(0, 0, 1), 1.0e-12);
390         distance = FieldVector3D.distanceInf(v1, new Vector3D(-4, 2, 0));
391         assertEquals(5.0, distance.getReal(), 1.0e-12);
392         assertEquals(1, distance.getPartialDerivative(1, 0, 0), 1.0e-12);
393         assertEquals(0, distance.getPartialDerivative(0, 1, 0), 1.0e-12);
394         assertEquals(0, distance.getPartialDerivative(0, 0, 1), 1.0e-12);
395         distance = FieldVector3D.distanceInf(new Vector3D(-4, 2, 0), v1);
396         assertEquals(5.0, distance.getReal(), 1.0e-12);
397         assertEquals(1, distance.getPartialDerivative(1, 0, 0), 1.0e-12);
398         assertEquals(0, distance.getPartialDerivative(0, 1, 0), 1.0e-12);
399         assertEquals(0, distance.getPartialDerivative(0, 0, 1), 1.0e-12);
400         assertEquals(v1.subtract(v2).getNormInf().getReal(), FieldVector3D.distanceInf(v1, v2).getReal(), 1.0e-12);
401 
402         assertEquals(5.0,
403                             FieldVector3D.distanceInf(createVector( 1, -2, 3, 3), createVector(-4,  2, 0, 3)).getReal(),
404                             1.0e-12);
405         assertEquals(5.0,
406                             FieldVector3D.distanceInf(createVector( 1, 3, -2, 3), createVector(-4, 0,  2, 3)).getReal(),
407                             1.0e-12);
408         assertEquals(5.0,
409                             FieldVector3D.distanceInf(createVector(-2,  1, 3, 3), createVector( 2, -4, 0, 3)).getReal(),
410                             1.0e-12);
411         assertEquals(5.0,
412                             FieldVector3D.distanceInf(createVector(-2, 3,  1, 3), createVector( 2, 0, -4, 3)).getReal(),
413                             1.0e-12);
414         assertEquals(5.0,
415                             FieldVector3D.distanceInf(createVector(3, -2,  1, 3), createVector(0,  2, -4, 3)).getReal(),
416                             1.0e-12);
417         assertEquals(5.0,
418                             FieldVector3D.distanceInf(createVector(3,  1, -2, 3), createVector(0, -4,  2, 3)).getReal(),
419                             1.0e-12);
420 
421         assertEquals(5.0,
422                             FieldVector3D.distanceInf(createVector( 1, -2, 3, 3), new Vector3D(-4,  2, 0)).getReal(),
423                             1.0e-12);
424         assertEquals(5.0,
425                             FieldVector3D.distanceInf(createVector( 1, 3, -2, 3), new Vector3D(-4, 0,  2)).getReal(),
426                             1.0e-12);
427         assertEquals(5.0,
428                             FieldVector3D.distanceInf(createVector(-2,  1, 3, 3), new Vector3D( 2, -4, 0)).getReal(),
429                             1.0e-12);
430         assertEquals(5.0,
431                             FieldVector3D.distanceInf(createVector(-2, 3,  1, 3), new Vector3D( 2, 0, -4)).getReal(),
432                             1.0e-12);
433         assertEquals(5.0,
434                             FieldVector3D.distanceInf(createVector(3, -2,  1, 3), new Vector3D(0,  2, -4)).getReal(),
435                             1.0e-12);
436         assertEquals(5.0,
437                             FieldVector3D.distanceInf(createVector(3,  1, -2, 3), new Vector3D(0, -4,  2)).getReal(),
438                             1.0e-12);
439 
440     }
441 
442     @Test
443     void testSubtract() {
444         FieldVector3D<DerivativeStructure> v1 = createVector(1, 2, 3, 3);
445         FieldVector3D<DerivativeStructure> v2 = createVector(-3, -2, -1, 3);
446         v1 = v1.subtract(v2);
447         checkVector(v1, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0);
448 
449         checkVector(v2.subtract(v1), -7, -6, -5, 1, 0, 0, 0, 1, 0, 0, 0, 1);
450         checkVector(v2.subtract(new Vector3D(4, 4, 4)), -7, -6, -5, 1, 0, 0, 0, 1, 0, 0, 0, 1);
451         checkVector(v2.subtract(3, v1), -15, -14, -13, 1, 0, 0, 0, 1, 0, 0, 0, 1);
452         checkVector(v2.subtract(3, new Vector3D(4, 4, 4)), -15, -14, -13, 1, 0, 0, 0, 1, 0, 0, 0, 1);
453         DSFactory factory31 = new DSFactory(3, 1);
454         checkVector(v2.subtract(factory31.variable(2, 3), new Vector3D(4, 4, 4)),
455                     -15, -14, -13, 1, 0, -4, 0, 1, -4, 0, 0, -3);
456 
457         DSFactory factory41 = new DSFactory(4, 1);
458         checkVector(createVector(1, 2, 3, 4).subtract(factory41.variable(3, 5.0),
459                                                       createVector(3, -2, 1, 4)),
460                     -14, 12, -2,
461                      -4,  0,  0, -3,
462                       0, -4,  0,  2,
463                       0,  0, -4, -1);
464 
465     }
466 
467     @Test
468     void testAdd() {
469         FieldVector3D<DerivativeStructure> v1 = createVector(1, 2, 3, 3);
470         FieldVector3D<DerivativeStructure> v2 = createVector(-3, -2, -1, 3);
471         v1 = v1.add(v2);
472         checkVector(v1, -2, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 2);
473 
474         checkVector(v2.add(v1), -5, -2, 1, 3, 0, 0, 0, 3, 0, 0, 0, 3);
475         checkVector(v2.add(new Vector3D(-2, 0, 2)), -5, -2, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1);
476         checkVector(v2.add(3, v1), -9, -2, 5, 7, 0, 0, 0, 7, 0, 0, 0, 7);
477         checkVector(v2.add(3, new Vector3D(-2, 0, 2)), -9, -2, 5, 1, 0, 0, 0, 1, 0, 0, 0, 1);
478         DSFactory factory31 = new DSFactory(3, 1);
479         checkVector(v2.add(factory31.variable(2, 3), new Vector3D(-2, 0, 2)),
480                     -9, -2, 5, 1, 0, -2, 0, 1, 0, 0, 0, 3);
481 
482         DSFactory factory41 = new DSFactory(4, 1);
483         checkVector(createVector(1, 2, 3, 4).add(factory41.variable(3, 5.0),
484                                                  createVector(3, -2, 1, 4)),
485                     16, -8,  8,
486                      6,  0,  0,  3,
487                      0,  6,  0, -2,
488                      0,  0,  6,  1);
489 
490     }
491 
492     @Test
493     void testScalarProduct() {
494         FieldVector3D<DerivativeStructure> v = createVector(1, 2, 3, 3);
495         v = v.scalarMultiply(3);
496         checkVector(v, 3, 6, 9);
497 
498         checkVector(v.scalarMultiply(0.5), 1.5, 3, 4.5);
499     }
500 
501     @Test
502     void testVectorialProducts() {
503         FieldVector3D<DerivativeStructure> v1 = createVector(2, 1, -4, 3);
504         FieldVector3D<DerivativeStructure> v2 = createVector(3, 1, -1, 3);
505 
506         assertTrue(FastMath.abs(FieldVector3D.dotProduct(v1, v2).getReal() - 11) < 1.0e-12);
507         assertTrue(FastMath.abs(FieldVector3D.dotProduct(v1, v2.toVector3D()).getReal() - 11) < 1.0e-12);
508         assertTrue(FastMath.abs(FieldVector3D.dotProduct(v1.toVector3D(), v2).getReal() - 11) < 1.0e-12);
509 
510         FieldVector3D<DerivativeStructure> v3 = FieldVector3D.crossProduct(v1, v2);
511         checkVector(v3, 3, -10, -1);
512         assertTrue(FastMath.abs(FieldVector3D.dotProduct(v1, v3).getReal()) < 1.0e-12);
513         assertTrue(FastMath.abs(FieldVector3D.dotProduct(v2, v3).getReal()) < 1.0e-12);
514 
515         v3 = FieldVector3D.crossProduct(v1, v2.toVector3D());
516         checkVector(v3, 3, -10, -1);
517         assertTrue(FastMath.abs(FieldVector3D.dotProduct(v1, v3).getReal()) < 1.0e-12);
518         assertTrue(FastMath.abs(FieldVector3D.dotProduct(v2, v3).getReal()) < 1.0e-12);
519 
520         v3 = FieldVector3D.crossProduct(v1.toVector3D(), v2);
521         checkVector(v3, 3, -10, -1);
522         assertTrue(FastMath.abs(FieldVector3D.dotProduct(v1, v3).getReal()) < 1.0e-12);
523         assertTrue(FastMath.abs(FieldVector3D.dotProduct(v2, v3).getReal()) < 1.0e-12);
524 
525     }
526 
527     @Test
528     void testCrossProductCancellation() {
529         FieldVector3D<DerivativeStructure> v1 = createVector(9070467121.0, 4535233560.0, 1, 3);
530         FieldVector3D<DerivativeStructure> v2 = createVector(9070467123.0, 4535233561.0, 1, 3);
531         checkVector(FieldVector3D.crossProduct(v1, v2), -1, 2, 1);
532 
533         double scale    = FastMath.scalb(1.0, 100);
534         FieldVector3D<DerivativeStructure> big1   = new FieldVector3D<>(scale, v1);
535         FieldVector3D<DerivativeStructure> small2 = new FieldVector3D<>(1 / scale, v2);
536         checkVector(FieldVector3D.crossProduct(big1, small2), -1, 2, 1);
537 
538     }
539 
540     @Test
541     void testAngular() {
542         assertEquals(0,           createVector(1, 0, 0, 3).getAlpha().getReal(), 1.0e-10);
543         assertEquals(0,           createVector(1, 0, 0, 3).getDelta().getReal(), 1.0e-10);
544         assertEquals(FastMath.PI / 2, createVector(0, 1, 0, 3).getAlpha().getReal(), 1.0e-10);
545         assertEquals(0,           createVector(0, 1, 0, 3).getDelta().getReal(), 1.0e-10);
546         assertEquals(FastMath.PI / 2, createVector(0, 0, 1, 3).getDelta().getReal(), 1.0e-10);
547 
548         FieldVector3D<DerivativeStructure> u = createVector(-1, 1, -1, 3);
549         assertEquals(3 * FastMath.PI /4, u.getAlpha().getReal(), 1.0e-10);
550         assertEquals(-1.0 / FastMath.sqrt(3), u.getDelta().sin().getReal(), 1.0e-10);
551     }
552 
553     @Test
554     void testAngularSeparation() throws MathRuntimeException {
555         FieldVector3D<DerivativeStructure> v1 = createVector(2, -1, 4, 3);
556 
557         FieldVector3D<DerivativeStructure>  k = v1.normalize();
558         FieldVector3D<DerivativeStructure>  i = k.orthogonal();
559         FieldVector3D<DerivativeStructure> v2 = k.scalarMultiply(FastMath.cos(1.2)).add(i.scalarMultiply(FastMath.sin(1.2)));
560 
561         assertTrue(FastMath.abs(FieldVector3D.angle(v1, v2).getReal() - 1.2) < 1.0e-12);
562         assertTrue(FastMath.abs(FieldVector3D.angle(v1, v2.toVector3D()).getReal() - 1.2) < 1.0e-12);
563         assertTrue(FastMath.abs(FieldVector3D.angle(v1.toVector3D(), v2).getReal() - 1.2) < 1.0e-12);
564 
565         try {
566             FieldVector3D.angle(v1, Vector3D.ZERO);
567             fail("an exception should have been thrown");
568         } catch (MathRuntimeException mae) {
569             // expected
570         }
571         assertEquals(0.0, FieldVector3D.angle(v1, v1.toVector3D()).getReal(), 1.0e-15);
572         assertEquals(FastMath.PI, FieldVector3D.angle(v1, v1.negate().toVector3D()).getReal(), 1.0e-15);
573 
574     }
575 
576     @Test
577     void testNormalize() throws MathRuntimeException {
578         assertEquals(1.0, createVector(5, -4, 2, 3).normalize().getNorm().getReal(), 1.0e-12);
579         try {
580             createVector(0, 0, 0, 3).normalize();
581             fail("an exception should have been thrown");
582         } catch (MathRuntimeException ae) {
583             // expected behavior
584         }
585     }
586 
587     @Test
588     void testNegate() {
589         checkVector(createVector(0.1, 2.5, 1.3, 3).negate(),
590                     -0.1, -2.5, -1.3, -1, 0, 0, 0, -1, 0, 0, 0, -1);
591     }
592 
593     @Test
594     void testOrthogonal() throws MathRuntimeException {
595         FieldVector3D<DerivativeStructure> v1 = createVector(0.1, 2.5, 1.3, 3);
596         assertEquals(0.0, FieldVector3D.dotProduct(v1, v1.orthogonal()).getReal(), 1.0e-12);
597         FieldVector3D<DerivativeStructure> v2 = createVector(2.3, -0.003, 7.6, 3);
598         assertEquals(0.0, FieldVector3D.dotProduct(v2, v2.orthogonal()).getReal(), 1.0e-12);
599         FieldVector3D<DerivativeStructure> v3 = createVector(-1.7, 1.4, 0.2, 3);
600         assertEquals(0.0, FieldVector3D.dotProduct(v3, v3.orthogonal()).getReal(), 1.0e-12);
601         FieldVector3D<DerivativeStructure> v4 = createVector(4.2, 0.1, -1.8, 3);
602         assertEquals(0.0, FieldVector3D.dotProduct(v4, v4.orthogonal()).getReal(), 1.0e-12);
603         try {
604             createVector(0, 0, 0, 3).orthogonal();
605             fail("an exception should have been thrown");
606         } catch (MathRuntimeException ae) {
607             // expected behavior
608         }
609     }
610 
611     @Test
612     void testAngle() throws MathRuntimeException {
613         assertEquals(0.22572612855273393616,
614                             FieldVector3D.angle(createVector(1, 2, 3, 3), createVector(4, 5, 6, 3)).getReal(),
615                             1.0e-12);
616         assertEquals(7.98595620686106654517199e-8,
617                             FieldVector3D.angle(createVector(1, 2, 3, 3), createVector(2, 4, 6.000001, 3)).getReal(),
618                             1.0e-12);
619         assertEquals(3.14159257373023116985197793156,
620                             FieldVector3D.angle(createVector(1, 2, 3, 3), createVector(-2, -4, -6.000001, 3)).getReal(),
621                             1.0e-12);
622         try {
623             FieldVector3D.angle(createVector(0, 0, 0, 3), createVector(1, 0, 0, 3));
624             fail("an exception should have been thrown");
625         } catch (MathRuntimeException ae) {
626             // expected behavior
627         }
628     }
629 
630     @Test
631     void testAccurateDotProduct() {
632         // the following two vectors are nearly but not exactly orthogonal
633         // naive dot product (i.e. computing u1.x * u2.x + u1.y * u2.y + u1.z * u2.z
634         // leads to a result of 0.0, instead of the correct -1.855129...
635         FieldVector3D<DerivativeStructure> u1 = createVector(-1321008684645961.0 /  268435456.0,
636                                    -5774608829631843.0 /  268435456.0,
637                                    -7645843051051357.0 / 8589934592.0, 3);
638         FieldVector3D<DerivativeStructure> u2 = createVector(-5712344449280879.0 /    2097152.0,
639                                    -4550117129121957.0 /    2097152.0,
640                                     8846951984510141.0 /     131072.0, 3);
641         DerivativeStructure sNaive = u1.getX().multiply(u2.getX()).add(u1.getY().multiply(u2.getY())).add(u1.getZ().multiply(u2.getZ()));
642         DerivativeStructure sAccurate = FieldVector3D.dotProduct(u1, u2);
643         assertEquals(0.0, sNaive.getReal(), 1.0e-30);
644         assertEquals(-2088690039198397.0 / 1125899906842624.0, sAccurate.getReal(), 1.0e-15);
645     }
646 
647     @Test
648     void testDotProduct() {
649         // we compare accurate versus naive dot product implementations
650         // on regular vectors (i.e. not extreme cases like in the previous test)
651         Well1024a random = new Well1024a(553267312521321234l);
652         for (int i = 0; i < 10000; ++i) {
653             double ux = 10000 * random.nextDouble();
654             double uy = 10000 * random.nextDouble();
655             double uz = 10000 * random.nextDouble();
656             double vx = 10000 * random.nextDouble();
657             double vy = 10000 * random.nextDouble();
658             double vz = 10000 * random.nextDouble();
659             double sNaive = ux * vx + uy * vy + uz * vz;
660 
661             FieldVector3D<DerivativeStructure> uds = createVector(ux, uy, uz, 3);
662             FieldVector3D<DerivativeStructure> vds = createVector(vx, vy, vz, 3);
663             Vector3D v = new Vector3D(vx, vy, vz);
664 
665             DerivativeStructure sAccurate = FieldVector3D.dotProduct(uds, vds);
666             assertEquals(sNaive, sAccurate.getReal(), 2.5e-16 * sNaive);
667             assertEquals(ux + vx, sAccurate.getPartialDerivative(1, 0, 0), 2.5e-16 * sNaive);
668             assertEquals(uy + vy, sAccurate.getPartialDerivative(0, 1, 0), 2.5e-16 * sNaive);
669             assertEquals(uz + vz, sAccurate.getPartialDerivative(0, 0, 1), 2.5e-16 * sNaive);
670 
671             sAccurate = FieldVector3D.dotProduct(uds, v);
672             assertEquals(sNaive, sAccurate.getReal(), 2.5e-16 * sNaive);
673             assertEquals(vx, sAccurate.getPartialDerivative(1, 0, 0), 2.5e-16 * sNaive);
674             assertEquals(vy, sAccurate.getPartialDerivative(0, 1, 0), 2.5e-16 * sNaive);
675             assertEquals(vz, sAccurate.getPartialDerivative(0, 0, 1), 2.5e-16 * sNaive);
676 
677         }
678     }
679 
680     @Test
681     void testAccurateCrossProduct() {
682         // the vectors u1 and u2 are nearly but not exactly anti-parallel
683         // (7.31e-16 degrees from 180 degrees) naive cross product (i.e.
684         // computing u1.x * u2.x + u1.y * u2.y + u1.z * u2.z
685         // leads to a result of   [0.0009765, -0.0001220, -0.0039062],
686         // instead of the correct [0.0006913, -0.0001254, -0.0007909]
687         final FieldVector3D<DerivativeStructure> u1 = createVector(-1321008684645961.0 /   268435456.0,
688                                                                    -5774608829631843.0 /   268435456.0,
689                                                                    -7645843051051357.0 /  8589934592.0, 3);
690         final FieldVector3D<DerivativeStructure> u2 = createVector( 1796571811118507.0 /  2147483648.0,
691                                                                     7853468008299307.0 /  2147483648.0,
692                                                                     2599586637357461.0 / 17179869184.0, 3);
693         final FieldVector3D<DerivativeStructure> u3 = createVector(12753243807587107.0 / 18446744073709551616.0,
694                                                                    -2313766922703915.0 / 18446744073709551616.0,
695                                                                     -227970081415313.0 /   288230376151711744.0, 3);
696         FieldVector3D<DerivativeStructure> cNaive = new FieldVector3D<DerivativeStructure>(u1.getY().multiply(u2.getZ()).subtract(u1.getZ().multiply(u2.getY())),
697                                        u1.getZ().multiply(u2.getX()).subtract(u1.getX().multiply(u2.getZ())),
698                                        u1.getX().multiply(u2.getY()).subtract(u1.getY().multiply(u2.getX())));
699         FieldVector3D<DerivativeStructure> cAccurate = FieldVector3D.crossProduct(u1, u2);
700         assertTrue(FieldVector3D.distance(u3, cNaive).getReal() > 2.9 * u3.getNorm().getReal());
701         assertEquals(0.0, FieldVector3D.distance(u3, cAccurate).getReal(), 1.0e-30 * cAccurate.getNorm().getReal());
702     }
703 
704     @Test
705     void testCrossProduct() {
706         // we compare accurate versus naive cross product implementations
707         // on regular vectors (i.e. not extreme cases like in the previous test)
708         Well1024a random = new Well1024a(885362227452043214l);
709         for (int i = 0; i < 10000; ++i) {
710             double ux = random.nextDouble();
711             double uy = random.nextDouble();
712             double uz = random.nextDouble();
713             double vx = random.nextDouble();
714             double vy = random.nextDouble();
715             double vz = random.nextDouble();
716             Vector3D cNaive = new Vector3D(uy * vz - uz * vy, uz * vx - ux * vz, ux * vy - uy * vx);
717 
718             FieldVector3D<DerivativeStructure> uds = createVector(ux, uy, uz, 3);
719             FieldVector3D<DerivativeStructure> vds = createVector(vx, vy, vz, 3);
720             Vector3D v = new Vector3D(vx, vy, vz);
721 
722             checkVector(FieldVector3D.crossProduct(uds, vds),
723                         cNaive.getX(), cNaive.getY(), cNaive.getZ(),
724                         0, vz - uz, uy - vy,
725                         uz - vz, 0, vx - ux,
726                         vy - uy, ux - vx, 0);
727 
728             checkVector(FieldVector3D.crossProduct(uds, v),
729                         cNaive.getX(), cNaive.getY(), cNaive.getZ(),
730                           0,  vz, -vy,
731                         -vz,   0,  vx,
732                          vy, -vx,   0);
733 
734         }
735     }
736 
737     @Test
738     void testArithmeticalBlending(){
739         // Given
740         final FieldVector3D<Binary64> vector1 = new FieldVector3D<>(new Binary64(1), new Binary64(2), new Binary64(3));
741         final FieldVector3D<Binary64> vector2 = new FieldVector3D<>(new Binary64(2), new Binary64(4), new Binary64(9));
742 
743         final Binary64 blendingValue = new Binary64(0.65);
744 
745         // When
746         final FieldVector3D<Binary64> blendedVector = vector1.blendArithmeticallyWith(vector2, blendingValue);
747 
748         // Then
749         assertEquals(1.65, blendedVector.getX().getReal(), 1.0e-15);
750         assertEquals(3.3 , blendedVector.getY().getReal(), 1.0e-15);
751         assertEquals(6.9 , blendedVector.getZ().getReal(), 1.0e-15);
752     }
753 
754     private FieldVector3D<DerivativeStructure> createVector(double x, double y, double z, int params) {
755         DSFactory factory = new DSFactory(params, 1);
756         return new FieldVector3D<>(factory.variable(0, x),
757                                    factory.variable(1, y),
758                                    factory.variable(2, z));
759     }
760 
761     private void checkVector(FieldVector3D<DerivativeStructure> v, double x, double y, double z) {
762         assertEquals(x, v.getX().getReal(), 1.0e-12);
763         assertEquals(y, v.getY().getReal(), 1.0e-12);
764         assertEquals(z, v.getZ().getReal(), 1.0e-12);
765     }
766 
767     private void checkVector(FieldVector3D<DerivativeStructure> v, double x, double y, double z,
768                              double dxdx, double dxdy, double dxdz,
769                              double dydx, double dydy, double dydz,
770                              double dzdx, double dzdy, double dzdz) {
771         assertEquals(x, v.getX().getReal(), 1.0e-12);
772         assertEquals(y, v.getY().getReal(), 1.0e-12);
773         assertEquals(z, v.getZ().getReal(), 1.0e-12);
774         assertEquals(dxdx, v.getX().getPartialDerivative(1, 0, 0), 1.0e-12);
775         assertEquals(dxdy, v.getX().getPartialDerivative(0, 1, 0), 1.0e-12);
776         assertEquals(dxdz, v.getX().getPartialDerivative(0, 0, 1), 1.0e-12);
777         assertEquals(dydx, v.getY().getPartialDerivative(1, 0, 0), 1.0e-12);
778         assertEquals(dydy, v.getY().getPartialDerivative(0, 1, 0), 1.0e-12);
779         assertEquals(dydz, v.getY().getPartialDerivative(0, 0, 1), 1.0e-12);
780         assertEquals(dzdx, v.getZ().getPartialDerivative(1, 0, 0), 1.0e-12);
781         assertEquals(dzdy, v.getZ().getPartialDerivative(0, 1, 0), 1.0e-12);
782         assertEquals(dzdz, v.getZ().getPartialDerivative(0, 0, 1), 1.0e-12);
783     }
784 
785     private void checkVector(FieldVector3D<DerivativeStructure> v, double x, double y, double z,
786                              double dxdx, double dxdy, double dxdz, double dxdt,
787                              double dydx, double dydy, double dydz, double dydt,
788                              double dzdx, double dzdy, double dzdz, double dzdt) {
789         assertEquals(x, v.getX().getReal(), 1.0e-12);
790         assertEquals(y, v.getY().getReal(), 1.0e-12);
791         assertEquals(z, v.getZ().getReal(), 1.0e-12);
792         assertEquals(dxdx, v.getX().getPartialDerivative(1, 0, 0, 0), 1.0e-12);
793         assertEquals(dxdy, v.getX().getPartialDerivative(0, 1, 0, 0), 1.0e-12);
794         assertEquals(dxdz, v.getX().getPartialDerivative(0, 0, 1, 0), 1.0e-12);
795         assertEquals(dxdt, v.getX().getPartialDerivative(0, 0, 0, 1), 1.0e-12);
796         assertEquals(dydx, v.getY().getPartialDerivative(1, 0, 0, 0), 1.0e-12);
797         assertEquals(dydy, v.getY().getPartialDerivative(0, 1, 0, 0), 1.0e-12);
798         assertEquals(dydz, v.getY().getPartialDerivative(0, 0, 1, 0), 1.0e-12);
799         assertEquals(dydt, v.getY().getPartialDerivative(0, 0, 0, 1), 1.0e-12);
800         assertEquals(dzdx, v.getZ().getPartialDerivative(1, 0, 0, 0), 1.0e-12);
801         assertEquals(dzdy, v.getZ().getPartialDerivative(0, 1, 0, 0), 1.0e-12);
802         assertEquals(dzdz, v.getZ().getPartialDerivative(0, 0, 1, 0), 1.0e-12);
803         assertEquals(dzdt, v.getZ().getPartialDerivative(0, 0, 0, 1), 1.0e-12);
804     }
805 
806 }