TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
TRUSTArray_tools.tpp
1/****************************************************************************
2* Copyright (c) 2024, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#ifndef TRUSTArray_tools_TPP_included
17#define TRUSTArray_tools_TPP_included
18
19/*! @brief Renvoie 1 si les tableaux "v" et "a" sont de la meme taille et contiennent les memes valeurs au sens strict, sinon renvoie 0.
20 *
21 * Le test est !(v[i]!=a[i])
22 *
23 */
24template <typename _TYPE_, typename _SIZE_>
25bool operator==(const TRUSTArray<_TYPE_,_SIZE_>& v, const TRUSTArray<_TYPE_,_SIZE_>& a)
26{
27 const _SIZE_ n = v.size_array();
28 const _SIZE_ na = a.size_array();
29
30 if (n != na) return false;
31
34 const _TYPE_ * vv = v.addr();
35 const _TYPE_ * av = a.addr();
36 for (_SIZE_ i = 0; i < n; i++)
37 if (av[i] != vv[i])
38 return false;
39 return true;
40}
41
42/*! @brief Retourne l'indice du min ou -1 si le tableau est vide
43 *
44 */
45template <typename _TYPE_, typename _SIZE_> _SIZE_ imin_array(const TRUSTArray<_TYPE_,_SIZE_>& dx)
46{
47 _SIZE_ indice_min = -1;
48 const _SIZE_ size = dx.size_array();
49 if (size > 0)
50 {
51 indice_min = 0;
52 _TYPE_ valeur_min = dx[0];
53 for (_SIZE_ i = 1; i < size; i++)
54 {
55 const _TYPE_ val = dx[i];
56 if(val < valeur_min)
57 {
58 indice_min = i;
59 valeur_min = val;
60 }
61 }
62 }
63 return indice_min;
64}
65
66/*! @brief Retourne l'indice du max ou -1 si le tableau est vide
67 *
68 */
69template <typename _TYPE_, typename _SIZE_> _SIZE_ imax_array(const TRUSTArray<_TYPE_,_SIZE_>& dx)
70{
71 _SIZE_ indice_max = -1;
72 const _SIZE_ size = dx.size_array();
73 if (size > 0)
74 {
75 indice_max = 0;
76 _TYPE_ valeur_max = dx[0];
77 for (_SIZE_ i = 1; i < size; i++)
78 {
79 const _TYPE_ val = dx[i];
80 if(val > valeur_max)
81 {
82 indice_max = i;
83 valeur_max = val;
84 }
85 }
86 }
87 return indice_max;
88}
89
90/*! @brief Retourne la valeur minimale
91 *
92 */
93template <typename _TYPE_, typename _SIZE_>
94_TYPE_ min_array(const TRUSTArray<_TYPE_,_SIZE_>& dx)
95{
96 const _SIZE_ size = dx.size_array();
97 assert(size > 0);
98 _TYPE_ valeur_min = dx[0];
99 for (_SIZE_ i = 1; i < size; i++)
100 {
101 const _TYPE_ val = dx[i];
102 if (val < valeur_min) valeur_min = val;
103 }
104 return valeur_min;
105}
106
107/*! @brief Retourne la valeur maximale
108 *
109 */
110template <typename _TYPE_, typename _SIZE_>
111_TYPE_ max_array(const TRUSTArray<_TYPE_,_SIZE_>& dx)
112{
113 const _SIZE_ size = dx.size_array();
114 assert(size > 0);
115 _TYPE_ valeur_max = dx[0];
116 for (_SIZE_ i = 1; i < size; i++)
117 {
118 const _TYPE_ val = dx[i];
119 if (val > valeur_max) valeur_max = val;
120 }
121 return valeur_max;
122}
123
124// Absolute value for a scalar ....
125namespace
126{
127template <typename _TYPE_>
128inline _TYPE_ scalar_abs(_TYPE_ x)
129{
130 constexpr bool IS_INT = std::is_integral<_TYPE_>::value;
131 return IS_INT ? std::abs(x) : std::fabs(x);
132}
133}
134
135/*! @brief Retourne le max des abs(i)
136 */
137template <typename _TYPE_, typename _SIZE_>
138_TYPE_ max_abs_array(const TRUSTArray<_TYPE_,_SIZE_>& dx)
139{
140 const _SIZE_ size = dx.size_array();
141 assert(size > 0);
142 _TYPE_ valeur_max = ::scalar_abs(dx[0]);
143 for(_SIZE_ i = 1; i < size; i++)
144 {
145 const _TYPE_ val = ::scalar_abs(dx[i]);
146 if (val > valeur_max) valeur_max = val;
147 }
148 return valeur_max;
149}
150
151/*! @brief Retourne le min des abs(i)
152 *
153 */
154template <typename _TYPE_, typename _SIZE_>
155_TYPE_ min_abs_array(const TRUSTArray<_TYPE_,_SIZE_>& dx)
156{
157 const _SIZE_ size = dx.size_array();
158 assert(size > 0);
159 _TYPE_ v = ::scalar_abs(dx[0]);
160 for(_SIZE_ i = 1; i < size; i++)
161 {
162 const _TYPE_ val = ::scalar_abs(dx[i]);
163 if (val < v) v = val;
164 }
165 return v;
166}
167
168/*! @brief Produit scalaire de deux "array" (dotproduct_array remplace operator* car le nom indique clairement que l'on fait un produit scalaire non distribue)
169 *
170 */
171template <typename _TYPE_, typename _SIZE_>
172_TYPE_ dotproduct_array(const TRUSTArray<_TYPE_,_SIZE_>& dx, const TRUSTArray<_TYPE_,_SIZE_>& dy)
173{
174 const _SIZE_ size = dx.size_array();
175 assert(size == dy.size_array());
176 _TYPE_ resultat = 0.;
177 if (size > 0)
178 {
179 integer n = size;
180 integer incx = 1;
181 dx.ensureDataOnHost();
182 dy.ensureDataOnHost();
183 resultat = F77NAME(DDOT)(&n, dx.addr(), &incx, dy.addr(), &incx);
184 }
185 return resultat;
186}
187
188
189/*! @brief Calcul de la norme du vecteur dx (fonction blas DNRM2, soit racine carree(somme des dx[i]*dx[i]).
190 *
191 */
192template <typename _TYPE_, typename _SIZE_>
193_TYPE_ norme_array(const TRUSTArray<_TYPE_,_SIZE_>& dx)
194{
195 integer n = dx.size_array();
196 _TYPE_ resultat = 0.;
197 if (n > 0)
198 {
199 integer incx = 1;
200 dx.ensureDataOnHost();
201 resultat = F77NAME(DNRM2)(&n, &dx[0], &incx);
202 }
203 return resultat;
204}
205
206#endif /* TRUSTArray_tools_TPP_included */
Represents a an array of int/int64/double/... values.
Definition TRUSTArray.h:81
_SIZE_ size_array() const
_TYPE_ * addr()