Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
AnyItemVariable.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/* AnyItemVariable.h (C) 2000-2022 */
9/* */
10/* Variable aggrégée de types quelconques. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ANYITEMS_ANYITEMVARIABLE_H
13#define ARCANE_ANYITEMS_ANYITEMVARIABLE_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Exception.h"
18
19#include "arcane/anyitem/AnyItemGlobal.h"
20#include "arcane/anyitem/AnyItemGroup.h"
21#include "arcane/anyitem/AnyItemLinkFamily.h"
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arcane::AnyItem
27{
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
53template<typename DataType>
55{
56public:
57
62 {
63 public:
64
65 VariableAdder(Variable<DataType>& variable, const ItemGroup& group)
66 : m_variable(variable)
67 , m_group(group)
68 , m_used(false) {}
69
71 {
72 ARCANE_ASSERT((m_used == true),("VariableAdder never used"));
73 }
74
76 template<typename K, typename T>
78 {
79 ARCANE_ASSERT((m_used == false),("VariableAdder already used"));
80 m_variable._insertVariable(m_group,v.asArray());
81 m_variable._insertInternalVariable(m_group,v.variable());
82 m_used = true;
83 }
84
86 template<typename K, typename T>
88 {
89 ARCANE_ASSERT((m_used == false),("VariableAdder already used"));
90 m_variable._insertPartialVariable(m_group,v.asArray());
91 m_variable._insertInternalVariable(m_group,v.variable());
92 m_used = true;
93 }
94 private:
95
98
101
103 bool m_used;
104 };
105
106public:
107
108 Variable(const Family& family)
110 , m_values(m_family.groupSize())
111 , m_variables(m_family.groupSize())
112 {
113 // la famille enregistre les variables portées
115 for(Integer i = 0; i < m_family.groupSize(); ++i)
116 m_variables[i] = NULL;
117 }
118
119 Variable(const Variable& v)
120 : m_family(v.m_family)
121 , m_values(v.m_values)
123 {
124 // la famille enregistre les variables portées
126 }
127
128 ~Variable()
129 {
130 // la famille désenregistre la variable
132 }
133
135 inline DataType& operator[](const Group::BlockItemEnumerator& item) {
136 return m_values[item.groupIndex()][item.varIndex()];
137 }
138
140 inline const DataType& operator[](const Group::BlockItemEnumerator & item) const {
141 return m_values[item.groupIndex()][item.varIndex()];
142 }
143
145 inline DataType& operator[](const LinkFamily::LinkData & item) {
146 return m_values[item.groupIndex()][item.varIndex()];
147 }
148
150 inline const DataType& operator[](const LinkFamily::LinkData & item) const {
151 return m_values[item.groupIndex()][item.varIndex()];
152 }
153
155 inline VariableAdder operator[](const ItemGroup& group)
156 {
157 return VariableAdder(*this,group);
158 }
159
160 template<typename T>
161 inline VariableAdder operator[](const ItemGroupT<T>& group)
162 {
163 return VariableAdder(*this,group);
164 }
165
167 inline const Family& family() const { return m_family; }
168
171 {
172 return m_variables;
173 }
174
177 {
178 return m_values[igrp];
179 }
180
182 inline ConstArrayView<DataType> valuesAtGroup(const Integer igrp) const
183 {
184 return m_values[igrp];
185 }
186
189 // Si la famille change, on invalide les variables et on retaille
190 m_values.resize(m_family.groupSize());
192 for(Integer i = 0; i < m_family.groupSize(); ++i)
193 m_variables[i] = NULL;
194 }
195
198 // Si la famille est agrandie, on retaille simplement
199 const Integer old_size = m_values.size();
200 ARCANE_ASSERT((old_size < m_family.groupSize()),("Old size greater than new size!"));
201 m_values.resize(m_family.groupSize());
203 for(Integer i = old_size; i < m_family.groupSize(); ++i)
204 m_variables[i] = NULL;
205 }
206
207private:
208
209 inline void _insertVariable(ItemGroup group, ArrayView<DataType> v)
210 {
211 if(m_family.isPartial(group))
212 throw FatalErrorException(String::format("Group '{0}' defined partial",group.name()));
213 m_values[m_family.groupIndex(group)] = v;
214 }
215
216 inline void _insertPartialVariable(ItemGroup group, ArrayView<DataType> v)
217 {
218 if(not m_family.isPartial(group))
219 throw FatalErrorException(String::format("Group '{0}' not defined partial",group.name()));
220 m_values[m_family.groupIndex(group)] = v;
221 }
222
223 inline void _insertInternalVariable(ItemGroup group, IVariable* v)
224 {
225 m_variables[m_family.groupIndex(group)] = v;
226 }
227
228private:
229
232
235
238};
239
240/*---------------------------------------------------------------------------*/
241/*---------------------------------------------------------------------------*/
242
243} // End namespace Arcane::AnyItem
244
245/*---------------------------------------------------------------------------*/
246/*---------------------------------------------------------------------------*/
247
248#endif /* ARCANE_ANYITEMS_ANYITEMVARIABLE_H */
Famille AnyItem (pattern flyweight) Aggrégation de groupes pour décrire des variables / variables par...
bool isPartial(const ItemGroup &group) const
retourne vrai si le groupe est associé à une variable partielle
void removeObserver(IFamilyObserver &observer) const
Supprime un observeur.
Integer groupSize() const
Taille de la famille, ie nombre de groupes.
void registerObserver(IFamilyObserver &observer) const
Enregistre un observeur.
Integer groupIndex(const ItemGroup &group) const
Position du groupe dans la famille.
Enumérateur d'un bloc d'items.
Integer varIndex() const
localId() de l'entité courante.
Integer groupIndex() const
Index dans la AnyItem::Family du groupe en cours.
Outil pour l'ajout de variable à un groupe.
Variable< DataType > & m_variable
Variable AnyItem.
void operator<<(MeshVariableScalarRefT< K, T > &v)
Liaison d'un variable.
void operator<<(MeshPartialVariableScalarRefT< K, T > &v)
Liaison d'une variable partielle.
const ItemGroup & m_group
Groupe de la variable.
bool m_used
Indicateur sur l'utilisation du Adder.
Variable aggrégée de types quelconques (pas de variables tableaux)
VariableAdder operator[](const ItemGroup &group)
Ajout d'une variable pour un groupe.
void notifyFamilyIsInvalidate()
Notification d'invalidation de la famille.
ArrayView< DataType > valuesAtGroup(const Integer igrp)
Doonnées brutes associées à un groupe identifié relativement à sa famille.
ConstArrayView< IVariable * > variables() const
Tableau des variables.
const DataType & operator[](const Group::BlockItemEnumerator &item) const
Accesseur direct par un enumerateur AnyItem.
Arcane::UniqueArray< IVariable * > m_variables
Conteneur des variables.
ConstArrayView< DataType > valuesAtGroup(const Integer igrp) const
Doonnées brutes associées à un groupe identifié relativement à sa famille.
const DataType & operator[](const LinkFamily::LinkData &item) const
Accesseur direct par un élément de LinkFamily (LinkData)
DataType & operator[](const LinkFamily::LinkData &item)
Accesseur direct par un élément de LinkFamily (LinkData)
const Family & family() const
Accesseur à la famille.
Arcane::UniqueArray< ArrayView< DataType > > m_values
Conteneur des variables génériques.
void notifyFamilyIsIncreased()
Notification d'aggrandissement de la famille.
DataType & operator[](const Group::BlockItemEnumerator &item)
Accesseur direct par un enumerateur AnyItem.
const Family m_family
Famille AnyItem des groupes.
Interface d'observeurs de famille AnyItem.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
const String & name() const
Nom du groupe.
Definition ItemGroup.h:76
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Integer varIndex() const
Identifiant localId de l'item référencé dans sa famille IItemFamily d'origine.
Integer groupIndex() const
Identifiant du groupe auquel est associé l'item référencé par ce LinkData.
Instance d'une variable.
Definition Variable.h:79
Exception lorsqu'une erreur fatale est survenue.
void arcaneCallFunctionAndTerminateIfThrow(std::function< void()> function)