Arcane  v3.14.10.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 Compare la matrice avec la matrice nulle.
176 *
177 * La matrice est nulle si et seulement si chacune de ses composantes
178 * est inférieure à un espilon donné. La valeur de l'epsilon utilisée est celle
179 * de float_info<value_type>::nearlyEpsilon():
180 * \f[A=0 \Leftrightarrow |A.x|<\epsilon,|A.y|<\epsilon,|A.z|<\epsilon \f]
181 *
182 * \retval true si la matrice est égale à la matrice nulle,
183 * \retval false sinon.
184 */
185 constexpr ARCCORE_HOST_DEVICE bool isNearlyZero() const
186 {
187 return x.isNearlyZero() && y.isNearlyZero() && z.isNearlyZero();
188 }
189
190 /*!
191 * \brief Lit la matrice sur le flot \a i
192 * La matrice est lue sous la forme de trois Real3.
193 */
194 std::istream& assign(std::istream& i);
195 //! Ecrit le triplet sur le flot \a o lisible par un assign()
196 std::ostream& print(std::ostream& o) const;
197 //! Ecrit le triplet sur le flot \a o sous la forme (x,y,z)
198 std::ostream& printXyz(std::ostream& o) const;
199
200 //! Ajoute \a b au triplet
201 constexpr ARCCORE_HOST_DEVICE Real3x3& add(Real3x3 b)
202 {
203 x += b.x;
204 y += b.y;
205 z += b.z;
206 return (*this);
207 }
208 //! Soustrait \a b au triplet
209 constexpr ARCCORE_HOST_DEVICE Real3x3& sub(Real3x3 b)
210 {
211 x -= b.x;
212 y -= b.y;
213 z -= b.z;
214 return (*this);
215 }
216 //! Ajoute \a b à chaque composante du triplet
217 constexpr ARCCORE_HOST_DEVICE Real3x3& addSame(Real3 b)
218 {
219 x += b;
220 y += b;
221 z += b;
222 return (*this);
223 }
224 //! Soustrait \a b à chaque composante du triplet
225 constexpr ARCCORE_HOST_DEVICE Real3x3& subSame(Real3 b)
226 {
227 x -= b;
228 y -= b;
229 z -= b;
230 return (*this);
231 }
232 //! Ajoute \a b au triplet.
233 constexpr ARCCORE_HOST_DEVICE Real3x3& operator+=(Real3x3 b) { return add(b); }
234 //! Soustrait \a b au triplet
235 constexpr ARCCORE_HOST_DEVICE Real3x3& operator-=(Real3x3 b) { return sub(b); }
236 //! Multiple chaque composante de la matrice par le réel \a b
237 constexpr ARCCORE_HOST_DEVICE void operator*=(Real b)
238 {
239 x *= b;
240 y *= b;
241 z *= b;
242 }
243 //! Divise chaque composante de la matrice par le réel \a b
244 constexpr ARCCORE_HOST_DEVICE void operator/=(Real b)
245 {
246 x /= b;
247 y /= b;
248 z /= b;
249 }
250 //! Créé un triplet qui vaut ce triplet ajouté à \a b
251 constexpr ARCCORE_HOST_DEVICE Real3x3 operator+(Real3x3 b) const { return Real3x3(x + b.x, y + b.y, z + b.z); }
252 //! Créé un triplet qui vaut \a b soustrait de ce triplet
253 constexpr ARCCORE_HOST_DEVICE Real3x3 operator-(Real3x3 b) const { return Real3x3(x - b.x, y - b.y, z - b.z); }
254 //! Créé un tenseur opposé au tenseur actuel
255 constexpr ARCCORE_HOST_DEVICE Real3x3 operator-() const { return Real3x3(-x, -y, -z); }
256
257 /*!
258 * \brief Compare composant pas composante l'instance courante à \a b.
259 *
260 * \retval true si this.x==b.x et this.y==b.y et this.z==b.z.
261 * \retval false sinon.
262 */
263 constexpr ARCCORE_HOST_DEVICE bool operator==(Real3x3 b) const
264 {
265 return x == b.x && y == b.y && z == b.z;
266 }
267
268 /*!
269 * \brief Compare deux triplets.
270 * Pour la notion d'égalité, voir operator==()
271 * \retval true si les deux triplets sont différents,
272 * \retval false sinon.
273 */
274 constexpr ARCCORE_HOST_DEVICE bool operator!=(Real3x3 b) const
275 {
276 return !operator==(b);
277 }
278
279 /*!
280 * \brief Accès en lecture seule à la \a i-ème (entre 0 et 2 inclus) ligne de l'instance.
281 * \param i numéro de la ligne à retourner
282 */
283 ARCCORE_HOST_DEVICE Real3 operator[](Integer i) const
284 {
285 ARCCORE_CHECK_AT(i, 3);
286 return (&x)[i];
287 }
288
289 /*!
290 * \brief Accès en lecture seule à la \a i-ème (entre 0 et 2 inclus) ligne de l'instance.
291 * \param i numéro de la ligne à retourner
292 */
293 ARCCORE_HOST_DEVICE Real3 operator()(Integer i) const
294 {
295 ARCCORE_CHECK_AT(i, 3);
296 return (&x)[i];
297 }
298
299 /*!
300 * \brief Accès en lecture seule à la \a i-ème ligne et \a j-ème colonne.
301 * \param i numéro de la ligne à retourner
302 * \param j numéro de la colonne à retourner
303 */
304 ARCCORE_HOST_DEVICE Real operator()(Integer i, Integer j) const
305 {
306 ARCCORE_CHECK_AT(i, 3);
307 ARCCORE_CHECK_AT(j, 3);
308 return (&x)[i][j];
309 }
310
311 /*!
312 * \brief Accès à la \a i-ème ligne (entre 0 et 2 inclus) de l'instance.
313 * \param i numéro de la ligne à retourner
314 */
315 ARCCORE_HOST_DEVICE Real3& operator[](Integer i)
316 {
317 ARCCORE_CHECK_AT(i, 3);
318 return (&x)[i];
319 }
320
321 /*!
322 * \brief Accès à la \a i-ème ligne (entre 0 et 2 inclus) de l'instance.
323 * \param i numéro de la ligne à retourner
324 */
325 ARCCORE_HOST_DEVICE Real3& operator()(Integer i)
326 {
327 ARCCORE_CHECK_AT(i, 3);
328 return (&x)[i];
329 }
330
331 /*!
332 * \brief Accès à la \a i-ème ligne et \a j-ème colonne.
333 * \param i numéro de la ligne à retourner
334 * \param j numéro de la colonne à retourner
335 */
336 ARCCORE_HOST_DEVICE Real& operator()(Integer i, Integer j)
337 {
338 ARCCORE_CHECK_AT(i, 3);
339 ARCCORE_CHECK_AT(j, 3);
340 return (&x)[i][j];
341 }
342
343 //! Déterminant de la matrice
344 constexpr ARCCORE_HOST_DEVICE Real determinant() const
345 {
346 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));
347 }
348
349 //! Ecrit le triplet \a t sur le flot \a o.
350 friend std::ostream& operator<<(std::ostream& o, Real3x3 t)
351 {
352 return t.printXyz(o);
353 }
354
355 //! Lit le triplet \a t à partir du flot \a o.
356 friend std::istream& operator>>(std::istream& i, Real3x3& t)
357 {
358 return t.assign(i);
359 }
360
361 //! Multiplication par un scalaire.
362 friend constexpr ARCCORE_HOST_DEVICE Real3x3 operator*(Real sca, Real3x3 vec)
363 {
364 return Real3x3(vec.x * sca, vec.y * sca, vec.z * sca);
365 }
366
367 //! Multiplication par un scalaire.
368 friend constexpr ARCCORE_HOST_DEVICE Real3x3 operator*(Real3x3 vec, Real sca)
369 {
370 return Real3x3(vec.x * sca, vec.y * sca, vec.z * sca);
371 }
372
373 //! Division par un scalaire.
374 friend constexpr ARCCORE_HOST_DEVICE Real3x3 operator/(Real3x3 vec, Real sca)
375 {
376 return Real3x3(vec.x / sca, vec.y / sca, vec.z / sca);
377 }
378
379 /*!
380 * \brief Opérateur de comparaison.
381 *
382 * Cet opérateur permet de trier les Real3 pour les utiliser par exemple
383 * dans les std::set
384 */
385 friend constexpr ARCCORE_HOST_DEVICE bool operator<(Real3x3 v1, Real3x3 v2)
386 {
387 if (v1.x == v2.x) {
388 if (v1.y == v2.y)
389 return v1.z < v2.z;
390 else
391 return v1.y < v2.y;
392 }
393 return (v1.x < v2.x);
394 }
395
396 private:
397
398 /*!
399 * \brief Compare les valeurs de \a a et \a b avec le comparateur TypeEqualT
400 * \retval true si \a a et \a b sont égaux,
401 * \retval false sinon.
402 */
403 constexpr ARCCORE_HOST_DEVICE static bool _eq(Real a, Real b)
404 {
405 return TypeEqualT<Real>::isEqual(a, b);
406 }
407};
408
409/*---------------------------------------------------------------------------*/
410/*---------------------------------------------------------------------------*/
411
412} // End namespace Arcane
413
414/*---------------------------------------------------------------------------*/
415/*---------------------------------------------------------------------------*/
416
417#endif
Classe gérant un vecteur de réel de dimension 3.
Definition Real3.h:132
constexpr __host__ __device__ bool isNearlyZero() const
Indique si l'instance est proche de l'instance nulle.
Definition Real3.h:225
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:253
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:362
constexpr __host__ __device__ Real3x3 & add(Real3x3 b)
Ajoute b au triplet.
Definition Real3x3.h:201
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:225
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:263
friend constexpr __host__ __device__ bool operator<(Real3x3 v1, Real3x3 v2)
Opérateur de comparaison.
Definition Real3x3.h:385
constexpr __host__ __device__ Real3x3 & sub(Real3x3 b)
Soustrait b au triplet.
Definition Real3x3.h:209
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:344
__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:293
constexpr __host__ __device__ bool isNearlyZero() const
Compare la matrice avec la matrice nulle.
Definition Real3x3.h:185
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:283
constexpr __host__ __device__ Real3x3 & addSame(Real3 b)
Ajoute b à chaque composante du triplet.
Definition Real3x3.h:217
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:274
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:350
__host__ __device__ Real3 & operator[](Integer i)
Accès à la i-ème ligne (entre 0 et 2 inclus) de l'instance.
Definition Real3x3.h:315
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:304
friend std::istream & operator>>(std::istream &i, Real3x3 &t)
Lit le triplet t à partir du flot o.
Definition Real3x3.h:356
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:233
constexpr __host__ __device__ void operator/=(Real b)
Divise chaque composante de la matrice par le réel b.
Definition Real3x3.h:244
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:255
constexpr __host__ __device__ Real3x3 operator+(Real3x3 b) const
Créé un triplet qui vaut ce triplet ajouté à b.
Definition Real3x3.h:251
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:237
__host__ __device__ Real & operator()(Integer i, Integer j)
Accès à la i-ème ligne et j-ème colonne.
Definition Real3x3.h:336
constexpr __host__ __device__ Real3x3 & operator-=(Real3x3 b)
Soustrait b au triplet.
Definition Real3x3.h:235
friend constexpr __host__ __device__ Real3x3 operator/(Real3x3 vec, Real sca)
Division par un scalaire.
Definition Real3x3.h:374
friend constexpr __host__ __device__ Real3x3 operator*(Real3x3 vec, Real sca)
Multiplication par un scalaire.
Definition Real3x3.h:368
__host__ __device__ Real3 & operator()(Integer i)
Accès à la i-ème ligne (entre 0 et 2 inclus) de l'instance.
Definition Real3x3.h:325
-*- 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