Arcane  v3.15.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Real3x3.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* Real3x3.h (C) 2000-2024 */
9/* */
10/* Matrice 3x3 de 'Real'. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_REAL3X3_H
13#define ARCANE_UTILS_REAL3X3_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Real3.h"
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21
22namespace Arcane
23{
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27/*!
28 * \brief Structure POD pour un Real3x3.
29 */
31{
32 public:
33
34 Real3POD x;
35 Real3POD y;
36 Real3POD z;
37};
38
39/*---------------------------------------------------------------------------*/
40/*---------------------------------------------------------------------------*/
41/*!
42 * \brief Classe gérant une matrice de réel de dimension 3x3.
43
44 La matrice comprend trois composantes \a x, \a y et \a z qui sont du
45 type \b Real3. Chaque composante représente une ligne de la matrice.
46 Par conséquent, Pour une matrice \a m, m.y.z représente la 2ème ligne
47 et la 3ème colonne de la matrice.
48
49 Il est aussi possible d'accéder aux éléments de la matrice à la
50 manière d'un tableau. Par exemple m[1][2] représente la 2ème ligne et la 3ème
51 colonne de la matrice.
52
53 Les matrices peuvent se construire par ligne en spécifiant les valeurs
54 par ligne (fromLines()) ou en spécifiant par colonne (fromColumns()).
55
56 Par exemple:
57
58 * \code
59 * Real3x3 matrix;
60 * matrix.x.y = 2.0;
61 * matrix.y.z = 3.0;
62 * matrix.x.x = 5.0;
63 * \endcode
64*/
65class ARCANE_UTILS_EXPORT Real3x3
66{
67 public:
68
69 //! Construit la matrice avec tous les coefficiants nuls.
70 constexpr ARCCORE_HOST_DEVICE Real3x3()
71 : x(Real3::zero())
72 , y(Real3::zero())
73 , z(Real3::zero())
74 {}
75
76 //! Construit la matrice avec les lignes (ax,ay,az)
77 constexpr ARCCORE_HOST_DEVICE Real3x3(Real3 ax, Real3 ay, Real3 az)
78 : x(ax)
79 , y(ay)
80 , z(az)
81 {}
82
83 /*!
84 * \brief Construit le tenseur ((ax,bx,cx),(ay,by,cy),(az,bz,cz)).
85 * \deprecated Utiliser Real3x3(Real3 x,Real3 y,Real3 z) à la place.
86 */
87 ARCANE_DEPRECATED_116 Real3x3(Real ax, Real ay, Real az, Real bx, Real by, Real bz, Real cx, Real cy, Real cz)
88 : x(ax, bx, cx)
89 , y(ay, by, cy)
90 , z(az, bz, cz)
91 {}
92 //! Construit un triplet identique à \a f
93 Real3x3(const Real3x3& f) = default;
94 //! Construit un triplet identique à \a f
95 constexpr ARCCORE_HOST_DEVICE explicit Real3x3(const Real3x3POD& f)
96 : x(f.x)
97 , y(f.y)
98 , z(f.z)
99 {}
100 //! Construit l'instance avec le triplet (v,v,v).
101 constexpr ARCCORE_HOST_DEVICE explicit Real3x3(Real v)
102 {
103 x = y = z = v;
104 }
105 //! Opérateur de recopie
106 Real3x3& operator=(const Real3x3& f) = default;
107
108 //! Affecte à l'instance le triplet (v,v,v).
109 constexpr ARCCORE_HOST_DEVICE Real3x3& operator=(Real v)
110 {
111 x = y = z = v;
112 return (*this);
113 }
114
115 public:
116
117 Real3 x; //!< premier élément du triplet
118 Real3 y; //!< premier élément du triplet
119 Real3 z; //!< premier élément du triplet
120
121 public:
122
123 //! Construit le tenseur nul.
124 constexpr ARCCORE_HOST_DEVICE static Real3x3 null() { return Real3x3(); }
125
126 //! Construit la matrice nulle
127 constexpr ARCCORE_HOST_DEVICE static Real3x3 zero() { return Real3x3(); }
128
129 //! Construit la matrice identité
130 constexpr ARCCORE_HOST_DEVICE static Real3x3 identity() { return Real3x3(Real3(1.0, 0.0, 0.0), Real3(0.0, 1.0, 0.0), Real3(0.0, 0.0, 1.0)); }
131
132 //! Construit la matrice ((ax,bx,cx),(ay,by,cy),(az,bz,cz)).
133 constexpr ARCCORE_HOST_DEVICE static Real3x3 fromColumns(Real ax, Real ay, Real az, Real bx, Real by, Real bz, Real cx, Real cy, Real cz)
134 {
135 return Real3x3(Real3(ax, bx, cx), Real3(ay, by, cy), Real3(az, bz, cz));
136 }
137
138 //! Construit la matrice ((ax,bx,cx),(ay,by,cy),(az,bz,cz)).
139 constexpr ARCCORE_HOST_DEVICE static Real3x3 fromLines(Real ax, Real bx, Real cx, Real ay, Real by, Real cy, Real az, Real bz, Real cz)
140 {
141 return Real3x3(Real3(ax, bx, cx), Real3(ay, by, cy), Real3(az, bz, cz));
142 }
143
144 public:
145
146 //! Retourne une copie de la matrice
147 constexpr ARCCORE_HOST_DEVICE Real3x3 copy() const { return (*this); }
148
149 //! Remet à zéro les coefficients de la matrice.
150 constexpr ARCCORE_HOST_DEVICE Real3x3& reset()
151 {
152 *this = zero();
153 return (*this);
154 }
155
156 //! Affecte à l'instance les lignes (ax,ay,az)
157 constexpr ARCCORE_HOST_DEVICE Real3x3& assign(Real3 ax, Real3 ay, Real3 az)
158 {
159 x = ax;
160 y = ay;
161 z = az;
162 return (*this);
163 }
164
165 //! Copie la matrice \a f
166 constexpr ARCCORE_HOST_DEVICE Real3x3& assign(Real3x3 f)
167 {
168 x = f.x;
169 y = f.y;
170 z = f.z;
171 return (*this);
172 }
173
174 /*!
175 * \brief Lit la matrice sur le flot \a i
176 * La matrice est lue sous la forme de trois Real3.
177 */
178 std::istream& assign(std::istream& i);
179 //! Ecrit le triplet sur le flot \a o lisible par un assign()
180 std::ostream& print(std::ostream& o) const;
181 //! Ecrit le triplet sur le flot \a o sous la forme (x,y,z)
182 std::ostream& printXyz(std::ostream& o) const;
183
184 //! Ajoute \a b au triplet
185 constexpr ARCCORE_HOST_DEVICE Real3x3& add(Real3x3 b)
186 {
187 x += b.x;
188 y += b.y;
189 z += b.z;
190 return (*this);
191 }
192 //! Soustrait \a b au triplet
193 constexpr ARCCORE_HOST_DEVICE Real3x3& sub(Real3x3 b)
194 {
195 x -= b.x;
196 y -= b.y;
197 z -= b.z;
198 return (*this);
199 }
200 //! Ajoute \a b à chaque composante du triplet
201 constexpr ARCCORE_HOST_DEVICE Real3x3& addSame(Real3 b)
202 {
203 x += b;
204 y += b;
205 z += b;
206 return (*this);
207 }
208 //! Soustrait \a b à chaque composante du triplet
209 constexpr ARCCORE_HOST_DEVICE Real3x3& subSame(Real3 b)
210 {
211 x -= b;
212 y -= b;
213 z -= b;
214 return (*this);
215 }
216 //! Ajoute \a b au triplet.
217 constexpr ARCCORE_HOST_DEVICE Real3x3& operator+=(Real3x3 b) { return add(b); }
218 //! Soustrait \a b au triplet
219 constexpr ARCCORE_HOST_DEVICE Real3x3& operator-=(Real3x3 b) { return sub(b); }
220 //! Multiple chaque composante de la matrice par le réel \a b
221 constexpr ARCCORE_HOST_DEVICE void operator*=(Real b)
222 {
223 x *= b;
224 y *= b;
225 z *= b;
226 }
227 //! Divise chaque composante de la matrice par le réel \a b
228 constexpr ARCCORE_HOST_DEVICE void operator/=(Real b)
229 {
230 x /= b;
231 y /= b;
232 z /= b;
233 }
234 //! Créé un triplet qui vaut ce triplet ajouté à \a b
235 constexpr ARCCORE_HOST_DEVICE Real3x3 operator+(Real3x3 b) const { return Real3x3(x + b.x, y + b.y, z + b.z); }
236 //! Créé un triplet qui vaut \a b soustrait de ce triplet
237 constexpr ARCCORE_HOST_DEVICE Real3x3 operator-(Real3x3 b) const { return Real3x3(x - b.x, y - b.y, z - b.z); }
238 //! Créé un tenseur opposé au tenseur actuel
239 constexpr ARCCORE_HOST_DEVICE Real3x3 operator-() const { return Real3x3(-x, -y, -z); }
240
241 /*!
242 * \brief Compare composant pas composante l'instance courante à \a b.
243 *
244 * \retval true si this.x==b.x et this.y==b.y et this.z==b.z.
245 * \retval false sinon.
246 */
247 constexpr ARCCORE_HOST_DEVICE bool operator==(Real3x3 b) const
248 {
249 return x == b.x && y == b.y && z == b.z;
250 }
251
252 /*!
253 * \brief Compare deux triplets.
254 * Pour la notion d'égalité, voir operator==()
255 * \retval true si les deux triplets sont différents,
256 * \retval false sinon.
257 */
258 constexpr ARCCORE_HOST_DEVICE bool operator!=(Real3x3 b) const
259 {
260 return !operator==(b);
261 }
262
263 /*!
264 * \brief Accès en lecture seule à la \a i-ème (entre 0 et 2 inclus) ligne de l'instance.
265 * \param i numéro de la ligne à retourner
266 */
267 ARCCORE_HOST_DEVICE Real3 operator[](Integer i) const
268 {
269 ARCCORE_CHECK_AT(i, 3);
270 return (&x)[i];
271 }
272
273 /*!
274 * \brief Accès en lecture seule à la \a i-ème (entre 0 et 2 inclus) ligne de l'instance.
275 * \param i numéro de la ligne à retourner
276 */
277 ARCCORE_HOST_DEVICE Real3 operator()(Integer i) const
278 {
279 ARCCORE_CHECK_AT(i, 3);
280 return (&x)[i];
281 }
282
283 /*!
284 * \brief Accès en lecture seule à la \a i-ème ligne et \a j-ème colonne.
285 * \param i numéro de la ligne à retourner
286 * \param j numéro de la colonne à retourner
287 */
288 ARCCORE_HOST_DEVICE Real operator()(Integer i, Integer j) const
289 {
290 ARCCORE_CHECK_AT(i, 3);
291 ARCCORE_CHECK_AT(j, 3);
292 return (&x)[i][j];
293 }
294
295 /*!
296 * \brief Accès à la \a i-ème ligne (entre 0 et 2 inclus) de l'instance.
297 * \param i numéro de la ligne à retourner
298 */
299 ARCCORE_HOST_DEVICE Real3& operator[](Integer i)
300 {
301 ARCCORE_CHECK_AT(i, 3);
302 return (&x)[i];
303 }
304
305 /*!
306 * \brief Accès à la \a i-ème ligne (entre 0 et 2 inclus) de l'instance.
307 * \param i numéro de la ligne à retourner
308 */
309 ARCCORE_HOST_DEVICE Real3& operator()(Integer i)
310 {
311 ARCCORE_CHECK_AT(i, 3);
312 return (&x)[i];
313 }
314
315 /*!
316 * \brief Accès à la \a i-ème ligne et \a j-ème colonne.
317 * \param i numéro de la ligne à retourner
318 * \param j numéro de la colonne à retourner
319 */
320 ARCCORE_HOST_DEVICE Real& operator()(Integer i, Integer j)
321 {
322 ARCCORE_CHECK_AT(i, 3);
323 ARCCORE_CHECK_AT(j, 3);
324 return (&x)[i][j];
325 }
326
327 //! Déterminant de la matrice
328 constexpr ARCCORE_HOST_DEVICE Real determinant() const
329 {
330 return (x.x * (y.y * z.z - y.z * z.y) + x.y * (y.z * z.x - y.x * z.z) + x.z * (y.x * z.y - y.y * z.x));
331 }
332
333 //! Ecrit le triplet \a t sur le flot \a o.
334 friend std::ostream& operator<<(std::ostream& o, Real3x3 t)
335 {
336 return t.printXyz(o);
337 }
338
339 //! Lit le triplet \a t à partir du flot \a o.
340 friend std::istream& operator>>(std::istream& i, Real3x3& t)
341 {
342 return t.assign(i);
343 }
344
345 //! Multiplication par un scalaire.
346 friend constexpr ARCCORE_HOST_DEVICE Real3x3 operator*(Real sca, Real3x3 vec)
347 {
348 return Real3x3(vec.x * sca, vec.y * sca, vec.z * sca);
349 }
350
351 //! Multiplication par un scalaire.
352 friend constexpr ARCCORE_HOST_DEVICE Real3x3 operator*(Real3x3 vec, Real sca)
353 {
354 return Real3x3(vec.x * sca, vec.y * sca, vec.z * sca);
355 }
356
357 //! Division par un scalaire.
358 friend constexpr ARCCORE_HOST_DEVICE Real3x3 operator/(Real3x3 vec, Real sca)
359 {
360 return Real3x3(vec.x / sca, vec.y / sca, vec.z / sca);
361 }
362
363 /*!
364 * \brief Opérateur de comparaison.
365 *
366 * Cet opérateur permet de trier les Real3 pour les utiliser par exemple
367 * dans les std::set
368 */
369 friend constexpr ARCCORE_HOST_DEVICE bool operator<(Real3x3 v1, Real3x3 v2)
370 {
371 if (v1.x == v2.x) {
372 if (v1.y == v2.y)
373 return v1.z < v2.z;
374 else
375 return v1.y < v2.y;
376 }
377 return (v1.x < v2.x);
378 }
379
380 public:
381
382 // TODO: rendre obsolète mi-2025: ARCANE_DEPRECATED_REASON("Y2024: Use math::isNearlyZero(const Real3x3&) instead")
383 inline constexpr ARCCORE_HOST_DEVICE bool isNearlyZero() const;
384
385 private:
386
387 /*!
388 * \brief Compare les valeurs de \a a et \a b avec le comparateur TypeEqualT
389 * \retval true si \a a et \a b sont égaux,
390 * \retval false sinon.
391 */
392 constexpr ARCCORE_HOST_DEVICE static bool _eq(Real a, Real b)
393 {
394 return TypeEqualT<Real>::isEqual(a, b);
395 }
396};
397
398/*---------------------------------------------------------------------------*/
399/*---------------------------------------------------------------------------*/
400
401namespace math
402{
403 /*!
404 * \brief Compare la matrice avec la matrice nulle.
405 *
406 * La matrice est nulle si et seulement si chacune de ses composantes
407 * est inférieure à un espilon donné. La valeur de l'epsilon utilisée est celle
408 * de float_info<value_type>::nearlyEpsilon():
409 * \f[A=0 \Leftrightarrow |A.x|<\epsilon,|A.y|<\epsilon,|A.z|<\epsilon \f]
410 *
411 * \retval true si la matrice est égale à la matrice nulle,
412 * \retval false sinon.
413 */
414 inline constexpr ARCCORE_HOST_DEVICE bool isNearlyZero(const Real3x3& v)
415 {
416 return isNearlyZero(v.x) && isNearlyZero(v.y) && isNearlyZero(v.z);
417 }
418} // namespace math
419
420/*---------------------------------------------------------------------------*/
421/*---------------------------------------------------------------------------*/
422
423inline constexpr ARCCORE_HOST_DEVICE bool Real3x3::
424isNearlyZero() const
425{
426 return math::isNearlyZero(*this);
427}
428
429/*---------------------------------------------------------------------------*/
430/*---------------------------------------------------------------------------*/
431
432} // End namespace Arcane
433
434/*---------------------------------------------------------------------------*/
435/*---------------------------------------------------------------------------*/
436
437#endif
Classe gérant un vecteur de réel de dimension 3.
Definition Real3.h:132
Classe gérant une matrice de réel de dimension 3x3.
Definition Real3x3.h:66
constexpr __host__ __device__ Real3x3 operator-(Real3x3 b) const
Créé un triplet qui vaut b soustrait de ce triplet.
Definition Real3x3.h:237
constexpr __host__ static __device__ Real3x3 null()
Construit le tenseur nul.
Definition Real3x3.h:124
Real3x3(const Real3x3 &f)=default
Construit un triplet identique à f.
friend constexpr __host__ __device__ Real3x3 operator*(Real sca, Real3x3 vec)
Multiplication par un scalaire.
Definition Real3x3.h:346
constexpr __host__ __device__ Real3x3 & add(Real3x3 b)
Ajoute b au triplet.
Definition Real3x3.h:185
constexpr __host__ static __device__ Real3x3 identity()
Construit la matrice identité
Definition Real3x3.h:130
constexpr __host__ __device__ Real3x3 & subSame(Real3 b)
Soustrait b à chaque composante du triplet.
Definition Real3x3.h:209
std::ostream & printXyz(std::ostream &o) const
Ecrit le triplet sur le flot o sous la forme (x,y,z)
Definition Real3x3.cc:49
constexpr __host__ __device__ Real3x3 & assign(Real3 ax, Real3 ay, Real3 az)
Affecte à l'instance les lignes (ax,ay,az)
Definition Real3x3.h:157
Real3 z
premier élément du triplet
Definition Real3x3.h:119
constexpr __host__ __device__ bool operator==(Real3x3 b) const
Compare composant pas composante l'instance courante à b.
Definition Real3x3.h:247
friend constexpr __host__ __device__ bool operator<(Real3x3 v1, Real3x3 v2)
Opérateur de comparaison.
Definition Real3x3.h:369
constexpr __host__ __device__ Real3x3 & sub(Real3x3 b)
Soustrait b au triplet.
Definition Real3x3.h:193
constexpr __host__ static __device__ Real3x3 fromLines(Real ax, Real bx, Real cx, Real ay, Real by, Real cy, Real az, Real bz, Real cz)
Construit la matrice ((ax,bx,cx),(ay,by,cy),(az,bz,cz)).
Definition Real3x3.h:139
constexpr __host__ __device__ Real3x3 & operator=(Real v)
Affecte à l'instance le triplet (v,v,v).
Definition Real3x3.h:109
constexpr __host__ __device__ Real3x3 & reset()
Remet à zéro les coefficients de la matrice.
Definition Real3x3.h:150
Real3 y
premier élément du triplet
Definition Real3x3.h:118
constexpr __host__ __device__ Real3x3 & assign(Real3x3 f)
Copie la matrice f.
Definition Real3x3.h:166
constexpr __host__ __device__ Real determinant() const
Déterminant de la matrice.
Definition Real3x3.h:328
__host__ __device__ Real3 operator()(Integer i) const
Accès en lecture seule à la i-ème (entre 0 et 2 inclus) ligne de l'instance.
Definition Real3x3.h:277
constexpr __host__ static __device__ Real3x3 fromColumns(Real ax, Real ay, Real az, Real bx, Real by, Real bz, Real cx, Real cy, Real cz)
Construit la matrice ((ax,bx,cx),(ay,by,cy),(az,bz,cz)).
Definition Real3x3.h:133
constexpr __host__ __device__ Real3x3()
Construit la matrice avec tous les coefficiants nuls.
Definition Real3x3.h:70
__host__ __device__ Real3 operator[](Integer i) const
Accès en lecture seule à la i-ème (entre 0 et 2 inclus) ligne de l'instance.
Definition Real3x3.h:267
constexpr __host__ __device__ Real3x3 & addSame(Real3 b)
Ajoute b à chaque composante du triplet.
Definition Real3x3.h:201
Real3x3 & operator=(const Real3x3 &f)=default
Opérateur de recopie.
constexpr __host__ __device__ Real3x3(const Real3x3POD &f)
Construit un triplet identique à f.
Definition Real3x3.h:95
constexpr __host__ __device__ bool operator!=(Real3x3 b) const
Compare deux triplets. Pour la notion d'égalité, voir operator==()
Definition Real3x3.h:258
Real3 x
premier élément du triplet
Definition Real3x3.h:117
constexpr __host__ __device__ Real3x3(Real v)
Construit l'instance avec le triplet (v,v,v).
Definition Real3x3.h:101
friend std::ostream & operator<<(std::ostream &o, Real3x3 t)
Ecrit le triplet t sur le flot o.
Definition Real3x3.h:334
__host__ __device__ Real3 & operator[](Integer i)
Accès à la i-ème ligne (entre 0 et 2 inclus) de l'instance.
Definition Real3x3.h:299
constexpr __host__ static __device__ Real3x3 zero()
Construit la matrice nulle.
Definition Real3x3.h:127
__host__ __device__ Real operator()(Integer i, Integer j) const
Accès en lecture seule à la i-ème ligne et j-ème colonne.
Definition Real3x3.h:288
friend std::istream & operator>>(std::istream &i, Real3x3 &t)
Lit le triplet t à partir du flot o.
Definition Real3x3.h:340
constexpr __host__ __device__ Real3x3(Real3 ax, Real3 ay, Real3 az)
Construit la matrice avec les lignes (ax,ay,az)
Definition Real3x3.h:77
constexpr __host__ __device__ Real3x3 & operator+=(Real3x3 b)
Ajoute b au triplet.
Definition Real3x3.h:217
constexpr __host__ __device__ void operator/=(Real b)
Divise chaque composante de la matrice par le réel b.
Definition Real3x3.h:228
constexpr __host__ __device__ Real3x3 copy() const
Retourne une copie de la matrice.
Definition Real3x3.h:147
constexpr __host__ __device__ Real3x3 operator-() const
Créé un tenseur opposé au tenseur actuel.
Definition Real3x3.h:239
constexpr __host__ __device__ Real3x3 operator+(Real3x3 b) const
Créé un triplet qui vaut ce triplet ajouté à b.
Definition Real3x3.h:235
ARCANE_DEPRECATED_116 Real3x3(Real ax, Real ay, Real az, Real bx, Real by, Real bz, Real cx, Real cy, Real cz)
Construit le tenseur ((ax,bx,cx),(ay,by,cy),(az,bz,cz)).
Definition Real3x3.h:87
constexpr __host__ __device__ void operator*=(Real b)
Multiple chaque composante de la matrice par le réel b.
Definition Real3x3.h:221
__host__ __device__ Real & operator()(Integer i, Integer j)
Accès à la i-ème ligne et j-ème colonne.
Definition Real3x3.h:320
constexpr __host__ __device__ Real3x3 & operator-=(Real3x3 b)
Soustrait b au triplet.
Definition Real3x3.h:219
friend constexpr __host__ __device__ Real3x3 operator/(Real3x3 vec, Real sca)
Division par un scalaire.
Definition Real3x3.h:358
friend constexpr __host__ __device__ Real3x3 operator*(Real3x3 vec, Real sca)
Multiplication par un scalaire.
Definition Real3x3.h:352
__host__ __device__ Real3 & operator()(Integer i)
Accès à la i-ème ligne (entre 0 et 2 inclus) de l'instance.
Definition Real3x3.h:309
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Real y
deuxième composante du triplet
Definition Real3.h:36
Real z
troisième composante du triplet
Definition Real3.h:37
Real x
première composante du triplet
Definition Real3.h:35
Structure POD pour un Real3x3.
Definition Real3x3.h:31