12#ifndef ARCANE_CORE_MATHUTILS_H
13#define ARCANE_CORE_MATHUTILS_H
17#include "arcane/utils/Math.h"
18#include "arcane/utils/ArrayView.h"
19#include "arcane/utils/NumericTypes.h"
20#include "arcane/utils/Real2x2.h"
21#include "arcane/utils/Real3.h"
22#include "arcane/utils/Real2.h"
24#include "arcane/core/Algorithm.h"
47ARCCORE_HOST_DEVICE
inline Real3
51 u.
y * v.
z - u.
z * v.
y,
52 u.
z * v.
x - u.
x * v.
z,
53 u.
x * v.
y - u.
y * v.
x);
65ARCCORE_HOST_DEVICE
inline Real
78ARCCORE_HOST_DEVICE
inline Real
93ARCCORE_HOST_DEVICE
inline Real
96 return (u.
x * v.
x + u.
y * v.
y);
111ARCCORE_HOST_DEVICE
inline Real
114 return (u.
x * v.
x + u.
y * v.
y);
127ARCCORE_HOST_DEVICE
inline Real
130 return (u.
x * v.
x + u.
y * v.
y + u.
z * v.
z);
145ARCCORE_HOST_DEVICE
inline Real
148 return (u.
x * v.
x + u.
y * v.
y + u.
z * v.
z);
160ARCCORE_HOST_DEVICE
inline Real
172ARCCORE_HOST_DEVICE
inline Real
176 (u.
x * (v.
y * w.
z - v.
z * w.
y)) +
177 (u.
y * (v.
z * w.
x - v.
x * w.
z)) +
178 (u.
z * (v.
x * w.
y - v.
y * w.
x)));
210ARCCORE_HOST_DEVICE
inline Real3
215ARCCORE_HOST_DEVICE
inline Real2
230ARCCORE_HOST_DEVICE
inline Real3
233 return Real3(
dot(v,
Real3(t.
x.
x, t.
y.
x, t.
z.
x)),
dot(v,
Real3(t.
x.
y, t.
y.
y, t.
z.
y)),
dot(v,
Real3(t.
x.
z, t.
y.
z, t.
z.
z)));
243ARCCORE_HOST_DEVICE
inline Real3x3
264ARCCORE_HOST_DEVICE
inline Real3x3
279ARCCORE_HOST_DEVICE
inline Real3x3
296ARCCORE_HOST_DEVICE
inline Real
311 return x1 + x2 + x3 + y1 + y2 + y3 + z1 + z2 + z3;
323ARCCORE_HOST_DEVICE
inline Real
332 return x1 + x2 + y1 + y2;
345ARCCORE_HOST_DEVICE
inline Real2
355ARCCORE_HOST_DEVICE
inline Real3
365ARCCORE_HOST_DEVICE
inline Real2x2
375ARCCORE_HOST_DEVICE
inline Real3x3
391template <
class T>
inline T
392min(
const T& a,
const T& b,
const T& c)
394 return ((a < b) ? ((a < c) ? a : ((b < c) ? b : c)) : ((b < c) ? b : c));
406template <
class T>
inline T
407max(
const T& a,
const T& b,
const T& c)
409 return ((a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c));
419ARCCORE_HOST_DEVICE
inline Real2
429ARCCORE_HOST_DEVICE
inline Real3
439ARCCORE_HOST_DEVICE
inline Real2x2
449ARCCORE_HOST_DEVICE
inline Real3x3
464ARCCORE_HOST_DEVICE
inline Real
476ARCCORE_HOST_DEVICE
inline Real
488ARCCORE_HOST_DEVICE
inline Real
512ARCCORE_HOST_DEVICE
inline Real
516 return min4Real(
max(a, zero),
max(b, zero),
max(c, zero),
max(d, zero)) +
max4Real(
min(a, zero),
min(b, zero),
min(c, zero),
min(d, zero));
525ARCCORE_HOST_DEVICE
inline Real
539ARCCORE_HOST_DEVICE
inline Real
559 Real sum = math::abs(a) + math::abs(b);
560 return (
isZero(sum)) ? (a - b) : (a - b) / sum;
603 Real sum = math::abs(b);
604 return (
isZero(sum)) ? (a - b) : (a - b) / sum;
620 Real sum = math::abs(a);
621 return (
isZero(sum)) ? (a - b) : (a - b) / sum;
632 Real& ymin,
Real& ymax,
bool need_init)
644 xmin = xmax = array[0].x;
645 ymin = ymax = array[0].y;
648 for (
Integer i = 1; i < size; ++i) {
649 if (array[i].x < xmin)
651 if (array[i].x > xmax)
654 if (array[i].y < ymin)
656 if (array[i].y > ymax)
668ARCCORE_HOST_DEVICE
inline Real
694ARCCORE_HOST_DEVICE
inline Real3x3
698 Real3(0.0, 1.0, 0.0),
699 Real3(0.0, 0.0, 1.0));
708ARCCORE_HOST_DEVICE
inline Real3x3
724ARCCORE_HOST_DEVICE
inline Real3x3
743 v.
x = v1.
y * v2.
z - v1.
z * v2.
y;
744 v.
y = v2.
x * v1.
z - v2.
z * v1.
x;
745 v.
z = v1.
x * v2.
y - v1.
y * v2.
x;
757ARCCORE_HOST_DEVICE
inline Real3
761 v.
x = v1.
y * v2.
z - v1.
z * v2.
y;
762 v.
y = v2.
x * v1.
z - v2.
z * v1.
x;
763 v.
z = v1.
x * v2.
y - v1.
y * v2.
x;
776ARCCORE_HOST_DEVICE
inline Real3
781 return Real3(v.
x / norme, v.
y / norme, v.
z / norme);
846ARCCORE_HOST_DEVICE
inline Real3
851 m.
z.
x * v.
x + m.
z.
y * v.
y + m.
z.
z * v.
z);
867 return (m0.
x.
x < epsilon) && (m0.
x.
y < epsilon) && (m0.
x.
z < epsilon) &&
868 (m0.
y.
x < epsilon) && (m0.
y.
y < epsilon) && (m0.
y.
z < epsilon) &&
869 (m0.
z.
x < epsilon) && (m0.
z.
y < epsilon) && (m0.
z.
z < epsilon);
889 u_tilde = u - 2.0 *
dot(norm, u) * norm;
905 if (a.normL2() == 0) {
910 u_tilde = 2.0 *
dot(u, norm) * norm - u;
925template <
typename T>
inline void
929 ARCANE_ASSERT((copy_array.
size() >= size), (
"Bad size %d %d", copy_array.
size(), size));
930 const T* copy_begin = copy_array.
data();
931 T* to_ptr = lhs.
data();
932 for (
Integer i = 0; i < size; ++i)
933 to_ptr[i] += copy_begin[i];
944template <
typename T>
inline void
948 ARCANE_ASSERT((copy_array.
size() >= size), (
"Bad size %d %d", copy_array.
size(), size));
949 const T* copy_begin = copy_array.
data();
950 T* to_ptr = lhs.
data();
951 for (
Integer i = 0; i < size; ++i)
952 to_ptr[i] += copy_begin[i];
963template <
typename T>
inline void
967 ARCANE_ASSERT((copy_array.
size() >= size), (
"Bad size %d %d", copy_array.
size(), size));
968 const T* copy_begin = copy_array.
data();
969 T* to_ptr = lhs.
data();
970 for (
Integer i = 0; i < size; ++i)
971 to_ptr[i] -= copy_begin[i];
982template <
typename T>
inline void
986 ARCANE_ASSERT((copy_array.
size() >= size), (
"Bad size %d %d", copy_array.
size(), size));
987 const T* copy_begin = copy_array.
data();
988 T* to_ptr = lhs.
data();
989 for (
Integer i = 0; i < size; ++i)
990 to_ptr[i] -= copy_begin[i];
1003template <
typename T>
inline void
1007 ARCANE_ASSERT((copy_array.
size() >= size), (
"Bad size %d %d", copy_array.
size(), size));
1008 const T* copy_begin = copy_array.
data();
1009 T* to_ptr = lhs.
data();
1010 for (
Integer i = 0; i < size; ++i)
1011 to_ptr[i] *= copy_begin[i];
1024template <
typename T>
inline void
1033template <
typename T>
inline void
1036 T* ptr = lhs.
data();
1037 for (
Integer i = 0, size = lhs.
size(); i < size; ++i)
1044template <
typename T>
inline void
1047 T* ptr = lhs.
data();
1048 for (
Integer i = 0, size = lhs.
size(); i < size; ++i)
Vue modifiable d'un tableau d'un type T.
constexpr const_pointer data() const noexcept
Pointeur sur le début de la vue.
constexpr ConstArrayView< T > constView() const noexcept
Vue constante sur cette vue.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
Vue constante d'un tableau de type T.
constexpr const_pointer data() const noexcept
Pointeur sur la mémoire allouée.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Classe gérant un vecteur réel 2-dimensionnel.
Classe gérant une matrice 2x2 de réels.
Real2 x
Première composante.
Real2 y
Deuxième composante.
Classe gérant un vecteur réel de 3 dimensions.
__host__ __device__ Real normL2() const
Retourne la norme L2 du triplet $ .
Classe gérant une matrice réelle 3x3.
Real3 z
premier élément du triplet
constexpr __host__ static __device__ Real3x3 fromLines(Real ax, Real bx, Real cx, Real ay, Real by, Real cy, Real az, Real bz, Real cz)
Construit la matrice ((ax,bx,cx),(ay,by,cy),(az,bz,cz)).
Real3 y
premier élément du triplet
constexpr __host__ __device__ Real determinant() const
Déterminant de la matrice.
constexpr __host__ static __device__ Real3x3 fromColumns(Real ax, Real ay, Real az, Real bx, Real by, Real bz, Real cx, Real cy, Real cz)
Construit la matrice ((ax,bx,cx),(ay,by,cy),(az,bz,cz)).
Real3 x
premier élément du triplet
__host__ __device__ Real vecMul2D(Real3 u, Real3 v)
Produit vectoriel de u par v dans .
__host__ __device__ Real dot(Real2 u, Real2 v)
Produit scalaire de u par v dans .
__host__ __device__ Real2 min(Real2 a, Real2 b)
Retourne le minimum de deux Real2.
T max(const T &a, const T &b, const T &c)
Retourne le maximum de trois éléments.
__host__ __device__ Real3 vecMul(Real3 u, Real3 v)
Produit vectoriel de u par v dans .
Real3 normalizedCrossProduct3(Real3 v1, Real3 v2)
Produit vectoriel normalisé.
__host__ __device__ Real minMod(Real a, Real b, Real c, Real d)
retourne le Min mod de quatre Real
__host__ __device__ Real minMod2(Real a, Real b)
retourne le Min mod de deux Reals
__host__ __device__ Real cross2D(Real3 u, Real3 v)
Produit vectoriel de u par v dans .
__host__ __device__ Real scaMul(Real2 u, Real2 v)
Produit scalaire de u par v dans .
__host__ __device__ Real3 prodVecTens(Real3 v, Real3x3 t)
Produit transposé(vecteur) matrice entre la transposée d'un vecteur et une matrice.
__host__ __device__ Real3 cross(Real3 v1, Real3 v2)
Produit vectoriel de deux vecteurs à 3 composantes.
__host__ __device__ Real3 normalizeReal3(Real3 v)
Normalisation d'un Real3.
Real3x3 prodTens(Real3 u, Real3 v)
Produit tensoriel de deux vecteurs Real3.
__host__ __device__ Real maxMod2(Real a, Real b)
retourne le Max mod de deux Reals
__host__ __device__ Real3x3 matrixProduct(const Real3x3 &t, const Real3x3 &v)
Produit matrice-matrice entre deux tenseurs.
Real3x3 matrix3x3Transp(Real3x3 m)
Real3 planarSymmetric(Real3 u, Real3 n)
Symétrie d'un vecteur u par rapport à un plan de normale n.
__host__ __device__ Real3 prodTensVec(Real3x3 t, Real3 v)
Produit matrice-vecteur entre un tenseur et un vecteur.
Real3 axisSymmetric(Real3 u, Real3 a)
Symétrie d'un vecteur u par rapport à un axe de vecteur directeur a .
__host__ __device__ Real mixteMul(Real3 u, Real3 v, Real3 w)
Produit mixte de u, v et w.
__host__ __device__ Real3x3 matrixTranspose(const Real3x3 &t)
Transpose la matrice.
Espace de nom pour les fonctions mathématiques.
Real relativeError(Real a, Real b)
Retourne l'erreur relative entre deux scalaires a et b.
__host__ __device__ Real min8Real(const Real a[8])
retourne le min de huit Real
apfloat pow(apfloat x, apfloat y)
Fonction puissance.
Real relativeError2(Real a, Real b)
Retourne l'erreur relative entre deux scalaires a et b relativement à b.
void power(ArrayView< T > lhs, T o)
Met à la puissance o tous les éléments du tableau.
Real normeR3(Real3 v1)
Norme d'un vecteur.
Real relativeError1(Real a, Real b)
Retourne l'erreur relative entre deux scalaires a et b relativement à a.
bool isNearlyId(Real3x3 m, Real epsilon=1.e-10)
Vérifie qu'une matrice vaut bien la matrice identité.
bool searchExtrema(ConstArrayView< Real2 > array, Real &xmin, Real &xmax, Real &ymin, Real &ymax, bool need_init)
Recherche les valeurs extrèmes d'un tableau de couple (x,y).
__host__ __device__ Real doubleContraction(const Real3x3 &u, const Real3x3 &v)
__host__ __device__ Real3 multiply(const Real3x3 &m, Real3 v)
Produit matrice 3x3 . vecteur.
bool isZero(const BuiltInProxy< _Type > &a)
Teste si une valeur est exactement égale à zéro.
__host__ __device__ Real matDet(Real3 u, Real3 v, Real3 w)
Déterminant de la matrice u,v,w.
Real max8Real(const Real a[8])
retourne le max de huit Real
__host__ __device__ Real3x3 matrix3x3Id()
Matrice identite.
__host__ __device__ Real matrixDeterminant(Real3x3 m)
Calcul du déterminant d'une matrice 3x3.
void mult(ArrayView< T > lhs, ConstArrayView< T > copy_array)
Multiplie terme à terme les éléments de l'instance par les éléments du tableau copy_array.
__host__ __device__ Real min4Real(Real a, Real b, Real c, Real d)
retourne le min de quatre Real
Real3 crossProduct3(Real3 v1, Real3 v2)
Produit vectoriel de deux vecteurs à 3 composantes.
__host__ __device__ Real max4Real(Real a, Real b, Real c, Real d)
retourne le max de quatre Real
Real3x3 matrix3x3Prod(Real3x3 m1, Real3x3 m2)
Multiplication de 2 matrices 3x3.
apfloat sqrt(apfloat v)
Racine carrée de v.
__host__ __device__ Real3x3 inverseMatrix(const Real3x3 &m, Real d)
Calcul de l'inverse d'une matrice m en supposant connu son déterminant d.
void sub(ArrayView< T > lhs, ConstArrayView< T > copy_array)
Soustrait le tableau copy_array de l'instance.
__host__ __device__ Real3x3 transpose(const Real3x3 &t)
Transpose la matrice.
void add(ArrayView< T > lhs, ConstArrayView< T > copy_array)
Ajoute le tableau copy_array dans l'instance.
Int32 Integer
Type représentant un entier.
double Real
Type représentant un réel.
__host__ __device__ void arcaneMathError(long double arg_value, const char *func_name)
Signale un argument invalide d'une fonction mathématique.
Real y
deuxième composante du couple
Real x
première composante du couple
Real y
deuxième composante du triplet
Real z
troisième composante du triplet
Real x
première composante du triplet