8#include <gtest/gtest.h>
10#include "arcane/utils/ValueConvert.h"
11#include "arcane/utils/NumMatrix.h"
12#include "arccore/base/MathNumeric.h"
20static_assert(std::is_same_v<TrueType,ArrayTraits<NumMatrix<double,4,2>>::IsPODType>);
24 auto zero = RealN2::zero();
27 ASSERT_EQ(v0.vx(), zero);
28 ASSERT_EQ(v0.vy(), zero);
32 ASSERT_EQ(v1.vx(), zero);
33 ASSERT_EQ(v1.vy(), zero);
37 RealN2 r2_value(value);
39 ASSERT_EQ(v1.vx(), r2_value);
40 ASSERT_EQ(v1.vy(), r2_value);
42 ASSERT_EQ(v2.vx(), v1.vx());
43 ASSERT_EQ(v2.vy(), v1.vy());
49 ASSERT_EQ(v2.vx(), rx);
50 ASSERT_EQ(v2.vy(), ry);
58TEST(TestNumMatrix, Real2x2ElementAccess)
65 ASSERT_EQ(m(0, 0), 1.0);
66 ASSERT_EQ(m(0, 1), 2.0);
67 ASSERT_EQ(m(1, 0), 3.0);
68 ASSERT_EQ(m(1, 1), 4.0);
72 ASSERT_EQ(r0.
vx(), 1.0);
73 ASSERT_EQ(r0.
vy(), 2.0);
75 ASSERT_EQ(r1.
vx(), 3.0);
76 ASSERT_EQ(r1.
vy(), 4.0);
82TEST(TestNumMatrix, Real2x2SetRow)
85 m.
setRow(0, RealN2(5.0, 6.0));
86 m.
setRow(1, RealN2(7.0, 8.0));
87 ASSERT_EQ(m(0, 0), 5.0);
88 ASSERT_EQ(m(0, 1), 6.0);
89 ASSERT_EQ(m(1, 0), 7.0);
90 ASSERT_EQ(m(1, 1), 8.0);
96TEST(TestNumMatrix, Real2x2Fill)
100 ASSERT_EQ(m(0, 0), 3.5);
101 ASSERT_EQ(m(0, 1), 3.5);
102 ASSERT_EQ(m(1, 0), 3.5);
103 ASSERT_EQ(m(1, 1), 3.5);
109TEST(TestNumMatrix, Real2x2Zero)
113 ASSERT_EQ(m.vx(), zero);
114 ASSERT_EQ(m.vy(), zero);
121TEST(TestNumMatrix, Real2x2Arithmetic)
123 RealN2x2 a(RealN2(1.0, 2.0), RealN2(3.0, 4.0));
124 RealN2x2 b(RealN2(5.0, 6.0), RealN2(7.0, 8.0));
128 ASSERT_EQ(c(0, 0), 6.0);
129 ASSERT_EQ(c(0, 1), 8.0);
130 ASSERT_EQ(c(1, 0), 10.0);
131 ASSERT_EQ(c(1, 1), 12.0);
139 ASSERT_EQ(e(0, 0), -1.0);
140 ASSERT_EQ(e(0, 1), -2.0);
143 RealN2x2 f = a * 2.0;
144 ASSERT_EQ(f(0, 0), 2.0);
145 ASSERT_EQ(f(0, 1), 4.0);
146 ASSERT_EQ(f(1, 0), 6.0);
147 ASSERT_EQ(f(1, 1), 8.0);
149 RealN2x2 g = 3.0 * a;
150 ASSERT_EQ(g(0, 0), 3.0);
151 ASSERT_EQ(g(0, 1), 6.0);
154 RealN2x2 h = f / 2.0;
161TEST(TestNumMatrix, Real2x2CompoundAssignment)
163 RealN2x2 a(RealN2(1.0, 2.0), RealN2(3.0, 4.0));
164 RealN2x2 b(RealN2(5.0, 6.0), RealN2(7.0, 8.0));
168 ASSERT_EQ(c(0, 0), 6.0);
169 ASSERT_EQ(c(0, 1), 8.0);
175 ASSERT_EQ(c(0, 0), 2.0);
176 ASSERT_EQ(c(0, 1), 4.0);
180 ASSERT_EQ(d(0, 0), 0.5);
181 ASSERT_EQ(d(0, 1), 1.0);
187TEST(TestNumMatrix, Real2x2ScalarAssignment)
191 ASSERT_EQ(m(0, 0), 5.0);
192 ASSERT_EQ(m(0, 1), 5.0);
193 ASSERT_EQ(m(1, 0), 5.0);
194 ASSERT_EQ(m(1, 1), 5.0);
200TEST(TestNumMatrix, Real2x2Conversion)
202 RealN2x2 m(RealN2(1.0, 2.0), RealN2(3.0, 4.0));
204 ASSERT_EQ(r.
x.
x, 1.0);
205 ASSERT_EQ(r.
x.
y, 2.0);
206 ASSERT_EQ(r.
y.
x, 3.0);
207 ASSERT_EQ(r.
y.
y, 4.0);
211 ASSERT_EQ(m2(0, 0), 1.0);
212 ASSERT_EQ(m2(1, 1), 4.0);
217 ASSERT_EQ(m3(0, 0), 5.0);
218 ASSERT_EQ(m3(1, 1), 8.0);
229 ASSERT_EQ(v1.vx(), zero);
230 ASSERT_EQ(v1.vy(), zero);
231 ASSERT_EQ(v1.vz(), zero);
235 RealN3 r3_value(value);
237 ASSERT_EQ(v1.vx(), r3_value);
238 ASSERT_EQ(v1.vy(), r3_value);
239 ASSERT_EQ(v1.vz(), r3_value);
241 ASSERT_EQ(v2.vx(), v1.vx());
242 ASSERT_EQ(v2.vy(), v1.vy());
243 ASSERT_EQ(v2.vz(), v1.vz());
244 RealN3 rx(3.5, 1.2, -1.5);
245 RealN3 ry(1.6, 2.1, -2.3);
246 RealN3 rz(-2.3, 1.8, 9.4);
251 ASSERT_EQ(v1.vx(), rx);
252 ASSERT_EQ(v1.vy(), ry);
253 ASSERT_EQ(v1.vz(), rz);
261TEST(TestNumMatrix, Real3x3FromColumns)
268 ASSERT_EQ(m(0, 0), 1.0);
269 ASSERT_EQ(m(0, 1), 4.0);
270 ASSERT_EQ(m(0, 2), 7.0);
271 ASSERT_EQ(m(1, 0), 2.0);
272 ASSERT_EQ(m(1, 1), 5.0);
273 ASSERT_EQ(m(1, 2), 8.0);
274 ASSERT_EQ(m(2, 0), 3.0);
275 ASSERT_EQ(m(2, 1), 6.0);
276 ASSERT_EQ(m(2, 2), 9.0);
282TEST(TestNumMatrix, Real3x3FromLines)
287 ASSERT_EQ(m(0, 0), 1.0);
288 ASSERT_EQ(m(0, 1), 2.0);
289 ASSERT_EQ(m(0, 2), 3.0);
290 ASSERT_EQ(m(1, 0), 4.0);
291 ASSERT_EQ(m(1, 1), 5.0);
292 ASSERT_EQ(m(1, 2), 6.0);
293 ASSERT_EQ(m(2, 0), 7.0);
294 ASSERT_EQ(m(2, 1), 8.0);
295 ASSERT_EQ(m(2, 2), 9.0);
301TEST(TestNumMatrix, Real3x3Conversion)
303 RealN3x3 m(RealN3(1.0, 2.0, 3.0),
304 RealN3(4.0, 5.0, 6.0),
305 RealN3(7.0, 8.0, 9.0));
307 ASSERT_EQ(r.
x.
x, 1.0);
308 ASSERT_EQ(r.
x.
y, 2.0);
309 ASSERT_EQ(r.
x.
z, 3.0);
310 ASSERT_EQ(r.
y.
x, 4.0);
311 ASSERT_EQ(r.
y.
y, 5.0);
312 ASSERT_EQ(r.
y.
z, 6.0);
313 ASSERT_EQ(r.
z.
x, 7.0);
314 ASSERT_EQ(r.
z.
y, 8.0);
315 ASSERT_EQ(r.
z.
z, 9.0);
320 ASSERT_EQ(m2(0, 0), 1.0);
321 ASSERT_EQ(m2(1, 1), 5.0);
322 ASSERT_EQ(m2(2, 2), 9.0);
333TEST(TestNumMatrix, Real3x3ElementAccess)
336 for (
int i = 0; i < 3; ++i)
337 for (
int j = 0; j < 3; ++j)
338 m(i, j) = double(i * 3 + j + 1);
340 ASSERT_EQ(m(0, 0), 1.0);
341 ASSERT_EQ(m(0, 1), 2.0);
342 ASSERT_EQ(m(0, 2), 3.0);
343 ASSERT_EQ(m(1, 0), 4.0);
344 ASSERT_EQ(m(1, 1), 5.0);
345 ASSERT_EQ(m(1, 2), 6.0);
346 ASSERT_EQ(m(2, 0), 7.0);
347 ASSERT_EQ(m(2, 1), 8.0);
348 ASSERT_EQ(m(2, 2), 9.0);
350 ASSERT_EQ(m.row(0), RealN3(1.0, 2.0, 3.0));
351 ASSERT_EQ(m.row(1), RealN3(4.0, 5.0, 6.0));
352 ASSERT_EQ(m.row(2), RealN3(7.0, 8.0, 9.0));
358TEST(TestNumMatrix, Real3x3Arithmetic)
360 RealN3x3 a(RealN3(1.0, 2.0, 3.0),
361 RealN3(4.0, 5.0, 6.0),
362 RealN3(7.0, 8.0, 9.0));
363 RealN3x3 b(RealN3(9.0, 8.0, 7.0),
364 RealN3(6.0, 5.0, 4.0),
365 RealN3(3.0, 2.0, 1.0));
368 ASSERT_EQ(c(0, 0), 10.0);
369 ASSERT_EQ(c(1, 1), 10.0);
370 ASSERT_EQ(c(2, 2), 10.0);
376 ASSERT_EQ(e(0, 0), -1.0);
377 ASSERT_EQ(e(1, 1), -5.0);
378 ASSERT_EQ(e(2, 2), -9.0);
380 RealN3x3 f = a * 2.0;
381 ASSERT_EQ(f(0, 0), 2.0);
382 ASSERT_EQ(f(1, 1), 10.0);
384 RealN3x3 g = 0.5 * f;
391TEST(TestNumMatrix, Real3x3Fill)
395 for (
int i = 0; i < 3; ++i)
396 for (
int j = 0; j < 3; ++j)
397 ASSERT_EQ(m(i, j), -1.0);
403TEST(TestNumMatrix, Real3x3NearlyZero)
416TEST(TestNumMatrix, NonSquare2x5)
421 for (
int j = 0; j < 5; ++j) {
423 m(1, j) = double(j * 10);
425 for (
int j = 0; j < 5; ++j) {
426 ASSERT_EQ(m(0, j),
double(j));
427 ASSERT_EQ(m(1, j),
double(j * 10));
430 ASSERT_EQ(m.row(0).vx(), 0.0);
431 ASSERT_EQ(m.row(0)(4), 4.0);
432 ASSERT_EQ(m.row(1)(3), 30.0);
436 for (
int j = 0; j < 5; ++j) {
437 ASSERT_EQ(n(0, j), 7.0);
438 ASSERT_EQ(n(1, j), 7.0);
445TEST(TestNumMatrix, NonSquare5x2)
450 for (
int i = 0; i < 5; ++i)
451 for (
int j = 0; j < 2; ++j)
452 m(i, j) = double(i + j);
454 for (
int i = 0; i < 5; ++i)
455 for (
int j = 0; j < 2; ++j)
456 ASSERT_EQ(m(i, j),
double(i + j));
458 ASSERT_EQ(m.vx()(1), 1.0);
459 ASSERT_EQ(m.vy()(1), 1.0 + 1.0);
460 ASSERT_EQ(m.row(3)(1), 4.0);
466TEST(TestNumMatrix, Int32x2)
471 ASSERT_EQ(m(0, 0), 0);
472 ASSERT_EQ(m(1, 1), 0);
478 ASSERT_EQ(m(0, 0), 1);
479 ASSERT_EQ(m(1, 1), 4);
481 Int32x2 n(Int32x2::VectorType(5, 6), Int32x2::VectorType(7, 8));
482 ASSERT_EQ(n(0, 0), 5);
483 ASSERT_EQ(n(1, 1), 8);
486 ASSERT_EQ(p(0, 0), 6);
487 ASSERT_EQ(p(0, 1), 8);
488 ASSERT_EQ(p(1, 0), 10);
489 ASSERT_EQ(p(1, 1), 12);
492 ASSERT_EQ(p(0, 0), 12);
495 ASSERT_EQ(r(0, 0), 0);
496 ASSERT_EQ(r(1, 1), 0);
#define ASSERT_FALSE(condition)
Checks that condition is false.
#define ASSERT_TRUE(condition)
Checks that condition is true.
Small fixed-size matrix containing RowSize rows and ColumnSize columns.
constexpr __host__ static __device__ ThatClass zero()
constexpr __host__ static __device__ ThatClass fromLines(Real ax, Real bx, Real cx, Real ay, Real by, Real cy, Real az, Real bz, Real cz)
constexpr __host__ __device__ void setRow(Int32 i, const VectorType &v)
Sets the value of the i-th row to v.
constexpr __host__ static __device__ ThatClass fromColumns(Real ax, Real ay, Real az, Real bx, Real by, Real bz, Real cx, Real cy, Real cz)
constexpr __host__ __device__ void fill(const DataType &v)
Fill the matrix with the value v.
constexpr __host__ __device__ DataType & vx()
Value of the first component.
constexpr __host__ __device__ DataType & vy()
Value of the second component.
Class managing a 2-dimensional real vector.
Class managing a 2x2 matrix of reals.
Class managing a 3-dimensional real vector.
Class managing a 3x3 real matrix.
Real3 z
first element of the triplet
Real3 y
first element of the triplet
Real3 x
first element of the triplet
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Real y
second component of the pair
Real x
first component of the pair
Real y
second component of the triplet
Real z
third component of the triplet
Real x
first component of the triplet