Arcane  v3.14.10.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-2023 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-2023 */
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 template <int S = Size, typename = std::enable_if_t<S == 2, void>>
59 constexpr ARCCORE_HOST_DEVICE NumVector(T ax, T ay)
60 {
61 m_values[0] = ax;
62 m_values[1] = ay;
63 }
64
65 //! Construit avec le triplet (ax,ay,az)
66 template <int S = Size, typename = std::enable_if_t<S == 3, void>>
67 constexpr ARCCORE_HOST_DEVICE NumVector(T ax, T ay, T az)
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 template <int S = Size, typename = std::enable_if_t<S == 4, void>>
76 constexpr ARCCORE_HOST_DEVICE NumVector(T a1, T a2, T a3, T a4)
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 template <int S = Size, typename = std::enable_if_t<S == 5, void>>
86 constexpr ARCCORE_HOST_DEVICE NumVector(T a1, T a2, T a3, T a4, T a5)
87 {
88 m_values[0] = a1;
89 m_values[1] = a2;
90 m_values[2] = a3;
91 m_values[3] = a4;
92 m_values[4] = a5;
93 }
94
95 //! Construit l'instance avec pour chaque composante la valeur \a v
96 template <bool = true>
97 explicit constexpr ARCCORE_HOST_DEVICE NumVector(const T (&v)[Size])
98 {
99 for (int i = 0; i < Size; ++i)
100 m_values[i] = v[i];
101 }
102
103 //! Construit l'instance avec pour chaque composante la valeur \a v
104 explicit constexpr ARCCORE_HOST_DEVICE NumVector(std::array<T, Size> v)
105 {
106 for (int i = 0; i < Size; ++i)
107 m_values[i] = v[i];
108 }
109
110 //! Construit l'instance avec pour chaque composante la valeur \a v
111 explicit constexpr ARCCORE_HOST_DEVICE NumVector(T v)
112 {
113 for (int i = 0; i < Size; ++i)
114 m_values[i] = v;
115 }
116
117 template <int S = Size, typename = std::enable_if_t<S == 2, void>>
118 explicit constexpr ARCCORE_HOST_DEVICE NumVector(Real2 v)
119 : NumVector(v.x, v.y)
120 {}
121
122 template <int S = Size, typename = std::enable_if_t<S == 3, void>>
123 explicit constexpr ARCCORE_HOST_DEVICE NumVector(Real3 v)
124 : NumVector(v.x, v.y, v.z)
125 {}
126
127 //! Affecte à l'instance le triplet (v,v,v).
128 constexpr ARCCORE_HOST_DEVICE ThatClass& operator=(Real v)
129 {
130 for (int i = 0; i < Size; ++i)
131 m_values[i] = v;
132 return (*this);
133 }
134
135 template <int S = Size, typename = std::enable_if_t<S == 2, void>>
136 constexpr ARCCORE_HOST_DEVICE ThatClass& operator=(const Real2& v)
137 {
138 *this = ThatClass(v);
139 return (*this);
140 }
141
142 template <int S = Size, typename = std::enable_if_t<S == 3, void>>
143 constexpr ARCCORE_HOST_DEVICE ThatClass& operator=(const Real3& v)
144 {
145 *this = ThatClass(v);
146 return (*this);
147 }
148
149 template <int S = Size, typename = std::enable_if_t<S == 2, void>>
150 operator Real2() const { return Real2(m_values[0], m_values[1]); }
151
152 template <int S = Size, typename = std::enable_if_t<S == 3, void>>
153 operator Real3() const { return Real3(m_values[0], m_values[1], m_values[2]); }
154
155 public:
156
157 constexpr ARCCORE_HOST_DEVICE static ThatClass zero() { return ThatClass(); }
158
159 public:
160
161 constexpr ARCCORE_HOST_DEVICE bool isNearlyZero() const
162 {
163 bool is_nearly_zero = true;
164 for (int i = 0; i < Size; ++i)
165 is_nearly_zero = is_nearly_zero && math::isNearlyZero(m_values[i]);
166 return is_nearly_zero;
167 }
168
169 //! Retourne la norme L2 au carré du triplet \f$x^2+y^2+z^2\f$
170 constexpr ARCCORE_HOST_DEVICE Real squareNormL2() const
171 {
172 T v = T();
173 for (int i = 0; i < Size; ++i)
174 v += m_values[i] * m_values[i];
175 return v;
176 }
177 //! Retourne la norme L2 du triplet \f$\sqrt{x^2+y^2+z^2}\f$
178 ARCCORE_HOST_DEVICE Real normL2() const { return _sqrt(squareNormL2()); }
179
180 //! Valeur absolue composante par composante.
181 ARCCORE_HOST_DEVICE ThatClass absolute() const
182 {
183 ThatClass v;
184 for (int i = 0; i < Size; ++i)
185 v.m_values[i] = math::abs(m_values[i]);
186 return v;
187 }
188
189 //! Ajoute \a b à chaque composante de l'instance
190 constexpr ARCCORE_HOST_DEVICE ThatClass& operator+=(T b)
191 {
192 for (int i = 0; i < Size; ++i)
193 m_values[i] += b;
194 return (*this);
195 }
196
197 //! Ajoute \a b à l'instance
198 constexpr ARCCORE_HOST_DEVICE ThatClass& operator+=(const ThatClass& b)
199 {
200 for (int i = 0; i < Size; ++i)
201 m_values[i] += b.m_values[i];
202 return (*this);
203 }
204 //! Soustrait \a b à chaque composante de l'instance
205 constexpr ARCCORE_HOST_DEVICE ThatClass& operator-=(T b)
206 {
207 for (int i = 0; i < Size; ++i)
208 m_values[i] -= b;
209 return (*this);
210 }
211 //! Soustrait \a b à l'instance
212 constexpr ARCCORE_HOST_DEVICE ThatClass& operator-=(const ThatClass& b)
213 {
214 for (int i = 0; i < Size; ++i)
215 m_values[i] -= b.m_values[i];
216 return (*this);
217 }
218 //! Multiple 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 //! Divise chaque composante par \a b
226 constexpr ARCCORE_HOST_DEVICE ThatClass& operator/=(T b)
227 {
228 for (int i = 0; i < Size; ++i)
229 m_values[i] /= b;
230 return (*this);
231 }
232 //! Créé un triplet qui vaut ce triplet ajouté à \a b
233 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator+(const ThatClass& a, const ThatClass& b)
234 {
235 ThatClass v;
236 for (int i = 0; i < Size; ++i)
237 v.m_values[i] = a.m_values[i] + b.m_values[i];
238 return v;
239 }
240 //! Créé un triplet qui vaut \a b soustrait de ce triplet
241 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator-(const ThatClass& a, const ThatClass& b)
242 {
243 ThatClass v;
244 for (int i = 0; i < Size; ++i)
245 v.m_values[i] = a.m_values[i] - b.m_values[i];
246 return v;
247 }
248 //! Créé un triplet opposé au triplet actuel
249 constexpr ARCCORE_HOST_DEVICE ThatClass operator-() const
250 {
251 ThatClass v;
252 for (int i = 0; i < Size; ++i)
253 v.m_values[i] = -m_values[i];
254 return v;
255 }
256 //! Multiplication par un scalaire.
257 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator*(T a, const ThatClass& vec)
258 {
259 ThatClass v;
260 for (int i = 0; i < Size; ++i)
261 v.m_values[i] = a * vec.m_values[i];
262 return v;
263 }
264 //! Multiplication par un scalaire.
265 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator*(const ThatClass& vec, T b)
266 {
267 ThatClass v;
268 for (int i = 0; i < Size; ++i)
269 v.m_values[i] = vec.m_values[i] * b;
270 return v;
271 }
272 //! Division par un scalaire.
273 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator/(const ThatClass& vec, T b)
274 {
275 ThatClass v;
276 for (int i = 0; i < Size; ++i)
277 v.m_values[i] = vec.m_values[i] / b;
278 return v;
279 }
280
281 /*!
282 * \brief Compare composant pas composante l'instance courante à \a b.
283 *
284 * \retval true si this.x==b.x et this.y==b.y et this.z==b.z.
285 * \retval false sinon.
286 */
287 friend constexpr ARCCORE_HOST_DEVICE bool operator==(const ThatClass& a, const ThatClass& b)
288 {
289 for (int i = 0; i < Size; ++i)
290 if (!_eq(a.m_values[i], b.m_values[i]))
291 return false;
292 return true;
293 }
294
295 /*!
296 * \brief Compare deux vecteurs
297 * Pour la notion d'égalité, voir operator==()
298 */
299 friend constexpr ARCCORE_HOST_DEVICE bool operator!=(const ThatClass& a, const ThatClass& b)
300 {
301 return !(a == b);
302 }
303
304 constexpr ARCCORE_HOST_DEVICE T& operator()(Int32 i)
305 {
306 ARCCORE_CHECK_AT(i, Size);
307 return m_values[i];
308 }
309 constexpr ARCCORE_HOST_DEVICE T operator()(Int32 i) const
310 {
311 ARCCORE_CHECK_AT(i, Size);
312 return m_values[i];
313 }
314 constexpr ARCCORE_HOST_DEVICE T& operator[](Int32 i)
315 {
316 ARCCORE_CHECK_AT(i, Size);
317 return m_values[i];
318 }
319 constexpr ARCCORE_HOST_DEVICE T operator[](Int32 i) const
320 {
321 ARCCORE_CHECK_AT(i, Size);
322 return m_values[i];
323 }
324
325 //! Valeur de la première composante
326 template <int S = Size, typename = std::enable_if_t<S >= 1, void>>
327 T& vx()
328 {
329 return m_values[0];
330 }
331 //! Valeur de la première composante
332 template <int S = Size, typename = std::enable_if_t<S >= 1, void>>
333 T vx() const
334 {
335 return m_values[0];
336 }
337
338 //! Valeur de la deuxième composante
339 template <int S = Size, typename = std::enable_if_t<S >= 2, void>>
340 T& vy()
341 {
342 return m_values[1];
343 }
344 //! Valeur de la deuxième composante
345 template <int S = Size, typename = std::enable_if_t<S >= 2, void>>
346 T vy() const
347 {
348 return m_values[1];
349 }
350
351 //! Valeur de la troisième composante
352 template <int S = Size, typename = std::enable_if_t<S >= 3, void>>
353 T& vz()
354 {
355 return m_values[2];
356 }
357 //! Valeur de la troisième composante
358 template <int S = Size, typename = std::enable_if_t<S >= 3, void>>
359 T vz() const
360 {
361 return m_values[2];
362 }
363
364 private:
365
366 //! Valeurs du vecteur
367 T m_values[Size] = {};
368
369 private:
370
371 /*!
372 * \brief Compare les valeurs de \a a et \a b avec le comparateur TypeEqualT
373 * \retval true si \a a et \a b sont égaux,
374 * \retval false sinon.
375 */
376 constexpr ARCCORE_HOST_DEVICE static bool
377 _eq(T a, T b)
378 {
379 return math::isEqual(a, b);
380 }
381 //! Retourne la racine carrée de \a a
382 ARCCORE_HOST_DEVICE static T _sqrt(T a)
383 {
384 return math::sqrt(a);
385 }
386};
387
388/*---------------------------------------------------------------------------*/
389/*---------------------------------------------------------------------------*/
390
391} // End namespace Arcane
392
393/*---------------------------------------------------------------------------*/
394/*---------------------------------------------------------------------------*/
395
396#endif
Petit vecteur de taille fixe de N données numériques.
Definition NumVector.h:43
constexpr __host__ __device__ NumVector(T ax, T ay)
Construit avec le couple (ax,ay)
Definition NumVector.h:59
constexpr __host__ __device__ ThatClass & operator=(Real v)
Affecte à l'instance le triplet (v,v,v).
Definition NumVector.h:128
constexpr __host__ __device__ ThatClass & operator*=(T b)
Multiple chaque composante par b.
Definition NumVector.h:219
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:299
__host__ __device__ ThatClass absolute() const
Valeur absolue composante par composante.
Definition NumVector.h:181
NumVector()=default
Construit le vecteur nul.
constexpr __host__ __device__ ThatClass & operator/=(T b)
Divise chaque composante par b.
Definition NumVector.h:226
T & vz()
Valeur de la troisième composante.
Definition NumVector.h:353
friend constexpr __host__ __device__ bool operator==(const ThatClass &a, const ThatClass &b)
Compare composant pas composante l'instance courante à b.
Definition NumVector.h:287
constexpr __host__ __device__ ThatClass & operator-=(const ThatClass &b)
Soustrait b à l'instance.
Definition NumVector.h:212
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:86
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:241
friend constexpr __host__ __device__ ThatClass operator*(const ThatClass &vec, T b)
Multiplication par un scalaire.
Definition NumVector.h:265
constexpr __host__ __device__ NumVector(T v)
Construit l'instance avec pour chaque composante la valeur v.
Definition NumVector.h:111
T vy() const
Valeur de la deuxième composante.
Definition NumVector.h:346
constexpr __host__ __device__ ThatClass & operator-=(T b)
Soustrait b à chaque composante de l'instance.
Definition NumVector.h:205
constexpr __host__ __device__ NumVector(std::array< T, Size > v)
Construit l'instance avec pour chaque composante la valeur v.
Definition NumVector.h:104
friend constexpr __host__ __device__ ThatClass operator/(const ThatClass &vec, T b)
Division par un scalaire.
Definition NumVector.h:273
constexpr __host__ __device__ NumVector(T ax, T ay, T az)
Construit avec le triplet (ax,ay,az)
Definition NumVector.h:67
T & vx()
Valeur de la première composante.
Definition NumVector.h:327
constexpr __host__ __device__ ThatClass & operator+=(T b)
Ajoute b à chaque composante de l'instance.
Definition NumVector.h:190
constexpr __host__ __device__ Real squareNormL2() const
Retourne la norme L2 au carré du triplet .
Definition NumVector.h:170
T vz() const
Valeur de la troisième composante.
Definition NumVector.h:359
constexpr __host__ __device__ NumVector(const T(&v)[Size])
Construit l'instance avec pour chaque composante la valeur v.
Definition NumVector.h:97
constexpr __host__ __device__ NumVector(T a1, T a2, T a3, T a4)
Construit avec le quadruplet (a1,a2,a3,a4)
Definition NumVector.h:76
friend constexpr __host__ __device__ ThatClass operator*(T a, const ThatClass &vec)
Multiplication par un scalaire.
Definition NumVector.h:257
T & vy()
Valeur de la deuxième composante.
Definition NumVector.h:340
constexpr __host__ __device__ ThatClass & operator+=(const ThatClass &b)
Ajoute b à l'instance.
Definition NumVector.h:198
__host__ __device__ Real normL2() const
Retourne la norme L2 du triplet .
Definition NumVector.h:178
T vx() const
Valeur de la première composante.
Definition NumVector.h:333
constexpr __host__ __device__ ThatClass operator-() const
Créé un triplet opposé au triplet actuel.
Definition NumVector.h:249
friend constexpr __host__ __device__ ThatClass operator+(const ThatClass &a, const ThatClass &b)
Créé un triplet qui vaut ce triplet ajouté à b.
Definition NumVector.h:233
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 -*-