12#ifndef ARCANE_UTILS_NUMVECTOR_H
13#define ARCANE_UTILS_NUMVECTOR_H
17#include "arcane/utils/Real2.h"
18#include "arcane/utils/Real3.h"
41template <
typename T,
int Size>
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");
58 template <
int S = Size,
typename = std::enable_if_t<S == 2,
void>>
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)
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)
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)
96 template <
bool = true>
97 explicit constexpr ARCCORE_HOST_DEVICE
NumVector(
const T (&v)[Size])
99 for (
int i = 0; i < Size; ++i)
104 explicit constexpr ARCCORE_HOST_DEVICE
NumVector(std::array<T, Size> v)
106 for (
int i = 0; i < Size; ++i)
113 for (
int i = 0; i < Size; ++i)
117 template <
int S = Size,
typename = std::enable_if_t<S == 2,
void>>
122 template <
int S = Size,
typename = std::enable_if_t<S == 3,
void>>
123 explicit constexpr ARCCORE_HOST_DEVICE
NumVector(Real3 v)
128 constexpr ARCCORE_HOST_DEVICE ThatClass&
operator=(Real v)
130 for (
int i = 0; i < Size; ++i)
135 template <
int S = Size,
typename = std::enable_if_t<S == 2,
void>>
136 constexpr ARCCORE_HOST_DEVICE ThatClass&
operator=(
const Real2& v)
138 *
this = ThatClass(v);
142 template <
int S = Size,
typename = std::enable_if_t<S == 3,
void>>
143 constexpr ARCCORE_HOST_DEVICE ThatClass&
operator=(
const Real3& v)
145 *
this = ThatClass(v);
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]); }
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]); }
157 constexpr ARCCORE_HOST_DEVICE
static ThatClass zero() {
return ThatClass(); }
161 constexpr ARCCORE_HOST_DEVICE
bool isNearlyZero()
const
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;
173 for (
int i = 0; i < Size; ++i)
174 v += m_values[i] * m_values[i];
184 for (
int i = 0; i < Size; ++i)
185 v.m_values[i] = math::abs(m_values[i]);
192 for (
int i = 0; i < Size; ++i)
198 constexpr ARCCORE_HOST_DEVICE ThatClass&
operator+=(
const ThatClass& b)
200 for (
int i = 0; i < Size; ++i)
201 m_values[i] += b.m_values[i];
207 for (
int i = 0; i < Size; ++i)
212 constexpr ARCCORE_HOST_DEVICE ThatClass&
operator-=(
const ThatClass& b)
214 for (
int i = 0; i < Size; ++i)
215 m_values[i] -= b.m_values[i];
221 for (
int i = 0; i < Size; ++i)
228 for (
int i = 0; i < Size; ++i)
233 friend constexpr ARCCORE_HOST_DEVICE ThatClass
operator+(
const ThatClass& a,
const ThatClass& b)
236 for (
int i = 0; i < Size; ++i)
237 v.m_values[i] = a.m_values[i] + b.m_values[i];
241 friend constexpr ARCCORE_HOST_DEVICE ThatClass
operator-(
const ThatClass& a,
const ThatClass& b)
244 for (
int i = 0; i < Size; ++i)
245 v.m_values[i] = a.m_values[i] - b.m_values[i];
249 constexpr ARCCORE_HOST_DEVICE ThatClass
operator-()
const
252 for (
int i = 0; i < Size; ++i)
253 v.m_values[i] = -m_values[i];
257 friend constexpr ARCCORE_HOST_DEVICE ThatClass
operator*(T a,
const ThatClass& vec)
260 for (
int i = 0; i < Size; ++i)
261 v.m_values[i] = a * vec.m_values[i];
265 friend constexpr ARCCORE_HOST_DEVICE ThatClass
operator*(
const ThatClass& vec, T b)
268 for (
int i = 0; i < Size; ++i)
269 v.m_values[i] = vec.m_values[i] * b;
273 friend constexpr ARCCORE_HOST_DEVICE ThatClass
operator/(
const ThatClass& vec, T b)
276 for (
int i = 0; i < Size; ++i)
277 v.m_values[i] = vec.m_values[i] / b;
287 friend constexpr ARCCORE_HOST_DEVICE
bool operator==(
const ThatClass& a,
const ThatClass& b)
289 for (
int i = 0; i < Size; ++i)
290 if (!_eq(a.m_values[i], b.m_values[i]))
299 friend constexpr ARCCORE_HOST_DEVICE
bool operator!=(
const ThatClass& a,
const ThatClass& b)
304 constexpr ARCCORE_HOST_DEVICE T& operator()(Int32 i)
306 ARCCORE_CHECK_AT(i, Size);
309 constexpr ARCCORE_HOST_DEVICE T operator()(Int32 i)
const
311 ARCCORE_CHECK_AT(i, Size);
314 constexpr ARCCORE_HOST_DEVICE T& operator[](Int32 i)
316 ARCCORE_CHECK_AT(i, Size);
319 constexpr ARCCORE_HOST_DEVICE T operator[](Int32 i)
const
321 ARCCORE_CHECK_AT(i, Size);
326 template <
int S = Size,
typename = std::enable_if_t<S >= 1,
void>>
332 template <
int S = Size,
typename = std::enable_if_t<S >= 1,
void>>
339 template <
int S = Size,
typename = std::enable_if_t<S >= 2,
void>>
345 template <
int S = Size,
typename = std::enable_if_t<S >= 2,
void>>
352 template <
int S = Size,
typename = std::enable_if_t<S >= 3,
void>>
358 template <
int S = Size,
typename = std::enable_if_t<S >= 3,
void>>
367 T m_values[Size] = {};
376 constexpr ARCCORE_HOST_DEVICE
static bool
382 ARCCORE_HOST_DEVICE
static T _sqrt(T a)
Petit vecteur de taille fixe de N données numériques.
constexpr __host__ __device__ NumVector(T ax, T ay)
Construit avec le couple (ax,ay)
constexpr __host__ __device__ ThatClass & operator=(Real v)
Affecte à l'instance le triplet (v,v,v).
constexpr __host__ __device__ ThatClass & operator*=(T b)
Multiple chaque composante par b.
friend constexpr __host__ __device__ bool operator!=(const ThatClass &a, const ThatClass &b)
Compare deux vecteurs Pour la notion d'égalité, voir operator==()
__host__ __device__ ThatClass absolute() const
Valeur absolue composante par composante.
NumVector()=default
Construit le vecteur nul.
constexpr __host__ __device__ ThatClass & operator/=(T b)
Divise chaque composante par b.
T & vz()
Valeur de la troisième composante.
friend constexpr __host__ __device__ bool operator==(const ThatClass &a, const ThatClass &b)
Compare composant pas composante l'instance courante à b.
constexpr __host__ __device__ ThatClass & operator-=(const ThatClass &b)
Soustrait b à l'instance.
constexpr __host__ __device__ NumVector(T a1, T a2, T a3, T a4, T a5)
Construit avec le quintuplet (a1,a2,a3,a4,a5)
friend constexpr __host__ __device__ ThatClass operator-(const ThatClass &a, const ThatClass &b)
Créé un triplet qui vaut b soustrait de ce triplet.
friend constexpr __host__ __device__ ThatClass operator*(const ThatClass &vec, T b)
Multiplication par un scalaire.
constexpr __host__ __device__ NumVector(T v)
Construit l'instance avec pour chaque composante la valeur v.
T vy() const
Valeur de la deuxième composante.
constexpr __host__ __device__ ThatClass & operator-=(T b)
Soustrait b à chaque composante de l'instance.
constexpr __host__ __device__ NumVector(std::array< T, Size > v)
Construit l'instance avec pour chaque composante la valeur v.
friend constexpr __host__ __device__ ThatClass operator/(const ThatClass &vec, T b)
Division par un scalaire.
constexpr __host__ __device__ NumVector(T ax, T ay, T az)
Construit avec le triplet (ax,ay,az)
T & vx()
Valeur de la première composante.
constexpr __host__ __device__ ThatClass & operator+=(T b)
Ajoute b à chaque composante de l'instance.
constexpr __host__ __device__ Real squareNormL2() const
Retourne la norme L2 au carré du triplet .
T vz() const
Valeur de la troisième composante.
constexpr __host__ __device__ NumVector(const T(&v)[Size])
Construit l'instance avec pour chaque composante la valeur v.
constexpr __host__ __device__ NumVector(T a1, T a2, T a3, T a4)
Construit avec le quadruplet (a1,a2,a3,a4)
friend constexpr __host__ __device__ ThatClass operator*(T a, const ThatClass &vec)
Multiplication par un scalaire.
T & vy()
Valeur de la deuxième composante.
constexpr __host__ __device__ ThatClass & operator+=(const ThatClass &b)
Ajoute b à l'instance.
__host__ __device__ Real normL2() const
Retourne la norme L2 du triplet .
T vx() const
Valeur de la première composante.
constexpr __host__ __device__ ThatClass operator-() const
Créé un triplet opposé au triplet actuel.
friend constexpr __host__ __device__ ThatClass operator+(const ThatClass &a, const ThatClass &b)
Créé un triplet qui vaut ce triplet ajouté à b.
Classe gérant un vecteur de réel de dimension 2.
__host__ __device__ double sqrt(double v)
Racine carrée de v.
constexpr __host__ __device__ bool isEqual(const _Type &a, const _Type &b)
Teste l'égalité bit à bit entre deux valeurs.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-