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
72 return Real(u.
x * v.
y - u.
y * v.
x);
81ARCCORE_HOST_DEVICE
inline Real
84 return Real(u.
x * v.
y - u.
y * v.
x);
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
290 Real x1 = u.
x.
x * v.
x.
x;
291 Real x2 = u.
x.
y * v.
x.
y;
292 Real x3 = u.
x.
z * v.
x.
z;
294 Real y1 = u.
y.
x * v.
y.
x;
295 Real y2 = u.
y.
y * v.
y.
y;
296 Real y3 = u.
y.
z * v.
y.
z;
298 Real z1 = u.
z.
x * v.
z.
x;
299 Real z2 = u.
z.
y * v.
z.
y;
300 Real z3 = u.
z.
z * v.
z.
z;
302 return x1 + x2 + x3 + y1 + y2 + y3 + z1 + z2 + z3;
313ARCCORE_HOST_DEVICE
inline Real
316 Real x1 = u.
x.
x * v.
x.
x;
317 Real x2 = u.
x.
y * v.
x.
y;
319 Real y1 = u.
y.
x * v.
y.
x;
320 Real y2 = u.
y.
y * v.
y.
y;
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)
611 Integer size = array.
size();
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
887 Integer size = lhs.
size();
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
906 Integer size = lhs.
size();
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
925 Integer size = lhs.
size();
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
944 Integer size = lhs.
size();
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
965 Integer size = lhs.
size();
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
996 for( Integer i=0, size=lhs.
size(); i<size; ++i )
1003template<
typename T>
inline void
1006 T* ptr = lhs.
data();
1007 for( Integer i=0, size=lhs.
size(); i<size; ++i )
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
Vue modifiable d'un tableau d'un type T.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
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.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
constexpr const_pointer data() const noexcept
Pointeur sur la mémoire allouée.
__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.
__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.
__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 -*-
__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