Arcane  v3.14.10.0
Documentation utilisateur
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/*---------------------------------------------------------------------------*/
34/*!
35 \brief Espace de nom pour les fonctions mathématiques.
36
37 Cet espace de nom contient toutes les fonctions mathématiques utilisées
38 par le code.
39*/
40namespace math
41{
42
43/*---------------------------------------------------------------------------*/
44/*---------------------------------------------------------------------------*/
45/*!
46 * \ingroup GroupMathUtils
47 * \brief Produit vectoriel de \a u par \a v. dans \f$R^3\f$.
48 *
49 * \deprecated Utiliser cross() à la place.
50 */
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/*---------------------------------------------------------------------------*/
63/*!
64 * \ingroup GroupMathUtils
65 * \brief Produit vectoriel de \a u par \a v dans \f$R^2\f$.
66 *
67 * \deprecated Utiliser cross2D() à la place.
68 */
69ARCCORE_HOST_DEVICE inline Real
71{
72 return Real(u.x * v.y - u.y * v.x);
73}
74
75/*---------------------------------------------------------------------------*/
76/*---------------------------------------------------------------------------*/
77/*!
78 * \ingroup GroupMathUtils
79 * \brief Produit vectoriel de \a u par \a v dans \f$R^2\f$.
80 */
81ARCCORE_HOST_DEVICE inline Real
83{
84 return Real(u.x * v.y - u.y * v.x);
85}
86
87/*---------------------------------------------------------------------------*/
88/*---------------------------------------------------------------------------*/
89/*!
90 * \ingroup GroupMathUtils
91 * \brief Produit scalaire de \a u par \a v dans \f$R^2\f$.
92 *
93 * Il s'agit de: \f$u{\cdot}v\f$
94 */
95ARCCORE_HOST_DEVICE inline Real
97{
98 return (u.x * v.x + u.y * v.y );
99}
100
101/*---------------------------------------------------------------------------*/
102/*---------------------------------------------------------------------------*/
103/*!
104 * \brief Produit scalaire de \a u par \a v dans \f$R^2\f$
105 *
106 * \ingroup GroupMathUtils
107 *
108 * Il s'agit de: \f$u{\cdot}v\f$.
109 *
110 * \deprecated Utiliser dot(Real2,Real2) à la place
111 */
112ARCCORE_HOST_DEVICE inline Real
114{
115 return (u.x * v.x + u.y * v.y );
116}
117
118/*---------------------------------------------------------------------------*/
119/*---------------------------------------------------------------------------*/
120/*!
121 * \brief Produit scalaire de \a u par \a v
122 *
123 * \ingroup GroupMathUtils
124 *
125 * Il s'agit de: \f$u{\cdot}v\f$.
126 */
127ARCCORE_HOST_DEVICE inline Real
129{
130 return (u.x * v.x + u.y * v.y + u.z * v.z);
131}
132
133/*---------------------------------------------------------------------------*/
134/*---------------------------------------------------------------------------*/
135/*!
136 * \brief Produit scalaire de \a u par \a v
137 *
138 * \ingroup GroupMathUtils
139 *
140 * Il s'agit de: \f$u{\cdot}v\f$
141 *
142 * \deprecated Utiliser dot(Real2,Real2) à la place
143 */
144ARCCORE_HOST_DEVICE inline Real
146{
147 return (u.x * v.x + u.y * v.y + u.z * v.z);
148}
149
150/*---------------------------------------------------------------------------*/
151/*---------------------------------------------------------------------------*/
152/*!
153 * \brief Produit mixte de \a u, \a v et \a w
154 *
155 * \ingroup GroupMathUtils
156 *
157 */
158ARCCORE_HOST_DEVICE inline Real
160{
161 return dot(u,vecMul(v,w));
162}
163
164/*---------------------------------------------------------------------------*/
165/*---------------------------------------------------------------------------*/
166/*!
167 * \brief Déterminant de la matrice u,v,w
168 */
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/*---------------------------------------------------------------------------*/
181/*!
182 * \ingroup GroupMathUtils
183 * \brief Produit tensoriel de deux vecteurs Real3.
184
185 Il s'agit de \f$\vec{u}=~^t(u_{x},u_{y},u_{z})\f$ et \f$\vec{v}=~^t(v_{x},v_{y},v_{z})\f$
186 et est noté \f$\vec{u} \otimes \vec{v}\f$, et est donné par~:
187
188 * Ux*Vx Ux*Vy Ux*Vz
189 *U \otimes V = Uy*Vx Uy*Vy Uy*Vz
190 * Uz*Vx Uz*Vy Uz*Vz
191 */
192inline Real3x3
194{
195 return Real3x3(u.x*v,u.y*v,u.z*v);
196}
197
198/*---------------------------------------------------------------------------*/
199/*---------------------------------------------------------------------------*/
200/*!
201 * \brief Produit matrice vecteur entre un tenseur et un vecteur.
202 *
203 * \ingroup GroupMathUtils
204 *
205 */
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/*---------------------------------------------------------------------------*/
219/*!
220 * \ingroup GroupMathUtils
221 * \brief Produit transposé(vecteur) matrice entre la transposée d'un vecteur et une matrice.
222 *
223 * Retourne le vecteur transposé du résultat.
224 */
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/*---------------------------------------------------------------------------*/
233/*!
234 * \ingroup GroupMathUtils
235 * \brief Produit matrice matrice entre deux tenseurs.
236 */
237ARCCORE_HOST_DEVICE inline Real3x3
238matrixProduct(const Real3x3& t,const Real3x3& v)
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/*---------------------------------------------------------------------------*/
253/*!
254 * \brief Transpose la matrice.
255 * \deprecated Utiliser matrixTranspose() à la place.
256 */
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/*---------------------------------------------------------------------------*/
267/*!
268 * \ingroup GroupMathUtils
269 * \brief Transpose la matrice.
270 */
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/*---------------------------------------------------------------------------*/
281/*!
282 * \ingroup GroupMathUtils
283 * \brief Produit doublement contracté de deux tenseurs.
284 *
285 * U:V = sum_{i,j \in \{x,y,z \}} U_{i,j}V_{i,j}
286 */
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/*---------------------------------------------------------------------------*/
307/*!
308 * \ingroup GroupMathUtils
309 * \brief Produit doublement contracté de deux tenseurs.
310 *
311 * U:V = sum_{i,j \in \{x,y,z \}} U_{i,j}V_{i,j}
312 */
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
331/*!
332 * \brief Retourne le minimum de deux Real2
333 * \ingroup GroupMathUtils
334 */
335ARCCORE_HOST_DEVICE inline Real2
337{
338 return Real2( math::min(a.x,b.x), math::min(a.y,b.y) );
339}
340/*!
341 * \brief Retourne le minimum de deux Real3
342 * \ingroup GroupMathUtils
343 */
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}
349/*!
350 * \brief Retourne le minimum de deux Real2x2
351 * \ingroup GroupMathUtils
352 */
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}
358/*!
359 * \brief Retourne le minimum de deux Real3x3
360 * \ingroup GroupMathUtils
361 */
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/*---------------------------------------------------------------------------*/
370/*!
371 * \brief Retourne le minimum de trois éléments.
372 *
373 * \ingroup GroupMathUtils
374 *
375 * Utilise l'opérateur < pour déterminer le minimum.
376 */
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/*---------------------------------------------------------------------------*/
385/*!\brief Retourne le maximum de trois éléments.
386 *
387 * \ingroup GroupMathUtils
388 *
389 * Utilise l'opérateur > pour déterminer le maximum.
390 */
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
400/*!
401 * \brief Retourne le maximum de deux Real2
402 * \ingroup GroupMathUtils
403 */
404ARCCORE_HOST_DEVICE inline Real2
406{
407 return Real2( math::max(a.x,b.x), math::max(a.y,b.y) );
408}
409/*!
410 * \brief Retourne le maximum de deux Real3
411 * \ingroup GroupMathUtils
412 */
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}
418/*!
419 * \brief Retourne le maximum de deux Real2x2
420 * \ingroup GroupMathUtils
421 */
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}
427/*!
428 * \brief Retourne le maximum de deux Real3x3
429 * \ingroup GroupMathUtils
430 */
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/*---------------------------------------------------------------------------*/
442/*!
443 * \brief retourne le min de quatre Real
444 */
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/*---------------------------------------------------------------------------*/
453/*!
454 * \brief retourne le max de quatre Real
455 */
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/*---------------------------------------------------------------------------*/
464/*!
465 * \brief retourne le min de huit <tt>Real</tt>
466 */
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/*---------------------------------------------------------------------------*/
475/*!
476 * \brief retourne le max de huit <tt>Real</tt>
477 */
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/*---------------------------------------------------------------------------*/
485/*!
486 * \ingroup GroupMathUtils
487 * \brief retourne le Min mod de quatre Real
488 */
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/*---------------------------------------------------------------------------*/
498/*!
499 * \ingroup GroupMathUtils
500 * \brief retourne le Min mod de deux Reals
501 */
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/*---------------------------------------------------------------------------*/
511/*!
512 * \ingroup GroupMathUtils
513 * \brief retourne le Max mod de deux Reals
514 *
515 */
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/*---------------------------------------------------------------------------*/
525/*!
526 * \brief Retourne l'erreur relative entre deux scalaires \a a et \a b.
527 *
528 * L'erreur relative est calculée par :
529 *
530 * \f$\frac{a-b}{|a|+|b|}\f$
531 */
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/*---------------------------------------------------------------------------*/
541/*!
542 * \brief Retourne l'erreur relative entre deux tenseurs \a T1 et \a T2.
543 *
544 * L'erreur relative est calculée comme le max des erreurs relatives
545 * sur chacune des composantes des tenseurs.
546 *
547 */
548inline Real
549relativeError(const Real3x3& T1,const Real3x3& T2)
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/*---------------------------------------------------------------------------*/
567/*!
568 * \brief Retourne l'erreur relative entre deux scalaires \a a et \a b relativement à \a b
569 *
570 * L'erreur relative est calculée par :
571 *
572 * \f$\frac{a-b}{(|b|)}\f$
573 */
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/*---------------------------------------------------------------------------*/
583/*!
584 * \brief Retourne l'erreur relative entre deux scalaires \a a et \a b relativement à \a a
585 *
586 * L'erreur relative est calculée par :
587 *
588 * \f$\frac{a-b}{(|b|)}\f$
589 */
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/*---------------------------------------------------------------------------*/
599/*!
600 * \brief Recherche les valeurs extrèmes d'un tableau de couple (x,y).
601 */
602inline bool
603searchExtrema(ConstArrayView<Real2> array,Real& xmin,Real& xmax,
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/*---------------------------------------------------------------------------*/
636/*!
637 * \brief Calcul du déterminant d'une matrice 3x3.
638 */
639ARCCORE_HOST_DEVICE inline Real
641{
642 return m.determinant();
643}
644
645/*---------------------------------------------------------------------------*/
646/*---------------------------------------------------------------------------*/
647/*!
648 * \brief Norme d'un vecteur
649 *
650 * \deprecated Utiliser Real3.abs() à la place.
651 */
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/*---------------------------------------------------------------------------*/
660/*!
661 * \brief Matrice identite.
662 */
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/*---------------------------------------------------------------------------*/
673/*!
674 * \brief Calcul de l'inverse d'une matrice \a m en supposant connu son déterminant \a d
675 */
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/*---------------------------------------------------------------------------*/
688/*!
689 * \brief Calcul de l'inverse d'une matrice \a m.
690 */
691ARCCORE_HOST_DEVICE inline Real3x3
693{
694 Real d = m.determinant();
695 return inverseMatrix(m,d);
696}
697
698/*---------------------------------------------------------------------------*/
699/*---------------------------------------------------------------------------*/
700/*!
701 * \brief Produit vectoriel de deux vecteurs à 3 composantes.
702 *
703 * \deprecated Utiliser cross() à la place.
704 */
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/*---------------------------------------------------------------------------*/
718/*!
719 * \ingroup GroupMathUtils
720 * \brief Produit vectoriel de deux vecteurs à 3 composantes.
721 */
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/*---------------------------------------------------------------------------*/
735/*!
736 * \ingroup GroupMathUtils
737 * \brief Normalisation d'un Real3.
738 * \pre la norme de \a v ne doit pas être nulle.
739 */
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/*---------------------------------------------------------------------------*/
750/*!
751 * \ingroup GroupMathUtils
752 * \brief Produit vectoriel normalisé.
753 */
754inline Real3
756{
757 return normalizeReal3(cross(v1,v2));
758}
759
760/*---------------------------------------------------------------------------*/
761/*---------------------------------------------------------------------------*/
762/*!
763 * \ingroup GroupMathUtils
764 *
765 * \warning Cette méthode n'utilise pas la convention habituelle des Real3x3.
766 * Elle suppose qu'ils sont rangés en colonne. En général, il faut utiliser
767 * matrixTanspose() à la place.
768 */
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/*---------------------------------------------------------------------------*/
780/*!
781 * \brief Multiplication de 2 matrices 3x3.
782 *
783 * \warning Cette méthode n'utilise pas la convention habituelle des Real3x3.
784 * Elle suppose qu'ils sont rangés en colonne. En général, il faut utiliser
785 * matrixProduct() à la place.
786 */
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/*---------------------------------------------------------------------------*/
805/*!
806 * \brief Produit matrice 3x3 . vecteur
807 */
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/*---------------------------------------------------------------------------*/
818/*!
819 * \brief Vérifie qu'une matrice vaut bien la matrice identité.
820 */
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/*---------------------------------------------------------------------------*/
836/*!
837 * \ingroup GroupMathUtils
838 * \brief Symétrie d'un vecteur \a u par rapport à un plan de normale \a n.
839 */
840inline Real3
842{
843 Real3 u_tilde;
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/*---------------------------------------------------------------------------*/
856/*!
857 * \ingroup GroupMathUtils
858 * \brief Symétrie d'un vecteur u par rapport à un axe de vecteur directeur a .
859 */
860inline Real3
862{
863 Real3 u_tilde;
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/*---------------------------------------------------------------------------*/
876/*!
877 * \brief Ajoute le tableau \a copy_array dans l'instance.
878 *
879 * Comme aucune allocation mémoire n'est effectuée, le
880 * nombre d'éléments de \a copy_array doit être inférieur ou égal au
881 * nombre d'éléments courant. S'il est inférieur, les éléments du
882 * tableau courant situés à la fin du tableau sont inchangés
883 */
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
895/*!
896 * \brief Ajoute le tableau \a copy_array dans l'instance.
897 *
898 * Comme aucune allocation mémoire n'est effectuée, le
899 * nombre d'éléments de \a copy_array doit être inférieur ou égal au
900 * nombre d'éléments courant. S'il est inférieur, les éléments du
901 * tableau courant situés à la fin du tableau sont inchangés
902 */
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
914/*!
915 * \brief Soustrait le tableau \a copy_array de l'instance.
916 *
917 * Comme aucune allocation mémoire n'est effectuée, le
918 * nombre d'éléments de \a copy_array doit être inférieur ou égal au
919 * nombre d'éléments courant. S'il est inférieur, les éléments du
920 * tableau courant situés à la fin du tableau sont inchangés
921 */
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
933/*!
934 * \brief Soustrait le tableau \a copy_array de l'instance.
935 *
936 * Comme aucune allocation mémoire n'est effectuée, le
937 * nombre d'éléments de \a copy_array doit être inférieur ou égal au
938 * nombre d'éléments courant. S'il est inférieur, les éléments du
939 * tableau courant situés à la fin du tableau sont inchangés
940 */
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
952/*!
953 * \brief Multiplie terme à terme les éléments de l'instance par les
954 * éléments du tableau \a copy_array.
955 *
956 * Comme aucune allocation
957 * mémoire n'est effectuée, le nombre d'éléments de \a copy_array
958 * doit être inférieur ou égal au nombre d'éléments courant. S'il
959 * est inférieur, les éléments du tableau courant situés à la fin du
960 * tableau sont inchangés
961 */
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
973/*!
974 * \brief Multiplie terme à terme les éléments de l'instance par les
975 * éléments du tableau \a copy_array.
976 *
977 * Comme aucune allocation
978 * mémoire n'est effectuée, le nombre d'éléments de \a copy_array
979 * doit être inférieur ou égal au nombre d'éléments courant. S'il
980 * est inférieur, les éléments du tableau courant situés à la fin du
981 * tableau sont inchangés
982 */
983template<typename T> inline void
985{
986 math::mult(lhs,copy_array.constView());
987}
988
989/*!
990 * \brief Multiplie tous les éléments du tableau par le réel \a o.
991 */
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
1000/*!
1001 * \brief Met à la puissance \a o tous les éléments du tableau.
1002 */
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
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
__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 __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)).
Definition Real3x3.h:139
Real3 y
premier élément du triplet
Definition Real3x3.h:118
constexpr __host__ __device__ Real determinant() const
Déterminant de la matrice.
Definition Real3x3.h:344
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)).
Definition Real3x3.h:133
Real3 x
premier élément du triplet
Definition Real3x3.h:117
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 .
Definition MathUtils.h:70
__host__ __device__ Real dot(Real2 u, Real2 v)
Produit scalaire de u par v dans .
Definition MathUtils.h:96
__host__ __device__ Real2 min(Real2 a, Real2 b)
Retourne le minimum de deux Real2.
Definition MathUtils.h:336
T max(const T &a, const T &b, const T &c)
Retourne le maximum de trois éléments.
Definition MathUtils.h:392
__host__ __device__ Real3 vecMul(Real3 u, Real3 v)
Produit vectoriel de u par v. dans .
Definition MathUtils.h:52
Real3 normalizedCrossProduct3(Real3 v1, Real3 v2)
Produit vectoriel normalisé.
Definition MathUtils.h:755
__host__ __device__ Real minMod(Real a, Real b, Real c, Real d)
retourne le Min mod de quatre Real
Definition MathUtils.h:490
__host__ __device__ Real minMod2(Real a, Real b)
retourne le Min mod de deux Reals
Definition MathUtils.h:503
__host__ __device__ Real cross2D(Real3 u, Real3 v)
Produit vectoriel de u par v dans .
Definition MathUtils.h:82
__host__ __device__ Real scaMul(Real2 u, Real2 v)
Produit scalaire de u par v dans .
Definition MathUtils.h:113
__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
__host__ __device__ Real3 cross(Real3 v1, Real3 v2)
Produit vectoriel de deux vecteurs à 3 composantes.
Definition MathUtils.h:723
__host__ __device__ Real3 normalizeReal3(Real3 v)
Normalisation d'un Real3.
Definition MathUtils.h:741
Real3x3 prodTens(Real3 u, Real3 v)
Produit tensoriel de deux vecteurs Real3.
Definition MathUtils.h:193
__host__ __device__ Real maxMod2(Real a, Real b)
retourne le Max mod de deux Reals
Definition MathUtils.h:517
__host__ __device__ Real3x3 matrixProduct(const Real3x3 &t, const Real3x3 &v)
Produit matrice matrice entre deux tenseurs.
Definition MathUtils.h:238
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
__host__ __device__ Real3 prodTensVec(Real3x3 t, Real3 v)
Produit matrice vecteur entre un tenseur et un vecteur.
Definition MathUtils.h:207
Real3 axisSymmetric(Real3 u, Real3 a)
Symétrie d'un vecteur u par rapport à un axe de vecteur directeur a .
Definition MathUtils.h:861
__host__ __device__ Real mixteMul(Real3 u, Real3 v, Real3 w)
Produit mixte de u, v et w.
Definition MathUtils.h:159
__host__ __device__ Real3x3 matrixTranspose(const Real3x3 &t)
Transpose la matrice.
Definition MathUtils.h:272
double toDouble(Real r)
Converti un Real en double.
Definition Convert.h:40
__host__ __device__ double pow(double x, double y)
Fonction puissance.
Definition Math.h:166
Real relativeError(Real a, Real b)
Retourne l'erreur relative entre deux scalaires a et b.
Definition MathUtils.h:533
__host__ __device__ Real min8Real(const Real a[8])
retourne le min de huit Real
Definition MathUtils.h:468
Real relativeError2(Real a, Real b)
Retourne l'erreur relative entre deux scalaires a et b relativement à b.
Definition MathUtils.h:575
__host__ __device__ double sqrt(double v)
Racine carrée de v.
Definition Math.h:135
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
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
__host__ __device__ Real doubleContraction(const Real3x3 &u, const Real3x3 &v)
Definition MathUtils.h:288
__host__ __device__ Real3 multiply(const Real3x3 &m, Real3 v)
Produit matrice 3x3 . vecteur.
Definition MathUtils.h:809
__host__ __device__ Real matDet(Real3 u, Real3 v, Real3 w)
Déterminant de la matrice u,v,w.
Definition MathUtils.h:170
Real max8Real(const Real a[8])
retourne le max de huit Real
Definition MathUtils.h:478
__host__ __device__ Real3x3 matrix3x3Id()
Matrice identite.
Definition MathUtils.h:664
__host__ __device__ Real matrixDeterminant(Real3x3 m)
Calcul du déterminant d'une matrice 3x3.
Definition MathUtils.h:640
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
__host__ __device__ Real min4Real(Real a, Real b, Real c, Real d)
retourne le min de quatre Real
Definition MathUtils.h:446
Real3 crossProduct3(Real3 v1, Real3 v2)
Produit vectoriel de deux vecteurs à 3 composantes.
Definition MathUtils.h:706
__host__ __device__ Real max4Real(Real a, Real b, Real c, Real d)
retourne le max de quatre Real
Definition MathUtils.h:457
Real3x3 matrix3x3Prod(Real3x3 m1, Real3x3 m2)
Multiplication de 2 matrices 3x3.
Definition MathUtils.h:788
__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
void sub(ArrayView< T > lhs, ConstArrayView< T > copy_array)
Soustrait le tableau copy_array de l'instance.
Definition MathUtils.h:923
__host__ __device__ Real3x3 transpose(const Real3x3 &t)
Transpose la matrice.
Definition MathUtils.h:258
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 -*-
__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