Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
MeshVariableScalarRefT.H
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 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/* MeshVariableScalarRefT.H (C) 2000-2023 */
9/* */
10/* Variable scalaire du maillage. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/core/MeshVariableScalarRef.h"
15
16#include "arcane/core/ItemGroup.h"
17#include "arcane/core/VariableScalar.h"
18#include "arcane/core/VariableDataTypeTraits.h"
19#include "arcane/core/VariableTypeInfo.h"
20#include "arcane/core/VariableBuildInfo.h"
21#include "arcane/core/VariableInfo.h"
22#include "arcane/core/VariableFactoryRegisterer.h"
23#include "arcane/core/internal/IDataInternal.h"
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28namespace Arcane
29{
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33
34void ItemNumericOperation<Real>::
35add(VarType& out,const VarType& v,const ItemGroup& group)
36{
37 ENUMERATE_ITEM(iitem,group){
38 out[iitem] += v[iitem];
39 }
40}
41
42void ItemNumericOperation<Real>::
43sub(VarType& out,const VarType& v,const ItemGroup& group)
44{
45 ENUMERATE_ITEM(iitem,group){
46 out[iitem] -= v[iitem];
47 }
48}
49
50void ItemNumericOperation<Real>::
51mult(VarType& out,const VarType& v,const ItemGroup& group)
52{
53 ENUMERATE_ITEM(iitem,group){
54 out[iitem] *= v[iitem];
55 }
56}
57
58void ItemNumericOperation<Real>::
59mult(VarType& out,Real v,const ItemGroup& group)
60{
61 ENUMERATE_ITEM(iitem,group){
62 out[iitem] *= v;
63 }
64}
65
66void ItemNumericOperation<Real>::
67power(VarType& out,Real v,const ItemGroup& group)
68{
69 ENUMERATE_ITEM(iitem,group){
70 out[iitem] = math::pow(out[iitem],v);
71 }
72}
73
74/*---------------------------------------------------------------------------*/
75/*---------------------------------------------------------------------------*/
76
77template<typename DataType> VariableTypeInfo
78ItemVariableScalarRefT<DataType>::
79_internalVariableTypeInfo(eItemKind ik)
80{
81 eDataType dt = VariableDataTypeTraitsT<DataType>::type();
82 return VariableTypeInfo(ik,dt,1,0,false);
83}
84
85/*---------------------------------------------------------------------------*/
86/*---------------------------------------------------------------------------*/
87
88template<typename DataType> VariableInfo
89ItemVariableScalarRefT<DataType>::
90_internalVariableInfo(const VariableBuildInfo& vbi,eItemKind ik)
91{
92 VariableTypeInfo vti = _internalVariableTypeInfo(ik);
94 return VariableInfo(vbi.name(),vbi.itemFamilyName(),vbi.itemGroupName(),vbi.meshName(),vti,sti);
95}
97/*---------------------------------------------------------------------------*/
98/*---------------------------------------------------------------------------*/
99
100template<class DataTypeT>
103: PrivateVariableScalarT<DataTypeT>(vb,_internalVariableInfo(vb,ik))
104{
105 if (!vb.isNull()) {
106 this->_internalInit();
107 if (this->m_private_part->isPartial())
108 ARCANE_FATAL("Can not assign a partial variable to a full variable");
109 }
110}
111
112/*---------------------------------------------------------------------------*/
113/*---------------------------------------------------------------------------*/
114
115template<class DataTypeT>
118: PrivateVariableScalarT<DataTypeT>(var)
119{
120 this->_internalInit();
121 if (this->m_private_part->isPartial())
122 ARCANE_FATAL("Can not assign a partial variable to a full variable");
123}
124
125/*---------------------------------------------------------------------------*/
126/*---------------------------------------------------------------------------*/
127
128template<class DataTypeT>
134
135/*---------------------------------------------------------------------------*/
136/*---------------------------------------------------------------------------*/
137
138template<class DataTypeT> void
140fill(const DataTypeT& v)
141{
142 this->m_private_part->fill(v,this->m_private_part->itemGroup());
143}
144
145/*---------------------------------------------------------------------------*/
146/*---------------------------------------------------------------------------*/
147
148template<class DataTypeT> void
149ItemVariableScalarRefT<DataTypeT>::
150fill(const DataTypeT& value,const ItemGroup& group)
151{
152 ENUMERATE_ITEM(iitem,group){
153 operator[](iitem) = value;
154 }
155}
156
157/*---------------------------------------------------------------------------*/
158/*---------------------------------------------------------------------------*/
159
160template<typename DataTypeT> void
163{
164 ENUMERATE_ITEM(iitem,group){
165 operator[](iitem) = v[iitem];
166 }
167}
168
169/*---------------------------------------------------------------------------*/
170/*---------------------------------------------------------------------------*/
171
172template<typename DataTypeT> void
175{
176 if (!queue){
177 copy(v);
178 return;
179 }
180 impl::copyContiguousData(this->m_private_part->data(), v.m_private_part->data(), *queue);
181}
182
183/*---------------------------------------------------------------------------*/
184/*---------------------------------------------------------------------------*/
185
186template<class DataTypeT> void
188fill(const DataTypeT& v, RunQueue* queue)
189{
190 if (!queue){
191 fill(v);
192 return;
193 }
194 impl::fillContiguousData<DataTypeT>(this->m_private_part->data(), v, *queue);
195}
196
197/*---------------------------------------------------------------------------*/
198/*---------------------------------------------------------------------------*/
199
200template<class DataTypeT> void
203{
204 BaseClass::operator=(rhs);
205 this->m_private_part = rhs.m_private_part;
206 this->updateFromInternal();
207}
208
209/*---------------------------------------------------------------------------*/
210/*---------------------------------------------------------------------------*/
211
212/*---------------------------------------------------------------------------*/
213/*---------------------------------------------------------------------------*/
214
215template<class ItemType,class DataType> VariableFactoryRegisterer
217m_auto_registerer(_autoCreate,_internalVariableTypeInfo());
218
219/*---------------------------------------------------------------------------*/
220/*---------------------------------------------------------------------------*/
221
222template<typename ItemType,typename DataType> VariableInfo
225{
226 return BaseClass::_internalVariableInfo(vbi,ItemTraitsT<ItemType>::kind());
227}
228
229/*---------------------------------------------------------------------------*/
230/*---------------------------------------------------------------------------*/
232template<typename ItemType,typename DataType> VariableTypeInfo
235{
236 return BaseClass::_internalVariableTypeInfo(ItemTraitsT<ItemType>::kind());
237}
238
239/*---------------------------------------------------------------------------*/
240/*---------------------------------------------------------------------------*/
241
242template<class ItemType,class DataType>
245{
246 return new ThatClass(vb);
247}
248
249/*---------------------------------------------------------------------------*/
250/*---------------------------------------------------------------------------*/
251
252template<class ItemType,class DataTypeT>
255: ItemVariableScalarRefT<DataTypeT>(vb,ItemTraitsT<ItemType>::kind())
257}
258
259/*---------------------------------------------------------------------------*/
260/*---------------------------------------------------------------------------*/
261
262template<class ItemType,class DataTypeT>
268
269/*---------------------------------------------------------------------------*/
270/*---------------------------------------------------------------------------*/
271
272template<class ItemType,class DataTypeT>
275: ItemVariableScalarRefT<DataTypeT>(rhs)
276{
277 // Normalement, c'est à cette classe de faire l'initilisation mais
278 // comme cette classe est juste un wrapper autour de ItemVariableScalarRefT
279 // et ne fait rien d'autre, on laisse l'initialisation à la classe de base,
280 // ce qui permet de fabriquer de manière générique une variable sur
281 // une entité du maillage à partir de son genre.
282}
283
284/*---------------------------------------------------------------------------*/
285/*---------------------------------------------------------------------------*/
286
287template<class ItemType,class DataTypeT> void
293
294/*---------------------------------------------------------------------------*/
295/*---------------------------------------------------------------------------*/
296
297template<class ItemType,class DataTypeT>
298typename Arcane::MeshVariableScalarRefT<ItemType, DataTypeT>::GroupType
300itemGroup() const
301{
302 return GroupType(BaseClass::itemGroup());
303}
304
305/*---------------------------------------------------------------------------*/
306/*---------------------------------------------------------------------------*/
307
308template<class ItemType,class DataTypeT> void
310setIsSynchronized(const GroupType& group)
311{
312 this->m_private_part->setIsSynchronized(group);
313}
314
315/*---------------------------------------------------------------------------*/
316/*---------------------------------------------------------------------------*/
317
318template<class ItemType,class DataTypeT> void
319MeshVariableScalarRefT<ItemType,DataTypeT>::
320setIsSynchronized()
321{
322 this->m_private_part->setIsSynchronized();
323}
324
325/*---------------------------------------------------------------------------*/
326/*---------------------------------------------------------------------------*/
327/*!
328 * \brief Échange les valeurs de la variable \a rhs avec celles de l'instance.
329 *
330 * Cette méthode est optimisée pour éviter les recopie et donc l'échange
331 * se fait en temps constant. Les variables échangées doivent avoir le
332 * même maillage, la même famille et le même groupe. Elles doivent aussi
333 * être allouées (IVariable::setUsed()==true)
334 */
335template<class ItemType,class DataTypeT> void
338{
339 this->m_private_part->swapValues(*(rhs.m_private_part));
340}
341
342/*---------------------------------------------------------------------------*/
343/*---------------------------------------------------------------------------*/
344
345} // End namespace Arcane
346
347/*---------------------------------------------------------------------------*/
348/*---------------------------------------------------------------------------*/
#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.
Informations de type pour un conteneur de données.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
Variable scalaire sur un type d'entité du maillage.
void operator=(const ItemVariableScalarRefT< DataTypeT > &rhs)
Positionne la référence de l'instance à la variable rhs.
Variable scalaire sur un type d'entité du maillage.
GroupType itemGroup() const
Groupe associé à la grandeur.
void refersTo(const MeshVariableScalarRefT< ItemType, DataTypeT > &rhs)
Positionne la référence de l'instance à la variable rhs.
void swapValues(MeshVariableScalarRefT< ItemType, DataType > &rhs)
Échange les valeurs de la variable rhs avec celles de l'instance.
Classe de factorisation des variables scalaires sur des entités du maillage.
Paramètres nécessaires à la construction d'une variable.
Infos caractérisant une variable.
Référence à une variable.
Definition VariableRef.h:56
Informations caractérisant le type d'une variable.
DataStorageTypeInfo _internalDefaultDataStorage() const
Conteneur de donnée par défaut associé à ce type de variable.
__host__ __device__ double pow(double x, double y)
Fonction puissance.
Definition Math.h:166
-*- 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