Arcane  4.1.12.0
Developer documentation
Loading...
Searching...
No Matches
SimdMathUtils.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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/* Diverse mathematical functions for SIMD classes. */
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
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
43inline SimdReal
44cross2D(const SimdReal3& u, const SimdReal3& v)
45{
46 return (u.x * v.y - u.y * v.x);
47}
48
49inline SimdReal
50dot(const SimdReal3& u, const SimdReal3& v)
51{
52 return SimdReal(u.x * v.x + u.y * v.y + u.z * v.z);
53}
54
55inline SimdReal
56dot(const SimdReal2& u, const SimdReal2& v)
57{
58 return SimdReal(u.x * v.x + u.y * v.y);
59}
60
61ARCCORE_DEPRECATED_2021("Use normL2() instead")
62inline SimdReal
63abs(const SimdReal3& sr)
64{
65 SimdReal vr;
67 {
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 {
81 Real2 r(sr.x[si], sr.y[si]);
82 vr[si] = r.normL2();
83 }
84 return vr;
85}
86
87inline SimdReal
88normL2(const SimdReal3& sr)
89{
90 SimdReal vr;
92 {
93 Real3 r(sr.x[si], sr.y[si], sr.z[si]);
94 vr[si] = r.normL2();
95 }
96 return vr;
97}
98
99inline SimdReal
100normL2(const SimdReal2& sr)
101{
102 SimdReal vr;
104 {
105 Real2 r(sr.x[si], sr.y[si]);
106 vr[si] = r.normL2();
107 }
108 return vr;
109}
110
114inline SimdReal
115mixteMul(const SimdReal3& u, const SimdReal3& v, const SimdReal3& w)
116{
117 return dot(u, cross(v, w));
118}
119
120/*---------------------------------------------------------------------------*/
121/*---------------------------------------------------------------------------*/
122
123inline SimdReal3x3
124prodTens(const SimdReal3& u, const SimdReal3& v)
125{
126 return SimdReal3x3(u.x * v, u.y * v, u.z * v);
127}
128
129/*---------------------------------------------------------------------------*/
130/*---------------------------------------------------------------------------*/
131
136inline SimdReal3x3
138{
139 return SimdReal3x3(SimdReal3(t.x.x * v.x.x + t.x.y * v.y.x + t.x.z * v.z.x,
140 t.x.x * v.x.y + t.x.y * v.y.y + t.x.z * v.z.y,
141 t.x.x * v.x.z + t.x.y * v.y.z + t.x.z * v.z.z),
142 SimdReal3(t.y.x * v.x.x + t.y.y * v.y.x + t.y.z * v.z.x,
143 t.y.x * v.x.y + t.y.y * v.y.y + t.y.z * v.z.y,
144 t.y.x * v.x.z + t.y.y * v.y.z + t.y.z * v.z.z),
145 SimdReal3(t.z.x * v.x.x + t.z.y * v.y.x + t.z.z * v.z.x,
146 t.z.x * v.x.y + t.z.y * v.y.y + t.z.z * v.z.y,
147 t.z.x * v.x.z + t.z.y * v.y.z + t.z.z * v.z.z));
148}
149
150/*---------------------------------------------------------------------------*/
151/*---------------------------------------------------------------------------*/
152
157inline SimdReal3x3
159{
160 return SimdReal3x3(SimdReal3(t.x.x, t.y.x, t.z.x),
161 SimdReal3(t.x.y, t.y.y, t.z.y),
162 SimdReal3(t.x.z, t.y.z, t.z.z));
163}
164
165/*---------------------------------------------------------------------------*/
166/*---------------------------------------------------------------------------*/
167
172ARCCORE_HOST_DEVICE inline SimdReal2
173min(const SimdReal2& a, const SimdReal2& b)
174{
175 return SimdReal2(math::min(a.x, b.x), math::min(a.y, b.y));
176}
177
182ARCCORE_HOST_DEVICE inline SimdReal3
183min(const SimdReal3& a, const SimdReal3& b)
184{
185 return SimdReal3(math::min(a.x, b.x), math::min(a.y, b.y), math::min(a.z, b.z));
186}
187
192inline SimdReal2x2
193min(const SimdReal2x2& a, const SimdReal2x2& b)
194{
195 return SimdReal2x2(math::min(a.x, b.x), math::min(a.y, b.y));
196}
197
202inline SimdReal3x3
203min(const SimdReal3x3& a, const SimdReal3x3& b)
204{
205 return SimdReal3x3(math::min(a.x, b.x), math::min(a.y, b.y), math::min(a.z, b.z));
206}
207
208/*---------------------------------------------------------------------------*/
209/*---------------------------------------------------------------------------*/
210
215ARCCORE_HOST_DEVICE inline SimdReal2
216max(const SimdReal2& a, const SimdReal2& b)
217{
218 return SimdReal2(math::max(a.x, b.x), math::max(a.y, b.y));
219}
220
225ARCCORE_HOST_DEVICE inline SimdReal3
226max(const SimdReal3& a, const SimdReal3& b)
227{
228 return SimdReal3(math::max(a.x, b.x), math::max(a.y, b.y), math::max(a.z, b.z));
229}
230
235inline SimdReal2x2
236max(const SimdReal2x2& a, const SimdReal2x2& b)
237{
238 return SimdReal2x2(math::max(a.x, b.x), math::max(a.y, b.y));
239}
240
245inline SimdReal3x3
246max(const SimdReal3x3& a, const SimdReal3x3& b)
247{
248 return SimdReal3x3(math::max(a.x, b.x), math::max(a.y, b.y), math::max(a.z, b.z));
249}
250
251/*---------------------------------------------------------------------------*/
252/*---------------------------------------------------------------------------*/
253
254} // End namespace Arcane::math
255
256/*---------------------------------------------------------------------------*/
257/*---------------------------------------------------------------------------*/
258
259#endif
Represents a vectorized Real2.
Definition Simd.h:204
Represents a vectorized Real2x2.
Definition Simd.h:306
Represents a vectorized Real3.
Definition Simd.h:151
Represents a vectorized Real3x3.
Definition Simd.h:253
SimdInfo::SimdReal SimdReal
SIMD vector of real numbers.
Definition Simd.h:134
#define ENUMERATE_SIMD_REAL(_iter)
Macro to iterate over the indices of a SIMD real or derived vector (Real2, Real3, ....
Definition Simd.h:101
__host__ __device__ Real dot(Real2 u, Real2 v)
Dot product of u by v in .
Definition MathUtils.h:94
__host__ __device__ Real2 min(Real2 a, Real2 b)
Returns the minimum of two Real2.
Definition MathUtils.h:346
T max(const T &a, const T &b, const T &c)
Returns the maximum of three elements.
Definition MathUtils.h:407
__host__ __device__ Real cross2D(Real3 u, Real3 v)
Vector cross product of u by v in .
Definition MathUtils.h:79
__host__ __device__ Real3 cross(Real3 v1, Real3 v2)
Cross product of two 3-component vectors.
Definition MathUtils.h:759
Real3x3 prodTens(Real3 u, Real3 v)
Tensor product of two Real3 vectors.
Definition MathUtils.h:196
__host__ __device__ Real3x3 matrixProduct(const Real3x3 &t, const Real3x3 &v)
Matrix-matrix product between two tensors.
Definition MathUtils.h:244
__host__ __device__ Real mixteMul(Real3 u, Real3 v, Real3 w)
Mixed product of u, v and w.
Definition MathUtils.h:161
__host__ __device__ Real3x3 matrixTranspose(const Real3x3 &t)
Transpose the matrix.
Definition MathUtils.h:280
Namespace for mathematical functions.
Definition MathUtils.h:36