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(v1.vx(), zero);
28 ASSERT_EQ(v1.vy(), zero);
32 RealN2 r2_value(value);
34 ASSERT_EQ(v1.vx(), r2_value);
35 ASSERT_EQ(v1.vy(), r2_value);
37 ASSERT_EQ(v2.vx(), v1.vx());
38 ASSERT_EQ(v2.vy(), v1.vy());
44 ASSERT_EQ(v2.vx(), rx);
45 ASSERT_EQ(v2.vy(), ry);
53TEST(TestNumMatrix, Real2x2ElementAccess)
60 ASSERT_EQ(m(0, 0), 1.0);
61 ASSERT_EQ(m(0, 1), 2.0);
62 ASSERT_EQ(m(1, 0), 3.0);
63 ASSERT_EQ(m(1, 1), 4.0);
67 ASSERT_EQ(r0.
vx(), 1.0);
68 ASSERT_EQ(r0.
vy(), 2.0);
70 ASSERT_EQ(r1.
vx(), 3.0);
71 ASSERT_EQ(r1.
vy(), 4.0);
77TEST(TestNumMatrix, Real2x2SetRow)
80 m.
setRow(0, RealN2(5.0, 6.0));
81 m.
setRow(1, RealN2(7.0, 8.0));
82 ASSERT_EQ(m(0, 0), 5.0);
83 ASSERT_EQ(m(0, 1), 6.0);
84 ASSERT_EQ(m(1, 0), 7.0);
85 ASSERT_EQ(m(1, 1), 8.0);
91TEST(TestNumMatrix, Real2x2Fill)
95 ASSERT_EQ(m(0, 0), 3.5);
96 ASSERT_EQ(m(0, 1), 3.5);
97 ASSERT_EQ(m(1, 0), 3.5);
98 ASSERT_EQ(m(1, 1), 3.5);
104TEST(TestNumMatrix, Real2x2Zero)
108 ASSERT_EQ(m.vx(), zero);
109 ASSERT_EQ(m.vy(), zero);
116TEST(TestNumMatrix, Real2x2Arithmetic)
118 RealN2x2 a(RealN2(1.0, 2.0), RealN2(3.0, 4.0));
119 RealN2x2 b(RealN2(5.0, 6.0), RealN2(7.0, 8.0));
123 ASSERT_EQ(c(0, 0), 6.0);
124 ASSERT_EQ(c(0, 1), 8.0);
125 ASSERT_EQ(c(1, 0), 10.0);
126 ASSERT_EQ(c(1, 1), 12.0);
134 ASSERT_EQ(e(0, 0), -1.0);
135 ASSERT_EQ(e(0, 1), -2.0);
138 RealN2x2 f = a * 2.0;
139 ASSERT_EQ(f(0, 0), 2.0);
140 ASSERT_EQ(f(0, 1), 4.0);
141 ASSERT_EQ(f(1, 0), 6.0);
142 ASSERT_EQ(f(1, 1), 8.0);
144 RealN2x2 g = 3.0 * a;
145 ASSERT_EQ(g(0, 0), 3.0);
146 ASSERT_EQ(g(0, 1), 6.0);
149 RealN2x2 h = f / 2.0;
156TEST(TestNumMatrix, Real2x2CompoundAssignment)
158 RealN2x2 a(RealN2(1.0, 2.0), RealN2(3.0, 4.0));
159 RealN2x2 b(RealN2(5.0, 6.0), RealN2(7.0, 8.0));
163 ASSERT_EQ(c(0, 0), 6.0);
164 ASSERT_EQ(c(0, 1), 8.0);
170 ASSERT_EQ(c(0, 0), 2.0);
171 ASSERT_EQ(c(0, 1), 4.0);
175 ASSERT_EQ(d(0, 0), 0.5);
176 ASSERT_EQ(d(0, 1), 1.0);
182TEST(TestNumMatrix, Real2x2ScalarAssignment)
186 ASSERT_EQ(m(0, 0), 5.0);
187 ASSERT_EQ(m(0, 1), 5.0);
188 ASSERT_EQ(m(1, 0), 5.0);
189 ASSERT_EQ(m(1, 1), 5.0);
195TEST(TestNumMatrix, Real2x2Conversion)
197 RealN2x2 m(RealN2(1.0, 2.0), RealN2(3.0, 4.0));
199 ASSERT_EQ(r.
x.
x, 1.0);
200 ASSERT_EQ(r.
x.
y, 2.0);
201 ASSERT_EQ(r.
y.
x, 3.0);
202 ASSERT_EQ(r.
y.
y, 4.0);
206 ASSERT_EQ(m2(0, 0), 1.0);
207 ASSERT_EQ(m2(1, 1), 4.0);
212 ASSERT_EQ(m3(0, 0), 5.0);
213 ASSERT_EQ(m3(1, 1), 8.0);
224 ASSERT_EQ(v1.vx(), zero);
225 ASSERT_EQ(v1.vy(), zero);
226 ASSERT_EQ(v1.vz(), zero);
230 RealN3 r3_value(value);
232 ASSERT_EQ(v1.vx(), r3_value);
233 ASSERT_EQ(v1.vy(), r3_value);
234 ASSERT_EQ(v1.vz(), r3_value);
236 ASSERT_EQ(v2.vx(), v1.vx());
237 ASSERT_EQ(v2.vy(), v1.vy());
238 ASSERT_EQ(v2.vz(), v1.vz());
239 RealN3 rx(3.5, 1.2, -1.5);
240 RealN3 ry(1.6, 2.1, -2.3);
241 RealN3 rz(-2.3, 1.8, 9.4);
246 ASSERT_EQ(v1.vx(), rx);
247 ASSERT_EQ(v1.vy(), ry);
248 ASSERT_EQ(v1.vz(), rz);
256TEST(TestNumMatrix, Real3x3FromColumns)
263 ASSERT_EQ(m(0, 0), 1.0);
264 ASSERT_EQ(m(0, 1), 4.0);
265 ASSERT_EQ(m(0, 2), 7.0);
266 ASSERT_EQ(m(1, 0), 2.0);
267 ASSERT_EQ(m(1, 1), 5.0);
268 ASSERT_EQ(m(1, 2), 8.0);
269 ASSERT_EQ(m(2, 0), 3.0);
270 ASSERT_EQ(m(2, 1), 6.0);
271 ASSERT_EQ(m(2, 2), 9.0);
277TEST(TestNumMatrix, Real3x3FromLines)
282 ASSERT_EQ(m(0, 0), 1.0);
283 ASSERT_EQ(m(0, 1), 2.0);
284 ASSERT_EQ(m(0, 2), 3.0);
285 ASSERT_EQ(m(1, 0), 4.0);
286 ASSERT_EQ(m(1, 1), 5.0);
287 ASSERT_EQ(m(1, 2), 6.0);
288 ASSERT_EQ(m(2, 0), 7.0);
289 ASSERT_EQ(m(2, 1), 8.0);
290 ASSERT_EQ(m(2, 2), 9.0);
296TEST(TestNumMatrix, Real3x3Conversion)
298 RealN3x3 m(RealN3(1.0, 2.0, 3.0),
299 RealN3(4.0, 5.0, 6.0),
300 RealN3(7.0, 8.0, 9.0));
302 ASSERT_EQ(r.
x.
x, 1.0);
303 ASSERT_EQ(r.
x.
y, 2.0);
304 ASSERT_EQ(r.
x.
z, 3.0);
305 ASSERT_EQ(r.
y.
x, 4.0);
306 ASSERT_EQ(r.
y.
y, 5.0);
307 ASSERT_EQ(r.
y.
z, 6.0);
308 ASSERT_EQ(r.
z.
x, 7.0);
309 ASSERT_EQ(r.
z.
y, 8.0);
310 ASSERT_EQ(r.
z.
z, 9.0);
315 ASSERT_EQ(m2(0, 0), 1.0);
316 ASSERT_EQ(m2(1, 1), 5.0);
317 ASSERT_EQ(m2(2, 2), 9.0);
328TEST(TestNumMatrix, Real3x3ElementAccess)
331 for (
int i = 0; i < 3; ++i)
332 for (
int j = 0; j < 3; ++j)
333 m(i, j) = double(i * 3 + j + 1);
335 ASSERT_EQ(m(0, 0), 1.0);
336 ASSERT_EQ(m(0, 1), 2.0);
337 ASSERT_EQ(m(0, 2), 3.0);
338 ASSERT_EQ(m(1, 0), 4.0);
339 ASSERT_EQ(m(1, 1), 5.0);
340 ASSERT_EQ(m(1, 2), 6.0);
341 ASSERT_EQ(m(2, 0), 7.0);
342 ASSERT_EQ(m(2, 1), 8.0);
343 ASSERT_EQ(m(2, 2), 9.0);
345 ASSERT_EQ(m.row(0), RealN3(1.0, 2.0, 3.0));
346 ASSERT_EQ(m.row(1), RealN3(4.0, 5.0, 6.0));
347 ASSERT_EQ(m.row(2), RealN3(7.0, 8.0, 9.0));
353TEST(TestNumMatrix, Real3x3Arithmetic)
355 RealN3x3 a(RealN3(1.0, 2.0, 3.0),
356 RealN3(4.0, 5.0, 6.0),
357 RealN3(7.0, 8.0, 9.0));
358 RealN3x3 b(RealN3(9.0, 8.0, 7.0),
359 RealN3(6.0, 5.0, 4.0),
360 RealN3(3.0, 2.0, 1.0));
363 ASSERT_EQ(c(0, 0), 10.0);
364 ASSERT_EQ(c(1, 1), 10.0);
365 ASSERT_EQ(c(2, 2), 10.0);
371 ASSERT_EQ(e(0, 0), -1.0);
372 ASSERT_EQ(e(1, 1), -5.0);
373 ASSERT_EQ(e(2, 2), -9.0);
375 RealN3x3 f = a * 2.0;
376 ASSERT_EQ(f(0, 0), 2.0);
377 ASSERT_EQ(f(1, 1), 10.0);
379 RealN3x3 g = 0.5 * f;
386TEST(TestNumMatrix, Real3x3Fill)
390 for (
int i = 0; i < 3; ++i)
391 for (
int j = 0; j < 3; ++j)
392 ASSERT_EQ(m(i, j), -1.0);
398TEST(TestNumMatrix, Real3x3NearlyZero)
411TEST(TestNumMatrix, NonSquare2x5)
416 for (
int j = 0; j < 5; ++j) {
418 m(1, j) = double(j * 10);
420 for (
int j = 0; j < 5; ++j) {
421 ASSERT_EQ(m(0, j),
double(j));
422 ASSERT_EQ(m(1, j),
double(j * 10));
425 ASSERT_EQ(m.row(0).vx(), 0.0);
426 ASSERT_EQ(m.row(0)(4), 4.0);
427 ASSERT_EQ(m.row(1)(3), 30.0);
431 for (
int j = 0; j < 5; ++j) {
432 ASSERT_EQ(n(0, j), 7.0);
433 ASSERT_EQ(n(1, j), 7.0);
440TEST(TestNumMatrix, NonSquare5x2)
445 for (
int i = 0; i < 5; ++i)
446 for (
int j = 0; j < 2; ++j)
447 m(i, j) = double(i + j);
449 for (
int i = 0; i < 5; ++i)
450 for (
int j = 0; j < 2; ++j)
451 ASSERT_EQ(m(i, j),
double(i + j));
453 ASSERT_EQ(m.vx()(1), 1.0);
454 ASSERT_EQ(m.vy()(1), 1.0 + 1.0);
455 ASSERT_EQ(m.row(3)(1), 4.0);
461TEST(TestNumMatrix, Int32x2)
466 ASSERT_EQ(m(0, 0), 0);
467 ASSERT_EQ(m(1, 1), 0);
473 ASSERT_EQ(m(0, 0), 1);
474 ASSERT_EQ(m(1, 1), 4);
476 Int32x2 n(Int32x2::VectorType(5, 6), Int32x2::VectorType(7, 8));
477 ASSERT_EQ(n(0, 0), 5);
478 ASSERT_EQ(n(1, 1), 8);
481 ASSERT_EQ(p(0, 0), 6);
482 ASSERT_EQ(p(0, 1), 8);
483 ASSERT_EQ(p(1, 0), 10);
484 ASSERT_EQ(p(1, 1), 12);
487 ASSERT_EQ(p(0, 0), 12);
#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