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