1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
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
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
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
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
627 }
628 }
629
630 @Test
631 void testAccurateDotProduct() {
632
633
634
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
650
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
683
684
685
686
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
707
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
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
746 final FieldVector3D<Binary64> blendedVector = vector1.blendArithmeticallyWith(vector2, blendingValue);
747
748
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 }