Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ItemSharedInfoList.cc
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/* ItemSharedInfoList.cc (C) 2000-2022 */
9/* */
10/* Liste de 'ItemSharedInfo'. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/FatalErrorException.h"
15#include "arcane/utils/ITraceMng.h"
16
17#include "arcane/ISubDomain.h"
18#include "arcane/IMesh.h"
19#include "arcane/IMeshSubMeshTransition.h"
20#include "arcane/VariableTypes.h"
21
22#include "arcane/mesh/ItemSharedInfoList.h"
23#include "arcane/mesh/ItemFamily.h"
24
25#include <map>
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30namespace Arcane::mesh
31{
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
36ItemSharedInfoWithType::
37ItemSharedInfoWithType(ItemSharedInfo* shared_info,ItemTypeInfo* item_type)
38: m_shared_info(shared_info)
39, m_type_id(item_type->typeId())
40{
41}
42
43ItemSharedInfoWithType::
44ItemSharedInfoWithType(ItemSharedInfo* shared_info,ItemTypeInfo* item_type,Int32ConstArrayView buffer)
45: m_shared_info(shared_info)
46, m_type_id(item_type->typeId())
47{
48 // La taille du buffer dépend des versions de Arcane.
49 // Avant la 3.2 (Octobre 2021), la taille du buffer est 9 (non AMR) ou 13 (AMR)
50 // Entre la 3.2 et la 3.6 (Mai 2022), la taille vaut toujours 13
51 // A partir de la 3.6, la taille vaut 6.
52 //
53 // On ne cherche pas à faire de reprise avec des versions
54 // de Arcane antérieures à 3.2 donc on peut supposer que la taille
55 // du buffer vaut 13. Ces versions utilisent la nouvelle connectivité
56 // et donc le nombre des éléments est toujours 0 (ainsi que les *allocated)
57 // sauf pour m_nb_node.
58 //
59 // A partir de la 3.6, le nombre de noeuds n'est plus utilisé non
60 // plus et vaut toujours 0. On pourra donc pour les versions de fin
61 // 2022 supprimer ces champs de ItemSharedInfo.
62
63 // TODO: Indiquer qu'à partir de la version 3.7 on ne supporte
64 // que buf_size==6 avec le numéro de version 0x0307
65 Int32 buf_size = buffer.size();
66 if (buf_size!=6)
67 ARCANE_FATAL("Invalid buf size '{0}'. This is probably because your checkpoint is from a version of Arcane which is too old (before 3.6)",
68 buf_size);
69 m_index = buffer[2];
70 m_nb_reference = buffer[3];
71}
72
73/*---------------------------------------------------------------------------*/
74/*---------------------------------------------------------------------------*/
75
76void ItemSharedInfoWithType::
77serializeWrite(Int32ArrayView buffer)
78{
79 buffer[0] = m_type_id; // Doit toujours être le premier
80
81 buffer[1] = 0x0307; // Numéro de version (3.7).
82
83 buffer[2] = m_index;
84 buffer[3] = m_nb_reference;
85
86 buffer[4] = 0; // Réservé
87 buffer[5] = 0; // Réservé
88}
89
90/*---------------------------------------------------------------------------*/
91/*---------------------------------------------------------------------------*/
92
93/*---------------------------------------------------------------------------*/
94/*---------------------------------------------------------------------------*/
95
97{
98 public:
99
100 explicit ItemNumElements(Integer type)
101 : m_type(type) {}
102
103 public:
104
105 static bool m_debug;
106
107 Integer m_type;
108
109 bool operator<(const ItemNumElements& b) const
110 {
111#ifdef ARCANE_CHECK
112 if (m_debug){
113 cout << "Compare:\nTHIS=";
114 print(cout);
115 cout << "\nTO=";
116 b.print(cout);
117 cout << "\nVAL=" << compare(b);
118 cout << "\n";
119 }
120#endif
121 return compare(b);
122 }
123 private:
124 inline bool compare(const ItemNumElements& b) const
125 {
126 return m_type<b.m_type;
127 }
128 public:
129 void print(std::ostream& o) const
130 {
131 o << " Type=" << m_type;
132 }
133};
134
135/*---------------------------------------------------------------------------*/
136/*---------------------------------------------------------------------------*/
137
138bool ItemSharedInfoList::ItemNumElements::m_debug = false;
139
140/*---------------------------------------------------------------------------*/
141/*---------------------------------------------------------------------------*/
142
143std::ostream& operator<<(std::ostream& o,const ItemSharedInfoList::ItemNumElements& v)
144{
145 v.print(o);
146 return o;
147}
148
149/*---------------------------------------------------------------------------*/
150/*---------------------------------------------------------------------------*/
151
153{
154 public:
155 Variables(IMesh* mesh,const String& name)
156 : m_infos_values(VariableBuildInfo(mesh,name)){}
157 public:
158 VariableArray2Int32 m_infos_values;
159};
160
161/*---------------------------------------------------------------------------*/
162/*---------------------------------------------------------------------------*/
163
164/*---------------------------------------------------------------------------*/
165/*---------------------------------------------------------------------------*/
166
167ItemSharedInfoList::
168ItemSharedInfoList(ItemFamily* family,ItemSharedInfo* common_shared_info)
169: TraceAccessor(family->traceMng())
170, m_family(family)
171, m_common_item_shared_info(common_shared_info)
172, m_item_kind(family->itemKind())
173, m_item_shared_infos_buffer(new MultiBufferT<ItemSharedInfoWithType>(100))
174, m_infos_map(new ItemSharedInfoMap())
175{
176 {
177 String var_name(family->name());
178 var_name = var_name + "_SharedInfoList";
179 m_variables = new Variables(family->mesh(),var_name);
180 }
181}
182
183/*---------------------------------------------------------------------------*/
184/*---------------------------------------------------------------------------*/
185
188{
189 delete m_variables;
190 delete m_infos_map;
191 delete m_item_shared_infos_buffer;
192}
193
194/*---------------------------------------------------------------------------*/
195/*---------------------------------------------------------------------------*/
196
197void ItemSharedInfoList::
198prepareForDump()
199{
200 Integer n = m_item_shared_infos.size();
201 info(4) << "ItemSharedInfoList: write: " << m_family->name()
202 << " count=" << n << " changed=" << m_list_changed;
203 log() << "ItemSharedInfoList: write: " << m_family->name()
204 << " count=" << n << " changed=" << m_list_changed;
205
206 if (!m_list_changed)
207 return;
208 m_list_changed = false;
209 //Integer n = m_item_shared_infos.size();
210 Integer element_size = ItemSharedInfoWithType::serializeSize();
211 m_variables->m_infos_values.resize(n,element_size);
212 for( Integer i=0; i<n; ++i ){
213 m_item_shared_infos[i]->serializeWrite(m_variables->m_infos_values[i]);
214 // if (i<20 && m_family->itemKind()==IK_Particle){
215 // ItemSharedInfo* isi = m_item_shared_infos[i];
216 // log() << "FAMILY" << m_family->name() << " ISI: i=" << i << " values=" << *isi;
217 // info() << "FAMILY" << m_family->name() << "ISI: i=" << i << " values=" << *isi;
218 // }
219 }
220}
221
222/*---------------------------------------------------------------------------*/
223/*---------------------------------------------------------------------------*/
224
225void ItemSharedInfoList::
226readFromDump()
227{
228 Integer element_size = ItemSharedInfoWithType::serializeSize();
229 Integer n = m_variables->m_infos_values.dim1Size();
230 info() << "ItemSharedInfoList: read: " << m_family->name() << " count=" << n;
231
232 if (n>0){
233 // Le nombre d'éléments sauvés dépend de la version de Arcane et du fait
234 // qu'on utilise ou pas l'AMR.
235 Integer stored_size = m_variables->m_infos_values[0].size();
236 if (stored_size==ItemSharedInfoWithType::serializeSize()){
237 }
238 else if (stored_size!=element_size){
239 // On ne peut relire que les anciennes versions (avant la 3.6)
240 // dont la taille vaut 13 (avec AMR) ou 9 (sans AMR) ce qui correspond
241 // aux versions de Arcane de 2021.
242 if (stored_size!=13 && stored_size!=9)
243 ARCANE_FATAL("Incoherence of saved data (most probably due to a"
244 " difference of versions between the protection and the executable."
245 " stored_size={0} element_size={1} count={2}",
246 stored_size,element_size,n);
247 }
248 }
249
250 // Tous les types vont a nouveau être ajoutés à la liste
251 m_item_shared_infos.clear();
252 m_infos_map->clear();
253
254 if (n==0)
255 return;
256
257 for( Integer i=0; i<n; ++i )
258 allocOne();
259
260 ItemTypeMng* itm = m_family->mesh()->itemTypeMng();
261 for( Integer i=0; i<n; ++i ){
262 Int32ConstArrayView buffer(m_variables->m_infos_values[i]);
263 // Le premier élément du tampon contient toujours le type de l'entité
264 ItemTypeInfo* it = itm->typeFromId(buffer[0]);
265 ItemSharedInfoWithType* isi = m_item_shared_infos[i];
266 *isi = ItemSharedInfoWithType(m_common_item_shared_info,it,buffer);
267
268 ItemNumElements ine(it->typeId());
269 std::pair<ItemSharedInfoMap::iterator,bool> old = m_infos_map->insert(std::make_pair(ine,isi));
270 if (!old.second){
271 // Vérifie que l'instance ajoutée ne remplace pas une instance déjà présente,
272 // auquel il s'agit d'une erreur interne (opérateur de comparaison foireux)
273 dumpSharedInfos();
274 ItemNumElements::m_debug = true;
275 bool compare = m_infos_map->find(ine)!=m_infos_map->end();
276 fatal() << "INTERNAL: ItemSharedInfoList::readfromDump(): SharedInfo already present family=" << m_family->name()
277 << "\nWanted:"
278 << " type=" << it->typeId()
279 << " compare=" << compare
280 << "\nNEW_INE=(" << ine << ")"
281 << "\nOLD_INE=(" << old.first->first << ")"
282 << "\nNEW_ISI=(" << *isi << ")"
283 << "\nOLD_ISI=(" << *old.first->second << ")";
284 }
285 }
286}
287
288/*---------------------------------------------------------------------------*/
289/*---------------------------------------------------------------------------*/
290
293{
294 bool has_error = false;
295
296 info() << "ItemSharedInfoList: check valid family=" << m_family->name()
297 << " count=" << m_nb_item_shared_info
298 << " list=" << m_item_shared_infos.size()
299 << " free=" << m_free_item_shared_infos.size()
300 << " changed=" << m_list_changed;
301
302 // Premièrement, le item->localId() doit correspondre à l'indice
303 // dans le tableau m_internal
304 for( Integer i=0, n=m_item_shared_infos.size(); i<n; ++i ){
305 ItemSharedInfoWithType* item = m_item_shared_infos[i];
306 if (item->index()!=i){
307 error() << "The index (" << item->index() << ") from the list 'ItemSharedInfo' "
308 << "of the family " << m_family->name() << " is not "
309 << "coherent with its internal value (" << i << ")";
310 has_error = true;
311 }
312 }
313 if (has_error)
314 ARCANE_FATAL("Internal error with the mesh structure");
315}
316
317/*---------------------------------------------------------------------------*/
318/*---------------------------------------------------------------------------*/
319
320ItemSharedInfoWithType* ItemSharedInfoList::
321findSharedInfo(ItemTypeInfo* type)
322{
323 ItemNumElements ine(type->typeId());
324 ItemSharedInfoMap::const_iterator i = m_infos_map->find(ine);
325 if (i!=m_infos_map->end())
326 return i->second;
327 // Infos pas trouvé. On en construit une nouvelle
328 ItemSharedInfoWithType* isi = allocOne();
329 Integer old_index = isi->index();
330 *isi = ItemSharedInfoWithType(m_common_item_shared_info,type);
331 isi->setIndex(old_index);
332 std::pair<ItemSharedInfoMap::iterator,bool> old = m_infos_map->insert(std::make_pair(ine,isi));
333
334 //#ifdef ARCANE_CHECK
335 if (!old.second){
336 // Vérifie que l'instance ajoutée ne remplace pas une instance déjà présente,
337 // auquel il s'agit d'une erreur interne (opérateur de comparaison foireux)
338 dumpSharedInfos();
339 ItemNumElements::m_debug = true;
340 bool compare = m_infos_map->find(ine)!=m_infos_map->end();
341 fatal() << "INTERNE: ItemSharedInfoList::findSharedInfo() SharedInfo déjà présent\n"
342 << "\nWanted:"
343 << " type=" << type->typeId()
344 << " compare=" << compare
345 << "\nNEW_INE=(" << ine << ")"
346 << "\nOLD_INE=(" << old.first->first << ")"
347 << "\nNEW_ISI=(" << *isi << ")"
348 << "\nOLD_ISI=(" << *old.first->second << ")";
349 }
350 //#endif
351 return isi;
352}
353
354/*---------------------------------------------------------------------------*/
355/*---------------------------------------------------------------------------*/
356
357void ItemSharedInfoList::
358dumpSharedInfos()
359{
360 info() << "--- ItemSharedInfos: family=" << m_family->name();
361 for( ConstIterT<ItemSharedInfoMap> i(*m_infos_map); i(); ++i ){
362 info() << "INE: " << i->first;
363 info() << "ISI: " << *i->second;
364 }
365}
366
367/*---------------------------------------------------------------------------*/
368/*---------------------------------------------------------------------------*/
369
370} // End namespace Arcane::mesh
371
372/*---------------------------------------------------------------------------*/
373/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
virtual ItemTypeMng * itemTypeMng() const =0
Gestionnaire de types d'entités associé
Structure interne partagée d'une entité de maillage.
Infos sur un type d'entité du maillage.
Int16 typeId() const
Numéro du type.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Tampon pour allocation multiple.
Definition MultiBuffer.h:44
Paramètres nécessaires à la construction d'une variable.
virtual void resize(Integer new_size)
Réalloue le nombre d'éléments de la première dimension du tableau.
Famille d'entités.
Definition ItemFamily.h:76
IMesh * mesh() const override
Maillage associé
String name() const override
Nom de la famille.
Definition ItemFamily.h:125
Integer m_nb_item_shared_info
Nombre d'objets alloués.
~ItemSharedInfoList()
Libère les ressources.
void checkValid()
Vérifie si les structures internes de l'instance sont valides.
Classe temporaire pour conserver un ItemSharedInfo et un type d'entité.
constexpr Integer dim1Size() const
Nombre d'éléments de la première dimension.
Chaîne de caractères unicode.
TraceMessage log() const
Flot pour un message de log.
TraceMessage error() const
Flot pour un message d'erreur.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage fatal() const
Flot pour un message d'erreur fatale.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:640