Arcane  v3.15.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ItemFamily.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/* ItemFamily.h (C) 2000-2024 */
9/* */
10/* Famille d'entités. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_MESH_ITEMFAMILY_H
13#define ARCANE_MESH_ITEMFAMILY_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/List.h"
18#include "arcane/utils/String.h"
19#include "arcane/utils/TraceAccessor.h"
20
21#include "arcane/core/IItemFamily.h"
22#include "arcane/core/ItemPairGroup.h"
23#include "arcane/core/ObserverPool.h"
24#include "arcane/core/IItemConnectivity.h"
25#include "arcane/core/IIncrementalItemConnectivity.h"
26#include "arcane/core/ItemSharedInfo.h"
27#include "arcane/core/ItemGroup.h"
28
29#include <map>
30#include <set>
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34
35namespace Arcane
36{
37class Timer;
38class IVariableSynchronizer;
39class Properties;
40class IItemConnectivity;
41class IIncrementalItemConnectivity;
42class IItemFamilyTopologyModifier;
43class IMeshCompacter;
44class ItemFamilyCompactInfos;
45class ItemDataList;
46template <typename T> class ItemScalarProperty;
47}
48
49/*---------------------------------------------------------------------------*/
50/*---------------------------------------------------------------------------*/
51
52namespace Arcane::mesh
53{
54class ItemInternalMap;
55class DynamicMeshKindInfos;
56class ItemSharedInfoList;
57class ItemConnectivityInfo;
58class ItemConnectivitySelector;
59
60/*---------------------------------------------------------------------------*/
61/*---------------------------------------------------------------------------*/
73class ARCANE_MESH_EXPORT ItemFamily
74: public TraceAccessor
75, public IItemFamily
76{
77 private:
78
79 class Variables;
80 class InternalApi;
82 {
83 public:
84
87 : m_item_group(item_group), m_sub_item_group(sub_item_group),
88 m_link_kind(link_kind), m_nb_layer(nb_layer)
89 {
90 }
91 public:
92 ItemGroup m_item_group;
93 ItemGroup m_sub_item_group;
94 eItemKind m_link_kind;
95 Integer m_nb_layer;
96 public:
97
98 bool operator<(const AdjacencyInfo& rhs) const
99 {
100 if (m_item_group != rhs.m_item_group)
101 return m_item_group < rhs.m_item_group;
102 if (m_sub_item_group != rhs.m_sub_item_group)
103 return m_sub_item_group < rhs.m_sub_item_group;
104 if (m_link_kind != rhs.m_link_kind)
105 return m_link_kind < rhs.m_link_kind;
106 return m_nb_layer < rhs.m_nb_layer;
107 }
108
109 };
110 using AdjacencyGroupMap = std::map<AdjacencyInfo, ItemPairGroup>;
111 // Garde la version avec faute d'ortographe pour des raisons de compatibilité
112 // TODO: à enlever mi 2025
113 using AdjencyGroupMap = AdjacencyGroupMap;
114
115 public:
116
118
119 public:
120
121 ItemFamily(IMesh* mesh,eItemKind ik,const String& name);
122 ~ItemFamily() override; //<! Libère les ressources
123
124 public:
125
126 void build() override;
127
128 public:
129
130 String name() const override { return m_name; }
131 String fullName() const override { return m_full_name; }
132 eItemKind itemKind() const override;
133 Integer nbItem() const override;
134 Int32 maxLocalId() const override;
135 ItemInternalList itemsInternal() override;
136 ItemInfoListView itemInfoListView() override;
137 VariableItemInt32& itemsNewOwner() override;
138 IItemFamily * parentFamily() const override;
139 void setParentFamily(IItemFamily * parent) override;
140 Integer parentFamilyDepth() const override;
141 void addChildFamily(IItemFamily * family) override;
142 IItemFamilyCollection childFamilies() override;
143
144 void checkValid() override;
145 void checkValidConnectivity() override;
146 void checkUniqueIds(Int64ConstArrayView unique_ids) override;
147
148 public:
149
150 ItemInternalMap& itemsMap();
151
152 public:
153
154 void endUpdate() override;
155 void partialEndUpdate() override;
156 void partialEndUpdateGroup(const ItemGroup& group) override;
157 void partialEndUpdateVariable(IVariable* variable) override;
158
159 public:
160
161 void itemsUniqueIdToLocalId(ArrayView<Int64> ids,bool do_fatal=true) const;
162 void itemsUniqueIdToLocalId(Int32ArrayView local_ids,
164 bool do_fatal) const override;
165 void itemsUniqueIdToLocalId(Int32ArrayView local_ids,
167 bool do_fatal) const override;
168
169 public:
170
171 ISubDomain* subDomain() const override;
172 ITraceMng* traceMng() const override;
173 IMesh* mesh() const override;
174 IParallelMng* parallelMng() const override;
175
176 public:
177
178 IItemConnectivityInfo* localConnectivityInfos() const override;
179 IItemConnectivityInfo* globalConnectivityInfos() const override;
180
181 public:
182
183 void internalRemoveItems(Int32ConstArrayView local_ids,bool keep_ghost =false) override;
184 void removeItems2(ItemDataList& item_data_list) override; // Remove items based on family dependencies (ItemFamilyNetwork)
185 void removeNeedRemoveMarkedItems() override;
186
188 ItemVectorView view() override;
189
190 ItemInternal* findOneItem(Int64 uid) override;
191
192 public:
193
194 ItemGroup allItems() const override;
195
196 public:
197
198 void notifyItemsOwnerChanged() override;
199 ItemGroup findGroup(const String& name) const override;
200 ItemGroup findGroup(const String& name,bool create_if_needed) override;
201 ItemGroup createGroup(const String& name,Int32ConstArrayView elements,bool do_override=false) override;
202 ItemGroup createGroup(const String& name) override;
203 ItemGroup createGroup(const String& name,const ItemGroup& parent,bool do_override=false) override;
204 ItemGroupCollection groups() const override;
205 void notifyItemsUniqueIdChanged() override;
206 void destroyGroups() override;
207
208 public:
209
210 IVariable* findVariable(const String& name,bool throw_exception) override;
211 void usedVariables(VariableCollection collection) override;
212
213 public:
214
215 void prepareForDump() override;
216 void readFromDump() override;
217 void copyItemsValues(Int32ConstArrayView source,Int32ConstArrayView destination) override;
218 void copyItemsMeanValues(Int32ConstArrayView first_source,
220 Int32ConstArrayView destination) override;
221 void compactItems(bool do_sort) override;
222 void clearItems() override;
223
224 Int64ArrayView* uniqueIds();
225
226 ItemSharedInfo* commonItemSharedInfo() { return m_common_item_shared_info; }
227
228 public:
229
230 ARCANE_DEPRECATED_REASON("Y2024: This method is internal to Arcane. Use _infos() instead.")
231 const DynamicMeshKindInfos& infos() const;
232
233 public:
234
235 void setHasUniqueIdMap(bool v) override;
236 bool hasUniqueIdMap() const override;
237
238 public:
239
240 void computeSynchronizeInfos() override;
241 void getCommunicatingSubDomains(Int32Array& sub_domains) const override;
242 void synchronize(VariableCollection variables) override;
243 void synchronize(VariableCollection variables, Int32ConstArrayView local_ids) override;
244 IVariableSynchronizer* allItemsSynchronizer() override;
245
246 void reduceFromGhostItems(IVariable* v,IDataOperation* operation) override;
247 void reduceFromGhostItems(IVariable* v,Parallel::eReduceType operation) override;
248
249 public:
250
251 ARCANE_DEPRECATED_REASON("Y2024: use findAdjacencyItems() instead")
252 ItemPairGroup findAdjencyItems(const ItemGroup& group,
254 Integer layer) override;
255 ItemPairGroup findAdjacencyItems(const ItemGroup& group,
257 Integer layer) override;
258 IParticleFamily* toParticleFamily() override { return nullptr; }
259 void setItemSortFunction(IItemInternalSortFunction* sort_function) override;
260 IItemInternalSortFunction* itemSortFunction() const override;
261
262 public:
263
264 void addSourceConnectivity(IItemConnectivity* connectivity) override;
265 void addTargetConnectivity(IItemConnectivity* connectivity) override;
266 void removeSourceConnectivity(IItemConnectivity* connectivity) override;
267 void removeTargetConnectivity(IItemConnectivity* connectivity) override;
268 void setConnectivityMng(IItemConnectivityMng* connectivity_mng) override;
269
270 void addGhostItems(Int64ConstArrayView unique_ids, Int32ArrayView items, Int32ConstArrayView owners) override;
271 IItemFamilyPolicyMng* policyMng() override { return m_policy_mng; }
272 Properties* properties() override { return m_properties; }
273 IItemFamilyInternal* _internalApi() override;
274
275 public:
276
277 //NOTE: Cette méthode doit être virtuelle pour que PolyhedralMesh puisse positionner la politique.
278 virtual void setPolicyMng(IItemFamilyPolicyMng* policy_mng);
279
280 public:
281
282 void beginCompactItems(ItemFamilyCompactInfos& compact_infos);
285 void compactVariablesAndGroups(const ItemFamilyCompactInfos& compact_infos);
286 void finishCompactItems(ItemFamilyCompactInfos& compact_infos);
287 void removeItem(Item item)
288 {
289 _removeOne(item);
290 }
293 {
294 return &m_item_connectivity_list;
295 }
296
297 protected:
298
299 void _removeOne(Item item);
300 void _detachOne(Item item);
301 ItemInternalList _itemsInternal();
302 ItemInternal* _itemInternal(Int32 local_id);
303 ItemInternal* _allocOne(Int64 unique_id);
304 ItemInternal* _allocOne(Int64 unique_id, bool& need_alloc);
305 ItemInternal* _findOrAllocOne(Int64 uid, bool& is_alloc);
306 void _setHasUniqueIdMap(bool v);
307 void _removeMany(Int32ConstArrayView local_ids);
308 void _removeDetachedOne(Item item);
309 const DynamicMeshKindInfos& _infos() const;
310
311 void _detachCells2(Int32ConstArrayView local_ids);
312
313 virtual void _endAllocate();
314 virtual void _notifyEndUpdateFromMesh();
315
316 protected:
317
318 String m_name;
319 String m_full_name;
320 IMesh* m_mesh = nullptr;
321 InternalApi* m_internal_api = nullptr;
322 ISubDomain* m_sub_domain = nullptr;
323 IItemFamily* m_parent_family = nullptr;
324 Integer m_parent_family_depth = 0;
325
326 private:
327
328 std::unique_ptr<DynamicMeshKindInfos> m_infos;
329
330 protected:
331
332 ItemGroupList m_item_groups;
333 bool m_need_prepare_dump = true;
334 MeshItemInternalList* m_item_internal_list = nullptr;
335
336 private:
337
338 ItemSharedInfo* m_common_item_shared_info = nullptr;
339
340 protected:
341
342 ItemSharedInfoList* m_item_shared_infos = nullptr;
343 ObserverPool m_observers;
344 Ref<IVariableSynchronizer> m_variable_synchronizer;
345 Integer m_current_variable_item_size = 0;
346 IItemInternalSortFunction* m_item_sort_function = nullptr;
347 std::set<IVariable*> m_used_variables;
348 UniqueArray<ItemFamily*> m_child_families;
349 ItemConnectivityInfo* m_local_connectivity_info = nullptr;
350 ItemConnectivityInfo* m_global_connectivity_info = nullptr;
351 Properties* m_properties = nullptr;
352 typedef std::set<IItemConnectivity*> ItemConnectivitySet;
353 ItemConnectivitySet m_source_item_connectivities;
354 ItemConnectivitySet m_target_item_connectivities;
355 IItemConnectivityMng* m_connectivity_mng = nullptr;
356
357 private:
358
359 UniqueArray<Ref<IIncrementalItemSourceConnectivity>> m_source_incremental_item_connectivities;
360 UniqueArray<Ref<IIncrementalItemTargetConnectivity>> m_target_incremental_item_connectivities;
361
362 protected:
363
364 IItemFamilyPolicyMng* m_policy_mng = nullptr;
365
366 protected:
367
368 void _checkNeedEndUpdate() const;
369 void _updateSharedInfo();
370
371 void _allocateInfos(ItemInternal* item,Int64 uid,ItemSharedInfoWithType* isi);
372 void _allocateInfos(ItemInternal* item,Int64 uid,ItemTypeInfo* type);
373 void _endUpdate(bool need_check_remove);
374 bool _partialEndUpdate();
375 void _updateGroup(ItemGroup group,bool need_check_remove);
376 void _updateVariable(IVariable* var);
377
378 void _addConnectivitySelector(ItemConnectivitySelector* selector);
379 void _buildConnectivitySelectors();
380 void _preAllocate(Int32 nb_item,bool pre_alloc_connectivity);
381 ItemInternalConnectivityList* _unstructuredItemInternalConnectivityList()
382 {
383 return itemInternalConnectivityList();
384 }
385
386 public:
387
388 IItemFamilyTopologyModifier* _topologyModifier() override { return m_topology_modifier; }
389 void resizeVariables(bool force_resize) override { _resizeVariables(force_resize); }
390
391 private:
392
393 Int64Array* m_items_unique_id = nullptr;
394 Int32Array* m_items_owner = nullptr;
395 Int32Array* m_items_flags = nullptr;
396 Int16Array* m_items_type_id = nullptr;
397 Int32Array* m_items_nb_parent = nullptr;
398 // TODO: a supprimer car redondant avec le champ correspondant de ItemSharedInfo
399 Int64ArrayView m_items_unique_id_view;
400 Variables* m_internal_variables = nullptr;
401 Int32 m_default_sub_domain_owner = A_NULL_RANK;
402
403 protected:
404
405 Int32 m_sub_domain_id = A_NULL_RANK;
406
407 private:
408
409 bool m_is_parallel = false;
410
421 Integer m_current_id = 0;
422
423 bool m_item_need_prepare_dump = false;
424
425 private:
426
427 Int64 m_nb_allocate_info = 0;
428
429 private:
430
431 AdjacencyGroupMap m_adjacency_groups;
432 UniqueArray<ItemConnectivitySelector*> m_connectivity_selector_list;
433 IItemFamilyTopologyModifier* m_topology_modifier = nullptr;
436
437 UniqueArray<ItemConnectivitySelector*> m_connectivity_selector_list_by_item_kind;
438 bool m_use_legacy_compact_item = false;
439
440 private:
441
442 ItemTypeMng* m_item_type_mng = nullptr;
443 bool m_do_shrink_after_allocate = false;
444
445 protected:
446
447 ItemTypeMng* _itemTypeMng() const { return m_item_type_mng; }
448 virtual IItemInternalSortFunction* _defaultItemSortFunction();
449
450 ARCANE_DEPRECATED_REASON("Y2022: This method is a now a no-operation")
451 void _reserveInfosMemory(Integer memory);
452 ARCANE_DEPRECATED_REASON("Y2022: This method is a now a no-operation")
453 void _resizeInfos(Integer memory);
454
455 ItemSharedInfoWithType* _findSharedInfo(ItemTypeInfo* type);
456
457 ARCANE_DEPRECATED_REASON("Y2022: This method always return 0")
458 Integer _allocMany(Integer memory);
459 void _setSharedInfosPtr(Integer* ptr);
460 void _checkValid();
461 void _checkValidConnectivity();
462 void _notifyDataIndexChanged();
463 void _processNewGroup(ItemGroup group);
464 String _variableName(const String& base_name) const;
465 template<class Type> void
466 _synchronizeVariable(IVariable* var,Type* var_value,Integer nb_elem);
467 void _updateGroups(bool check_need_remove);
468 void _compactFromParentFamily(const ItemFamilyCompactInfos& compact_infos);
469 void _checkComputeSynchronizeInfos(Int32 changed);
470 void _readGroups();
471 void _invalidateComputedGroups();
472 void _compactItems(bool do_sort);
473 void _compactOnlyItems(bool do_sort);
474 void _applyCheckNeedUpdateOnGroups();
475 void _setTopologyModifier(IItemFamilyTopologyModifier* tm);
476
477 private:
478
479 void _updateItemsSharedFlag();
480
481 protected:
482
483 void _checkValidItem(ItemInternal* item)
484 {
485#ifdef ARCANE_CHECK
486 arcaneThrowIfNull(item,"item","Invalid null item");
487#else
488 ARCANE_UNUSED(item);
489#endif
490 }
491 void _checkValidSourceTargetItems(ItemInternal* source,ItemInternal* target)
492 {
493#ifdef ARCANE_CHECK
494 arcaneThrowIfNull(source,"source","Invalid null source item");
495 arcaneThrowIfNull(target,"target","Invalid null target item");
496#else
497 ARCANE_UNUSED(source);
498 ARCANE_UNUSED(target);
499#endif
500 }
501 void _checkValidItem(Item item) { _checkValidItem(ItemCompatibility::_itemInternal(item)); }
502 void _checkValidSourceTargetItems(Item source,Item target)
503 {
504 _checkValidItem(ItemCompatibility::_itemInternal(source));
505 _checkValidItem(ItemCompatibility::_itemInternal(target));
506 }
507
508 private:
509
510 void _getConnectedItems(IIncrementalItemConnectivity* parent_connectivity,ItemVector& target_family_connected_items);
511 void _fillHasExtraParentProperty(ItemScalarProperty<bool>& child_families_has_extra_parent,ItemVectorView connected_items);
512 void _computeConnectivityInfo(ItemConnectivityInfo* ici);
513 void _updateItemViews();
514 void _resizeItemVariables(Int32 new_size,bool force_resize);
515 void _handleOldCheckpoint();
516
517 void _addSourceConnectivity(IIncrementalItemSourceConnectivity* c);
518 void _addTargetConnectivity(IIncrementalItemTargetConnectivity* c);
519 void _addVariable(IVariable* var);
520 void _removeVariable(IVariable* var);
521 void _resizeVariables(bool force_resize);
522 void _shrinkConnectivityAndPrintInfos();
523};
524
525/*---------------------------------------------------------------------------*/
526/*---------------------------------------------------------------------------*/
527
528} // End namespace ARcane::mesh
529
530/*---------------------------------------------------------------------------*/
531/*---------------------------------------------------------------------------*/
532
533#endif
Tableau d'items de types quelconques.
Interface d'une opération sur une donnée.
Interface des informations sur la connectivité par type d'entité.
Interface pour gérer une connectivité.
Partie interne de IItemFamily.
Interface des politiques d'une famille d'entités.
Interface de modification de la topologie des entités d'une famille.
Interface d'une famille d'entités.
Interface d'une fonction de tri des entités.
Interface du gestionnaire de parallélisme pour un sous-domaine.
Interface d'une famille de particules.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
Interface d'un service de synchronisation de variable.
Interface d'une variable.
Definition IVariable.h:54
Informations pour gérer le compactage des entités d'une famille.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
Vue sur une liste pour obtenir des informations sur les entités.
Informations de connectivité, pour une famille d'entité, permettant la transition entre les anciennes...
Structure interne d'une entité de maillage.
Vue typée sur une liste d'entités d'une connectivité.
Tableau de listes d'entités.
Structure interne partagée d'une entité de maillage.
Infos sur un type d'entité du maillage.
Gestionnaire des types d'entités de maillage.
Definition ItemTypeMng.h:66
Vue sur un vecteur d'entités.
Classe de base d'un élément de maillage.
Definition Item.h:83
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
Tableaux d'indirection sur les entités d'un maillage.
Liste d'observateurs.
Liste de propriétés.
Definition Properties.h:64
Collection de variables.
Infos de maillage pour un genre donné d'entité.
Informations sur la connectivité par type d'entité.
Sélection entre les connectivités historiques et à la demande.
Famille d'entités.
Definition ItemFamily.h:76
String fullName() const override
Nom complet de la famille (avec celui du maillage)
Definition ItemFamily.h:131
ItemInternalConnectivityList m_item_connectivity_list
Accesseur pour les connectivités via Item et ItemInternal.
Definition ItemFamily.h:435
ItemInternalConnectivityList * itemInternalConnectivityList()
Accesseur pour les connectivités via Item et ItemInternal.
Definition ItemFamily.h:292
IItemFamilyTopologyModifier * _topologyModifier() override
Interface du modificateur de topologie.
Definition ItemFamily.h:388
ItemConnectivitySet m_target_item_connectivities
connectivite ou ItemFamily == SourceFamily
Definition ItemFamily.h:354
Properties * properties() override
Propriétés associées à cette famille.
Definition ItemFamily.h:272
void resizeVariables(bool force_resize) override
Redimensionne les variables de cette famille.
Definition ItemFamily.h:389
String name() const override
Nom de la famille.
Definition ItemFamily.h:130
IItemFamilyPolicyMng * policyMng() override
Interface des comportements/politiques associées à cette famille.
Definition ItemFamily.h:271
Tableau associatif de ItemInternal.
Infos de maillage pour un genre donné d'entité.
Classe temporaire pour conserver un ItemSharedInfo et un type d'entité.
Vue modifiable d'un tableau d'un type T.
Vue constante d'un tableau de type T.
Interface du gestionnaire de traces.
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
T * arcaneThrowIfNull(T *ptr, const char *ptr_name, const char *text)
Vérifie qu'un pointeur n'est pas nul.
eItemKind
Genre d'entité de maillage.
eReduceType
Types des réductions supportées.
Type
Type of JSON value.
Definition rapidjson.h:665