Arcane  v4.1.8.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
NumVector.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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/* NumVector.h (C) 2000-2026 */
9/* */
10/* Vecteur de taille fixe de types numériques. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_NUMVECTOR_H
13#define ARCANE_UTILS_NUMVECTOR_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Real2.h"
18#include "arcane/utils/Real3.h"
19
20#include <type_traits>
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30/*!
31 * \brief Petit vecteur de taille fixe de N données numériques.
32 *
33 * \note Actuellement uniquement implémenté pour le type Real.
34 *
35 * \warning API en cours de définition. Ne pas utiliser en dehors de Arcane.
36 *
37 * Il est possible d'accéder à chaque composante du vecteur par 'operator[]'
38 * ou 'operator()' ou par les méthodes vx(), vy(), vz() si la dimension est
39 * suffisante (par exemple vz() est uniquement accessible si la Size>=3.
40 */
41template <typename T, int Size>
43{
44 static_assert(Size > 1, "Size has to be strictly greater than 1");
45 static_assert(std::is_same_v<T,Real>,"Only type 'Real' is allowed");
46
47 public:
48
49 using ThatClass = NumVector<T, Size>;
50 using DataType = T;
51
52 public:
53
54 //! Construit le vecteur nul.
55 NumVector() = default;
56
57 //! Construit avec le couple (ax,ay)
58 constexpr ARCCORE_HOST_DEVICE NumVector(T ax, T ay) requires(Size == 2)
59
60 {
61 m_values[0] = ax;
62 m_values[1] = ay;
63 }
64
65 //! Construit avec le triplet (ax,ay,az)
66 constexpr ARCCORE_HOST_DEVICE NumVector(T ax, T ay, T az) requires(Size == 3)
67
68 {
69 m_values[0] = ax;
70 m_values[1] = ay;
71 m_values[2] = az;
72 }
73
74 //! Construit avec le quadruplet (a1,a2,a3,a4)
75 constexpr ARCCORE_HOST_DEVICE NumVector(T a1, T a2, T a3, T a4) requires(Size == 4)
76
77 {
78 m_values[0] = a1;
79 m_values[1] = a2;
80 m_values[2] = a3;
81 m_values[3] = a4;
82 }
83
84 //! Construit avec le quintuplet (a1,a2,a3,a4,a5)
85 constexpr ARCCORE_HOST_DEVICE NumVector(T a1, T a2, T a3, T a4, T a5) requires(Size == 5)
86 {
87 m_values[0] = a1;
88 m_values[1] = a2;
89 m_values[2] = a3;
90 m_values[3] = a4;
91 m_values[4] = a5;
92 }
93
94 //! Construit l'instance avec pour chaque composante la valeur \a v
95 template <bool = true>
96 explicit constexpr ARCCORE_HOST_DEVICE NumVector(const T (&v)[Size])
97 {
98 for (int i = 0; i < Size; ++i)
99 m_values[i] = v[i];
100 }
101
102 //! Construit l'instance avec pour chaque composante la valeur \a v
103 explicit constexpr ARCCORE_HOST_DEVICE NumVector(std::array<T, Size> v)
104 {
105 for (int i = 0; i < Size; ++i)
106 m_values[i] = v[i];
107 }
108
109 //! Construit l'instance avec pour chaque composante la valeur \a v
110 explicit constexpr ARCCORE_HOST_DEVICE NumVector(T v)
111 {
112 for (int i = 0; i < Size; ++i)
113 m_values[i] = v;
114 }
115
116 explicit constexpr ARCCORE_HOST_DEVICE NumVector(Real2 v) requires(Size == 2)
117 : NumVector(v.x, v.y)
118 {}
119
120 explicit constexpr ARCCORE_HOST_DEVICE NumVector(Real3 v) requires(Size == 3)
121 : NumVector(v.x, v.y, v.z)
122 {}
123
124 //! Affecte à l'instance le triplet (v,v,v).
125 constexpr ARCCORE_HOST_DEVICE ThatClass& operator=(Real v)
126 {
127 for (int i = 0; i < Size; ++i)
128 m_values[i] = v;
129 return (*this);
130 }
131
132 constexpr ARCCORE_HOST_DEVICE ThatClass& operator=(const Real2& v) requires(Size == 2)
133 {
134 *this = ThatClass(v);
135 return (*this);
136 }
137
138 constexpr ARCCORE_HOST_DEVICE ThatClass& operator=(const Real3& v) requires(Size == 3)
139 {
140 *this = ThatClass(v);
141 return (*this);
142 }
143
144 operator Real2() const requires(Size == 2) { return Real2(m_values[0], m_values[1]); }
145
146 operator Real3() const requires(Size == 3) { return Real3(m_values[0], m_values[1], m_values[2]); }
147
148 public:
149
150 constexpr ARCCORE_HOST_DEVICE static ThatClass zero() { return ThatClass(); }
151
152 public:
153
154 constexpr ARCCORE_HOST_DEVICE bool isNearlyZero() const
155 {
156 bool is_nearly_zero = true;
157 for (int i = 0; i < Size; ++i)
158 is_nearly_zero = is_nearly_zero && math::isNearlyZero(m_values[i]);
159 return is_nearly_zero;
160 }
161
162 //! Retourne la norme L2 au carré du triplet \f$x^2+y^2+z^2\f$
163 constexpr ARCCORE_HOST_DEVICE Real squareNormL2() const
164 {
165 T v = T();
166 for (int i = 0; i < Size; ++i)
167 v += m_values[i] * m_values[i];
168 return v;
169 }
170 //! Retourne la norme L2 du triplet \f$\sqrt{x^2+y^2+z^2}\f$
171 ARCCORE_HOST_DEVICE Real normL2() const { return _sqrt(squareNormL2()); }
172
173 //! Valeur absolue composante par composante.
174 ARCCORE_HOST_DEVICE ThatClass absolute() const
175 {
176 ThatClass v;
177 for (int i = 0; i < Size; ++i)
178 v.m_values[i] = math::abs(m_values[i]);
179 return v;
180 }
181
182 //! Ajoute \a b à chaque composante de l'instance
183 constexpr ARCCORE_HOST_DEVICE ThatClass& operator+=(T b)
184 {
185 for (int i = 0; i < Size; ++i)
186 m_values[i] += b;
187 return (*this);
188 }
189
190 //! Ajoute \a b à l'instance
191 constexpr ARCCORE_HOST_DEVICE ThatClass& operator+=(const ThatClass& b)
192 {
193 for (int i = 0; i < Size; ++i)
194 m_values[i] += b.m_values[i];
195 return (*this);
196 }
197 //! Soustrait \a b à chaque composante de l'instance
198 constexpr ARCCORE_HOST_DEVICE ThatClass& operator-=(T b)
199 {
200 for (int i = 0; i < Size; ++i)
201 m_values[i] -= b;
202 return (*this);
203 }
204 //! Soustrait \a b à l'instance
205 constexpr ARCCORE_HOST_DEVICE ThatClass& operator-=(const ThatClass& b)
206 {
207 for (int i = 0; i < Size; ++i)
208 m_values[i] -= b.m_values[i];
209 return (*this);
210 }
211 //! Multiple chaque composante par \a b
212 constexpr ARCCORE_HOST_DEVICE ThatClass& operator*=(T b)
213 {
214 for (int i = 0; i < Size; ++i)
215 m_values[i] *= b;
216 return (*this);
217 }
218 //! Divise chaque composante par \a b
219 constexpr ARCCORE_HOST_DEVICE ThatClass& operator/=(T b)
220 {
221 for (int i = 0; i < Size; ++i)
222 m_values[i] /= b;
223 return (*this);
224 }
225 //! Créé un triplet qui vaut ce triplet ajouté à \a b
226 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator+(const ThatClass& a, const ThatClass& b)
227 {
228 ThatClass v;
229 for (int i = 0; i < Size; ++i)
230 v.m_values[i] = a.m_values[i] + b.m_values[i];
231 return v;
232 }
233 //! Créé un triplet qui vaut \a b soustrait de ce triplet
234 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator-(const ThatClass& a, const ThatClass& b)
235 {
236 ThatClass v;
237 for (int i = 0; i < Size; ++i)
238 v.m_values[i] = a.m_values[i] - b.m_values[i];
239 return v;
240 }
241 //! Créé un triplet opposé au triplet actuel
242 constexpr ARCCORE_HOST_DEVICE ThatClass operator-() const
243 {
244 ThatClass v;
245 for (int i = 0; i < Size; ++i)
246 v.m_values[i] = -m_values[i];
247 return v;
248 }
249 //! Multiplication par un scalaire.
250 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator*(T a, const ThatClass& vec)
251 {
252 ThatClass v;
253 for (int i = 0; i < Size; ++i)
254 v.m_values[i] = a * vec.m_values[i];
255 return v;
256 }
257 //! Multiplication par un scalaire.
258 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator*(const ThatClass& vec, T b)
259 {
260 ThatClass v;
261 for (int i = 0; i < Size; ++i)
262 v.m_values[i] = vec.m_values[i] * b;
263 return v;
264 }
265 //! Division par un scalaire.
266 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator/(const ThatClass& vec, T b)
267 {
268 ThatClass v;
269 for (int i = 0; i < Size; ++i)
270 v.m_values[i] = vec.m_values[i] / b;
271 return v;
272 }
273
274 /*!
275 * \brief Compare composant pas composante l'instance courante à \a b.
276 *
277 * \retval true si this.x==b.x et this.y==b.y et this.z==b.z.
278 * \retval false sinon.
279 */
280 friend constexpr ARCCORE_HOST_DEVICE bool operator==(const ThatClass& a, const ThatClass& b)
281 {
282 for (int i = 0; i < Size; ++i)
283 if (!_eq(a.m_values[i], b.m_values[i]))
284 return false;
285 return true;
286 }
287
288 /*!
289 * \brief Compare deux vecteurs
290 * Pour la notion d'égalité, voir operator==()
291 */
292 friend constexpr ARCCORE_HOST_DEVICE bool operator!=(const ThatClass& a, const ThatClass& b)
293 {
294 return !(a == b);
295 }
296
297 constexpr ARCCORE_HOST_DEVICE T& operator()(Int32 i)
298 {
299 ARCCORE_CHECK_AT(i, Size);
300 return m_values[i];
301 }
302 constexpr ARCCORE_HOST_DEVICE T operator()(Int32 i) const
303 {
304 ARCCORE_CHECK_AT(i, Size);
305 return m_values[i];
306 }
307 constexpr ARCCORE_HOST_DEVICE T& operator[](Int32 i)
308 {
309 ARCCORE_CHECK_AT(i, Size);
310 return m_values[i];
311 }
312 constexpr ARCCORE_HOST_DEVICE T operator[](Int32 i) const
313 {
314 ARCCORE_CHECK_AT(i, Size);
315 return m_values[i];
316 }
317
318 //! Valeur de la première composante
319 T& vx() requires(Size >= 1)
320 {
321 return m_values[0];
322 }
323 //! Valeur de la première composante
324 T vx() const requires(Size >= 1)
325 {
326 return m_values[0];
327 }
328
329 //! Valeur de la deuxième composante
330 T& vy() requires(Size >= 2)
331 {
332 return m_values[1];
333 }
334 //! Valeur de la deuxième composante
335 T vy() const requires(Size >= 2)
336 {
337 return m_values[1];
338 }
339
340 //! Valeur de la troisième composante
341 T& vz() requires(Size >= 3)
342 {
343 return m_values[2];
344 }
345 //! Valeur de la troisième composante
346 T vz() const requires(Size >= 3)
347 {
348 return m_values[2];
349 }
350
351 private:
352
353 //! Valeurs du vecteur
354 T m_values[Size] = {};
355
356 private:
357
358 /*!
359 * \brief Compare les valeurs de \a a et \a b avec le comparateur TypeEqualT
360 * \retval true si \a a et \a b sont égaux,
361 * \retval false sinon.
362 */
363 constexpr ARCCORE_HOST_DEVICE static bool
364 _eq(T a, T b)
365 {
366 return math::isEqual(a, b);
367 }
368 //! Retourne la racine carrée de \a a
369 ARCCORE_HOST_DEVICE static T _sqrt(T a)
370 {
371 return math::sqrt(a);
372 }
373};
374
375/*---------------------------------------------------------------------------*/
376/*---------------------------------------------------------------------------*/
377
378} // End namespace Arcane
379
380/*---------------------------------------------------------------------------*/
381/*---------------------------------------------------------------------------*/
382
383#endif
Petit vecteur de taille fixe de N données numériques.
Definition NumVector.h:43
T & vy()
Valeur de la deuxième composante.
Definition NumVector.h:330
constexpr __host__ __device__ NumVector(T ax, T ay, T az)
Construit avec le triplet (ax,ay,az)
Definition NumVector.h:66
T vz() const
Valeur de la troisième composante.
Definition NumVector.h:346
constexpr __host__ __device__ ThatClass & operator=(Real v)
Affecte à l'instance le triplet (v,v,v).
Definition NumVector.h:125
constexpr __host__ __device__ ThatClass & operator*=(T b)
Multiple chaque composante par b.
Definition NumVector.h:212
friend constexpr __host__ __device__ bool operator!=(const ThatClass &a, const ThatClass &b)
Compare deux vecteurs Pour la notion d'égalité, voir operator==()
Definition NumVector.h:292
T vy() const
Valeur de la deuxième composante.
Definition NumVector.h:335
constexpr __host__ __device__ NumVector(T a1, T a2, T a3, T a4, T a5)
Construit avec le quintuplet (a1,a2,a3,a4,a5)
Definition NumVector.h:85
__host__ __device__ ThatClass absolute() const
Valeur absolue composante par composante.
Definition NumVector.h:174
NumVector()=default
Construit le vecteur nul.
constexpr __host__ __device__ ThatClass & operator/=(T b)
Divise chaque composante par b.
Definition NumVector.h:219
T & vx()
Valeur de la première composante.
Definition NumVector.h:319
friend constexpr __host__ __device__ bool operator==(const ThatClass &a, const ThatClass &b)
Compare composant pas composante l'instance courante à b.
Definition NumVector.h:280
constexpr __host__ __device__ ThatClass & operator-=(const ThatClass &b)
Soustrait b à l'instance.
Definition NumVector.h:205
friend constexpr __host__ __device__ ThatClass operator-(const ThatClass &a, const ThatClass &b)
Créé un triplet qui vaut b soustrait de ce triplet.
Definition NumVector.h:234
friend constexpr __host__ __device__ ThatClass operator*(const ThatClass &vec, T b)
Multiplication par un scalaire.
Definition NumVector.h:258
constexpr __host__ __device__ NumVector(T a1, T a2, T a3, T a4)
Construit avec le quadruplet (a1,a2,a3,a4)
Definition NumVector.h:75
constexpr __host__ __device__ NumVector(T v)
Construit l'instance avec pour chaque composante la valeur v.
Definition NumVector.h:110
constexpr __host__ __device__ ThatClass & operator-=(T b)
Soustrait b à chaque composante de l'instance.
Definition NumVector.h:198
constexpr __host__ __device__ NumVector(std::array< T, Size > v)
Construit l'instance avec pour chaque composante la valeur v.
Definition NumVector.h:103
friend constexpr __host__ __device__ ThatClass operator/(const ThatClass &vec, T b)
Division par un scalaire.
Definition NumVector.h:266
T vx() const
Valeur de la première composante.
Definition NumVector.h:324
constexpr __host__ __device__ NumVector(T ax, T ay)
Construit avec le couple (ax,ay)
Definition NumVector.h:58
constexpr __host__ __device__ ThatClass & operator+=(T b)
Ajoute b à chaque composante de l'instance.
Definition NumVector.h:183
constexpr __host__ __device__ Real squareNormL2() const
Retourne la norme L2 au carré du triplet .
Definition NumVector.h:163
constexpr __host__ __device__ NumVector(const T(&v)[Size])
Construit l'instance avec pour chaque composante la valeur v.
Definition NumVector.h:96
friend constexpr __host__ __device__ ThatClass operator*(T a, const ThatClass &vec)
Multiplication par un scalaire.
Definition NumVector.h:250
T & vz()
Valeur de la troisième composante.
Definition NumVector.h:341
constexpr __host__ __device__ ThatClass & operator+=(const ThatClass &b)
Ajoute b à l'instance.
Definition NumVector.h:191
__host__ __device__ Real normL2() const
Retourne la norme L2 du triplet .
Definition NumVector.h:171
constexpr __host__ __device__ ThatClass operator-() const
Créé un triplet opposé au triplet actuel.
Definition NumVector.h:242
friend constexpr __host__ __device__ ThatClass operator+(const ThatClass &a, const ThatClass &b)
Créé un triplet qui vaut ce triplet ajouté à b.
Definition NumVector.h:226
Classe gérant un vecteur de réel de dimension 2.
Definition Real2.h:121
__host__ __device__ double sqrt(double v)
Racine carrée de v.
Definition Math.h:135
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 -*-
double Real
Type représentant un réel.
std::int32_t Int32
Type entier signé sur 32 bits.