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>>
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)
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)
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)
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)
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)
241 friend constexpr ARCCORE_HOST_DEVICE ThatClass
operator-(
const ThatClass& a,
const ThatClass& b)
244 for (
int i = 0; i < Size; ++i)
249 constexpr ARCCORE_HOST_DEVICE ThatClass
operator-()
const
252 for (
int i = 0; i < Size; ++i)
257 friend constexpr ARCCORE_HOST_DEVICE ThatClass
operator*(T a,
const ThatClass& vec)
260 for (
int i = 0; i < Size; ++i)
265 friend constexpr ARCCORE_HOST_DEVICE ThatClass
operator*(
const ThatClass& vec, T b)
268 for (
int i = 0; i < Size; ++i)
273 friend constexpr ARCCORE_HOST_DEVICE ThatClass
operator/(
const ThatClass& vec, T b)
276 for (
int i = 0; i < Size; ++i)
287 friend constexpr ARCCORE_HOST_DEVICE
bool operator==(
const ThatClass& a,
const ThatClass& b)
289 for (
int i = 0; i < Size; ++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>>
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.
T vx() const
Valeur de la première composante.
friend constexpr __host__ __device__ bool operator==(const ThatClass &a, const ThatClass &b)
Compare composant pas composante l'instance courante à b.
constexpr __host__ static __device__ bool _eq(T a, T b)
Compare les valeurs de a et b avec le comparateur TypeEqualT.
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.
constexpr __host__ __device__ ThatClass & operator-=(T b)
Soustrait b à chaque composante de l'instance.
T vz() const
Valeur de la troisième composante.
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.
__host__ static __device__ T _sqrt(T a)
Retourne la racine carrée de a.
constexpr __host__ __device__ Real squareNormL2() const
Retourne la norme L2 au carré du triplet .
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)
T vy() const
Valeur de la deuxième composante.
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 .
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.
Espace de nom pour l'utilisation des accélérateurs.
__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 -*-
double Real
Type représentant un réel.
std::int32_t Int32
Type entier signé sur 32 bits.