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