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/Algorithm.h"
51ARCCORE_HOST_DEVICE
inline Real3
55 u.
y * v.
z - u.
z * v.
y,
56 u.
z * v.
x - u.
x * v.
z,
69ARCCORE_HOST_DEVICE
inline Real
81ARCCORE_HOST_DEVICE
inline Real
95ARCCORE_HOST_DEVICE
inline Real
98 return (u.
x * v.
x + u.
y * v.
y );
112ARCCORE_HOST_DEVICE
inline Real
115 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);
144ARCCORE_HOST_DEVICE
inline Real
147 return (u.
x * v.
x + u.
y * v.
y + u.
z * v.
z);
158ARCCORE_HOST_DEVICE
inline Real
169ARCCORE_HOST_DEVICE
inline Real
173 (u.
x * ( v.
y*w.
z - v.
z*w.
y )) +
174 (u.
y * ( v.
z*w.
x - v.
x*w.
z )) +
175 (u.
z * ( v.
x*w.
y - v.
y*w.
x ))
206ARCCORE_HOST_DEVICE
inline Real3
211ARCCORE_HOST_DEVICE
inline Real2
225ARCCORE_HOST_DEVICE
inline Real3
228 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)));
237ARCCORE_HOST_DEVICE
inline Real3x3
257ARCCORE_HOST_DEVICE
inline Real3x3
271ARCCORE_HOST_DEVICE
inline Real3x3
287ARCCORE_HOST_DEVICE
inline Real
302 return x1 + x2 + x3 + y1 + y2 + y3 + z1 + z2 + z3;
313ARCCORE_HOST_DEVICE
inline Real
335ARCCORE_HOST_DEVICE
inline Real2
344ARCCORE_HOST_DEVICE
inline Real3
353ARCCORE_HOST_DEVICE
inline Real2x2
362ARCCORE_HOST_DEVICE
inline Real3x3
377template<
class T>
inline T
378min(
const T& a,
const T& b,
const T& c)
380 return ( (a<b) ? ((a<c) ? a : ((b<c) ? b : c)) : ((b<c) ? b : c) );
391template<
class T>
inline T
392max(
const T& a,
const T& b,
const T& c)
394 return ( (a>b) ? ((a>c) ? a : c) : ((b>c) ? b : c) );
404ARCCORE_HOST_DEVICE
inline Real2
413ARCCORE_HOST_DEVICE
inline Real3
422ARCCORE_HOST_DEVICE
inline Real2x2
431ARCCORE_HOST_DEVICE
inline Real3x3
445ARCCORE_HOST_DEVICE
inline Real
456ARCCORE_HOST_DEVICE
inline Real
467ARCCORE_HOST_DEVICE
inline Real
489ARCCORE_HOST_DEVICE
inline Real
502ARCCORE_HOST_DEVICE
inline Real
516ARCCORE_HOST_DEVICE
inline Real
535 Real sum = math::abs(a) + math::abs(b);
536 return (
isZero(sum)) ? (a-b) : (a-b)/sum;
577 Real sum = math::abs(b);
578 return (
isZero(sum)) ? (a-b) : (a-b)/sum;
593 Real sum = math::abs(a);
594 return (
isZero(sum)) ? (a-b) : (a-b)/sum;
604 Real& ymin,
Real& ymax,
bool need_init)
616 xmin = xmax = array[0].x;
617 ymin = ymax = array[0].y;
620 for(
Integer i=1; i<size; ++i ){
621 if (array[i].x < xmin)
623 if (array[i].x > xmax)
626 if (array[i].y < ymin)
628 if (array[i].y > ymax)
639ARCCORE_HOST_DEVICE
inline Real
663ARCCORE_HOST_DEVICE
inline Real3x3
667 Real3(0.0, 1.0, 0.0),
668 Real3(0.0, 0.0, 1.0));
676ARCCORE_HOST_DEVICE
inline Real3x3
691ARCCORE_HOST_DEVICE
inline Real3x3
709 v.
x = v1.
y*v2.
z - v1.
z*v2.
y;
710 v.
y = v2.
x*v1.
z - v2.
z*v1.
x;
711 v.
z = v1.
x*v2.
y - v1.
y*v2.
x;
722ARCCORE_HOST_DEVICE
inline Real3
726 v.
x = v1.
y*v2.
z - v1.
z*v2.
y;
727 v.
y = v2.
x*v1.
z - v2.
z*v1.
x;
728 v.
z = v1.
x*v2.
y - v1.
y*v2.
x;
740ARCCORE_HOST_DEVICE
inline Real3
745 return Real3(v.
x/norme, v.
y/norme, v.
z/norme);
808ARCCORE_HOST_DEVICE
inline Real3
829 return (m0.
x.
x < epsilon) && (m0.
x.
y < epsilon) && (m0.
x.
z < epsilon) &&
830 (m0.
y.
x < epsilon) && (m0.
y.
y < epsilon) && (m0.
y.
z < epsilon) &&
831 (m0.
z.
x < epsilon) && (m0.
z.
y < epsilon) && (m0.
z.
z < epsilon);
850 u_tilde = u - 2.0 *
dot(norm, u) * norm;
870 u_tilde = 2.0 *
dot(u,norm) * norm - u;
884template<
typename T>
inline void
888 ARCANE_ASSERT( (copy_array.
size()>=size), (
"Bad size %d %d",copy_array.
size(),size) );
889 const T* copy_begin = copy_array.
data();
890 T* to_ptr = lhs.
data();
891 for(
Integer i=0; i<size; ++i )
892 to_ptr[i] += copy_begin[i];
903template<
typename T>
inline void
907 ARCANE_ASSERT( (copy_array.
size()>=size), (
"Bad size %d %d",copy_array.
size(),size) );
908 const T* copy_begin = copy_array.
data();
909 T* to_ptr = lhs.
data();
910 for(
Integer i=0; i<size; ++i )
911 to_ptr[i] += copy_begin[i];
922template<
typename T>
inline void
926 ARCANE_ASSERT( (copy_array.
size()>=size), (
"Bad size %d %d",copy_array.
size(),size) );
927 const T* copy_begin = copy_array.
data();
928 T* to_ptr = lhs.
data();
929 for(
Integer i=0; i<size; ++i )
930 to_ptr[i] -= copy_begin[i];
941template<
typename T>
inline void
945 ARCANE_ASSERT( (copy_array.
size()>=size), (
"Bad size %d %d",copy_array.
size(),size) );
946 const T* copy_begin = copy_array.
data();
947 T* to_ptr = lhs.
data();
948 for(
Integer i=0; i<size; ++i )
949 to_ptr[i] -= copy_begin[i];
962template<
typename T>
inline void
966 ARCANE_ASSERT( (copy_array.
size()>=size), (
"Bad size %d %d",copy_array.
size(),size) );
967 const T* copy_begin = copy_array.
data();
968 T* to_ptr = lhs.
data();
969 for(
Integer i=0; i<size; ++i )
970 to_ptr[i] *= copy_begin[i];
983template<
typename T>
inline void
992template<
typename T>
inline void
1003template<
typename T>
inline void
1006 T* ptr = lhs.
data();
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 de réel de dimension 2.
Classe gérant une matrice de réel de dimension 2x2.
Real2 x
Première composante.
Real2 y
Deuxième composante.
Classe gérant un vecteur de réel de dimension 3.
__host__ __device__ Real normL2() const
Retourne la norme L2 du triplet .
Classe gérant une matrice de réel de dimension 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.
double toDouble(Real r)
Converti un Real en double.
Espace de nom pour les fonctions mathématiques.
__host__ __device__ double pow(double x, double y)
Fonction puissance.
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
Real relativeError2(Real a, Real b)
Retourne l'erreur relative entre deux scalaires a et b relativement à b.
__host__ __device__ double sqrt(double v)
Racine carrée de v.
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.
__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.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
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