Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
SimdMathUtils.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 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/* SimdMathUtils.h (C) 2000-2022 */
9/* */
10/* Fonctions mathématiques diverses pour les classes SIMD. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_SIMDMATHUTILS_H
13#define ARCANE_SIMDMATHUTILS_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/SimdOperation.h"
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21
22namespace Arcane::math
23{
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28/*!
29 * \brief Produit vectoriel de \a u par \a v dans \f$R^3\f$.
30 */
31inline SimdReal3
32cross(const SimdReal3& u,const SimdReal3& v)
33{
34 return SimdReal3(
35 u.y * v.z - u.z * v.y,
36 u.z * v.x - u.x * v.z,
37 u.x * v.y - u.y * v.x
38 );
39}
40
41/*!
42 * \brief Produit vectoriel de \a u par \a v dans \f$R^2\f$.
43 */
44inline SimdReal
45cross2D(const SimdReal3& u,const SimdReal3& v)
46{
47 return (u.x * v.y - u.y * v.x);
48}
49
50inline SimdReal
51dot(const SimdReal3& u,const SimdReal3& v)
52{
53 return SimdReal(u.x*v.x + u.y*v.y + u.z*v.z);
54}
55
56inline SimdReal
57dot(const SimdReal2& u,const SimdReal2& v)
58{
59 return SimdReal(u.x*v.x + u.y*v.y);
60}
61
62ARCCORE_DEPRECATED_2021("Use normL2() instead")
63inline SimdReal
64abs(const SimdReal3& sr)
65{
66 SimdReal vr;
68 Real3 r(sr.x[si],sr.y[si],sr.z[si]);
69 vr[si] = r.normL2();
70 }
71 return vr;
72}
73
74ARCCORE_DEPRECATED_2021("Use normL2() instead")
75inline SimdReal
76abs(const SimdReal2& sr)
77{
78 SimdReal vr;
80 Real2 r(sr.x[si],sr.y[si]);
81 vr[si] = r.normL2();
82 }
83 return vr;
84}
85
86inline SimdReal
87normL2(const SimdReal3& sr)
88{
89 SimdReal vr;
91 Real3 r(sr.x[si],sr.y[si],sr.z[si]);
92 vr[si] = r.normL2();
93 }
94 return vr;
95}
96
97inline SimdReal
98normL2(const SimdReal2& sr)
99{
100 SimdReal vr;
102 Real2 r(sr.x[si],sr.y[si]);
103 vr[si] = r.normL2();
104 }
105 return vr;
106}
107
108/*!
109 * \brief Produit mixte de \a u, \a v et \a w
110 */
111inline SimdReal
112mixteMul(const SimdReal3& u,const SimdReal3& v,const SimdReal3& w)
113{
114 return dot(u,cross(v,w));
115}
116
117/*---------------------------------------------------------------------------*/
118/*---------------------------------------------------------------------------*/
119
120inline SimdReal3x3
121prodTens(const SimdReal3& u,const SimdReal3& v)
122{
123 return SimdReal3x3(u.x*v,u.y*v,u.z*v);
124}
125
126/*---------------------------------------------------------------------------*/
127/*---------------------------------------------------------------------------*/
128/*!
129 * \ingroup GroupMathUtils
130 * \brief Produit matrice matrice entre deux tenseurs.
131 */
132inline SimdReal3x3
134{
135 return SimdReal3x3(SimdReal3(t.x.x*v.x.x+t.x.y*v.y.x+t.x.z*v.z.x,
136 t.x.x*v.x.y+t.x.y*v.y.y+t.x.z*v.z.y,
137 t.x.x*v.x.z+t.x.y*v.y.z+t.x.z*v.z.z),
138 SimdReal3(t.y.x*v.x.x+t.y.y*v.y.x+t.y.z*v.z.x,
139 t.y.x*v.x.y+t.y.y*v.y.y+t.y.z*v.z.y,
140 t.y.x*v.x.z+t.y.y*v.y.z+t.y.z*v.z.z),
141 SimdReal3(t.z.x*v.x.x+t.z.y*v.y.x+t.z.z*v.z.x,
142 t.z.x*v.x.y+t.z.y*v.y.y+t.z.z*v.z.y,
143 t.z.x*v.x.z+t.z.y*v.y.z+t.z.z*v.z.z));
144}
145
146/*---------------------------------------------------------------------------*/
147/*---------------------------------------------------------------------------*/
148/*!
149 * \ingroup GroupMathUtils
150 * \brief Transpose la matrice.
151 */
152inline SimdReal3x3
154{
155 return SimdReal3x3(SimdReal3(t.x.x, t.y.x, t.z.x),
156 SimdReal3(t.x.y, t.y.y, t.z.y),
157 SimdReal3(t.x.z, t.y.z, t.z.z));
158}
159
160/*---------------------------------------------------------------------------*/
161/*---------------------------------------------------------------------------*/
162
163/*!
164 * \brief Retourne le minimum de deux SimdReal2
165 * \ingroup GroupMathUtils
166 */
167ARCCORE_HOST_DEVICE inline SimdReal2
168min(const SimdReal2& a,const SimdReal2& b)
169{
170 return SimdReal2( math::min(a.x,b.x), math::min(a.y,b.y) );
171}
172/*!
173 * \brief Retourne le minimum de deux SimdReal3
174 * \ingroup GroupMathUtils
175 */
176ARCCORE_HOST_DEVICE inline SimdReal3
177min(const SimdReal3& a,const SimdReal3& b)
178{
179 return SimdReal3( math::min(a.x,b.x), math::min(a.y,b.y), math::min(a.z,b.z) );
180}
181/*!
182 * \brief Retourne le minimum de deux SimdReal2x2
183 * \ingroup GroupMathUtils
184 */
185inline SimdReal2x2
186min(const SimdReal2x2& a,const SimdReal2x2& b)
187{
188 return SimdReal2x2( math::min(a.x,b.x), math::min(a.y,b.y) );
189}
190/*!
191 * \brief Retourne le minimum de deux SimdReal3x3
192 * \ingroup GroupMathUtils
193 */
194inline SimdReal3x3
195min(const SimdReal3x3& a,const SimdReal3x3& b)
196{
197 return SimdReal3x3( math::min(a.x,b.x), math::min(a.y,b.y), math::min(a.z,b.z) );
198}
199
200/*---------------------------------------------------------------------------*/
201/*---------------------------------------------------------------------------*/
202
203/*!
204 * \brief Retourne le maximum de deux SimdReal2
205 * \ingroup GroupMathUtils
206 */
207ARCCORE_HOST_DEVICE inline SimdReal2
208max(const SimdReal2& a,const SimdReal2& b)
209{
210 return SimdReal2( math::max(a.x,b.x), math::max(a.y,b.y) );
211}
212/*!
213 * \brief Retourne le maximum de deux SimdReal3
214 * \ingroup GroupMathUtils
215 */
216ARCCORE_HOST_DEVICE inline SimdReal3
217max(const SimdReal3& a,const SimdReal3& b)
218{
219 return SimdReal3( math::max(a.x,b.x), math::max(a.y,b.y), math::max(a.z,b.z) );
220}
221/*!
222 * \brief Retourne le maximum de deux SimdReal2x2
223 * \ingroup GroupMathUtils
224 */
225inline SimdReal2x2
226max(const SimdReal2x2& a,const SimdReal2x2& b)
227{
228 return SimdReal2x2( math::max(a.x,b.x), math::max(a.y,b.y) );
229}
230/*!
231 * \brief Retourne le maximum de deux SimdReal3x3
232 * \ingroup GroupMathUtils
233 */
234inline SimdReal3x3
235max(const SimdReal3x3& a,const SimdReal3x3& b)
236{
237 return SimdReal3x3( math::max(a.x,b.x), math::max(a.y,b.y), math::max(a.z,b.z) );
238}
239
240/*---------------------------------------------------------------------------*/
241/*---------------------------------------------------------------------------*/
242
243} // End namespace Arcane::math
244
245/*---------------------------------------------------------------------------*/
246/*---------------------------------------------------------------------------*/
247
248#endif
Vectorisation des réels par émulation.
Definition SimdEMUL.h:155
Représente un Real2 vectoriel.
Definition Simd.h:195
Représente un Real2x2 vectoriel.
Definition Simd.h:282
Représente un Real3 vectoriel.
Definition Simd.h:150
Représente un Real3x3 vectoriel.
Definition Simd.h:237
SimdInfo::SimdReal SimdReal
Vecteur SIMD de réel.
Definition Simd.h:134
#define ENUMERATE_SIMD_REAL(_iter)
Macro pour itérer sur les index d'un vecteur Simd de réel ou dérivé (Real2, Real3,...
Definition Simd.h:103
__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__ Real cross2D(Real3 u, Real3 v)
Produit vectoriel de u par v dans .
Definition MathUtils.h:82
__host__ __device__ Real3 cross(Real3 v1, Real3 v2)
Produit vectoriel de deux vecteurs à 3 composantes.
Definition MathUtils.h:723
Real3x3 prodTens(Real3 u, Real3 v)
Produit tensoriel de deux vecteurs Real3.
Definition MathUtils.h:193
__host__ __device__ Real3x3 matrixProduct(const Real3x3 &t, const Real3x3 &v)
Produit matrice matrice entre deux tenseurs.
Definition MathUtils.h:238
__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
Espace de nom pour les fonctions mathématiques.
Definition MathUtils.h:41