Arcane  v3.16.6.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
Real3.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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/* Real3.h (C) 2000-2025 */
9/* */
10/* Vecteur à 3 dimensions de 'Real'. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_REAL3_H
13#define ARCANE_UTILS_REAL3_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Numeric.h"
18#include "arcane/utils/Real2.h"
19
20#include <iosfwd>
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
32{
33 public:
34
38
48 ARCCORE_HOST_DEVICE Real operator[](Integer i) const
49 {
50 ARCCORE_CHECK_AT(i, 3);
51 return (&x)[i];
52 }
53
63 ARCCORE_HOST_DEVICE Real operator()(Integer i) const
64 {
65 ARCCORE_CHECK_AT(i, 3);
66 return (&x)[i];
67 }
68
78 ARCCORE_HOST_DEVICE Real& operator[](Integer i)
79 {
80 ARCCORE_CHECK_AT(i,3);
81 return (&x)[i];
82 }
83
93 ARCCORE_HOST_DEVICE Real& operator()(Integer i)
94 {
95 ARCCORE_CHECK_AT(i,3);
96 return (&x)[i];
97 }
98
100 ARCCORE_HOST_DEVICE void setComponent(Integer i, Real value)
101 {
102 ARCCORE_CHECK_AT(i, 3);
103 (&x)[i] = value;
104 }
105};
106
107/*---------------------------------------------------------------------------*/
108/*---------------------------------------------------------------------------*/
129
130class ARCANE_UTILS_EXPORT Real3
131: public Real3POD
132{
133 public:
134
136 constexpr ARCCORE_HOST_DEVICE Real3()
137 : Real3POD()
138 {
139 x = 0.0;
140 y = 0.0;
141 z = 0.0;
142 }
143
144 constexpr ARCCORE_HOST_DEVICE Real3(Real ax, Real ay, Real az)
145 : Real3POD()
146 {
147 x = ax;
148 y = ay;
149 z = az;
150 }
151
152 Real3(const Real3& f) = default;
154 constexpr ARCCORE_HOST_DEVICE explicit Real3(const Real3POD& f)
155 : Real3POD()
156 {
157 x = f.x;
158 y = f.y;
159 z = f.z;
160 }
161
163 constexpr ARCCORE_HOST_DEVICE explicit Real3(Real v)
164 : Real3POD()
165 {
166 x = y = z = v;
167 }
168
170 constexpr ARCCORE_HOST_DEVICE explicit Real3(const Real2& f)
171 : Real3POD()
172 {
173 x = f.x;
174 y = f.y;
175 z = 0.0;
176 }
177
179 constexpr ARCCORE_HOST_DEVICE Real3(ConstArrayView<Real> av)
180 : Real3POD()
181 {
182 x = av[0];
183 y = av[1];
184 z = av[2];
185 }
186
188 Real3& operator=(const Real3& f) = default;
189
191 constexpr ARCCORE_HOST_DEVICE Real3& operator=(Real v)
192 {
193 x = y = z = v;
194 return (*this);
195 }
196
197 public:
198
199 constexpr ARCCORE_HOST_DEVICE static Real3 null() { return Real3(0., 0., 0.); }
200 constexpr ARCCORE_HOST_DEVICE static Real3 zero() { return Real3(0., 0., 0.); }
201
202 public:
203
205 constexpr ARCCORE_HOST_DEVICE Real3 copy() const { return (*this); }
207 constexpr ARCCORE_HOST_DEVICE Real3& reset()
208 {
209 x = y = z = 0.;
210 return (*this);
211 }
212
213 constexpr ARCCORE_HOST_DEVICE Real3& assign(Real ax, Real ay, Real az)
214 {
215 x = ax;
216 y = ay;
217 z = az;
218 return (*this);
219 }
220
221 constexpr ARCCORE_HOST_DEVICE Real3& assign(Real3 f)
222 {
223 x = f.x;
224 y = f.y;
225 z = f.z;
226 return (*this);
227 }
228
230 constexpr ARCCORE_HOST_DEVICE ArrayView<Real> view()
231 {
232 return { 3, &x };
233 }
234
236 constexpr ARCCORE_HOST_DEVICE ConstArrayView<Real> constView() const
237 {
238 return { 3, &x };
239 }
240
242 ARCCORE_HOST_DEVICE Real3 absolute() const { return Real3(math::abs(x), math::abs(y), math::abs(z)); }
243
248 std::istream& assign(std::istream& i);
250 std::ostream& print(std::ostream& o) const;
252 std::ostream& printXyz(std::ostream& o) const;
253
255 constexpr ARCCORE_HOST_DEVICE Real3& add(Real3 b)
256 {
257 x += b.x;
258 y += b.y;
259 z += b.z;
260 return (*this);
261 }
262
263 constexpr ARCCORE_HOST_DEVICE Real3& sub(Real3 b)
264 {
265 x -= b.x;
266 y -= b.y;
267 z -= b.z;
268 return (*this);
269 }
270
271 constexpr ARCCORE_HOST_DEVICE Real3& mul(Real3 b)
272 {
273 x *= b.x;
274 y *= b.y;
275 z *= b.z;
276 return (*this);
277 }
278
279 constexpr ARCCORE_HOST_DEVICE Real3& div(Real3 b)
280 {
281 x /= b.x;
282 y /= b.y;
283 z /= b.z;
284 return (*this);
285 }
286
287 constexpr ARCCORE_HOST_DEVICE Real3& addSame(Real b)
288 {
289 x += b;
290 y += b;
291 z += b;
292 return (*this);
293 }
294
295 constexpr ARCCORE_HOST_DEVICE Real3& subSame(Real b)
296 {
297 x -= b;
298 y -= b;
299 z -= b;
300 return (*this);
301 }
302
303 constexpr ARCCORE_HOST_DEVICE Real3& mulSame(Real b)
304 {
305 x *= b;
306 y *= b;
307 z *= b;
308 return (*this);
309 }
310
311 constexpr ARCCORE_HOST_DEVICE Real3& divSame(Real b)
312 {
313 x /= b;
314 y /= b;
315 z /= b;
316 return (*this);
317 }
318
319 constexpr ARCCORE_HOST_DEVICE Real3& operator+=(Real3 b) { return add(b); }
321 constexpr ARCCORE_HOST_DEVICE Real3& operator-=(Real3 b) { return sub(b); }
323 constexpr ARCCORE_HOST_DEVICE Real3& operator*=(Real3 b) { return mul(b); }
325 constexpr ARCCORE_HOST_DEVICE void operator*=(Real b)
326 {
327 x *= b;
328 y *= b;
329 z *= b;
330 }
331
332 constexpr ARCCORE_HOST_DEVICE Real3& operator/=(Real3 b) { return div(b); }
334 constexpr ARCCORE_HOST_DEVICE void operator/=(Real b)
335 {
336 x /= b;
337 y /= b;
338 z /= b;
339 }
340
341 constexpr ARCCORE_HOST_DEVICE Real3 operator+(Real3 b) const { return Real3(x + b.x, y + b.y, z + b.z); }
343 constexpr ARCCORE_HOST_DEVICE Real3 operator-(Real3 b) const { return Real3(x - b.x, y - b.y, z - b.z); }
345 constexpr ARCCORE_HOST_DEVICE Real3 operator-() const { return Real3(-x, -y, -z); }
350 constexpr ARCCORE_HOST_DEVICE Real3 operator*(Real3 b) const { return Real3(x * b.x, y * b.y, z * b.z); }
355 constexpr ARCCORE_HOST_DEVICE Real3 operator/(Real3 b) const { return Real3(x / b.x, y / b.y, z / b.z); }
356
358 friend constexpr ARCCORE_HOST_DEVICE Real3 operator*(Real sca, Real3 vec)
359 {
360 return Real3(vec.x * sca, vec.y * sca, vec.z * sca);
361 }
362
364 friend constexpr ARCCORE_HOST_DEVICE Real3 operator*(Real3 vec, Real sca)
365 {
366 return Real3(vec.x * sca, vec.y * sca, vec.z * sca);
367 }
368
370 friend constexpr ARCCORE_HOST_DEVICE Real3 operator/(Real3 vec, Real sca)
371 {
372 return Real3(vec.x / sca, vec.y / sca, vec.z / sca);
373 }
374
375 public:
376
383 friend constexpr ARCCORE_HOST_DEVICE bool operator<(Real3 v1, Real3 v2)
384 {
385 if (v1.x == v2.x) {
386 if (v1.y == v2.y)
387 return v1.z < v2.z;
388 else
389 return v1.y < v2.y;
390 }
391 return (v1.x < v2.x);
392 }
393
395 friend std::ostream& operator<<(std::ostream& o, Real3 t)
396 {
397 return t.printXyz(o);
398 }
399
401 friend std::istream& operator>>(std::istream& i, Real3& t)
402 {
403 return t.assign(i);
404 }
405
412 constexpr ARCCORE_HOST_DEVICE bool operator==(Real3 b) const
413 {
414 return _eq(x, b.x) && _eq(y, b.y) && _eq(z, b.z);
415 }
416
423 constexpr ARCCORE_HOST_DEVICE bool operator!=(Real3 b) const { return !operator==(b); }
424
425 public:
426
428 // TODO: rendre obsolète mi-2025: ARCANE_DEPRECATED_REASON("Y2024: Use math::squareNormL2(const Real3&) instead")
429 constexpr ARCCORE_HOST_DEVICE Real squareNormL2() const { return x * x + y * y + z * z; }
430
432 // TODO: rendre obsolète mi-2025: ARCANE_DEPRECATED_REASON("Y2024: Use math::normL2(const Real3&) instead")
433 inline ARCCORE_HOST_DEVICE Real normL2() const;
434
436 ARCCORE_DEPRECATED_2021("Use math::squareNormL2(const Real3&) instead")
437 constexpr ARCCORE_HOST_DEVICE Real abs2() const { return x * x + y * y + z * z; }
438
440 ARCCORE_DEPRECATED_2021("Use math::normL2(const Real3&) instead")
441 inline ARCCORE_HOST_DEVICE Real abs() const;
442
443 // TODO: rendre obsolète mi-2025: ARCANE_DEPRECATED_REASON("Y2024: Use math::isNearlyZero(const Real3&) instead")
444 inline constexpr ARCCORE_HOST_DEVICE bool isNearlyZero() const;
445
446 ARCANE_DEPRECATED_REASON("Y2024: Use math::mutableNormalize(Real3&) instead")
447 inline Real3& normalize();
448
449 private:
450
456 inline constexpr ARCCORE_HOST_DEVICE static bool _eq(Real a, Real b);
458 inline ARCCORE_HOST_DEVICE static Real _sqrt(Real a);
459};
460
461/*---------------------------------------------------------------------------*/
462/*---------------------------------------------------------------------------*/
463
464inline constexpr ARCCORE_HOST_DEVICE Real2::
465Real2(const Real3& v)
466: Real2POD()
467{
468 x = v.x;
469 y = v.y;
470}
471
472/*---------------------------------------------------------------------------*/
473/*---------------------------------------------------------------------------*/
474
475namespace math
476{
478 inline constexpr ARCCORE_HOST_DEVICE Real squareNormL2(const Real3& v)
479 {
480 return v.x * v.x + v.y * v.y + v.z * v.z;
481 }
482
489 inline constexpr ARCCORE_HOST_DEVICE bool isNearlyZero(const Real3& v)
490 {
491 return math::isNearlyZero(v.x) && math::isNearlyZero(v.y) && math::isNearlyZero(v.z);
492 }
493
494 inline ARCCORE_HOST_DEVICE Real normL2(const Real3& v)
495 {
497 }
498
506 {
507 Real d = math::normL2(v);
508 if (!math::isZero(d))
509 v.divSame(d);
510 return v;
511 }
512} // namespace math
513
514/*---------------------------------------------------------------------------*/
515/*---------------------------------------------------------------------------*/
516
517inline Real3& Real3::
518normalize()
519{
520 return math::mutableNormalize(*this);
521}
522
523inline constexpr ARCCORE_HOST_DEVICE bool Real3::
524isNearlyZero() const
525{
526 return math::isNearlyZero(*this);
527}
528
529inline constexpr ARCCORE_HOST_DEVICE bool Real3::
530_eq(Real a, Real b)
531{
532 return math::isEqual(a, b);
533}
534
535ARCCORE_HOST_DEVICE inline Real Real3::
536_sqrt(Real a)
537{
538 return math::sqrt(a);
539}
540
541inline ARCCORE_HOST_DEVICE Real Real3::
542normL2() const
543{
544 return math::normL2(*this);
545}
546
547inline ARCCORE_HOST_DEVICE Real Real3::
548abs() const
549{
550 return math::normL2(*this);
551}
552
553/*---------------------------------------------------------------------------*/
554/*---------------------------------------------------------------------------*/
555
556} // End namespace Arcane
557
558/*---------------------------------------------------------------------------*/
559/*---------------------------------------------------------------------------*/
560
561#endif
Vue modifiable d'un tableau d'un type T.
Vue constante d'un tableau de type T.
Classe gérant un vecteur de réel de dimension 2.
Definition Real2.h:121
constexpr __host__ __device__ Real2()
Construit le vecteur nul.
Definition Real2.h:125
Classe gérant un vecteur de réel de dimension 3.
Definition Real3.h:132
constexpr __host__ __device__ void operator*=(Real b)
Multiple chaque composante du triplet par le réel b.
Definition Real3.h:325
Real3(const Real3 &f)=default
Construit un triplet identique à f.
friend constexpr __host__ __device__ Real3 operator/(Real3 vec, Real sca)
Division par un scalaire.
Definition Real3.h:370
Real3 & operator=(const Real3 &f)=default
Opérateur de recopie.
constexpr __host__ __device__ Real3 & operator/=(Real3 b)
Divise chaque composante du triplet par la composant correspondant de b.
Definition Real3.h:332
constexpr __host__ __device__ Real3 operator*(Real3 b) const
Créé un triplet qui vaut ce triplet dont chaque composant a été multipliée par la composante correspo...
Definition Real3.h:350
constexpr __host__ __device__ Real3(Real ax, Real ay, Real az)
Construit le triplet (ax,ay,az)
Definition Real3.h:144
constexpr __host__ static __device__ bool _eq(Real a, Real b)
Compare les valeurs de a et b avec le comparateur TypeEqualT.
Definition Real3.h:530
constexpr __host__ __device__ ArrayView< Real > view()
Retourne une vue sur les trois élements du vecteur.
Definition Real3.h:230
constexpr __host__ __device__ Real3 & subSame(Real b)
Soustrait b à chaque composante du triplet.
Definition Real3.h:295
friend constexpr __host__ __device__ Real3 operator*(Real3 vec, Real sca)
Multiplication par un scalaire.
Definition Real3.h:364
constexpr __host__ __device__ Real3 operator-() const
Créé un triplet opposé au triplet actuel.
Definition Real3.h:345
constexpr __host__ __device__ Real3 operator+(Real3 b) const
Créé un triplet qui vaut ce triplet ajouté à b.
Definition Real3.h:341
constexpr __host__ __device__ Real3 & operator*=(Real3 b)
Multiple chaque composante du triplet par la composant correspondant de b.
Definition Real3.h:323
constexpr __host__ __device__ bool operator!=(Real3 b) const
Compare deux triplets. Pour la notion d'égalité, voir operator==()
Definition Real3.h:423
constexpr __host__ __device__ Real3 operator/(Real3 b) const
Créé un triplet qui vaut ce triplet dont chaque composant a été divisée par la composante corresponda...
Definition Real3.h:355
constexpr __host__ __device__ bool operator==(Real3 b) const
Compare composant pas composante l'instance courante à b.
Definition Real3.h:412
constexpr __host__ __device__ Real3 & mulSame(Real b)
Multiplie chaque composante du triplet par b.
Definition Real3.h:303
constexpr __host__ __device__ Real3 & operator=(Real v)
Affecte à l'instance le triplet (v,v,v).
Definition Real3.h:191
constexpr __host__ __device__ Real3 & add(Real3 b)
Ajoute b au triplet.
Definition Real3.h:255
constexpr __host__ __device__ Real3(const Real3POD &f)
Construit un triplet identique à f.
Definition Real3.h:154
friend constexpr __host__ __device__ Real3 operator*(Real sca, Real3 vec)
Multiplication par un scalaire.
Definition Real3.h:358
constexpr __host__ __device__ Real3 & addSame(Real b)
Ajoute b à chaque composante du triplet.
Definition Real3.h:287
constexpr __host__ __device__ Real3(Real v)
Construit l'instance avec le triplet (v,v,v).
Definition Real3.h:163
constexpr __host__ __device__ ConstArrayView< Real > constView() const
Retourne une vue constante sur les trois élements du vecteur.
Definition Real3.h:236
constexpr __host__ __device__ void operator/=(Real b)
Divise chaque composante du triplet par le réel b.
Definition Real3.h:334
std::ostream & printXyz(std::ostream &o) const
Ecrit le triplet sur le flot o sous la forme (x,y,z)
Definition Real3.cc:49
constexpr __host__ __device__ Real3 & operator-=(Real3 b)
Soustrait b au triplet.
Definition Real3.h:321
constexpr __host__ __device__ Real3(ConstArrayView< Real > av)
Construit le triplet (av[0], av[1], av[2])
Definition Real3.h:179
friend constexpr __host__ __device__ bool operator<(Real3 v1, Real3 v2)
Opérateur de comparaison.
Definition Real3.h:383
constexpr __host__ __device__ Real squareNormL2() const
Retourne la norme L2 au carré du triplet .
Definition Real3.h:429
friend std::istream & operator>>(std::istream &i, Real3 &t)
Lit le triplet t à partir du flot o.
Definition Real3.h:401
constexpr __host__ __device__ Real3(const Real2 &f)
Construit un triplet identique à f.
Definition Real3.h:170
constexpr __host__ __device__ Real3 copy() const
Retourne une copie du triplet.
Definition Real3.h:205
constexpr __host__ __device__ Real3 & reset()
Réinitialise le triplet avec les constructeurs par défaut.
Definition Real3.h:207
constexpr __host__ __device__ Real3 & divSame(Real b)
Divise chaque composante du triplet par b.
Definition Real3.h:311
constexpr __host__ __device__ Real3()
Construit le vecteur nul.
Definition Real3.h:136
constexpr __host__ __device__ Real3 & sub(Real3 b)
Soustrait b au triplet.
Definition Real3.h:263
__host__ __device__ Real3 absolute() const
Valeur absolue composante par composante.
Definition Real3.h:242
constexpr __host__ __device__ Real3 & operator+=(Real3 b)
Ajoute b au triplet.
Definition Real3.h:319
constexpr __host__ __device__ Real3 operator-(Real3 b) const
Créé un triplet qui vaut b soustrait de ce triplet.
Definition Real3.h:343
constexpr __host__ __device__ Real3 & div(Real3 b)
Divise chaque composante du triplet par la composant correspondant de b.
Definition Real3.h:279
constexpr __host__ __device__ Real3 & assign(Real ax, Real ay, Real az)
Affecte à l'instance le triplet (ax,ay,az)
Definition Real3.h:213
constexpr __host__ __device__ Real abs2() const
Retourne la norme au carré du triplet .
Definition Real3.h:437
constexpr __host__ __device__ Real3 & assign(Real3 f)
Copie le triplet f.
Definition Real3.h:221
friend std::ostream & operator<<(std::ostream &o, Real3 t)
Ecrit le triplet t sur le flot o.
Definition Real3.h:395
constexpr __host__ __device__ Real3 & mul(Real3 b)
Multiple chaque composante du triplet par la composant correspondant de b.
Definition Real3.h:271
Espace de nom pour l'utilisation des accélérateurs.
Espace de nom pour les fonctions mathématiques.
Definition MathUtils.h:41
constexpr __host__ __device__ Real squareNormL2(const Real2 &v)
Retourne la norme au carré du couple .
Definition Real2.h:451
__host__ __device__ double sqrt(double v)
Racine carrée de v.
Definition Math.h:135
bool isZero(const BuiltInProxy< _Type > &a)
Teste si une valeur est exactement égale à zéro.
Real2 & mutableNormalize(Real2 &v)
Normalise le couple.
Definition Real2.h:469
constexpr __host__ __device__ bool isEqual(const _Type &a, const _Type &b)
Teste l'égalité bit à bit entre deux valeurs.
Definition Numeric.h:253
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
double Real
Type représentant un réel.
Real y
deuxième composante du couple
Definition Real2.h:35
Real x
première composante du couple
Definition Real2.h:34
__host__ __device__ Real & operator()(Integer i)
Definition Real3.h:93
__host__ __device__ Real operator[](Integer i) const
Definition Real3.h:48
Real y
deuxième composante du triplet
Definition Real3.h:36
Real z
troisième composante du triplet
Definition Real3.h:37
__host__ __device__ Real operator()(Integer i) const
Definition Real3.h:63
__host__ __device__ void setComponent(Integer i, Real value)
Positionne la i-ème composante à value.
Definition Real3.h:100
__host__ __device__ Real & operator[](Integer i)
Definition Real3.h:78
Real x
première composante du triplet
Definition Real3.h:35