Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
MeshVariableArrayRefT.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/* MeshVariableArrayRefT.H (C) 2000-2024 */
9/* */
10/* Variable vectorielle du maillage. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/core/MeshVariableArrayRef.h"
15
16#include "arcane/utils/ValueConvert.h"
17#include "arcane/utils/FatalErrorException.h"
18
19#include "arcane/core/ItemGroup.h"
20#include "arcane/core/VariableDataTypeTraits.h"
21#include "arcane/core/VariableTypeInfo.h"
22#include "arcane/core/VariableBuildInfo.h"
23#include "arcane/core/VariableInfo.h"
24#include "arcane/core/VariableFactoryRegisterer.h"
25#include "arcane/core/internal/IDataInternal.h"
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30namespace Arcane
31{
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
36template<typename DataType> VariableTypeInfo
37ItemVariableArrayRefT<DataType>::
38_internalVariableTypeInfo(eItemKind ik)
39{
40 eDataType dt = VariableDataTypeTraitsT<DataType>::type();
41 return VariableTypeInfo(ik,dt,2,0,false);
42}
43
44/*---------------------------------------------------------------------------*/
45/*---------------------------------------------------------------------------*/
46
47template<typename DataType> VariableInfo
48ItemVariableArrayRefT<DataType>::
49_internalVariableInfo(const VariableBuildInfo& vbi,eItemKind ik)
50{
51 VariableTypeInfo vti = _internalVariableTypeInfo(ik);
52 DataStorageTypeInfo sti = vti._internalDefaultDataStorage();
53 return VariableInfo(vbi.name(),vbi.itemFamilyName(),vbi.itemGroupName(),vbi.meshName(),vti,sti);
54}
56/*---------------------------------------------------------------------------*/
57/*---------------------------------------------------------------------------*/
59template<class DataType>
62: PrivateVariableArrayT<DataType>(vb,_internalVariableInfo(vb,ik))
63{
64 if (!vb.isNull()) {
65 this->_internalInit();
66 if (this->m_private_part->isPartial())
67 ARCANE_FATAL("Can not assign a partial variable to a full variable");
68 }
69}
70
71/*---------------------------------------------------------------------------*/
72/*---------------------------------------------------------------------------*/
73
74template<class DataType> ItemVariableArrayRefT<DataType>::
76: PrivateVariableArrayT<DataType>(var)
77{
78 this->_internalInit();
79 if (this->m_private_part->isPartial())
80 ARCANE_FATAL("Can not assign a partial variable to a full variable");
81}
82
83/*---------------------------------------------------------------------------*/
84/*---------------------------------------------------------------------------*/
86template<class DataType> ItemVariableArrayRefT<DataType>::
88: PrivateVariableArrayT<DataType>(rhs)
89{
90 if (this->m_private_part)
91 this->updateFromInternal();
92}
94/*---------------------------------------------------------------------------*/
95/*---------------------------------------------------------------------------*/
96
97template <class DataType> ItemVariableArrayRefT<DataType>&
100{
101 if (this != &rhs) {
102 BaseClass::operator=(rhs);
103 if (this->m_private_part) {
104 this->m_private_part = rhs.m_private_part;
105 this->updateFromInternal();
106 }
107 }
108 return (*this);
109}
110
111/*---------------------------------------------------------------------------*/
112/*---------------------------------------------------------------------------*/
113
114/*---------------------------------------------------------------------------*/
115/*---------------------------------------------------------------------------*/
116
117template<class ItemType,class DataType> VariableFactoryRegisterer
119m_auto_registerer(_autoCreate,_internalVariableTypeInfo());
120
121/*---------------------------------------------------------------------------*/
122/*---------------------------------------------------------------------------*/
123
124template<typename ItemType,typename DataType> VariableTypeInfo
127{
130 return VariableTypeInfo(ik,dt,2,0,false);
131}
132
133/*---------------------------------------------------------------------------*/
134/*---------------------------------------------------------------------------*/
135
136template<typename ItemType,typename DataType> VariableInfo
137MeshVariableArrayRefT<ItemType,DataType>::
138_internalVariableInfo(const VariableBuildInfo& vbi)
139{
140 VariableTypeInfo vti = _internalVariableTypeInfo();
141 DataStorageTypeInfo sti = vti._internalDefaultDataStorage();
142 return VariableInfo(vbi.name(),vbi.itemFamilyName(),vbi.itemGroupName(),vbi.meshName(),vti,sti);
143}
145/*---------------------------------------------------------------------------*/
146/*---------------------------------------------------------------------------*/
147
148template<class ItemType,class DataType> VariableRef*
151
152{
153 return new ThatClass(vb);
154}
155
156/*---------------------------------------------------------------------------*/
157/*---------------------------------------------------------------------------*/
158
159template<class ItemType,class DataType>
162: ItemVariableArrayRefT<DataType>(vb,ItemTraitsT<ItemType>::kind())
163{
164 // Normalement, c'est à cette classe de faire l'initilisation mais
165 // comme cette classe est juste un wrapper autour de ItemVariableArrayRefT
166 // et ne fait rien d'autre, on laisse l'initialisation à la classe de base,
167 // ce qui permet de fabriquer de manière générique une variable sur
168 // une entité du maillage à partir de son genre.
169}
170
171/*---------------------------------------------------------------------------*/
172/*---------------------------------------------------------------------------*/
173
174template<class ItemType,class DataType>
177: ItemVariableArrayRefT<DataType>(var)
178{
179 // Normalement, c'est à cette classe de faire l'initilisation mais
180 // comme cette classe est juste un wrapper autour de ItemVariableArrayRefT
181 // et ne fait rien d'autre, on laisse l'initialisation à la classe de base,
182 // ce qui permet de fabriquer de manière générique une variable sur
183 // une entité du maillage à partir de son genre.
184}
185
186/*---------------------------------------------------------------------------*/
187/*---------------------------------------------------------------------------*/
188
189template<class ItemType,class DataType>
192: ItemVariableArrayRefT<DataType>(rhs)
193{
194 // Normalement, c'est à cette classe de faire l'initilisation mais
195 // comme cette classe est juste un wrapper autour de ItemVariableArrayRefT
196 // et ne fait rien d'autre, on laisse l'initialisation à la classe de base,
197 // ce qui permet de fabriquer de manière générique une variable sur
198 // une entité du maillage à partir de son genre.
199}
200
201/*---------------------------------------------------------------------------*/
202/*---------------------------------------------------------------------------*/
203
204template<class ItemType,class DataType>
205void
211
212/*---------------------------------------------------------------------------*/
213/*---------------------------------------------------------------------------*/
214
215/*---------------------------------------------------------------------------*/
216/*---------------------------------------------------------------------------*/
217
218template<class ItemType,class DataType>
219typename Arcane::MeshVariableArrayRefT<ItemType, DataType>::GroupType
221itemGroup() const
222{
223 return GroupType(this->m_private_part->itemGroup());
224}
225
226/*---------------------------------------------------------------------------*/
227/*---------------------------------------------------------------------------*/
228
229template<class DataType>
231fill(const DataType& v)
232{
233 this->fill(v,this->itemGroup());
234}
235
236/*---------------------------------------------------------------------------*/
237/*---------------------------------------------------------------------------*/
238
239template<class DataType>
241fill(const DataType& value,const ItemGroup& group)
242{
243 ENUMERATE_ITEM(iitem,group){
244 operator[](iitem).fill(value);
245 }
246}
247
248/*---------------------------------------------------------------------------*/
249/*---------------------------------------------------------------------------*/
250
251template<typename DataType>
254{
255 this->copy(v,this->itemGroup());
256}
257
258/*---------------------------------------------------------------------------*/
259/*---------------------------------------------------------------------------*/
260
261template<typename DataType>
264{
265 ENUMERATE_ITEM(iitem,group){
266 operator[](iitem).copy(v[iitem]);
267 }
268}
269
270/*---------------------------------------------------------------------------*/
271/*---------------------------------------------------------------------------*/
272
273template<typename DataTypeT> void
276{
277 if (!queue){
278 copy(v);
279 return;
280 }
281 impl::copyContiguousData(this->m_private_part->data(), v.m_private_part->data(), *queue);
282}
283
284/*---------------------------------------------------------------------------*/
285/*---------------------------------------------------------------------------*/
286
287template<typename DataTypeT> void
289fill(const DataTypeT& v,RunQueue* queue)
290{
291 if (!queue){
292 fill(v);
293 return;
294 }
295 impl::fillContiguousData(this->m_private_part->data(), v, *queue);
296}
297
298/*---------------------------------------------------------------------------*/
299/*---------------------------------------------------------------------------*/
300/*!
301 * \brief Échange les valeurs de la variable \a rhs avec celles de l'instance.
302 *
303 * Cette méthode est optimisée pour éviter les recopie et donc l'échange
304 * se fait en temps constant. Les variables échangées doivent avoir le
305 * même maillage, la même famille et le même groupe. Elles doivent aussi
306 * être allouées (IVariable::setUsed()==true)
307 */
308template<class ItemType,class DataTypeT> void
311{
312 this->m_private_part->swapValues(*(rhs.m_private_part));
313}
314
315/*---------------------------------------------------------------------------*/
316/*---------------------------------------------------------------------------*/
317
318} // End namespace Arcane
319
320/*---------------------------------------------------------------------------*/
321/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ENUMERATE_ITEM(name, group)
Enumérateur générique d'un groupe de noeuds.
File d'exécution pour un accélérateur.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
Variable tableau sur un type d'entité du maillage.
void copy(const ItemVariableArrayRefT< DataType > &v)
Copie les valeurs de v dans cette variable.
ItemVariableArrayRefT(const VariableBuildInfo &b, eItemKind ik)
Construit une référence à la variable spécifiée dans vb.
ItemVariableArrayRefT< DataType > & operator=(const ItemVariableArrayRefT< DataType > &rhs)
Positionne la référence de l'instance à la variable rhs.
void fill(const DataType &value)
Remplit la variable avec la valeur value.
Variable tableau sur un type d'entité du maillage.
GroupType itemGroup() const
Groupe associé à la grandeur.
void swapValues(MeshVariableArrayRefT< ItemType, DataType > &rhs)
Échange les valeurs de la variable rhs avec celles de l'instance.
void refersTo(const MeshVariableArrayRefT< ItemType, DataType > &rhs)
Positionne la référence de l'instance à la variable rhs.
MeshVariableArrayRefT(const VariableBuildInfo &b)
Construit une référence à la variable spécifiée dans vb.
Classe de factorisation des variables scalaires sur des entités du maillage.
Paramètres nécessaires à la construction d'une variable.
Référence à une variable.
Definition VariableRef.h:56
Informations caractérisant le type d'une variable.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
eItemKind
Genre d'entité de maillage.
eDataType
Type d'une donnée.
Definition DataTypes.h:39