9.1
general documentation
cs_reducers.h
Go to the documentation of this file.
1#ifndef CS_REDUCERS_H
2#define CS_REDUCERS_H
3
4/*============================================================================
5 * Structures for reduction
6 *============================================================================*/
7
8/*
9 This file is part of code_saturne, a general-purpose CFD tool.
10
11 Copyright (C) 1998-2025 EDF S.A.
12
13 This program is free software; you can redistribute it and/or modify it under
14 the terms of the GNU General Public License as published by the Free Software
15 Foundation; either version 2 of the License, or (at your option) any later
16 version.
17
18 This program is distributed in the hope that it will be useful, but WITHOUT
19 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
20 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
21 details.
22
23 You should have received a copy of the GNU General Public License along with
24 this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
25 Street, Fifth Floor, Boston, MA 02110-1301, USA.
26*/
27
28/*----------------------------------------------------------------------------*/
29
30#include "base/cs_defs.h"
31
32/*----------------------------------------------------------------------------
33 * External library headers
34 *----------------------------------------------------------------------------*/
35
36/*----------------------------------------------------------------------------
37 * Local headers
38 *----------------------------------------------------------------------------*/
39
40#include "base/cs_base.h"
41#include "base/cs_math.h"
42
43/*----------------------------------------------------------------------------*/
44
45#ifdef __cplusplus
46
47/*============================================================================
48 * Macro definitions
49 *============================================================================*/
50
51/*============================================================================
52 * Type definitions
53 *============================================================================*/
54
55/* Structures for reduction
56 ------------------------ */
57
58// real
59
60template<size_t stride>
61struct cs_float_n {
62 float r[stride];
63};
64
65template<size_t stride>
67 double r[stride];
68};
69
70// integer
71
72template<size_t stride>
73struct cs_int_n {
74 cs_lnum_t i[stride];
75};
76
77// various types
78
81 float r[1];
82};
83
86 float r[2];
87};
88
91 float r[2];
92};
93
95 double d[1];
96 float r[2];
97};
98
100 float r1[3];
101 float r2[3];
102};
103
104template<size_t stride>
106 double r[stride];
107};
108
109// Combined
110
111template<size_t stride>
113 double r[stride];
114 cs_lnum_t i[stride];
115};
116
117/* Reduction
118 --------- */
119
122
124 identity(T &a) const {
125 a.r[0] = cs_math_infinite_r;
126 a.r[1] = -cs_math_infinite_r;
127 a.r[2] = 0.;
128 a.r[3] = 0.;
129 }
130
132 combine(volatile T &a, volatile const T &b) const {
133 a.r[0] = cs::min(a.r[0], b.r[0]);
134 a.r[1] = cs::max(a.r[1], b.r[1]);
135 a.r[2] += b.r[2];
136 a.r[3] += b.r[3];
137 }
138};
139
142
144 identity(T &a) const {
145 a.i[0] = 0;
146 a.r[0] = cs_math_infinite_r;
147 }
148
150 combine(volatile T &a, volatile const T &b) const {
151 a.i[0] += b.i[0];
152 a.r[0] = cs::min(a.r[0], b.r[0]);
153 }
154};
155
156// Max (1 real)
157
159
161 identity(cs_real_t &a) const {
162 a = -HUGE_VAL;
163 }
164
166 combine(volatile cs_real_t &a, volatile const cs_real_t &b) const {
167 a = cs::max(a, b);
168 }
169};
170
171// Min (3 reals) and Max (3 reals)
172
175
177 identity(T &a) const {
178 a.r1[0] = cs_math_infinite_r;
179 a.r1[1] = cs_math_infinite_r;
180 a.r1[2] = cs_math_infinite_r;
181
182
183 a.r2[0] = -cs_math_infinite_r;
184 a.r2[1] = -cs_math_infinite_r;
185 a.r2[2] = -cs_math_infinite_r;
186 }
187
189 combine(volatile T &a, volatile const T &b) const {
190 a.r1[0] = cs::min(a.r1[0], b.r1[0]);
191 a.r1[1] = cs::min(a.r1[1], b.r1[1]);
192 a.r1[2] = cs::min(a.r1[2], b.r1[2]);
193
194 a.r2[0] = cs::max(a.r2[0], b.r2[0]);
195 a.r2[1] = cs::max(a.r2[1], b.r2[1]);
196 a.r2[2] = cs::max(a.r2[2], b.r2[2]);
197 }
198};
199
200// n_sum for double
201
202template<size_t stride>
205
207 identity(T &a) const {
208 for (size_t i = 0; i < stride; i++)
209 a.r[i] = 0.;
210 }
211
213 combine(volatile T &a, volatile const T &b) const {
214 for (size_t i = 0; i < stride; i++)
215 a.r[i] += b.r[i];
216 }
217};
218
219// n_sum for integer
220
221template<size_t stride>
224
226 identity(T &a) const {
227 for (size_t i = 0; i < stride; i++)
228 a.i[i] = 0.;
229 }
230
232 combine(volatile T &a, volatile const T &b) const {
233 for (size_t i = 0; i < stride; i++)
234 a.i[i] += b.i[i];
235 }
236};
237
238// n_min_max
239
240template<size_t stride>
243
245 identity(T &a) const {
246 for (size_t i = 0; i < stride; i++) {
247 a.r[i] = HUGE_VAL;
248 a.r[stride + i] = -HUGE_VAL;
249 }
250 }
251
253 combine(volatile T &a, volatile const T &b) const {
254 for (size_t i = 0; i < stride; i++) {
255 a.r[i] = cs::min(a.r[i], b.r[i]);
256 a.r[stride + i] = cs::max(a.r[stride + i], b.r[stride + i]);
257 }
258 }
259};
260
261// n min_max_sum
262
263template<size_t stride>
266
268 identity(T &a) const {
269 for (size_t i = 0; i < stride; i++) {
270 a.r[i] = HUGE_VAL;
271 a.r[stride + i] = -HUGE_VAL;
272 a.r[2*stride + i] = 0.;
273 }
274 }
275
277 combine(volatile T &a, volatile const T &b) const {
278 for (size_t i = 0; i < stride; i++) {
279 a.r[i] = cs::min(a.r[i], b.r[i]);
280 a.r[stride + i] = cs::max(a.r[stride + i], b.r[stride + i]);
281 a.r[2*stride + i] += b.r[2*stride + i];
282 }
283 }
284};
285
286// Min (1 real), max (1 real) and sum (1 int)
287
290
292 identity(T &a) const {
293 a.r[0] = HUGE_VAL;
294 a.r[1] = -HUGE_VAL;
295 a.i[0] = 0;
296 }
297
299 combine(volatile T &a, volatile const T &b) const {
300 a.r[0] = cs::min(a.r[0], b.r[0]);
301 a.r[1] = cs::max(a.r[1], b.r[1]);
302 a.i[0] += b.i[0];
303 }
304};
305
306// Min (1 real), max (1 real) and sum (2 int)
307
310
312 identity(T &a) const {
313 a.r[0] = cs_math_infinite_r;
314 a.r[1] = -cs_math_infinite_r;
315 a.i[0] = 0;
316 a.i[1] = 0;
317 }
318
320 combine(volatile T &a, volatile const T &b) const {
321 a.r[0] = cs::min(a.r[0], b.r[0]);
322 a.r[1] = cs::max(a.r[1], b.r[1]);
323 a.i[0] += b.i[0];
324 a.i[1] += b.i[1];
325 }
326};
327
328// Min, max (float) and sum (double)
329
332
334 identity(T &a) const {
335 a.d[0] = 0.0;
336
337 a.r[0] = cs_math_infinite_r;
338 a.r[1] = -cs_math_infinite_r;
339 }
340
342 combine(volatile T &a, volatile const T &b) const {
343 a.d[0] += b.d[0];
344
345 a.r[0] = cs::min(a.r[0], b.r[0]);
346 a.r[1] = cs::max(a.r[1], b.r[1]);
347 }
348};
349
350template<size_t stride>
352 using T = cs_double_n<3*(stride + 1)>;
353
355 identity(T &a) const {
356 const size_t _stride = stride + 1;
357 for (size_t i = 0; i < _stride; i++) {
358 a.r[i] = HUGE_VAL;
359 a.r[_stride + i] = -HUGE_VAL;
360 a.r[2*_stride + i] = 0.;
361 }
362 }
363
365 combine(volatile T &a, volatile const T &b) const {
366
367 const size_t _stride = stride + 1;
368
369 for (size_t i = 0; i < stride; i++) {
370 a.r[i] = cs::min(a.r[i], b.r[i]);
371 a.r[_stride + i] = cs::max(a.r[_stride + i], b.r[_stride + i]);
372 a.r[2*_stride + i] += b.r[2*_stride + i];
373 }
374 a.r[_stride - 1] = cs::min(a.r[_stride - 1], b.r[_stride - 1]);
375 a.r[2*_stride - 1] = cs::max(a.r[2*_stride - 1], b.r[2*_stride - 1]);
376 a.r[3*_stride - 1] += b.r[3*_stride - 1];
377 }
378};
379
380template<size_t stride>
383
385 identity(T &a) const {
386 for (size_t i = 0; i < stride; i++) {
387 a.r[i] = HUGE_VAL;
388 a.r[stride + i] = -HUGE_VAL;
389 a.r[2*stride + i] = 0.;
390 a.r[3*stride + i] = 0.;
391 }
392 }
393
395 combine(volatile T &a, volatile const T &b) const {
396 for (size_t i = 0; i < stride; i++) {
397 a.r[i] = cs::min(a.r[i], b.r[i]);
398 a.r[stride + i] = cs::max(a.r[stride + i], b.r[stride + i]);
399 a.r[2*stride + i] += b.r[2*stride + i];
400 a.r[3*stride + i] += b.r[3*stride + i];
401
402 }
403 }
404};
405
406template<size_t stride>
408 using T = cs_double_n<4*(stride + 1)>;
409
411 identity(T &a) const {
412 const size_t _stride = stride + 1;
413 for (size_t i = 0; i < _stride; i++) {
414 a.r[i] = HUGE_VAL;
415 a.r[_stride + i] = -HUGE_VAL;
416 a.r[2*_stride + i] = 0.;
417 a.r[3*_stride + i] = 0.;
418 }
419 }
420
422 combine(volatile T &a, volatile const T &b) const {
423
424 const size_t _stride = stride + 1;
425 for (size_t i = 0; i < stride; i++) {
426 a.r[i] = cs::min(a.r[i], b.r[i]);
427 a.r[_stride + i] = cs::max(a.r[_stride + i], b.r[_stride + i]);
428 a.r[2*_stride + i] += b.r[2*_stride + i];
429 a.r[3*_stride + i] += b.r[3*_stride + i];
430 }
431 a.r[_stride - 1] = cs::min(a.r[_stride - 1], b.r[_stride - 1]);
432 a.r[2*_stride - 1] = cs::max(a.r[2*_stride - 1], b.r[2*_stride - 1]);
433 a.r[3*_stride - 1] += b.r[3*_stride - 1];
434 a.r[4*_stride - 1] += b.r[4*_stride - 1];
435 }
436};
437
440
442 identity(T &a) const {
443 a.r[3] = -cs_math_infinite_r;
444
445 a.r[0] = 0.;
446 a.r[1] = 0.;
447 a.r[2] = 0.;
448 }
449
451 combine(volatile T &a, volatile const T &b) const {
452 if (a.r[3] < b.r[3]) {
453 a.r[3] = b.r[3]; // a=max(a,b)
454
455 a.r[0] = b.r[0];
456 a.r[1] = b.r[1];
457 a.r[2] = b.r[2];
458 }
459 }
460};
461
462// Strided min/max;
463// The first half of the structure is used for min,
464// the second for max.
465// Only the first half needs to be set by the user, as combine
466// handles the rest.
467
468template<size_t stride>
471
473 identity(T &a) const {
474 for (size_t i = 0; i < stride; i++) {
475 a.r[i] = HUGE_VAL;
476 a.r[stride + i] = -HUGE_VAL;
477 }
478 }
479
481 combine(volatile T &a, volatile const T &b) const {
482 for (size_t i = 0; i < stride; i++) {
483 // Do not use stride for b, as only the first half needs to be set.
484 a.r[i] = cs::min(a.r[i], b.r[i]);
485 a.r[stride+i] = cs::max(a.r[stride+i], b.r[stride+i]);
486 }
487 }
488};
489
490// Strided min:
491
492template<size_t stride>
495
497 identity(T &a) const {
498 for (size_t i = 0; i < stride; i++) {
499 a.r[i] = HUGE_VAL;
500 }
501 }
502
504 combine(volatile T &a, volatile const T &b) const {
505 for (size_t i = 0; i < stride; i++) {
506 a.r[i] = cs::min(a.r[i], b.r[i]);
507 }
508 }
509};
510
511// Strided min/max/loc;
512
513template<size_t stride>
516
518 identity(T &a) const {
519 for (size_t i = 0; i < stride; i++) {
520 a.r[i] = HUGE_VAL;
521 a.r[stride + i] = -HUGE_VAL;
522 a.i[i] = -1.;
523 a.i[stride + i] = -1.;
524 }
525 }
526
528 combine(volatile T &a, volatile const T &b) const {
529 for (size_t i = 0; i < stride; i++) {
530 if (a.r[i] > b.r[i]) {
531 a.r[i] = b.r[i];
532 a.i[i] = b.i[i];
533 }
534 if (a.r[stride + i] < b.r[stride + i]) {
535 a.r[stride + i] = b.r[stride + i];
536 a.i[stride + i] = b.i[stride + i];
537 }
538 }
539 }
540};
541
542/*============================================================================
543 * Templated function definitions
544 *============================================================================*/
545
546/*============================================================================
547 * Public function prototypes
548 *============================================================================*/
549
550#endif // __cplusplus
551
552/*----------------------------------------------------------------------------*/
553
554#endif /* CS_REDUCERS_H */
#define CS_F_HOST_DEVICE
Definition: cs_defs.h:585
double cs_real_t
Floating-point value.
Definition: cs_defs.h:357
int cs_lnum_t
local mesh entity id
Definition: cs_defs.h:350
const cs_real_t cs_math_infinite_r
CS_F_HOST_DEVICE T max(const T a, const T b)
Definition: cs_defs.h:769
CS_F_HOST_DEVICE T min(const T a, const T b)
Definition: cs_defs.h:746
#define HUGE_VAL
Definition: cs_reducers.h:94
double d[1]
Definition: cs_reducers.h:95
float r[2]
Definition: cs_reducers.h:96
Definition: cs_reducers.h:79
float r[1]
Definition: cs_reducers.h:81
cs_lnum_t i[1]
Definition: cs_reducers.h:80
Definition: cs_reducers.h:84
cs_lnum_t i[1]
Definition: cs_reducers.h:85
float r[2]
Definition: cs_reducers.h:86
Definition: cs_reducers.h:89
cs_lnum_t i[2]
Definition: cs_reducers.h:90
float r[2]
Definition: cs_reducers.h:91
Definition: cs_reducers.h:99
float r1[3]
Definition: cs_reducers.h:100
float r2[3]
Definition: cs_reducers.h:101
Definition: cs_reducers.h:112
double r[stride]
Definition: cs_reducers.h:113
cs_lnum_t i[stride]
Definition: cs_reducers.h:114
Definition: cs_reducers.h:105
double r[stride]
Definition: cs_reducers.h:106
Definition: cs_reducers.h:66
double r[stride]
Definition: cs_reducers.h:67
Definition: cs_reducers.h:61
float r[stride]
Definition: cs_reducers.h:62
Definition: cs_reducers.h:73
cs_lnum_t i[stride]
Definition: cs_reducers.h:74
Definition: cs_reducers.h:438
CS_F_HOST_DEVICE void identity(T &a) const
Definition: cs_reducers.h:442
CS_F_HOST_DEVICE void combine(volatile T &a, volatile const T &b) const
Definition: cs_reducers.h:451
Definition: cs_reducers.h:158
CS_F_HOST_DEVICE void combine(volatile cs_real_t &a, volatile const cs_real_t &b) const
Definition: cs_reducers.h:166
CS_F_HOST_DEVICE void identity(cs_real_t &a) const
Definition: cs_reducers.h:161
Definition: cs_reducers.h:288
CS_F_HOST_DEVICE void identity(T &a) const
Definition: cs_reducers.h:292
CS_F_HOST_DEVICE void combine(volatile T &a, volatile const T &b) const
Definition: cs_reducers.h:299
Definition: cs_reducers.h:308
CS_F_HOST_DEVICE void identity(T &a) const
Definition: cs_reducers.h:312
CS_F_HOST_DEVICE void combine(volatile T &a, volatile const T &b) const
Definition: cs_reducers.h:320
Definition: cs_reducers.h:120
CS_F_HOST_DEVICE void identity(T &a) const
Definition: cs_reducers.h:124
CS_F_HOST_DEVICE void combine(volatile T &a, volatile const T &b) const
Definition: cs_reducers.h:132
Definition: cs_reducers.h:173
CS_F_HOST_DEVICE void identity(T &a) const
Definition: cs_reducers.h:177
CS_F_HOST_DEVICE void combine(volatile T &a, volatile const T &b) const
Definition: cs_reducers.h:189
Definition: cs_reducers.h:241
CS_F_HOST_DEVICE void identity(T &a) const
Definition: cs_reducers.h:245
CS_F_HOST_DEVICE void combine(volatile T &a, volatile const T &b) const
Definition: cs_reducers.h:253
Definition: cs_reducers.h:351
CS_F_HOST_DEVICE void identity(T &a) const
Definition: cs_reducers.h:355
CS_F_HOST_DEVICE void combine(volatile T &a, volatile const T &b) const
Definition: cs_reducers.h:365
Definition: cs_reducers.h:264
CS_F_HOST_DEVICE void identity(T &a) const
Definition: cs_reducers.h:268
CS_F_HOST_DEVICE void combine(volatile T &a, volatile const T &b) const
Definition: cs_reducers.h:277
Definition: cs_reducers.h:407
CS_F_HOST_DEVICE void identity(T &a) const
Definition: cs_reducers.h:411
CS_F_HOST_DEVICE void combine(volatile T &a, volatile const T &b) const
Definition: cs_reducers.h:422
Definition: cs_reducers.h:381
CS_F_HOST_DEVICE void identity(T &a) const
Definition: cs_reducers.h:385
CS_F_HOST_DEVICE void combine(volatile T &a, volatile const T &b) const
Definition: cs_reducers.h:395
Definition: cs_reducers.h:493
CS_F_HOST_DEVICE void identity(T &a) const
Definition: cs_reducers.h:497
CS_F_HOST_DEVICE void combine(volatile T &a, volatile const T &b) const
Definition: cs_reducers.h:504
Definition: cs_reducers.h:469
CS_F_HOST_DEVICE void identity(T &a) const
Definition: cs_reducers.h:473
CS_F_HOST_DEVICE void combine(volatile T &a, volatile const T &b) const
Definition: cs_reducers.h:481
Definition: cs_reducers.h:514
CS_F_HOST_DEVICE void identity(T &a) const
Definition: cs_reducers.h:518
CS_F_HOST_DEVICE void combine(volatile T &a, volatile const T &b) const
Definition: cs_reducers.h:528
Definition: cs_reducers.h:330
CS_F_HOST_DEVICE void identity(T &a) const
Definition: cs_reducers.h:334
CS_F_HOST_DEVICE void combine(volatile T &a, volatile const T &b) const
Definition: cs_reducers.h:342
Definition: cs_reducers.h:140
CS_F_HOST_DEVICE void identity(T &a) const
Definition: cs_reducers.h:144
CS_F_HOST_DEVICE void combine(volatile T &a, volatile const T &b) const
Definition: cs_reducers.h:150
Definition: cs_reducers.h:222
CS_F_HOST_DEVICE void identity(T &a) const
Definition: cs_reducers.h:226
CS_F_HOST_DEVICE void combine(volatile T &a, volatile const T &b) const
Definition: cs_reducers.h:232
Definition: cs_reducers.h:203
CS_F_HOST_DEVICE void identity(T &a) const
Definition: cs_reducers.h:207
CS_F_HOST_DEVICE void combine(volatile T &a, volatile const T &b) const
Definition: cs_reducers.h:213