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 constexpr ARCCORE_HOST_DEVICE
NumVector(T ax, T ay)
requires(Size == 2)
66 constexpr ARCCORE_HOST_DEVICE
NumVector(T ax, T ay, T az)
requires(Size == 3)
75 constexpr ARCCORE_HOST_DEVICE
NumVector(T a1, T a2, T a3, T a4)
requires(Size == 4)
85 constexpr ARCCORE_HOST_DEVICE
NumVector(T a1, T a2, T a3, T a4, T a5)
requires(Size == 5)
95 template <
bool = true>
96 explicit constexpr ARCCORE_HOST_DEVICE
NumVector(
const T (&v)[Size])
98 for (
int i = 0; i < Size; ++i)
103 explicit constexpr ARCCORE_HOST_DEVICE
NumVector(std::array<T, Size> v)
105 for (
int i = 0; i < Size; ++i)
112 for (
int i = 0; i < Size; ++i)
116 explicit constexpr ARCCORE_HOST_DEVICE
NumVector(
Real2 v)
requires(Size == 2)
120 explicit constexpr ARCCORE_HOST_DEVICE
NumVector(Real3 v)
requires(Size == 3)
127 for (
int i = 0; i < Size; ++i)
132 constexpr ARCCORE_HOST_DEVICE ThatClass&
operator=(
const Real2& v)
requires(Size == 2)
134 *
this = ThatClass(v);
138 constexpr ARCCORE_HOST_DEVICE ThatClass&
operator=(
const Real3& v)
requires(Size == 3)
140 *
this = ThatClass(v);
144 operator Real2() const requires(Size == 2) {
return Real2(m_values[0], m_values[1]); }
146 operator Real3() const requires(Size == 3) {
return Real3(m_values[0], m_values[1], m_values[2]); }
150 constexpr ARCCORE_HOST_DEVICE
static ThatClass zero() {
return ThatClass(); }
154 constexpr ARCCORE_HOST_DEVICE
bool isNearlyZero()
const
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;
166 for (
int i = 0; i < Size; ++i)
167 v += m_values[i] * m_values[i];
177 for (
int i = 0; i < Size; ++i)
178 v.m_values[i] = math::abs(m_values[i]);
185 for (
int i = 0; i < Size; ++i)
191 constexpr ARCCORE_HOST_DEVICE ThatClass&
operator+=(
const ThatClass& b)
193 for (
int i = 0; i < Size; ++i)
194 m_values[i] += b.m_values[i];
200 for (
int i = 0; i < Size; ++i)
205 constexpr ARCCORE_HOST_DEVICE ThatClass&
operator-=(
const ThatClass& b)
207 for (
int i = 0; i < Size; ++i)
208 m_values[i] -= b.m_values[i];
214 for (
int i = 0; i < Size; ++i)
221 for (
int i = 0; i < Size; ++i)
226 friend constexpr ARCCORE_HOST_DEVICE ThatClass
operator+(
const ThatClass& a,
const ThatClass& b)
229 for (
int i = 0; i < Size; ++i)
230 v.m_values[i] = a.m_values[i] + b.m_values[i];
234 friend constexpr ARCCORE_HOST_DEVICE ThatClass
operator-(
const ThatClass& a,
const ThatClass& b)
237 for (
int i = 0; i < Size; ++i)
238 v.m_values[i] = a.m_values[i] - b.m_values[i];
242 constexpr ARCCORE_HOST_DEVICE ThatClass
operator-()
const
245 for (
int i = 0; i < Size; ++i)
246 v.m_values[i] = -m_values[i];
250 friend constexpr ARCCORE_HOST_DEVICE ThatClass
operator*(T a,
const ThatClass& vec)
253 for (
int i = 0; i < Size; ++i)
254 v.m_values[i] = a * vec.m_values[i];
258 friend constexpr ARCCORE_HOST_DEVICE ThatClass
operator*(
const ThatClass& vec, T b)
261 for (
int i = 0; i < Size; ++i)
262 v.m_values[i] = vec.m_values[i] * b;
266 friend constexpr ARCCORE_HOST_DEVICE ThatClass
operator/(
const ThatClass& vec, T b)
269 for (
int i = 0; i < Size; ++i)
270 v.m_values[i] = vec.m_values[i] / b;
280 friend constexpr ARCCORE_HOST_DEVICE
bool operator==(
const ThatClass& a,
const ThatClass& b)
282 for (
int i = 0; i < Size; ++i)
283 if (!_eq(a.m_values[i], b.m_values[i]))
292 friend constexpr ARCCORE_HOST_DEVICE
bool operator!=(
const ThatClass& a,
const ThatClass& b)
297 constexpr ARCCORE_HOST_DEVICE T& operator()(
Int32 i)
299 ARCCORE_CHECK_AT(i, Size);
302 constexpr ARCCORE_HOST_DEVICE T operator()(Int32 i)
const
304 ARCCORE_CHECK_AT(i, Size);
307 constexpr ARCCORE_HOST_DEVICE T& operator[](
Int32 i)
309 ARCCORE_CHECK_AT(i, Size);
312 constexpr ARCCORE_HOST_DEVICE T operator[](
Int32 i)
const
314 ARCCORE_CHECK_AT(i, Size);
319 T&
vx()
requires(Size >= 1)
324 T
vx() const requires(Size >= 1)
330 T&
vy()
requires(Size >= 2)
335 T
vy() const requires(Size >= 2)
341 T&
vz()
requires(Size >= 3)
346 T
vz() const requires(Size >= 3)
354 T m_values[Size] = {};
363 constexpr ARCCORE_HOST_DEVICE
static bool
369 ARCCORE_HOST_DEVICE
static T _sqrt(T a)
Petit vecteur de taille fixe de N données numériques.
T & vy()
Valeur de la deuxième composante.
constexpr __host__ __device__ NumVector(T ax, T ay, T az)
Construit avec le triplet (ax,ay,az)
T vz() const
Valeur de la troisième composante.
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==()
T vy() const
Valeur de la deuxième composante.
constexpr __host__ __device__ NumVector(T a1, T a2, T a3, T a4, T a5)
Construit avec le quintuplet (a1,a2,a3,a4,a5)
__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 & vx()
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__ __device__ ThatClass & operator-=(const ThatClass &b)
Soustrait b à l'instance.
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 a1, T a2, T a3, T a4)
Construit avec le quadruplet (a1,a2,a3,a4)
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.
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.
T vx() const
Valeur de la première composante.
constexpr __host__ __device__ NumVector(T ax, T ay)
Construit avec le couple (ax,ay)
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 .
constexpr __host__ __device__ NumVector(const T(&v)[Size])
Construit l'instance avec pour chaque composante la valeur v.
friend constexpr __host__ __device__ ThatClass operator*(T a, const ThatClass &vec)
Multiplication par un scalaire.
T & vz()
Valeur de la troisiè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.
__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.