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"
55 u.
y * v.
z - u.
z * v.
y,
56 u.
z * v.
x - u.
x * v.
z,
72 return Real(u.
x * v.
y - u.
y * v.
x);
84 return Real(u.
x * v.
y - u.
y * v.
x);
98 return (u.
x * v.
x + u.
y * v.
y );
115 return (u.
x * v.
x + u.
y * v.
y );
130 return (u.
x * v.
x + u.
y * v.
y + u.
z * v.
z);
147 return (u.
x * v.
x + u.
y * v.
y + u.
z * v.
z);
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 ))
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)));
377template<
class T>
inline T
380 return ( (
a<
b) ? ((
a<
c) ?
a : ((
b<
c) ?
b :
c)) : ((
b<
c) ?
b :
c) );
391template<
class T>
inline T
394 return ( (
a>
b) ? ((
a>
c) ?
a :
c) : ((
b>
c) ?
b :
c) );
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;
611 Integer size = array.size();
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)
642 return m.determinant();
667 Real3(0.0, 1.0, 0.0),
668 Real3(0.0, 0.0, 1.0));
680 Real3(
m.z.x *
m.y.z -
m.y.x *
m.z.z, -
m.z.x *
m.x.z +
m.x.x *
m.z.z,
m.y.x *
m.x.z -
m.x.x *
m.y.z),
681 Real3(-
m.z.x *
m.y.y +
m.y.x *
m.z.y,
m.z.x *
m.x.y -
m.x.x *
m.z.y, -
m.y.x *
m.x.y +
m.x.x *
m.y.y));
694 Real
d =
m.determinant();
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;
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;
812 m.y.x*v.
x +
m.y.y*v.
y +
m.y.z*v.
z,
813 m.z.x*v.
x +
m.z.y*v.
y +
m.z.z*v.
z
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);
845 if (
n.normL2() == 0) {
884template<
typename T>
inline void
887 Integer size =
lhs.size();
891 for( Integer i=0; i<size; ++i )
903template<
typename T>
inline void
906 Integer size =
lhs.size();
910 for( Integer i=0; i<size; ++i )
922template<
typename T>
inline void
925 Integer size =
lhs.size();
929 for( Integer i=0; i<size; ++i )
941template<
typename T>
inline void
944 Integer size =
lhs.size();
948 for( Integer i=0; i<size; ++i )
962template<
typename T>
inline void
965 Integer size =
lhs.size();
969 for( Integer i=0; i<size; ++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
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.
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__ 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
Référence à une instance.
__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