Arcane  v3.14.10.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:
86 : m_item_group(item_group), m_sub_item_group(sub_item_group),
87 m_link_kind(link_kind), m_nb_layer(nb_layer)
88 {
89 }
90 public:
91 ItemGroup m_item_group;
92 ItemGroup m_sub_item_group;
93 eItemKind m_link_kind;
94 Integer m_nb_layer;
95 public:
96 bool operator<(const AdjencyInfo& rhs) const
97 {
98 if (m_item_group != rhs.m_item_group)
99 return m_item_group < rhs.m_item_group;
100 if (m_sub_item_group != rhs.m_sub_item_group)
101 return m_sub_item_group < rhs.m_sub_item_group;
102 if (m_link_kind != rhs.m_link_kind)
103 return m_link_kind < rhs.m_link_kind;
104 return m_nb_layer < rhs.m_nb_layer;
105 }
106
107 };
108 typedef std::map<AdjencyInfo,ItemPairGroup> AdjencyGroupMap;
109
110 public:
111
113
114 public:
115
116 ItemFamily(IMesh* mesh,eItemKind ik,const String& name);
117 ~ItemFamily() override; //<! Libère les ressources
118
119 public:
120
121 void build() override;
122
123 public:
124
125 String name() const override { return m_name; }
126 String fullName() const override { return m_full_name; }
127 eItemKind itemKind() const override;
128 Integer nbItem() const override;
129 Int32 maxLocalId() const override;
130 ItemInternalList itemsInternal() override;
131 ItemInfoListView itemInfoListView() override;
132 VariableItemInt32& itemsNewOwner() override;
133 IItemFamily * parentFamily() const override;
134 void setParentFamily(IItemFamily * parent) override;
135 Integer parentFamilyDepth() const override;
136 void addChildFamily(IItemFamily * family) override;
137 IItemFamilyCollection childFamilies() override;
138
139 void checkValid() override;
140 void checkValidConnectivity() override;
141 void checkUniqueIds(Int64ConstArrayView unique_ids) override;
142
143 public:
144
145 ItemInternalMap& itemsMap();
146
147 public:
148
149 void endUpdate() override;
150 void partialEndUpdate() override;
151 void partialEndUpdateGroup(const ItemGroup& group) override;
152 void partialEndUpdateVariable(IVariable* variable) override;
153
154 public:
155
156 void itemsUniqueIdToLocalId(ArrayView<Int64> ids,bool do_fatal=true) const;
157 void itemsUniqueIdToLocalId(Int32ArrayView local_ids,
159 bool do_fatal) const override;
160 void itemsUniqueIdToLocalId(Int32ArrayView local_ids,
162 bool do_fatal) const override;
163
164 public:
165
166 ISubDomain* subDomain() const override;
167 ITraceMng* traceMng() const override;
168 IMesh* mesh() const override;
169 IParallelMng* parallelMng() const override;
170
171 public:
172
173 IItemConnectivityInfo* localConnectivityInfos() const override;
174 IItemConnectivityInfo* globalConnectivityInfos() const override;
175
176 public:
177
178 void internalRemoveItems(Int32ConstArrayView local_ids,bool keep_ghost =false) override;
179 void removeItems2(ItemDataList& item_data_list) override; // Remove items based on family dependencies (ItemFamilyNetwork)
180 void removeNeedRemoveMarkedItems() override;
181
183 ItemVectorView view() override;
184
185 ItemInternal* findOneItem(Int64 uid) override;
186
187 public:
188
189 ItemGroup allItems() const override;
190
191 public:
192
193 void notifyItemsOwnerChanged() override;
194 ItemGroup findGroup(const String& name) const override;
195 ItemGroup findGroup(const String& name,bool create_if_needed) override;
196 ItemGroup createGroup(const String& name,Int32ConstArrayView elements,bool do_override=false) override;
197 ItemGroup createGroup(const String& name) override;
198 ItemGroup createGroup(const String& name,const ItemGroup& parent,bool do_override=false) override;
199 ItemGroupCollection groups() const override;
200 void notifyItemsUniqueIdChanged() override;
201 void destroyGroups() override;
202
203 public:
204
205 IVariable* findVariable(const String& name,bool throw_exception) override;
206 void usedVariables(VariableCollection collection) override;
207
208 public:
209
210 void prepareForDump() override;
211 void readFromDump() override;
212 void copyItemsValues(Int32ConstArrayView source,Int32ConstArrayView destination) override;
213 void copyItemsMeanValues(Int32ConstArrayView first_source,
215 Int32ConstArrayView destination) override;
216 void compactItems(bool do_sort) override;
217 void clearItems() override;
218
219 Int64ArrayView* uniqueIds();
220
221 ItemSharedInfo* commonItemSharedInfo() { return m_common_item_shared_info; }
222
223 public:
224
225 ARCANE_DEPRECATED_REASON("Y2024: This method is internal to Arcane. Use _infos() instead.")
226 const DynamicMeshKindInfos& infos() const;
227
228 public:
229
230 void setHasUniqueIdMap(bool v) override;
231 bool hasUniqueIdMap() const override;
232
233 public:
234
235 void computeSynchronizeInfos() override;
236 void getCommunicatingSubDomains(Int32Array& sub_domains) const override;
237 void synchronize(VariableCollection variables) override;
238 void synchronize(VariableCollection variables, Int32ConstArrayView local_ids) override;
239 IVariableSynchronizer* allItemsSynchronizer() override;
240
241 void reduceFromGhostItems(IVariable* v,IDataOperation* operation) override;
242 void reduceFromGhostItems(IVariable* v,Parallel::eReduceType operation) override;
243
244 public:
245
246 ItemPairGroup findAdjencyItems(const ItemGroup& group,
248 Integer layer) override;
249 IParticleFamily* toParticleFamily() override { return nullptr; }
250 void setItemSortFunction(IItemInternalSortFunction* sort_function) override;
251 IItemInternalSortFunction* itemSortFunction() const override;
252
253 public:
254
255 void addSourceConnectivity(IItemConnectivity* connectivity) override;
256 void addTargetConnectivity(IItemConnectivity* connectivity) override;
257 void removeSourceConnectivity(IItemConnectivity* connectivity) override;
258 void removeTargetConnectivity(IItemConnectivity* connectivity) override;
259 void setConnectivityMng(IItemConnectivityMng* connectivity_mng) override;
260
261 void addGhostItems(Int64ConstArrayView unique_ids, Int32ArrayView items, Int32ConstArrayView owners) override;
262 IItemFamilyPolicyMng* policyMng() override { return m_policy_mng; }
263 Properties* properties() override { return m_properties; }
264 IItemFamilyInternal* _internalApi() override;
265
266 public:
267
268 //NOTE: Cette méthode n'est pas virtuelle et seul pour l'instant DynamicMesh peut modifier la politique.
269 void setPolicyMng(IItemFamilyPolicyMng* policy_mng);
270
271 public:
272
273 void beginCompactItems(ItemFamilyCompactInfos& compact_infos);
276 void compactVariablesAndGroups(const ItemFamilyCompactInfos& compact_infos);
277 void finishCompactItems(ItemFamilyCompactInfos& compact_infos);
278 void removeItem(Item item)
279 {
280 _removeOne(item);
281 }
284 {
285 return &m_item_connectivity_list;
286 }
287
288 protected:
289
290 void _removeOne(Item item);
291 void _detachOne(Item item);
292 ItemInternalList _itemsInternal();
293 ItemInternal* _itemInternal(Int32 local_id);
294 ItemInternal* _allocOne(Int64 unique_id);
295 ItemInternal* _allocOne(Int64 unique_id, bool& need_alloc);
296 ItemInternal* _findOrAllocOne(Int64 uid, bool& is_alloc);
297 void _setHasUniqueIdMap(bool v);
298 void _removeMany(Int32ConstArrayView local_ids);
299 void _removeDetachedOne(Item item);
300 const DynamicMeshKindInfos& _infos() const;
301
302 void _detachCells2(Int32ConstArrayView local_ids);
303
304 virtual void _endAllocate();
305 virtual void _notifyEndUpdateFromMesh();
306
307 protected:
308
309 String m_name;
310 String m_full_name;
311 IMesh* m_mesh = nullptr;
312 InternalApi* m_internal_api = nullptr;
313 ISubDomain* m_sub_domain = nullptr;
314 IItemFamily* m_parent_family = nullptr;
315 Integer m_parent_family_depth = 0;
316
317 private:
318
319 std::unique_ptr<DynamicMeshKindInfos> m_infos;
320
321 protected:
322
323 ItemGroupList m_item_groups;
324 bool m_need_prepare_dump = true;
325 MeshItemInternalList* m_item_internal_list = nullptr;
326
327 private:
328
329 ItemSharedInfo* m_common_item_shared_info = nullptr;
330
331 protected:
332
333 ItemSharedInfoList* m_item_shared_infos = nullptr;
334 ObserverPool m_observers;
335 Ref<IVariableSynchronizer> m_variable_synchronizer;
336 Integer m_current_variable_item_size = 0;
337 IItemInternalSortFunction* m_item_sort_function = nullptr;
338 std::set<IVariable*> m_used_variables;
339 UniqueArray<ItemFamily*> m_child_families;
340 ItemConnectivityInfo* m_local_connectivity_info = nullptr;
341 ItemConnectivityInfo* m_global_connectivity_info = nullptr;
342 Properties* m_properties = nullptr;
343 typedef std::set<IItemConnectivity*> ItemConnectivitySet;
344 ItemConnectivitySet m_source_item_connectivities;
345 ItemConnectivitySet m_target_item_connectivities;
346 IItemConnectivityMng* m_connectivity_mng = nullptr;
347
348 private:
349
350 UniqueArray<Ref<IIncrementalItemSourceConnectivity>> m_source_incremental_item_connectivities;
351 UniqueArray<Ref<IIncrementalItemTargetConnectivity>> m_target_incremental_item_connectivities;
352
353 protected:
354
355 IItemFamilyPolicyMng* m_policy_mng = nullptr;
356
357 protected:
358
359 void _checkNeedEndUpdate() const;
360 void _updateSharedInfo();
361
362 void _allocateInfos(ItemInternal* item,Int64 uid,ItemSharedInfoWithType* isi);
363 void _allocateInfos(ItemInternal* item,Int64 uid,ItemTypeInfo* type);
364 void _endUpdate(bool need_check_remove);
365 bool _partialEndUpdate();
366 void _updateGroup(ItemGroup group,bool need_check_remove);
367 void _updateVariable(IVariable* var);
368
369 void _addConnectivitySelector(ItemConnectivitySelector* selector);
370 void _buildConnectivitySelectors();
371 void _preAllocate(Int32 nb_item,bool pre_alloc_connectivity);
372 ItemInternalConnectivityList* _unstructuredItemInternalConnectivityList()
373 {
374 return itemInternalConnectivityList();
375 }
376
377 public:
378
379 IItemFamilyTopologyModifier* _topologyModifier() override { return m_topology_modifier; }
380 void resizeVariables(bool force_resize) override { _resizeVariables(force_resize); }
381
382 private:
383
384 Int64Array* m_items_unique_id = nullptr;
385 Int32Array* m_items_owner = nullptr;
386 Int32Array* m_items_flags = nullptr;
387 Int16Array* m_items_type_id = nullptr;
388 Int32Array* m_items_nb_parent = nullptr;
389 // TODO: a supprimer car redondant avec le champ correspondant de ItemSharedInfo
390 Int64ArrayView m_items_unique_id_view;
391 Variables* m_internal_variables = nullptr;
392 Int32 m_default_sub_domain_owner = A_NULL_RANK;
393
394 protected:
395
396 Int32 m_sub_domain_id = A_NULL_RANK;
397
398 private:
399
400 bool m_is_parallel = false;
401
412 Integer m_current_id = 0;
413
414 bool m_item_need_prepare_dump = false;
415
416 private:
417
418 Int64 m_nb_allocate_info = 0;
419
420 private:
421
422 AdjencyGroupMap m_adjency_groups;
423 UniqueArray<ItemConnectivitySelector*> m_connectivity_selector_list;
424 IItemFamilyTopologyModifier* m_topology_modifier = nullptr;
427
428 UniqueArray<ItemConnectivitySelector*> m_connectivity_selector_list_by_item_kind;
429 bool m_use_legacy_compact_item = false;
430
431 private:
432
433 ItemTypeMng* m_item_type_mng = nullptr;
434 bool m_do_shrink_after_allocate = false;
435
436 protected:
437
438 ItemTypeMng* _itemTypeMng() const { return m_item_type_mng; }
439 virtual IItemInternalSortFunction* _defaultItemSortFunction();
440
441 ARCANE_DEPRECATED_REASON("Y2022: This method is a now a no-operation")
442 void _reserveInfosMemory(Integer memory);
443 ARCANE_DEPRECATED_REASON("Y2022: This method is a now a no-operation")
444 void _resizeInfos(Integer memory);
445
446 ItemSharedInfoWithType* _findSharedInfo(ItemTypeInfo* type);
447
448 ARCANE_DEPRECATED_REASON("Y2022: This method always return 0")
449 Integer _allocMany(Integer memory);
450 void _setSharedInfosPtr(Integer* ptr);
451 void _checkValid();
452 void _checkValidConnectivity();
453 void _notifyDataIndexChanged();
454 void _processNewGroup(ItemGroup group);
455 String _variableName(const String& base_name) const;
456 template<class Type> void
457 _synchronizeVariable(IVariable* var,Type* var_value,Integer nb_elem);
458 void _updateGroups(bool check_need_remove);
459 void _compactFromParentFamily(const ItemFamilyCompactInfos& compact_infos);
460 void _checkComputeSynchronizeInfos(Int32 changed);
461 void _readGroups();
462 void _invalidateComputedGroups();
463 void _compactItems(bool do_sort);
464 void _compactOnlyItems(bool do_sort);
465 void _applyCheckNeedUpdateOnGroups();
466 void _setTopologyModifier(IItemFamilyTopologyModifier* tm);
467
468 private:
469
470 void _updateItemsSharedFlag();
471
472 protected:
473
474 void _checkValidItem(ItemInternal* item)
475 {
476#ifdef ARCANE_CHECK
477 arcaneThrowIfNull(item,"item","Invalid null item");
478#else
479 ARCANE_UNUSED(item);
480#endif
481 }
482 void _checkValidSourceTargetItems(ItemInternal* source,ItemInternal* target)
483 {
484#ifdef ARCANE_CHECK
485 arcaneThrowIfNull(source,"source","Invalid null source item");
486 arcaneThrowIfNull(target,"target","Invalid null target item");
487#else
488 ARCANE_UNUSED(source);
489 ARCANE_UNUSED(target);
490#endif
491 }
492 void _checkValidItem(Item item) { _checkValidItem(ItemCompatibility::_itemInternal(item)); }
493 void _checkValidSourceTargetItems(Item source,Item target)
494 {
495 _checkValidItem(ItemCompatibility::_itemInternal(source));
496 _checkValidItem(ItemCompatibility::_itemInternal(target));
497 }
498
499 private:
500
501 void _getConnectedItems(IIncrementalItemConnectivity* parent_connectivity,ItemVector& target_family_connected_items);
502 void _fillHasExtraParentProperty(ItemScalarProperty<bool>& child_families_has_extra_parent,ItemVectorView connected_items);
503 void _computeConnectivityInfo(ItemConnectivityInfo* ici);
504 void _updateItemViews();
505 void _resizeItemVariables(Int32 new_size,bool force_resize);
506 void _handleOldCheckpoint();
507
508 void _addSourceConnectivity(IIncrementalItemSourceConnectivity* c);
509 void _addTargetConnectivity(IIncrementalItemTargetConnectivity* c);
510 void _addVariable(IVariable* var);
511 void _removeVariable(IVariable* var);
512 void _resizeVariables(bool force_resize);
513 void _shrinkConnectivityAndPrintInfos();
514};
515
516/*---------------------------------------------------------------------------*/
517/*---------------------------------------------------------------------------*/
518
519} // End namespace ARcane::mesh
520
521/*---------------------------------------------------------------------------*/
522/*---------------------------------------------------------------------------*/
523
524#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.
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:120
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:126
ItemInternalConnectivityList m_item_connectivity_list
Accesseur pour les connectités via Item et ItemInternal.
Definition ItemFamily.h:426
ItemInternalConnectivityList * itemInternalConnectivityList()
Accesseur pour les connectivités via Item et ItemInternal.
Definition ItemFamily.h:283
IItemFamilyTopologyModifier * _topologyModifier() override
Interface du modificateur de topologie.
Definition ItemFamily.h:379
ItemConnectivitySet m_target_item_connectivities
connectivite ou ItemFamily == SourceFamily
Definition ItemFamily.h:345
Properties * properties() override
Propriétés associées à cette famille.
Definition ItemFamily.h:263
void resizeVariables(bool force_resize) override
Redimensionne les variables de cette famille.
Definition ItemFamily.h:380
String name() const override
Nom de la famille.
Definition ItemFamily.h:125
IItemFamilyPolicyMng * policyMng() override
Interface des comportements/politiques associées à cette famille.
Definition ItemFamily.h:262
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