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>>
75 template <
int S = Size,
typename = std::enable_if_t<S == 4,
void>>
85 template <
int S = Size,
typename = std::enable_if_t<S == 5,
void>>
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)
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>>
152 template <
int S = Size,
typename = std::enable_if_t<S == 3,
void>>
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)
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)
200 for (
int i = 0; i < Size; ++i)
207 for (
int i = 0; i < Size; ++i)
214 for (
int i = 0; i < Size; ++i)
221 for (
int i = 0; i < Size; ++i)
228 for (
int i = 0; i < Size; ++i)
236 for (
int i = 0; i < Size; ++i)
237 v.m_values[i] = a.m_values[i] +
b.m_values[i];
244 for (
int i = 0; i < Size; ++i)
245 v.m_values[i] = a.m_values[i] -
b.m_values[i];
252 for (
int i = 0; i < Size; ++i)
260 for (
int i = 0; i < Size; ++i)
261 v.m_values[i] = a *
vec.m_values[i];
268 for (
int i = 0; i < Size; ++i)
269 v.m_values[i] =
vec.m_values[i] *
b;
276 for (
int i = 0; i < Size; ++i)
277 v.m_values[i] =
vec.m_values[i] /
b;
289 for (
int i = 0; i < Size; ++i)
290 if (!
_eq(a.m_values[i],
b.m_values[i]))
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>>
376 constexpr ARCCORE_HOST_DEVICE
static bool
382 ARCCORE_HOST_DEVICE
static T
_sqrt(T a)
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Petit vecteur de taille fixe de N données numériques.
friend constexpr ARCCORE_HOST_DEVICE ThatClass operator*(const ThatClass &vec, T b)
Multiplication par un scalaire.
constexpr ARCCORE_HOST_DEVICE ThatClass & operator-=(const ThatClass &b)
Soustrait b à l'instance.
constexpr ARCCORE_HOST_DEVICE NumVector(T a1, T a2, T a3, T a4)
Construit avec le quadruplet (a1,a2,a3,a4)
constexpr ARCCORE_HOST_DEVICE ThatClass & operator*=(T b)
Multiple chaque composante par b.
T m_values[Size]
Valeurs du vecteur.
static ARCCORE_HOST_DEVICE T _sqrt(T a)
Retourne la racine carrée de a.
constexpr ARCCORE_HOST_DEVICE Real squareNormL2() const
Retourne la norme L2 au carré du triplet .
friend constexpr ARCCORE_HOST_DEVICE ThatClass operator/(const ThatClass &vec, T b)
Division par un scalaire.
constexpr ARCCORE_HOST_DEVICE NumVector(T ax, T ay)
Construit avec le couple (ax,ay)
constexpr static ARCCORE_HOST_DEVICE bool _eq(T a, T b)
Compare les valeurs de a et b avec le comparateur TypeEqualT.
NumVector()=default
Construit le vecteur nul.
friend constexpr ARCCORE_HOST_DEVICE ThatClass operator+(const ThatClass &a, const ThatClass &b)
Créé un triplet qui vaut ce triplet ajouté à b.
friend constexpr ARCCORE_HOST_DEVICE bool operator==(const ThatClass &a, const ThatClass &b)
Compare composant pas composante l'instance courante à b.
friend constexpr ARCCORE_HOST_DEVICE ThatClass operator*(T a, const ThatClass &vec)
Multiplication par un scalaire.
T & vz()
Valeur de la troisième composante.
T vy() const
Valeur de la deuxième composante.
ARCCORE_HOST_DEVICE ThatClass absolute() const
Valeur absolue composante par composante.
constexpr ARCCORE_HOST_DEVICE NumVector(const T(&v)[Size])
Construit l'instance avec pour chaque composante la valeur v.
constexpr ARCCORE_HOST_DEVICE ThatClass & operator/=(T b)
Divise chaque composante par b.
constexpr ARCCORE_HOST_DEVICE NumVector(T v)
Construit l'instance avec pour chaque composante la valeur v.
constexpr ARCCORE_HOST_DEVICE ThatClass & operator+=(const ThatClass &b)
Ajoute b à l'instance.
T & vx()
Valeur de la première composante.
constexpr ARCCORE_HOST_DEVICE NumVector(T ax, T ay, T az)
Construit avec le triplet (ax,ay,az)
constexpr ARCCORE_HOST_DEVICE ThatClass operator-() const
Créé un triplet opposé au triplet actuel.
T vz() const
Valeur de la troisième composante.
friend constexpr ARCCORE_HOST_DEVICE bool operator!=(const ThatClass &a, const ThatClass &b)
Compare deux vecteurs Pour la notion d'égalité, voir operator==()
T & vy()
Valeur de la deuxième composante.
ARCCORE_HOST_DEVICE Real normL2() const
Retourne la norme L2 du triplet .
constexpr ARCCORE_HOST_DEVICE ThatClass & operator+=(T b)
Ajoute b à chaque composante de l'instance.
constexpr ARCCORE_HOST_DEVICE NumVector(T a1, T a2, T a3, T a4, T a5)
Construit avec le quintuplet (a1,a2,a3,a4,a5)
constexpr ARCCORE_HOST_DEVICE ThatClass & operator-=(T b)
Soustrait b à chaque composante de l'instance.
constexpr ARCCORE_HOST_DEVICE ThatClass & operator=(Real v)
Affecte à l'instance le triplet (v,v,v).
constexpr ARCCORE_HOST_DEVICE NumVector(std::array< T, Size > v)
Construit l'instance avec pour chaque composante la valeur v.
friend constexpr ARCCORE_HOST_DEVICE ThatClass operator-(const ThatClass &a, const ThatClass &b)
Créé un triplet qui vaut b soustrait de ce triplet.
T vx() const
Valeur de la première composante.
Classe gérant un vecteur de réel de dimension 2.
Espace de nom pour l'utilisation des accélérateurs.
constexpr ARCCORE_HOST_DEVICE bool isEqual(const _Type &a, const _Type &b)
Teste l'égalité bit à bit entre deux valeurs.
ARCCORE_HOST_DEVICE double sqrt(double v)
Racine carrée de v.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-