Arcane  v3.15.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
VariableDataTypeTraits.h
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/* VariableDataTypeTraits.h (C) 2000-2024 */
9/* */
10/* Classes spécialisées pour caractériser les types de données. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_VARIABLEDATATYPETRAITS_H
13#define ARCANE_CORE_VARIABLEDATATYPETRAITS_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/PlatformUtils.h"
18#include "arcane/utils/ValueConvert.h"
19#include "arcane/utils/BFloat16.h"
20#include "arcane/utils/Float16.h"
21#include "arcane/utils/Float128.h"
22#include "arcane/utils/Int128.h"
23
25
26#include <cmath>
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
31namespace Arcane
32{
33
34/*---------------------------------------------------------------------------*/
35/*---------------------------------------------------------------------------*/
36/*!
37 * \brief Ecriture dans la chaine \a s d'un type basique de valeur \a v.
38 */
39template <typename DataType> inline void
40builtInDumpValue(String& s, const DataType& v)
41{
42 std::ostringstream sbuf;
43 sbuf << v << '\0';
44 s = sbuf.str();
45}
46
47/*---------------------------------------------------------------------------*/
48/*---------------------------------------------------------------------------*/
49/*!
50 * \internal
51 * \brief Classe template d'informations sur un type d'une variable.
52 *
53 * Cette classe doit être spécialisée pour chaque type.
54 */
55template <typename DataType>
57{
58 public:
59
60 static eDataType type() { return DT_Unknown; }
61};
62
63/*---------------------------------------------------------------------------*/
64/*---------------------------------------------------------------------------*/
65
66/*---------------------------------------------------------------------------*/
67/*---------------------------------------------------------------------------*/
68/*!
69 * \internal
70 * \brief Spécialisation de VariableDataTypeTraitsT pour le type <tt>byte</tt>.
71 */
72template <>
73class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Byte>
74{
75 public:
76
77 //! Type du paramètre template
78 typedef Byte Type;
79
80 //! Indique si le type peut être sauvé et relu
82
83 //! Indique si le type peut être subir une réduction
85
86 //! Indique si le type peut être subir une réduction Min/Max
88
89 //! Indique si le type est numérique
91
92 typedef Byte BasicType;
93
94 static constexpr Integer nbBasicType() { return 1; }
95
96 public:
97
98 //! Retourne le nom du type de la variable
99 static constexpr const char* typeName() { return "Byte"; }
100 //! Retourne le type de la variable
101 static constexpr eDataType type() { return DT_Byte; }
102 //! Ecrit dans la chaîne \a s la valeur de \a v
103 static void dumpValue(String& s, const Type& v) { builtInDumpValue(s, v); }
104 /*!
105 * \brief Stocke la conversion de la chaîne \a s en le type #Type dans \a v
106 * \retval true en cas d'échec,
107 * \retval false si la conversion est un succès
108 */
109 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
110
111 static bool verifDifferent(Byte v1, Byte v2, Byte& diff,
112 [[maybe_unused]] bool is_nan_equal = false)
113 {
114 if (v1 != v2) {
115 if (math::isZero(v1))
116 diff = (Byte)(v1 - v2);
117 else
118 diff = (Byte)((v1 - v2) / v1);
119 return true;
120 }
121 return false;
122 }
123
124 static Byte normeMax(Byte v)
125 {
126 return (Byte)math::abs(v);
127 }
128};
129
130/*---------------------------------------------------------------------------*/
131/*---------------------------------------------------------------------------*/
132/*!
133 * \internal
134 * \brief Spécialisation de VariableDataTypeTraitsT pour le type \c Real.
135 */
136template <>
137class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Real>
138{
139 public:
140
141 //! Type du paramètre template
142 typedef Real Type;
143
144 //! Indique si le type peut être sauvé et relu
146
147 //! Indique si le type peut être subir une réduction
149
150 //! Indique si le type peut être subir une réduction Min/Max
152
153 //! Indique si le type est numérique
155
156 typedef Real BasicType;
157
158 static constexpr Integer nbBasicType() { return 1; }
159
160 public:
161
162 //! Retourne le nom du type de la variable
163 static constexpr const char* typeName() { return "Real"; }
164 //! Retourne le type de la variable
165 static constexpr eDataType type() { return DT_Real; }
166 //! Ecrit dans la chaîne \a s la valeur de \a v
167 static void dumpValue(String& s, const Type& v) { builtInDumpValue(s, v); }
168 /*!
169 * \brief Stocke la conversion de la chaîne \a s en le type #Type dans \a v
170 * \retval true en cas d'échec,
171 * \retval false si la conversion est un succès
172 */
173 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
174
175 static bool verifDifferent(Real v1, Real v2, Real& diff, bool is_nan_equal = false)
176 {
177 if (is_nan_equal) {
178 if (std::isnan(v1) && std::isnan(v2))
179 return false;
180 }
181 // Vérifie avant de les comparer que les deux nombres sont valides
182 // pour éviter une exception flottante sur certaines plates-formes
183 if (platform::isDenormalized(v1) || platform::isDenormalized(v2)) {
184 diff = 1.0;
185 return true;
186 }
187 if (v1 != v2) {
188 if (math::abs(v1) < 1.e-100) // TH: plantait pour v1 tres petit(math::isZero(v1))
189 diff = v1 - v2;
190 else
191 diff = (v1 - v2) / v1;
192 return true;
193 }
194 return false;
195 }
196
197 static Real normeMax(Real v)
198 {
199 return math::abs(v);
200 }
201};
202
203/*---------------------------------------------------------------------------*/
204/*---------------------------------------------------------------------------*/
205/*!
206 * \internal
207 * \brief Spécialisation de VariableDataTypeTraitsT pour le type \c Real.
208 */
209template <>
210class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Float128>
211{
212 public:
213
214 //! Type du paramètre template
215 typedef Float128 Type;
216
217 //! Indique si le type peut être sauvé et relu
219
220 //! Indique si le type peut être subir une réduction
222
223 //! Indique si le type peut être subir une réduction Min/Max
225
226 //! Indique si le type est numérique
228
229 typedef Float128 BasicType;
230
231 static constexpr Int32 nbBasicType() { return 1; }
232
233 public:
234
235 //! Retourne le nom du type de la variable
236 static constexpr const char* typeName() { return "Float128"; }
237 //! Retourne le type de la variable
238 static constexpr eDataType type() { return DT_Float128; }
239 //! Ecrit dans la chaîne \a s la valeur de \a v
240 static void dumpValue(String& s, const Type& v) { builtInDumpValue(s, v); }
241 /*!
242 * \brief Stocke la conversion de la chaîne \a s en le type #Type dans \a v
243 * \retval true en cas d'échec,
244 * \retval false si la conversion est un succès
245 */
246 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
247
248 static bool verifDifferent(Type v1, Type v2, Type& diff, bool is_nan_equal = false)
249 {
250 if (is_nan_equal) {
251 // TODO: non supporté
252 return false;
253 }
254 if (v1 != v2) {
255 if (math::abs(v1) < 1.e-100) // TH: plantait pour v1 tres petit(math::isZero(v1))
256 diff = v1 - v2;
257 else
258 diff = (v1 - v2) / v1;
259 return true;
260 }
261 return false;
262 }
263};
264
265/*---------------------------------------------------------------------------*/
266/*---------------------------------------------------------------------------*/
267/*!
268 * \internal
269 * \brief Spécialisation de VariableDataTypeTraitsT pour le type <tt>Int8</tt>.
270 */
271template <>
272class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Int8>
273{
274 public:
275
276 //! Type du paramètre template
277 typedef Int8 Type;
278
279 //! Indique si le type peut être sauvé et relu
281
282 //! Indique si le type peut être subir une réduction
284
285 //! Indique si le type peut être subir une réduction Min/Max
287
288 //! Indique si le type est numérique
290
291 typedef Int8 BasicType;
292
293 static constexpr Int32 nbBasicType() { return 1; }
294
295 public:
296
297 //! Retourne le nom du type de la variable
298 static constexpr const char* typeName() { return "Int8"; }
299 //! Retourne le type de la variable
300 static constexpr eDataType type() { return DT_Int8; }
301 //! Ecrit dans la chaîne \a s la valeur de \a v
302 static void dumpValue(String& s, const Type& v) { builtInDumpValue(s, v); }
303 /*!
304 * \brief Stocke la conversion de la chaîne \a s en le type #Type dans \a v
305 * \retval true en cas d'échec,
306 * \retval false si la conversion est un succès
307 */
308 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
309 static bool verifDifferent(Int8 v1, Int8 v2, Int8& diff,
310 [[maybe_unused]] bool is_nan_equal = false)
311 {
312 if (v1 != v2) {
313 if (math::isZero(v1))
314 diff = (Int8)(v1 - v2);
315 else
316 diff = (Int8)((v1 - v2) / v1);
317 return true;
318 }
319 return false;
320 }
321 static Int8 normeMax(Int8 v)
322 {
323 return static_cast<Int8>(math::abs(v));
324 }
325};
326
327/*---------------------------------------------------------------------------*/
328/*---------------------------------------------------------------------------*/
329/*!
330 * \internal
331 * \brief Spécialisation de VariableDataTypeTraitsT pour le type <tt>Int16</tt>.
332 */
333template <>
334class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Int16>
335{
336 public:
337
338 //! Type du paramètre template
339 typedef Int16 Type;
340
341 //! Indique si le type peut être sauvé et relu
343
344 //! Indique si le type peut être subir une réduction
346
347 //! Indique si le type peut être subir une réduction Min/Max
349
350 //! Indique si le type est numérique
352
353 typedef Int16 BasicType;
354
355 static constexpr Integer nbBasicType() { return 1; }
356
357 public:
358
359 //! Retourne le nom du type de la variable
360 static constexpr const char* typeName() { return "Int16"; }
361 //! Retourne le type de la variable
362 static constexpr eDataType type() { return DT_Int16; }
363 //! Ecrit dans la chaîne \a s la valeur de \a v
364 static void dumpValue(String& s, const Type& v) { builtInDumpValue(s, v); }
365 /*!
366 * \brief Stocke la conversion de la chaîne \a s en le type #Type dans \a v
367 * \retval true en cas d'échec,
368 * \retval false si la conversion est un succès
369 */
370 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
371 static bool verifDifferent(Int16 v1, Int16 v2, Int16& diff,
372 [[maybe_unused]] bool is_nan_equal = false)
373 {
374 if (v1 != v2) {
375 if (math::isZero(v1))
376 diff = (Int16)(v1 - v2);
377 else
378 diff = (Int16)((v1 - v2) / v1);
379 return true;
380 }
381 return false;
382 }
383 static Int16 normeMax(Int16 v)
384 {
385 return math::abs(v);
386 }
387};
388
389/*---------------------------------------------------------------------------*/
390/*---------------------------------------------------------------------------*/
391/*!
392 * \internal
393 * \brief Spécialisation de VariableDataTypeTraitsT pour le type <tt>Int32</tt>.
394 */
395template <>
396class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Int32>
397{
398 public:
399
400 //! Type du paramètre template
401 typedef Int32 Type;
402
403 //! Indique si le type peut être sauvé et relu
405
406 //! Indique si le type peut être subir une réduction
408
409 //! Indique si le type peut être subir une réduction Min/Max
411
412 //! Indique si le type est numérique
414
415 typedef Int32 BasicType;
416
417 static constexpr Integer nbBasicType() { return 1; }
418
419 public:
420
421 //! Retourne le nom du type de la variable
422 static constexpr const char* typeName() { return "Int32"; }
423 //! Retourne le type de la variable
424 static constexpr eDataType type() { return DT_Int32; }
425 //! Ecrit dans la chaîne \a s la valeur de \a v
426 static void dumpValue(String& s, const Type& v) { builtInDumpValue(s, v); }
427 /*!
428 * \brief Stocke la conversion de la chaîne \a s en le type #Type dans \a v
429 * \retval true en cas d'échec,
430 * \retval false si la conversion est un succès
431 */
432 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
433 static bool verifDifferent(Int32 v1, Int32 v2, Int32& diff,
434 [[maybe_unused]] bool is_nan_equal = false)
435 {
436 if (v1 != v2) {
437 if (math::isZero(v1))
438 diff = v1 - v2;
439 else
440 diff = (v1 - v2) / v1;
441 return true;
442 }
443 return false;
444 }
445 static Int32 normeMax(Int32 v)
446 {
447 return math::abs(v);
448 }
449};
450
451/*---------------------------------------------------------------------------*/
452/*---------------------------------------------------------------------------*/
453/*!
454 * \internal
455 * \brief Spécialisation de VariableDataTypeTraitsT pour le type <tt>Int64</tt>.
456 */
457template <>
458class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Int64>
459{
460 public:
461
462 //! Type du paramètre template
463 typedef Int64 Type;
464
465 //! Indique si le type peut être sauvé et relu
467
468 //! Indique si le type peut être subir une réduction
470
471 //! Indique si le type peut être subir une réduction Min/Max
473
474 //! Indique si le type est numérique
476
477 typedef Int64 BasicType;
478
479 static constexpr Integer nbBasicType() { return 1; }
480
481 public:
482
483 //! Retourne le nom du type de la variable
484 static constexpr const char* typeName() { return "Int64"; }
485 //! Retourne le type de la variable
486 static constexpr eDataType type() { return DT_Int64; }
487 //! Ecrit dans la chaîne \a s la valeur de \a v
488 static void dumpValue(String& s, const Type& v) { builtInDumpValue(s, v); }
489 /*!
490 * \brief Stocke la conversion de la chaîne \a s en le type #Type dans \a v
491 * \retval true en cas d'échec,
492 * \retval false si la conversion est un succès
493 */
494 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
495
496 static bool verifDifferent(Type v1, Type v2, Type& diff,
497 [[maybe_unused]] bool is_nan_equal = false)
498 {
499 if (v1 != v2) {
500 if (math::isZero(v1))
501 diff = v1 - v2;
502 else
503 diff = (v1 - v2) / v1;
504 return true;
505 }
506 return false;
507 }
508 static Int64 normeMax(Int64 v)
509 {
510 return v;
511 }
512};
513
514/*---------------------------------------------------------------------------*/
515/*---------------------------------------------------------------------------*/
516/*!
517 * \internal
518 * \brief Spécialisation de VariableDataTypeTraitsT pour le type <tt>Int128</tt>.
519 */
520template <>
521class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Int128>
522{
523 public:
524
525 //! Type du paramètre template
526 typedef Int128 Type;
527
528 //! Indique si le type peut être sauvé et relu
530
531 //! Indique si le type peut être subir une réduction
533
534 //! Indique si le type peut être subir une réduction Min/Max
536
537 //! Indique si le type est numérique
539
540 typedef Int128 BasicType;
541
542 static constexpr Int32 nbBasicType() { return 1; }
543
544 public:
545
546 //! Retourne le nom du type de la variable
547 static constexpr const char* typeName() { return "Int128"; }
548 //! Retourne le type de la variable
549 static constexpr eDataType type() { return DT_Int128; }
550 //! Ecrit dans la chaîne \a s la valeur de \a v
551 static void dumpValue(String& s, const Type& v) { builtInDumpValue(s, v); }
552 /*!
553 * \brief Stocke la conversion de la chaîne \a s en le type #Type dans \a v
554 * \retval true en cas d'échec,
555 * \retval false si la conversion est un succès
556 */
557 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
558
559 static bool verifDifferent(Type v1, Type v2, Type& diff,
560 [[maybe_unused]] bool is_nan_equal = false)
561 {
562 if (v1 != v2) {
563 if (math::isZero(v1))
564 diff = v1 - v2;
565 else
566 diff = (v1 - v2) / v1;
567 return true;
568 }
569 return false;
570 }
571};
572
573/*---------------------------------------------------------------------------*/
574/*---------------------------------------------------------------------------*/
575/*!
576 * \internal
577 * \brief Spécialisation de VariableDataTypeTraitsT pour le type <tt>String</tt>.
578 */
579template <>
580class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<String>
581{
582 public:
583
584 //! Type du paramètre template
585 typedef String Type;
586
587 //! Indique si le type peut être sauvé et relu
589
590 //! Indique si le type peut être subir une réduction
592
593 //! Indique si le type peut être subir une réduction Min/Max
595
596 //! Indique si le type est numérique
598
599 typedef String BasicType;
600
601 static constexpr Integer nbBasicType() { return 1; }
602
603 public:
604
605 //! Retourne le nom du type de la variable
606 static constexpr const char* typeName() { return "String"; }
607 //! Retourne le type de la variable
608 static constexpr eDataType type() { return DT_String; }
609 //! Ecrit dans la chaîne \a s la valeur de \a v
610 static void dumpValue(String& s, const Type& v) { s = v; }
611 /*!
612 * \brief Stocke la conversion de la chaîne \a s en le type #Type dans \a v
613 * \retval true en cas d'échec,
614 * \retval false si la conversion est un succès
615 */
616 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
617
618 static bool verifDifferent(const Type v1, const Type& v2, Type&,
619 [[maybe_unused]] bool is_nan_equal = false)
620 {
621 return (v1 != v2);
622 }
623 static const char* normeMax(const char* v)
624 {
625 return v;
626 }
627};
628
629/*---------------------------------------------------------------------------*/
630/*---------------------------------------------------------------------------*/
631/*!
632 * \internal
633 * \brief Spécialisation de VariableDataTypeTraitsT pour le type \c BFloat16.
634 */
635template <>
636class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<BFloat16>
637{
638 public:
639
640 //! Type du paramètre template
641 typedef BFloat16 Type;
642
643 //! Indique si le type peut être sauvé et relu
645
646 //! Indique si le type peut être subir une réduction
648
649 //! Indique si le type peut être subir une réduction Min/Max
651
652 //! Indique si le type est numérique
654
655 typedef BFloat16 BasicType;
656
657 static constexpr Integer nbBasicType() { return 1; }
658
659 public:
660
661 //! Retourne le nom du type de la variable
662 static constexpr const char* typeName() { return "BFloat16"; }
663 //! Retourne le type de la variable
664 static constexpr eDataType type() { return DT_BFloat16; }
665 //! Ecrit dans la chaîne \a s la valeur de \a v
666 static void dumpValue(String& s, const Type& v) { builtInDumpValue(s, v); }
667 /*!
668 * \brief Stocke la conversion de la chaîne \a s en le type #Type dans \a v
669 * \retval true en cas d'échec,
670 * \retval false si la conversion est un succès
671 */
672 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
673
674 static bool verifDifferent(float v1, float v2, BFloat16& diff, bool is_nan_equal = false)
675 {
676 if (is_nan_equal) {
677 // TODO: non supporté
678 return false;
679 }
680 if (v1 != v2) {
681 float fdiff = 0.0;
682 if (math::abs(v1)!=0.0)
683 fdiff = v1 - v2;
684 else
685 fdiff = (v1 - v2) / v1;
686 diff = static_cast<Type>(fdiff);
687 return true;
688 }
689 return false;
690 }
691
692 static Real normeMax(Real v)
693 {
694 return math::abs(v);
695 }
696};
697
698/*---------------------------------------------------------------------------*/
699/*---------------------------------------------------------------------------*/
700/*!
701 * \internal
702 * \brief Spécialisation de VariableDataTypeTraitsT pour le type \c Float16.
703 */
704template <>
705class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Float16>
706{
707 public:
708
709 //! Type du paramètre template
710 typedef Float16 Type;
711
712 //! Indique si le type peut être sauvé et relu
714
715 //! Indique si le type peut être subir une réduction
717
718 //! Indique si le type peut être subir une réduction Min/Max
720
721 //! Indique si le type est numérique
723
724 typedef Float16 BasicType;
725
726 static constexpr Integer nbBasicType() { return 1; }
727
728 public:
729
730 //! Retourne le nom du type de la variable
731 static constexpr const char* typeName() { return "Float16"; }
732 //! Retourne le type de la variable
733 static constexpr eDataType type() { return DT_Float16; }
734 //! Ecrit dans la chaîne \a s la valeur de \a v
735 static void dumpValue(String& s, const Type& v) { builtInDumpValue(s, v); }
736 /*!
737 * \brief Stocke la conversion de la chaîne \a s en le type #Type dans \a v
738 * \retval true en cas d'échec,
739 * \retval false si la conversion est un succès
740 */
741 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
742
743 static bool verifDifferent(float v1, float v2, Float16& diff, bool is_nan_equal = false)
744 {
745 if (is_nan_equal) {
746 // TODO: non supporté
747 return false;
748 }
749 if (v1 != v2) {
750 float fdiff = 0.0;
751 if (math::abs(v1)!=0.0)
752 fdiff = v1 - v2;
753 else
754 fdiff = (v1 - v2) / v1;
755 diff = static_cast<Type>(fdiff);
756 return true;
757 }
758 return false;
759 }
760
761 static Real normeMax(Real v)
762 {
763 return math::abs(v);
764 }
765};
766
767/*---------------------------------------------------------------------------*/
768/*---------------------------------------------------------------------------*/
769/*!
770 * \internal
771 * \brief Spécialisation de VariableDataTypeTraitsT pour le type \c Float32.
772 */
773template <>
774class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Float32>
775{
776 public:
777
778 //! Type du paramètre template
779 typedef Float32 Type;
780
781 //! Indique si le type peut être sauvé et relu
783
784 //! Indique si le type peut être subir une réduction
786
787 //! Indique si le type peut être subir une réduction Min/Max
789
790 //! Indique si le type est numérique
792
793 typedef Real BasicType;
794
795 static constexpr Integer nbBasicType() { return 1; }
796
797 public:
798
799 //! Retourne le nom du type de la variable
800 static constexpr const char* typeName() { return "Float32"; }
801 //! Retourne le type de la variable
802 static constexpr eDataType type() { return DT_Float32; }
803 //! Ecrit dans la chaîne \a s la valeur de \a v
804 static void dumpValue(String& s, const Type& v) { builtInDumpValue(s, v); }
805 /*!
806 * \brief Stocke la conversion de la chaîne \a s en le type #Type dans \a v
807 * \retval true en cas d'échec,
808 * \retval false si la conversion est un succès
809 */
810 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
811
812 static bool verifDifferent(Type v1, Type v2, Type& diff, bool is_nan_equal = false)
813 {
814 if (is_nan_equal) {
815 if (std::isnan(v1) && std::isnan(v2))
816 return false;
817 }
818 // Vérifie avant de les comparer que les deux nombres sont valides
819 // pour éviter une exception flottante sur certaines plates-formes
820 if (platform::isDenormalized(v1) || platform::isDenormalized(v2)) {
821 diff = 1.0;
822 return true;
823 }
824 if (v1 != v2) {
825 if (math::abs(v1) < 1.e-40)
826 diff = v1 - v2;
827 else
828 diff = (v1 - v2) / v1;
829 return true;
830 }
831 return false;
832 }
833
834 static Real normeMax(Real v)
835 {
836 return math::abs(v);
837 }
838};
839
840/*---------------------------------------------------------------------------*/
841/*---------------------------------------------------------------------------*/
842/*!
843 * \internal
844 * \brief Spécialisation de VariableDataTypeTraitsT pour le type <tt>Real2</tt>.
845 */
846template <>
847class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Real2>
848{
849 public:
850
851 //! Type du paramètre template
852 typedef Real2 Type;
853
854 //! Indique si le type peut être sauvé et relu
856
857 //! Indique si le type peut être subir une réduction
859
860 //! Indique si le type peut être subir une réduction Min/Max
862
863 //! Indique si le type est numérique
865
866 typedef Real BasicType;
867
868 static constexpr Integer nbBasicType() { return 2; }
869
870 private:
871
872 using SubTraits = VariableDataTypeTraitsT<Real>;
873
874 public:
875
876 //! Retourne le nom du type de la variable
877 static constexpr const char* typeName() { return "Real2"; }
878 //! Retourne le type de la variable
879 static constexpr eDataType type() { return DT_Real2; }
880 //! Ecrit dans la chaîne \a s la valeur de \a v
881 static void dumpValue(String& s, const Type&) { s = "N/A"; }
882 /*!
883 * \brief Stocke la conversion de la chaîne \a s en le type #Type dans \a v
884 * \retval true en cas d'échec,
885 * \retval false si la conversion est un succès
886 */
887 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
888
889 static bool verifDifferent(Real2 v1, Real2 v2, Real2& diff, bool is_nan_equal = false)
890 {
891 bool is_different = false;
892 is_different |= SubTraits::verifDifferent(v1.x, v2.x, diff.x, is_nan_equal);
893 is_different |= SubTraits::verifDifferent(v1.y, v2.y, diff.y, is_nan_equal);
894 return is_different;
895 }
896
897 static Real normeMax(const Real2& v)
898 {
899 Real vx = SubTraits::normeMax(v.x);
900 Real vy = SubTraits::normeMax(v.y);
901 return math::max(vx, vy);
902 }
903};
904
905/*---------------------------------------------------------------------------*/
906/*---------------------------------------------------------------------------*/
907/*!
908 * \internal
909 * \brief Spécialisation de VariableDataTypeTraitsT pour le type <tt>Real3</tt>.
910 */
911template <>
912class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Real3>
913{
914 public:
915
916 //! Type du paramètre template
917 typedef Real3 Type;
918
919 //! Indique si le type peut être sauvé et relu
921
922 //! Indique si le type peut être subir une réduction
924
925 //! Indique si le type peut être subir une réduction Min/Max
927
928 //! Indique si le type est numérique
930
931 typedef Real BasicType;
932
933 static constexpr Integer nbBasicType() { return 3; }
934
935 private:
936
937 using SubTraits = VariableDataTypeTraitsT<Real>;
938
939 public:
940
941 //! Retourne le nom du type de la variable
942 static constexpr const char* typeName() { return "Real3"; }
943 //! Retourne le type de la variable
944 static constexpr eDataType type() { return DT_Real3; }
945 //! Ecrit dans la chaîne \a s la valeur de \a v
946 static void dumpValue(String& s, const Type&) { s = "N/A"; }
947 /*!
948 * \brief Stocke la conversion de la chaîne \a s en le type #Type dans \a v
949 * \retval true en cas d'échec,
950 * \retval false si la conversion est un succès
951 */
952 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
953
954 static bool verifDifferent(Real3 v1, Real3 v2, Real3& diff, bool is_nan_equal = false)
955 {
956 bool is_different = false;
957 is_different |= SubTraits::verifDifferent(v1.x, v2.x, diff.x, is_nan_equal);
958 is_different |= SubTraits::verifDifferent(v1.y, v2.y, diff.y, is_nan_equal);
959 is_different |= SubTraits::verifDifferent(v1.z, v2.z, diff.z, is_nan_equal);
960 return is_different;
961 }
962
963 static Real normeMax(const Real3& v)
964 {
965 Real vx = SubTraits::normeMax(v.x);
966 Real vy = SubTraits::normeMax(v.y);
967 Real vz = SubTraits::normeMax(v.z);
968 return math::max(vx, math::max(vy, vz));
969 }
970};
971
972/*---------------------------------------------------------------------------*/
973/*---------------------------------------------------------------------------*/
974/*!
975 * \internal
976 * \brief Spécialisation de VariableDataTypeTraitsT pour le type <tt>Real3x3</tt>.
977 */
978template <>
979class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Real2x2>
980{
981 public:
982
983 //! Type du paramètre template
984 typedef Real2x2 Type;
985
986 //! Indique si le type peut être sauvé et relu
988
989 //! Indique si le type peut être subir une réduction
991
992 //! Indique si le type peut être subir une réduction Min/Max
994
995 //! Indique si le type est numérique
997
998 typedef Real BasicType;
999
1000 static constexpr Integer nbBasicType() { return 4; }
1001
1002 private:
1003
1004 using SubTraits = VariableDataTypeTraitsT<Real2>;
1005
1006 public:
1007
1008 //! Retourne le nom du type de la variable
1009 static constexpr const char* typeName() { return "Real2x2"; }
1010 //! Retourne le type de la variable
1011 static constexpr eDataType type() { return DT_Real2x2; }
1012 //! Ecrit dans la chaîne \a s la valeur de \a v
1013 static void dumpValue(String& s, const Type&) { s = "N/A"; }
1014 /*!
1015 * \brief Stocke la conversion de la chaîne \a s en le type #Type dans \a v
1016 * \retval true en cas d'échec,
1017 * \retval false si la conversion est un succès
1018 */
1019 static bool getValue(Type&, const String&) { return true; }
1020
1021 static bool verifDifferent(Real2x2 v1, Real2x2 v2, Real2x2& diff, bool is_nan_equal = false)
1022 {
1023 bool is_different = false;
1024 is_different |= SubTraits::verifDifferent(v1.x, v2.x, diff.x, is_nan_equal);
1025 is_different |= SubTraits::verifDifferent(v1.y, v2.y, diff.y, is_nan_equal);
1026 return is_different;
1027 }
1028
1029 static Real normeMax(const Real2x2& v)
1030 {
1031 Real vx = SubTraits::normeMax(v.x);
1032 Real vy = SubTraits::normeMax(v.y);
1033 return SubTraits::normeMax(Real2(vx, vy));
1034 }
1035};
1036
1037/*---------------------------------------------------------------------------*/
1038/*---------------------------------------------------------------------------*/
1039/*!
1040 * \internal
1041 * \brief Spécialisation de VariableDataTypeTraitsT pour le type <tt>Real3x3</tt>.
1042 */
1043template <>
1044class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Real3x3>
1045{
1046 public:
1047
1048 //! Type du paramètre template
1049 typedef Real3x3 Type;
1050
1051 //! Indique si le type peut être sauvé et relu
1053
1054 //! Indique si le type peut être subir une réduction
1056
1057 //! Indique si le type peut être subir une réduction Min/Max
1059
1060 //! Indique si le type est numérique
1062
1063 typedef Real BasicType;
1064
1065 static constexpr Integer nbBasicType() { return 9; }
1066
1067 private:
1068
1069 using SubTraits = VariableDataTypeTraitsT<Real3>;
1070
1071 public:
1072
1073 //! Retourne le nom du type de la variable
1074 static constexpr const char* typeName() { return "Real3x3"; }
1075 //! Retourne le type de la variable
1076 static constexpr eDataType type() { return DT_Real3x3; }
1077 //! Ecrit dans la chaîne \a s la valeur de \a v
1078 static void dumpValue(String& s, const Type&) { s = "N/A"; }
1079 /*!
1080 * \brief Stocke la conversion de la chaîne \a s en le type #Type dans \a v
1081 * \retval true en cas d'échec,
1082 * \retval false si la conversion est un succès
1083 */
1084 static bool getValue(Type&, const String&) { return true; }
1085
1086 static bool verifDifferent(Real3x3 v1, Real3x3 v2, Real3x3& diff, bool is_nan_equal = false)
1087 {
1088 bool is_different = false;
1089 is_different |= SubTraits::verifDifferent(v1.x, v2.x, diff.x, is_nan_equal);
1090 is_different |= SubTraits::verifDifferent(v1.y, v2.y, diff.y, is_nan_equal);
1091 is_different |= SubTraits::verifDifferent(v1.z, v2.z, diff.z, is_nan_equal);
1092 return is_different;
1093 }
1094
1095 static Real normeMax(const Real3x3& v)
1096 {
1097 Real vx = SubTraits::normeMax(v.x);
1098 Real vy = SubTraits::normeMax(v.y);
1099 Real vz = SubTraits::normeMax(v.z);
1100 return VariableDataTypeTraitsT<Real3>::normeMax(Real3(vx, vy, vz));
1101 }
1102};
1103
1104/*---------------------------------------------------------------------------*/
1105/*---------------------------------------------------------------------------*/
1106
1107} // namespace Arcane
1108
1109/*---------------------------------------------------------------------------*/
1110/*---------------------------------------------------------------------------*/
1111
1112#endif
Fichier contenant les définitions des types de données gérés par Arcane.
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
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
Real3 y
premier élément du triplet
Definition Real3x3.h:118
Real3 x
premier élément du triplet
Definition Real3x3.h:117
TrueType IsNumeric
Indique si le type est numérique.
static constexpr eDataType type()
Retourne le type de la variable.
BFloat16 Type
Type du paramètre template.
FalseType HasReduce
Indique si le type peut être subir une réduction.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
static void dumpValue(String &s, const Type &v)
Ecrit dans la chaîne s la valeur de v.
FalseType HasDump
Indique si le type peut être sauvé et relu.
FalseType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
static constexpr eDataType type()
Retourne le type de la variable.
TrueType IsNumeric
Indique si le type est numérique.
TrueType HasDump
Indique si le type peut être sauvé et relu.
FalseType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
static void dumpValue(String &s, const Type &v)
Ecrit dans la chaîne s la valeur de v.
Byte Type
Type du paramètre template.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
TrueType HasReduce
Indique si le type peut être subir une réduction.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
FalseType HasReduce
Indique si le type peut être subir une réduction.
static constexpr eDataType type()
Retourne le type de la variable.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
FalseType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
TrueType HasDump
Indique si le type peut être sauvé et relu.
TrueType IsNumeric
Indique si le type est numérique.
Float128 Type
Type du paramètre template.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
static void dumpValue(String &s, const Type &v)
Ecrit dans la chaîne s la valeur de v.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
static constexpr eDataType type()
Retourne le type de la variable.
FalseType HasDump
Indique si le type peut être sauvé et relu.
static void dumpValue(String &s, const Type &v)
Ecrit dans la chaîne s la valeur de v.
FalseType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
Float16 Type
Type du paramètre template.
TrueType IsNumeric
Indique si le type est numérique.
FalseType HasReduce
Indique si le type peut être subir une réduction.
Float32 Type
Type du paramètre template.
TrueType HasReduce
Indique si le type peut être subir une réduction.
FalseType HasDump
Indique si le type peut être sauvé et relu.
TrueType IsNumeric
Indique si le type est numérique.
static constexpr eDataType type()
Retourne le type de la variable.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
static void dumpValue(String &s, const Type &v)
Ecrit dans la chaîne s la valeur de v.
TrueType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
FalseType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
TrueType IsNumeric
Indique si le type est numérique.
Int128 Type
Type du paramètre template.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
static constexpr eDataType type()
Retourne le type de la variable.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
static void dumpValue(String &s, const Type &v)
Ecrit dans la chaîne s la valeur de v.
TrueType HasDump
Indique si le type peut être sauvé et relu.
FalseType HasReduce
Indique si le type peut être subir une réduction.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
TrueType IsNumeric
Indique si le type est numérique.
static void dumpValue(String &s, const Type &v)
Ecrit dans la chaîne s la valeur de v.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
static constexpr eDataType type()
Retourne le type de la variable.
TrueType HasReduce
Indique si le type peut être subir une réduction.
TrueType HasDump
Indique si le type peut être sauvé et relu.
TrueType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
TrueType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
static void dumpValue(String &s, const Type &v)
Ecrit dans la chaîne s la valeur de v.
TrueType HasDump
Indique si le type peut être sauvé et relu.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
static constexpr eDataType type()
Retourne le type de la variable.
TrueType IsNumeric
Indique si le type est numérique.
TrueType HasReduce
Indique si le type peut être subir une réduction.
TrueType HasReduce
Indique si le type peut être subir une réduction.
static constexpr eDataType type()
Retourne le type de la variable.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
TrueType HasDump
Indique si le type peut être sauvé et relu.
TrueType IsNumeric
Indique si le type est numérique.
TrueType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
static void dumpValue(String &s, const Type &v)
Ecrit dans la chaîne s la valeur de v.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
static void dumpValue(String &s, const Type &v)
Ecrit dans la chaîne s la valeur de v.
TrueType HasDump
Indique si le type peut être sauvé et relu.
TrueType IsNumeric
Indique si le type est numérique.
FalseType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
static constexpr eDataType type()
Retourne le type de la variable.
TrueType HasReduce
Indique si le type peut être subir une réduction.
TrueType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
TrueType HasReduce
Indique si le type peut être subir une réduction.
static constexpr eDataType type()
Retourne le type de la variable.
TrueType HasDump
Indique si le type peut être sauvé et relu.
static void dumpValue(String &s, const Type &)
Ecrit dans la chaîne s la valeur de v.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
TrueType IsNumeric
Indique si le type est numérique.
static constexpr eDataType type()
Retourne le type de la variable.
TrueType IsNumeric
Indique si le type est numérique.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
TrueType HasReduce
Indique si le type peut être subir une réduction.
TrueType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
Real2x2 Type
Type du paramètre template.
static bool getValue(Type &, const String &)
Stocke la conversion de la chaîne s en le type Type dans v.
TrueType HasDump
Indique si le type peut être sauvé et relu.
static void dumpValue(String &s, const Type &)
Ecrit dans la chaîne s la valeur de v.
static void dumpValue(String &s, const Type &)
Ecrit dans la chaîne s la valeur de v.
TrueType IsNumeric
Indique si le type est numérique.
TrueType HasReduce
Indique si le type peut être subir une réduction.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
static constexpr eDataType type()
Retourne le type de la variable.
TrueType HasDump
Indique si le type peut être sauvé et relu.
TrueType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
TrueType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
TrueType HasDump
Indique si le type peut être sauvé et relu.
static constexpr eDataType type()
Retourne le type de la variable.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
TrueType HasReduce
Indique si le type peut être subir une réduction.
static bool getValue(Type &, const String &)
Stocke la conversion de la chaîne s en le type Type dans v.
static void dumpValue(String &s, const Type &)
Ecrit dans la chaîne s la valeur de v.
TrueType IsNumeric
Indique si le type est numérique.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
static void dumpValue(String &s, const Type &v)
Ecrit dans la chaîne s la valeur de v.
static constexpr eDataType type()
Retourne le type de la variable.
TrueType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
TrueType IsNumeric
Indique si le type est numérique.
TrueType HasDump
Indique si le type peut être sauvé et relu.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
TrueType HasReduce
Indique si le type peut être subir une réduction.
FalseType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
static constexpr eDataType type()
Retourne le type de la variable.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
FalseType IsNumeric
Indique si le type est numérique.
TrueType HasDump
Indique si le type peut être sauvé et relu.
FalseType HasReduce
Indique si le type peut être subir une réduction.
static void dumpValue(String &s, const Type &v)
Ecrit dans la chaîne s la valeur de v.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
String Type
Type du paramètre template.
Type flottant demi-précision.
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
void builtInDumpValue(String &s, const DataType &v)
Ecriture dans la chaine s d'un type basique de valeur v.
Arccore::Int8 Int8
Type représentant un entier sur 8 bits.
float Float32
Type flottant IEEE-753 simple précision (binary32)
unsigned char Byte
Type d'un octet.
Definition UtilsTypes.h:148
eDataType
Type d'une donnée.
Definition DataTypes.h:39
@ DT_Float32
Donnée de type 'Float32'.
Definition DataTypes.h:52
@ DT_Int128
Donnée de type entier sur 128 bits.
Definition DataTypes.h:55
@ DT_Real2x2
Donnée de type tenseur 3x3.
Definition DataTypes.h:48
@ DT_Int16
Donnée de type entier 16 bits.
Definition DataTypes.h:42
@ DT_Int8
Donnée de type entier sur 8 bits.
Definition DataTypes.h:53
@ DT_Real3x3
Donnée de type tenseur 3x3.
Definition DataTypes.h:49
@ DT_Int32
Donnée de type entier 32 bits.
Definition DataTypes.h:43
@ DT_Real3
Donnée de type vecteur 3.
Definition DataTypes.h:47
@ DT_Float16
Donnée de type 'Float16'.
Definition DataTypes.h:51
@ DT_Int64
Donnée de type entier 64 bits.
Definition DataTypes.h:44
@ DT_Unknown
Donnée de type inconnue ou non initialisée.
Definition DataTypes.h:56
@ DT_String
Donnée de type chaîne de caractère UTF-8.
Definition DataTypes.h:45
@ DT_BFloat16
Donnée de type 'BFloat16'.
Definition DataTypes.h:50
@ DT_Real2
Donnée de type vecteur 2.
Definition DataTypes.h:46
@ DT_Real
Donnée de type réel.
Definition DataTypes.h:41
@ DT_Byte
Donnée de type octet.
Definition DataTypes.h:40
@ DT_Float128
Donnée de type flottant sur 128 bits.
Definition DataTypes.h:54
double Real
Type représentant un réel.
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