Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
MathUtils.h
Aller à la documentation de ce fichier.
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* MathUtils.h (C) 2000-2024 */
9/* */
10/* Fonctions mathématiques diverses. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_MATHUTILS_H
13#define ARCANE_CORE_MATHUTILS_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
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"
23
24#include "arcane/Algorithm.h"
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29namespace Arcane
30{
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
40namespace math
41{
42
43/*---------------------------------------------------------------------------*/
44/*---------------------------------------------------------------------------*/
51ARCCORE_HOST_DEVICE inline Real3
53{
54 return Real3(
55 u.y * v.z - u.z * v.y,
56 u.z * v.x - u.x * v.z,
57 u.x * v.y - u.y * v.x
58 );
59}
60
61/*---------------------------------------------------------------------------*/
62/*---------------------------------------------------------------------------*/
69ARCCORE_HOST_DEVICE inline Real
71{
72 return Real(u.x * v.y - u.y * v.x);
73}
74
75/*---------------------------------------------------------------------------*/
76/*---------------------------------------------------------------------------*/
81ARCCORE_HOST_DEVICE inline Real
83{
84 return Real(u.x * v.y - u.y * v.x);
85}
86
87/*---------------------------------------------------------------------------*/
88/*---------------------------------------------------------------------------*/
95ARCCORE_HOST_DEVICE inline Real
97{
98 return (u.x * v.x + u.y * v.y );
99}
100
101/*---------------------------------------------------------------------------*/
102/*---------------------------------------------------------------------------*/
112ARCCORE_HOST_DEVICE inline Real
114{
115 return (u.x * v.x + u.y * v.y );
116}
117
118/*---------------------------------------------------------------------------*/
119/*---------------------------------------------------------------------------*/
127ARCCORE_HOST_DEVICE inline Real
129{
130 return (u.x * v.x + u.y * v.y + u.z * v.z);
131}
132
133/*---------------------------------------------------------------------------*/
134/*---------------------------------------------------------------------------*/
144ARCCORE_HOST_DEVICE inline Real
146{
147 return (u.x * v.x + u.y * v.y + u.z * v.z);
148}
149
150/*---------------------------------------------------------------------------*/
151/*---------------------------------------------------------------------------*/
158ARCCORE_HOST_DEVICE inline Real
160{
161 return dot(u,vecMul(v,w));
162}
163
164/*---------------------------------------------------------------------------*/
165/*---------------------------------------------------------------------------*/
169ARCCORE_HOST_DEVICE inline Real
171{
172 return (
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 ))
176 );
177}
178
179/*---------------------------------------------------------------------------*/
180/*---------------------------------------------------------------------------*/
192inline Real3x3
194{
195 return Real3x3(u.x*v,u.y*v,u.z*v);
196}
197
198/*---------------------------------------------------------------------------*/
199/*---------------------------------------------------------------------------*/
206ARCCORE_HOST_DEVICE inline Real3
208{
209 return Real3(dot(t.x,v),dot(t.y,v),dot(t.z,v));
210}
211ARCCORE_HOST_DEVICE inline Real2
213{
214 return Real2(dot(t.x,v),dot(t.y,v));
215}
216
217/*---------------------------------------------------------------------------*/
218/*---------------------------------------------------------------------------*/
225ARCCORE_HOST_DEVICE inline Real3
227{
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)));
229}
230
231/*---------------------------------------------------------------------------*/
232/*---------------------------------------------------------------------------*/
237ARCCORE_HOST_DEVICE inline Real3x3
239{
240 return Real3x3::fromLines(t.x.x*v.x.x+t.x.y*v.y.x+t.x.z*v.z.x,
241 t.x.x*v.x.y+t.x.y*v.y.y+t.x.z*v.z.y,
242 t.x.x*v.x.z+t.x.y*v.y.z+t.x.z*v.z.z,
243 t.y.x*v.x.x+t.y.y*v.y.x+t.y.z*v.z.x,
244 t.y.x*v.x.y+t.y.y*v.y.y+t.y.z*v.z.y,
245 t.y.x*v.x.z+t.y.y*v.y.z+t.y.z*v.z.z,
246 t.z.x*v.x.x+t.z.y*v.y.x+t.z.z*v.z.x,
247 t.z.x*v.x.y+t.z.y*v.y.y+t.z.z*v.z.y,
248 t.z.x*v.x.z+t.z.y*v.y.z+t.z.z*v.z.z);
249}
250
251/*---------------------------------------------------------------------------*/
252/*---------------------------------------------------------------------------*/
257ARCCORE_HOST_DEVICE inline Real3x3
259{
260 return Real3x3(Real3(t.x.x, t.y.x, t.z.x),
261 Real3(t.x.y, t.y.y, t.z.y),
262 Real3(t.x.z, t.y.z, t.z.z));
263}
264
265/*---------------------------------------------------------------------------*/
266/*---------------------------------------------------------------------------*/
271ARCCORE_HOST_DEVICE inline Real3x3
273{
274 return Real3x3(Real3(t.x.x, t.y.x, t.z.x),
275 Real3(t.x.y, t.y.y, t.z.y),
276 Real3(t.x.z, t.y.z, t.z.z));
277}
278
279/*---------------------------------------------------------------------------*/
280/*---------------------------------------------------------------------------*/
287ARCCORE_HOST_DEVICE inline Real
289{
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;
293
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;
297
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;
301
302 return x1 + x2 + x3 + y1 + y2 + y3 + z1 + z2 + z3;
303}
304
305/*---------------------------------------------------------------------------*/
306/*---------------------------------------------------------------------------*/
313ARCCORE_HOST_DEVICE inline Real
315{
316 Real x1 = u.x.x * v.x.x;
317 Real x2 = u.x.y * v.x.y;
318
319 Real y1 = u.y.x * v.y.x;
320 Real y2 = u.y.y * v.y.y;
321
322 return x1+x2+y1+y2;
323}
324
325/*---------------------------------------------------------------------------*/
326/*---------------------------------------------------------------------------*/
327
328/*---------------------------------------------------------------------------*/
329/*---------------------------------------------------------------------------*/
330
335ARCCORE_HOST_DEVICE inline Real2
337{
338 return Real2( math::min(a.x,b.x), math::min(a.y,b.y) );
339}
344ARCCORE_HOST_DEVICE inline Real3
346{
347 return Real3( math::min(a.x,b.x), math::min(a.y,b.y), math::min(a.z,b.z) );
348}
353ARCCORE_HOST_DEVICE inline Real2x2
354min(const Real2x2& a,const Real2x2& b)
355{
356 return Real2x2( math::min(a.x,b.x), math::min(a.y,b.y) );
357}
362ARCCORE_HOST_DEVICE inline Real3x3
363min(const Real3x3& a,const Real3x3& b)
364{
365 return Real3x3( math::min(a.x,b.x), math::min(a.y,b.y), math::min(a.z,b.z) );
366}
367
368/*---------------------------------------------------------------------------*/
369/*---------------------------------------------------------------------------*/
377template<class T> inline T
378min(const T& a,const T& b,const T& c)
379{
380 return ( (a<b) ? ((a<c) ? a : ((b<c) ? b : c)) : ((b<c) ? b : c) );
381}
382
383/*---------------------------------------------------------------------------*/
384/*---------------------------------------------------------------------------*/
391template<class T> inline T
392max(const T& a,const T& b,const T& c)
393{
394 return ( (a>b) ? ((a>c) ? a : c) : ((b>c) ? b : c) );
395}
396
397/*---------------------------------------------------------------------------*/
398/*---------------------------------------------------------------------------*/
399
404ARCCORE_HOST_DEVICE inline Real2
406{
407 return Real2( math::max(a.x,b.x), math::max(a.y,b.y) );
408}
413ARCCORE_HOST_DEVICE inline Real3
415{
416 return Real3( math::max(a.x,b.x), math::max(a.y,b.y), math::max(a.z,b.z) );
417}
422ARCCORE_HOST_DEVICE inline Real2x2
423max(const Real2x2& a,const Real2x2& b)
424{
425 return Real2x2( math::max(a.x,b.x), math::max(a.y,b.y) );
426}
431ARCCORE_HOST_DEVICE inline Real3x3
432max(const Real3x3& a,const Real3x3& b)
433{
434 return Real3x3( math::max(a.x,b.x), math::max(a.y,b.y), math::max(a.z,b.z) );
435}
436
437/*---------------------------------------------------------------------------*/
438/*---------------------------------------------------------------------------*/
439
440/*---------------------------------------------------------------------------*/
441/*---------------------------------------------------------------------------*/
445ARCCORE_HOST_DEVICE inline Real
446min4Real(Real a,Real b,Real c,Real d)
447{
448 return min(min(a,b),min(c,d));
449}
450
451/*---------------------------------------------------------------------------*/
452/*---------------------------------------------------------------------------*/
456ARCCORE_HOST_DEVICE inline Real
457max4Real(Real a,Real b,Real c,Real d)
458{
459 return max(max(a,b),max(c,d));
460}
461
462/*---------------------------------------------------------------------------*/
463/*---------------------------------------------------------------------------*/
467ARCCORE_HOST_DEVICE inline Real
468min8Real(const Real a[8])
469{
470 return min( min4Real(a[0],a[1],a[2],a[3]), min4Real(a[4],a[5],a[6],a[7]) );
471}
472
473/*---------------------------------------------------------------------------*/
474/*---------------------------------------------------------------------------*/
478inline Real max8Real(const Real a[8])
479{
480 return max( max4Real(a[0],a[1],a[2],a[3]), max4Real(a[4],a[5],a[6],a[7]) );
481}
482
483/*---------------------------------------------------------------------------*/
484/*---------------------------------------------------------------------------*/
489ARCCORE_HOST_DEVICE inline Real
490minMod(Real a,Real b,Real c,Real d)
491{
492 Real zero = 0.;
493 return min4Real(max(a,zero),max(b,zero),max(c,zero),max(d,zero))
494 +max4Real(min(a,zero),min(b,zero),min(c,zero),min(d,zero));
495}
496/*---------------------------------------------------------------------------*/
497/*---------------------------------------------------------------------------*/
502ARCCORE_HOST_DEVICE inline Real
503minMod2(Real a,Real b)
504{
505 Real zero = 0.;
506 return min(max(a,zero),max(b,zero))+max(min(a,zero),min(b,zero));
507}
508
509/*---------------------------------------------------------------------------*/
510/*---------------------------------------------------------------------------*/
516ARCCORE_HOST_DEVICE inline Real
517maxMod2(Real a,Real b)
518{
519 Real zero = 0.;
520 return max(max(a,zero),max(b,zero))+min(min(a,zero),min(b,zero));
521}
522
523/*---------------------------------------------------------------------------*/
524/*---------------------------------------------------------------------------*/
532inline Real
533relativeError(Real a,Real b)
534{
535 Real sum = math::abs(a) + math::abs(b);
536 return (isZero(sum)) ? (a-b) : (a-b)/sum;
537}
538
539/*---------------------------------------------------------------------------*/
540/*---------------------------------------------------------------------------*/
548inline Real
550{
551 Real err = 0;
552 err = math::max(err,math::abs(relativeError(T1.x.x,T2.x.x)));
553 err = math::max(err,math::abs(relativeError(T1.x.y,T2.x.y)));
554 err = math::max(err,math::abs(relativeError(T1.x.z,T2.x.z)));
555 err = math::max(err,math::abs(relativeError(T1.y.x,T2.y.x)));
556 err = math::max(err,math::abs(relativeError(T1.y.y,T2.y.y)));
557 err = math::max(err,math::abs(relativeError(T1.y.z,T2.y.z)));
558 err = math::max(err,math::abs(relativeError(T1.z.x,T2.z.x)));
559 err = math::max(err,math::abs(relativeError(T1.z.y,T2.z.y)));
560 err = math::max(err,math::abs(relativeError(T1.z.z,T2.z.z)));
561
562 return (err);
563}
564
565/*---------------------------------------------------------------------------*/
566/*---------------------------------------------------------------------------*/
574inline Real
575relativeError2(Real a, Real b)
576{
577 Real sum = math::abs(b);
578 return (isZero(sum)) ? (a-b) : (a-b)/sum;
579}
580
581/*---------------------------------------------------------------------------*/
582/*---------------------------------------------------------------------------*/
590inline Real
591relativeError1(Real a, Real b)
592{
593 Real sum = math::abs(a);
594 return (isZero(sum)) ? (a-b) : (a-b)/sum;
595}
596
597/*---------------------------------------------------------------------------*/
598/*---------------------------------------------------------------------------*/
602inline bool
604 Real& ymin,Real& ymax,bool need_init)
605{
606 if (need_init){
607 xmin = ymin = 0.;
608 xmax = ymax = 1.;
609 }
610
611 Integer size = array.size();
612 if (size==0)
613 return false;
614
615 if (need_init){
616 xmin = xmax = array[0].x;
617 ymin = ymax = array[0].y;
618 }
619
620 for( Integer i=1; i<size; ++i ){
621 if (array[i].x < xmin)
622 xmin = array[i].x;
623 if (array[i].x > xmax)
624 xmax = array[i].x;
625
626 if (array[i].y < ymin)
627 ymin = array[i].y;
628 if (array[i].y > ymax)
629 ymax = array[i].y;
630 }
631 return true;
632}
633
634/*---------------------------------------------------------------------------*/
635/*---------------------------------------------------------------------------*/
639ARCCORE_HOST_DEVICE inline Real
641{
642 return m.determinant();
643}
644
645/*---------------------------------------------------------------------------*/
646/*---------------------------------------------------------------------------*/
652inline Real
654{
655 Real norme = math::sqrt((v1.x)*(v1.x) + (v1.y)*(v1.y) + (v1.z)*(v1.z));
656 return norme;
657}
658/*---------------------------------------------------------------------------*/
659/*---------------------------------------------------------------------------*/
663ARCCORE_HOST_DEVICE inline Real3x3
665{
666 return Real3x3(Real3(1.0, 0.0, 0.0),
667 Real3(0.0, 1.0, 0.0),
668 Real3(0.0, 0.0, 1.0));
669}
670
671/*---------------------------------------------------------------------------*/
672/*---------------------------------------------------------------------------*/
676ARCCORE_HOST_DEVICE inline Real3x3
677inverseMatrix(const Real3x3& m,Real d)
678{
679 Real3x3 inv(Real3( m.y.y * m.z.z - m.y.z * m.z.y, -m.x.y * m.z.z + m.x.z * m.z.y, m.x.y * m.y.z - m.x.z * m.y.y),
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));
682 inv /= d;
683 return inv;
684}
685
686/*---------------------------------------------------------------------------*/
687/*---------------------------------------------------------------------------*/
691ARCCORE_HOST_DEVICE inline Real3x3
693{
694 Real d = m.determinant();
695 return inverseMatrix(m,d);
696}
697
698/*---------------------------------------------------------------------------*/
699/*---------------------------------------------------------------------------*/
705inline Real3
707{
708 Real3 v;
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;
712
713 return v;
714}
715
716/*---------------------------------------------------------------------------*/
717/*---------------------------------------------------------------------------*/
722ARCCORE_HOST_DEVICE inline Real3
724{
725 Real3 v;
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;
729
730 return v;
731}
732
733/*---------------------------------------------------------------------------*/
734/*---------------------------------------------------------------------------*/
740ARCCORE_HOST_DEVICE inline Real3
742{
743 Real norme = math::sqrt(v.x*v.x + v.y*v.y + v.z*v.z);
744
745 return Real3(v.x/norme, v.y/norme, v.z/norme);
746}
747
748/*---------------------------------------------------------------------------*/
749/*---------------------------------------------------------------------------*/
754inline Real3
756{
757 return normalizeReal3(cross(v1,v2));
758}
759
760/*---------------------------------------------------------------------------*/
761/*---------------------------------------------------------------------------*/
769inline Real3x3
771{
772 return Real3x3::fromColumns(m.x.x, m.x.y, m.x.z,
773 m.y.x, m.y.y, m.y.z,
774 m.z.x, m.z.y, m.z.z
775 );
776}
777
778/*---------------------------------------------------------------------------*/
779/*---------------------------------------------------------------------------*/
787inline Real3x3
789{
790 return Real3x3::fromColumns(
791 m1.x.x*m2.x.x + m1.y.x*m2.x.y + m1.z.x*m2.x.z,
792 m1.x.y*m2.x.x + m1.y.y*m2.x.y + m1.z.y*m2.x.z,
793 m1.x.z*m2.x.x + m1.y.z*m2.x.y + m1.z.z*m2.x.z,
794 m1.x.x*m2.y.x + m1.y.x*m2.y.y + m1.z.x*m2.y.z,
795 m1.x.y*m2.y.x + m1.y.y*m2.y.y + m1.z.y*m2.y.z,
796 m1.x.z*m2.y.x + m1.y.z*m2.y.y + m1.z.z*m2.y.z,
797 m1.x.x*m2.z.x + m1.y.x*m2.z.y + m1.z.x*m2.z.z,
798 m1.x.y*m2.z.x + m1.y.y*m2.z.y + m1.z.y*m2.z.z,
799 m1.x.z*m2.z.x + m1.y.z*m2.z.y + m1.z.z*m2.z.z
800 );
801}
802
803/*---------------------------------------------------------------------------*/
804/*---------------------------------------------------------------------------*/
808ARCCORE_HOST_DEVICE inline Real3
810{
811 return Real3( m.x.x*v.x + m.x.y*v.y + m.x.z*v.z,
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
814 );
815}
816/*---------------------------------------------------------------------------*/
817/*---------------------------------------------------------------------------*/
821inline bool
822isNearlyId(Real3x3 m, Real epsilon = 1.e-10)
823{
824 static Real3x3 id = Real3x3(Real3(1., 0., 0.), Real3(0., 1., 0.), Real3(0., 0., 1.));
825 // static Real epsilon = 1.e-10;
826
827 Real3x3 m0 = m - id;
828
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);
832}
833
834/*---------------------------------------------------------------------------*/
835/*---------------------------------------------------------------------------*/
840inline Real3
842{
844#ifdef ARCANE_CHECK
845 if (n.normL2() == 0) {
846 arcaneMathError(Convert::toDouble(n.normL2()), "planarSymetric");
847 }
848#endif
849 Real3 norm = n / n.normL2();
850 u_tilde = u - 2.0 * dot(norm, u) * norm;
851 return u_tilde;
852}
853
854/*---------------------------------------------------------------------------*/
855/*---------------------------------------------------------------------------*/
860inline Real3
862{
864#ifdef ARCANE_CHECK
865 if (a.normL2()==0){
866 arcaneMathError(Convert::toDouble(a.normL2()),"axisSymetric");
867 }
868#endif
869 Real3 norm = a / a.normL2();
870 u_tilde = 2.0 * dot(u,norm) * norm - u;
871 return u_tilde;
872}
873
874/*---------------------------------------------------------------------------*/
875/*---------------------------------------------------------------------------*/
884template<typename T> inline void
886{
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];
893}
894
903template<typename T> inline void
905{
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];
912}
913
922template<typename T> inline void
924{
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];
931}
932
941template<typename T> inline void
943{
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];
950}
951
962template<typename T> inline void
964{
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];
971}
972
983template<typename T> inline void
988
992template<typename T> inline void
994{
995 T* ptr = lhs.data();
996 for( Integer i=0, size=lhs.size(); i<size; ++i )
997 ptr[i] *= o;
998}
999
1003template<typename T> inline void
1005{
1006 T* ptr = lhs.data();
1007 for( Integer i=0, size=lhs.size(); i<size; ++i )
1008 ptr[i] = math::pow(ptr[i],o);
1009}
1010
1011} // namespace math
1012
1013/*---------------------------------------------------------------------------*/
1014/*---------------------------------------------------------------------------*/
1015
1016} // End namespace Arcane
1017
1018/*---------------------------------------------------------------------------*/
1019/*---------------------------------------------------------------------------*/
1020
1021#endif
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Classe gérant un vecteur de réel de dimension 2.
Definition Real2.h:121
Classe gérant une matrice de réel de dimension 2x2.
Definition Real2x2.h:53
Real2 x
Première composante.
Definition Real2x2.h:98
Real2 y
Deuxième composante.
Definition Real2x2.h:99
Classe gérant un vecteur de réel de dimension 3.
Definition Real3.h:132
ARCCORE_HOST_DEVICE Real normL2() const
Retourne la norme L2 du triplet .
Definition Real3.h:232
Classe gérant une matrice de réel de dimension 3x3.
Definition Real3x3.h:66
Real3 z
premier élément du triplet
Definition Real3x3.h:119
constexpr ARCCORE_HOST_DEVICE Real determinant() const
Déterminant de la matrice.
Definition Real3x3.h:344
Real3 y
premier élément du triplet
Definition Real3x3.h:118
constexpr static ARCCORE_HOST_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)).
Definition Real3x3.h:133
Real3 x
premier élément du triplet
Definition Real3x3.h:117
constexpr static ARCCORE_HOST_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)).
Definition Real3x3.h:139
ARCCORE_HOST_DEVICE Real3 normalizeReal3(Real3 v)
Normalisation d'un Real3.
Definition MathUtils.h:741
ARCCORE_HOST_DEVICE Real maxMod2(Real a, Real b)
retourne le Max mod de deux Reals
Definition MathUtils.h:517
T max(const T &a, const T &b, const T &c)
Retourne le maximum de trois éléments.
Definition MathUtils.h:392
ARCCORE_HOST_DEVICE Real2 min(Real2 a, Real2 b)
Retourne le minimum de deux Real2.
Definition MathUtils.h:336
Real3 normalizedCrossProduct3(Real3 v1, Real3 v2)
Produit vectoriel normalisé.
Definition MathUtils.h:755
ARCCORE_HOST_DEVICE Real3 prodTensVec(Real3x3 t, Real3 v)
Produit matrice vecteur entre un tenseur et un vecteur.
Definition MathUtils.h:207
ARCCORE_HOST_DEVICE Real3x3 matrixProduct(const Real3x3 &t, const Real3x3 &v)
Produit matrice matrice entre deux tenseurs.
Definition MathUtils.h:238
ARCCORE_HOST_DEVICE Real scaMul(Real2 u, Real2 v)
Produit scalaire de u par v dans .
Definition MathUtils.h:113
ARCCORE_HOST_DEVICE Real3 vecMul(Real3 u, Real3 v)
Produit vectoriel de u par v. dans .
Definition MathUtils.h:52
ARCCORE_HOST_DEVICE Real3 cross(Real3 v1, Real3 v2)
Produit vectoriel de deux vecteurs à 3 composantes.
Definition MathUtils.h:723
ARCCORE_HOST_DEVICE Real3x3 matrixTranspose(const Real3x3 &t)
Transpose la matrice.
Definition MathUtils.h:272
Real3x3 prodTens(Real3 u, Real3 v)
Produit tensoriel de deux vecteurs Real3.
Definition MathUtils.h:193
ARCCORE_HOST_DEVICE Real dot(Real2 u, Real2 v)
Produit scalaire de u par v dans .
Definition MathUtils.h:96
ARCCORE_HOST_DEVICE Real3 prodVecTens(Real3 v, Real3x3 t)
Produit transposé(vecteur) matrice entre la transposée d'un vecteur et une matrice.
Definition MathUtils.h:226
ARCCORE_HOST_DEVICE Real minMod(Real a, Real b, Real c, Real d)
retourne le Min mod de quatre Real
Definition MathUtils.h:490
ARCCORE_HOST_DEVICE Real cross2D(Real3 u, Real3 v)
Produit vectoriel de u par v dans .
Definition MathUtils.h:82
Real3x3 matrix3x3Transp(Real3x3 m)
Definition MathUtils.h:770
Real3 planarSymmetric(Real3 u, Real3 n)
Symétrie d'un vecteur u par rapport à un plan de normale n.
Definition MathUtils.h:841
Real3 axisSymmetric(Real3 u, Real3 a)
Symétrie d'un vecteur u par rapport à un axe de vecteur directeur a .
Definition MathUtils.h:861
ARCCORE_HOST_DEVICE Real vecMul2D(Real3 u, Real3 v)
Produit vectoriel de u par v dans .
Definition MathUtils.h:70
ARCCORE_HOST_DEVICE Real mixteMul(Real3 u, Real3 v, Real3 w)
Produit mixte de u, v et w.
Definition MathUtils.h:159
ARCCORE_HOST_DEVICE Real minMod2(Real a, Real b)
retourne le Min mod de deux Reals
Definition MathUtils.h:503
double toDouble(Real r)
Converti un Real en double.
Definition Convert.h:40
ARCCORE_HOST_DEVICE Real matrixDeterminant(Real3x3 m)
Calcul du déterminant d'une matrice 3x3.
Definition MathUtils.h:640
Real relativeError(Real a, Real b)
Retourne l'erreur relative entre deux scalaires a et b.
Definition MathUtils.h:533
Real relativeError2(Real a, Real b)
Retourne l'erreur relative entre deux scalaires a et b relativement à b.
Definition MathUtils.h:575
ARCCORE_HOST_DEVICE Real min4Real(Real a, Real b, Real c, Real d)
retourne le min de quatre Real
Definition MathUtils.h:446
ARCCORE_HOST_DEVICE Real min8Real(const Real a[8])
retourne le min de huit Real
Definition MathUtils.h:468
void power(ArrayView< T > lhs, T o)
Met à la puissance o tous les éléments du tableau.
Definition MathUtils.h:1004
Real normeR3(Real3 v1)
Norme d'un vecteur.
Definition MathUtils.h:653
ARCCORE_HOST_DEVICE Real3x3 inverseMatrix(const Real3x3 &m, Real d)
Calcul de l'inverse d'une matrice m en supposant connu son déterminant d.
Definition MathUtils.h:677
Real relativeError1(Real a, Real b)
Retourne l'erreur relative entre deux scalaires a et b relativement à a.
Definition MathUtils.h:591
bool isNearlyId(Real3x3 m, Real epsilon=1.e-10)
Vérifie qu'une matrice vaut bien la matrice identité.
Definition MathUtils.h:822
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).
Definition MathUtils.h:603
bool isZero(const BuiltInProxy< _Type > &a)
Teste si une valeur est exactement égale à zéro.
ARCCORE_HOST_DEVICE Real matDet(Real3 u, Real3 v, Real3 w)
Déterminant de la matrice u,v,w.
Definition MathUtils.h:170
ARCCORE_HOST_DEVICE Real max4Real(Real a, Real b, Real c, Real d)
retourne le max de quatre Real
Definition MathUtils.h:457
ARCCORE_HOST_DEVICE Real3 multiply(const Real3x3 &m, Real3 v)
Produit matrice 3x3 . vecteur.
Definition MathUtils.h:809
Real max8Real(const Real a[8])
retourne le max de huit Real
Definition MathUtils.h:478
ARCCORE_HOST_DEVICE double pow(double x, double y)
Fonction puissance.
Definition Math.h:166
ARCCORE_HOST_DEVICE Real3x3 transpose(const Real3x3 &t)
Transpose la matrice.
Definition MathUtils.h:258
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.
Definition MathUtils.h:963
Real3 crossProduct3(Real3 v1, Real3 v2)
Produit vectoriel de deux vecteurs à 3 composantes.
Definition MathUtils.h:706
Real3x3 matrix3x3Prod(Real3x3 m1, Real3x3 m2)
Multiplication de 2 matrices 3x3.
Definition MathUtils.h:788
ARCCORE_HOST_DEVICE double sqrt(double v)
Racine carrée de v.
Definition Math.h:135
ARCCORE_HOST_DEVICE Real3x3 matrix3x3Id()
Matrice identite.
Definition MathUtils.h:664
ARCCORE_HOST_DEVICE Real doubleContraction(const Real3x3 &u, const Real3x3 &v)
Definition MathUtils.h:288
void sub(ArrayView< T > lhs, ConstArrayView< T > copy_array)
Soustrait le tableau copy_array de l'instance.
Definition MathUtils.h:923
void add(ArrayView< T > lhs, ConstArrayView< T > copy_array)
Ajoute le tableau copy_array dans l'instance.
Definition MathUtils.h:885
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
ARCCORE_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
Definition Real2.h:35
Real x
première composante du couple
Definition Real2.h:34
Real y
deuxième composante du triplet
Definition Real3.h:36
Real z
troisième composante du triplet
Definition Real3.h:37
Real x
première composante du triplet
Definition Real3.h:35