Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
VariableRefScalar.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/* VariableRefScalar.h (C) 2000-2020 */
9/* */
10/* Classe gérant une référence sur une variable scalaire. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_VARIABLEREFSCALAR_H
13#define ARCANE_VARIABLEREFSCALAR_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/VariableRef.h"
18#include "arcane/Parallel.h"
19#include "arcane/MathUtils.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane
25{
26
27class VariableFactoryRegisterer;
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31/*!
32 * \brief Référence à une variable scalaire.
33 *
34 * L'opérateur operator()() permet d'accéder à la valeur de la variable en
35 * lecture seulement. Pour modifier la valeur de la variable, il faut
36 * utiliser la méthode assign() ou l'opérateur operator=(). A noter que
37 * l'affectation provoque une mise à jour des références et peut s'avérer
38 * coûteuse.
39 */
40template<typename DataType>
42: public VariableRef
43{
44 public:
45
46 //! Type des éléments de la variable
47 typedef DataType ElementType;
48 //! Type de la classe de base
50
51 typedef VariableScalarT<DataType> PrivatePartType;
52
53 typedef VariableRefScalarT<DataType> ThatClass;
54
55 public:
56
57 //! Construit une référence à une variable scalaire spécifiée dans \a vb
58 explicit ARCANE_CORE_EXPORT VariableRefScalarT(const VariableBuildInfo& b);
59 //! Construit une référence à partir de \a rhs
60 ARCANE_CORE_EXPORT VariableRefScalarT(const VariableRefScalarT<DataType>& rhs);
61 //! Construit une référence à partir de \a var
62 explicit ARCANE_CORE_EXPORT VariableRefScalarT(IVariable* var);
63 //! Positionne la référence de l'instance à la variable \a rhs.
64 ARCANE_CORE_EXPORT void refersTo(const VariableRefScalarT<DataType>& rhs);
65
66#ifdef ARCANE_DOTNET
67 public:
68#else
69 protected:
70#endif
71
72 //! Constructeur vide
73 VariableRefScalarT() : m_private_part(nullptr) {}
74
75 public:
76
77 virtual bool isArrayVariable() const { return false; }
78 virtual Integer arraySize() const { return 0; }
79 virtual ARCANE_CORE_EXPORT void updateFromInternal();
80
81 public:
82
83 ArrayView<DataType> asArray() { return ArrayView<DataType>(1,&(m_private_part->value())); }
84 ConstArrayView<DataType> asArray() const { return ConstArrayView<DataType>(1,&(m_private_part->value())); }
85
86 public:
87
88 void operator=(const DataType& v) { assign(v); }
89 VariableRefScalarT<DataType>& operator=(const VariableRefScalarT<DataType>& v)
90 {
91 assign(v());
92 return (*this);
93 }
94
95 //! Réinitialise la variable avec sa valeur par défaut
96 void reset() { assign(DataType()); }
97
98 //! Valeur du scalaire
99 const DataType& operator()() const { return m_private_part->value(); }
100
101 //! Valeur du scalaire
102 const DataType& value() const { return m_private_part->value(); }
103
104 /*!
105 * \brief Compare la variable avec la valeur \a v.
106 */
107 bool isEqual(const DataType& v) const
108 { return math::isEqual(m_private_part->value(),v); }
109
110 /*!
111 * \brief Compare la variable avec la valeur 0.
112 * \sa isEqual().
113 */
114 bool isZero() const
115 { return math::isZero(m_private_part->value()); }
116
117 /*!
118 * \brief Compare la variable avec la valeur \a v.
119 *
120 * Pour un type flottant, la comparaison se fait à un epsilon près,
121 * défini dans float_info<T>::nearlyEpsilon().
122 */
123 bool isNearlyEqual(const DataType& v) const
124 { return math::isNearlyEqual(m_private_part->value(),v); }
125 /*!
126 * \brief Compare la variable avec la valeur 0.
127 * \sa isEqual().
128 */
129 bool isNearlyZero() const
130 { return math::isNearlyZero(m_private_part->value()); }
131
132 //! Affecte à la variable la valeur \a v
133 ARCANE_CORE_EXPORT void assign(const DataType& v);
134
135 //! Effectue une réduction de type \a type sur la variable
136 ARCANE_CORE_EXPORT void reduce(Parallel::eReduceType type);
137
138 ARCANE_CORE_EXPORT void swapValues(VariableRefScalarT<DataType>& rhs);
139
140 protected:
141
142 private:
143
144 PrivatePartType* m_private_part;
145
146 private:
147
148 static VariableFactoryRegisterer m_auto_registerer;
149 static VariableTypeInfo _buildVariableTypeInfo();
150 static VariableInfo _buildVariableInfo(const VariableBuildInfo& vbi);
151 static VariableRef* _autoCreate(const VariableBuildInfo& vb);
152};
153
154/*---------------------------------------------------------------------------*/
155/*---------------------------------------------------------------------------*/
156
157} // End namespace Arcane
158
159/*---------------------------------------------------------------------------*/
160/*---------------------------------------------------------------------------*/
161
162#endif
Paramètres nécessaires à la construction d'une variable.
Infos caractérisant une variable.
Référence à une variable scalaire.
void refersTo(const VariableRefScalarT< DataType > &rhs)
Positionne la référence de l'instance à la variable rhs.
const DataType & value() const
Valeur du scalaire.
void swapValues(VariableRefScalarT< DataType > &rhs)
Échange les valeurs de la variable rhs avec celles de l'instance.
virtual Integer arraySize() const
Si la variable est un tableau, retourne sa dimension, sinon retourne 0.
bool isNearlyZero() const
Compare la variable avec la valeur 0.
const DataType & operator()() const
Valeur du scalaire.
void reset()
Réinitialise la variable avec sa valeur par défaut.
VariableRefScalarT()
Constructeur vide.
bool isEqual(const DataType &v) const
Compare la variable avec la valeur v.
bool isNearlyEqual(const DataType &v) const
Compare la variable avec la valeur v.
void reduce(Parallel::eReduceType type)
Effectue une réduction de type type sur la variable.
VariableRef BaseClass
Type de la classe de base.
bool isZero() const
Compare la variable avec la valeur 0.
void assign(const DataType &v)
Affecte à la variable la valeur v.
virtual void updateFromInternal()
Mise à jour à partir de la partie interne.
DataType ElementType
Type des éléments de la variable.
Référence à une variable.
Definition VariableRef.h:56
Informations caractérisant le type d'une variable.
Vue modifiable d'un tableau d'un type T.
constexpr __host__ __device__ bool isNearlyEqual(const _Type &a, const _Type &b)
Teste si deux valeurs sont à un peu près égales. Pour les types entiers, cette fonction est équivalen...
Definition Numeric.h:212
constexpr __host__ __device__ bool isEqual(const _Type &a, const _Type &b)
Teste l'égalité bit à bit entre deux valeurs.
Definition Numeric.h:253
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
eReduceType
Types des réductions supportées.