Arcane  v3.16.6.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ItemGroupInternal.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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/* ItemGroupInternal.h (C) 2000-2025 */
9/* */
10/* Partie interne à Arcane de ItemGroup. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_INTERNAL_ITEMGROUPINTERNAL_H
13#define ARCANE_CORE_INTERNAL_ITEMGROUPINTERNAL_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18
20#include "arcane/core/VariableTypes.h"
21#include "arcane/core/internal/ItemGroupImplInternal.h"
22
23#include <map>
24#include <mutex>
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29namespace Arcane
30{
31class ItemGroupImpl;
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
52class ItemGroupInternal
53{
54 friend class ItemGroupImplInternal;
55
56 public:
57
65 {
66 public:
67
68 class ScopedLock
69 {
70 public:
71
72 explicit ScopedLock(const CheckNeedUpdateMutex& mutex)
73 : m_update_mutex(mutex)
74 {
75 m_update_mutex._lock();
76 }
77 ~ScopedLock()
78 {
79 m_update_mutex._unlock();
80 }
81
82 private:
83
84 const CheckNeedUpdateMutex& m_update_mutex;
85 };
86
87 public:
88
90 {
91 delete m_mutex;
92 }
93 void create()
94 {
95 m_mutex = new std::mutex();
96 }
97
98 private:
99
100 std::mutex* m_mutex = nullptr;
101
102 private:
103
104 void _lock() const
105 {
106 if (m_mutex)
107 m_mutex->lock();
108 }
109 void _unlock() const
110 {
111 if (m_mutex)
112 m_mutex->unlock();
113 }
114 };
115
116 public:
117
118 ItemGroupInternal();
119 ItemGroupInternal(IItemFamily* family, const String& name);
120 ItemGroupInternal(IItemFamily* family, ItemGroupImpl* parent, const String& name);
121 ~ItemGroupInternal();
122
123 public:
124
125 const String& name() const { return m_name; }
126 const String& fullName() const { return m_full_name; }
127 bool null() const { return m_is_null; }
128 IMesh* mesh() const { return m_mesh; }
129 eItemKind kind() const { return m_kind; }
130 Integer maxLocalId() const;
131 ItemInternalList items() const;
132 ItemInfoListView itemInfoListView() const;
133
134 Int32ArrayView itemsLocalId() { return *m_items_local_id; }
135 Int32ConstArrayView itemsLocalId() const { return *m_items_local_id; }
136 Int32Array& mutableItemsLocalId() { return *m_items_local_id; }
137 VariableArrayInt32* variableItemsLocalid() { return m_variable_items_local_id; }
138
139 Int64 timestamp() const { return m_timestamp; }
140 bool isContiguous() const { return m_is_contiguous; }
141 void checkIsContiguous();
142
143 void updateTimestamp()
144 {
145 ++m_timestamp;
146 m_is_contiguous = false;
147 }
148
149 void setNeedRecompute()
150 {
151 // NOTE: normalement il ne faudrait mettre cette valeur à 'true' que pour
152 // les groupes recalculés (qui ont un parent ou pour lequel 'm_compute_functor' n'est
153 // pas nul). Cependant, cette méthode est aussi appelé sur le groupe de toutes les entités
154 // et peut-être d'autres groupes.
155 // Changer ce comportement risque d'impacter pas mal de code donc il faudrait bien vérifier
156 // que tout est OK avant de faire cette modification.
157 m_need_recompute = true;
158 }
159
161 void applySimdPadding();
162
164 bool isAllItems() const { return m_is_all_items; }
165 bool isOwn() const { return m_is_own; }
166 Int32 nbItem() const { return itemsLocalId().size(); }
167 void checkValid();
168
169 public:
170
171 void _removeItems(SmallSpan<const Int32> items_local_id);
172
173 private:
174
175 void _notifyDirectRemoveItems(SmallSpan<const Int32> removed_ids, Int32 nb_remaining);
176
177 public:
178
179 ItemGroupImplInternal m_internal_api;
180 IMesh* m_mesh = nullptr;
182 ItemGroupImpl* m_parent = nullptr;
185 bool m_is_null = true;
188 bool m_is_own = false;
189
190 private:
191
193
194 public:
195
208 // FIXME on peut éviter de stocker ces groupes en introduisant des predicats
209 // sur les groupes parents
216 std::map<Integer, ItemGroupImpl*> m_level_cell_group;
217 std::map<Integer, ItemGroupImpl*> m_own_level_cell_group;
218
221 std::map<String, AutoRefT<ItemGroupImpl>> m_sub_groups;
222 bool m_need_recompute = false;
224 bool m_transaction_mode = false;
227 bool m_is_all_items = false;
231
232 // Anciennement dans DynamicMeshKindInfo
233 Int32UniqueArray m_items_index_in_all_group;
234
235 std::map<const void*, IItemGroupObserver*> m_observers;
236 bool m_observer_need_info = false;
237 void notifyExtendObservers(const Int32ConstArrayView* info);
238 void notifyReduceObservers(const Int32ConstArrayView* info);
239 void notifyCompactObservers(const Int32ConstArrayView* info);
240 void notifyInvalidateObservers();
241
242 void resetSubGroups();
243
244 public:
245
246 bool isUseV2ForApplyOperation() const { return m_use_v2_for_apply_operation; }
247
248 private:
249
251 Array<Int32>* m_items_local_id = &m_local_buffer;
252 VariableArrayInt32* m_variable_items_local_id = nullptr;
253 bool m_is_contiguous = false;
255 bool m_is_print_check_simd_padding = false;
256 bool m_is_print_apply_simd_padding = false;
257 bool m_is_print_stack_apply_simd_padding = false;
258
259 private:
260
261 // TODO: Mettre cela dans une classe spécifique ce qui permettra
262 // de l'utiliser par exemple pour ItemVector
263
265
267
268 public:
269
272
283
286
287 bool m_is_debug_apply_operation = false;
289
292
293 private:
294
295 void _init();
296};
297
298/*---------------------------------------------------------------------------*/
299/*---------------------------------------------------------------------------*/
300
301} // namespace Arcane
302
303/*---------------------------------------------------------------------------*/
304/*---------------------------------------------------------------------------*/
305
306#endif
Déclarations des types généraux de Arcane.
Fonctions de gestion mémoire et des allocateurs.
Tableau d'items de types quelconques.
Interface d'une famille d'entités.
Definition IItemFamily.h:84
Implémentation d'un groupe d'entités de maillage.
Mutex pour protéger les appels à ItemGroupImpl::_checkNeedUpdate().
ItemGroupImpl * m_node_group
Groupe des noeuds.
std::map< Integer, ItemGroupImpl * > m_own_level_cell_group
Groupe des mailles propres de niveau.
String m_full_name
Nom complet du groupe.
String m_variable_name
Groupe parent (groupe null si aucun)
IMesh * m_mesh
Gestionnaire de groupe associé
UniqueArray< ItemGroupImpl * > m_children_by_type
Liste des fils de ce groupe par type d'entité
SharedPtrT< GroupIndexTable > m_group_index_table
Table de hachage du local id des items vers leur position en enumeration.
ItemGroupImpl * m_interface_group
Items on the boundary of two subdomains.
UniqueArray< UniqueArray< Int32 > > m_children_by_type_ids
Liste des localId() par type d'entité.
bool m_is_check_simd_padding
Vrai si les localIds sont consécutifs.
bool m_need_invalidate_on_recompute
Vrai si l'on doit activer les invalidate observers en cas de recalcul.
bool m_need_recompute
Vrai si le groupe doit être recalculé
eItemKind m_kind
Genre des entités du groupe.
ItemGroupImpl * m_inner_face_group
Groupe des faces internes.
Int64 m_timestamp
Temps de la derniere modification.
bool m_use_v2_for_apply_operation
Gestion pour applyOperation() Version 2.
std::map< String, AutoRefT< ItemGroupImpl > > m_sub_groups
Ensemble de tous les sous-groupes.
bool m_transaction_mode
Vrai si le groupe est en mode de transaction directe.
bool m_is_own
true si groupe contient uniquement les entités dont on est propriétaire.
Ref< IVariableSynchronizer > m_synchronizer
Synchronizer du groupe.
void checkUpdateSimdPadding()
Remplit les derniers éléments du groupe pour avoir un vecteur SIMD complet.
bool m_observer_need_info
Synthése de besoin de observers en informations de transition.
void applySimdPadding()
Applique le padding pour la vectorisation.
ItemGroupImpl * m_ghost_group
Items not owned by the subdomain.
bool m_is_local_to_sub_domain
Vrai si le groupe est local au sous-domaine.
bool m_is_all_items
Indique s'il s'agit du groupe de toutes les entités.
ItemGroupImpl * m_own_group
Items owned by the subdomain.
ItemTypeId m_unique_children_type
Indique le type des entités du groupe.
IItemFamily * m_item_family
Famille associée.
ItemGroupImpl * m_edge_group
Groupe des arêtes.
ItemGroupImpl * m_face_group
Groupe des faces.
std::map< Integer, ItemGroupImpl * > m_level_cell_group
Groupe des mailles de niveau.
Int64 m_simd_timestamp
Temps de la derniere modification pour le calcul des infos SIMD.
Array< Int32 > * m_items_local_id
Liste des numéros locaux des entités de ce groupe.
std::map< const void *, IItemGroupObserver * > m_observers
localids -> index (UNIQUEMENT ALLITEMS)
Int64 m_children_by_type_ids_computed_timestamp
Timestamp indiquant quand a été calculé la liste des ids des enfants.
IFunctor * m_compute_functor
Fonction de calcul du groupe.
bool m_is_constituent_group
Indique si le groupe est associé à un constituant (IMeshComponent)
CheckNeedUpdateMutex m_check_need_update_mutex
Mutex pour protéger la mise à jour.
ItemGroupImpl * m_inner_active_face_group
Groupe des faces internes actives.
ItemGroupImpl * m_own_active_cell_group
Groupe des mailles propres actives.
bool m_is_null
true si le groupe est nul
ItemGroupImpl * m_cell_group
Groupe des mailles.
ItemGroupImpl * m_active_cell_group
AMR.
ItemGroupImpl * m_own_active_face_group
Groupe des faces actives propres.
ItemGroupImpl * m_active_face_group
Groupe des faces actives.
ItemGroupImpl * m_outer_active_face_group
Groupe des faces externes actives.
void checkIsContiguous()
Vérifie que les localIds() sont contigüs.
String m_name
Nom du groupe.
Type d'une entité (Item).
Definition ItemTypeId.h:32
Référence à une instance.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
VariableRefArrayT< Int32 > VariableArrayInt32
Variable tableau de type entier 32 bits.
MemoryAllocationOptions getAllocatorForMostlyReadOnlyData()
Allocateur par défaut pour les données essentiellement en lecture.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:569
ConstArrayView< ItemInternal * > ItemInternalList
Type de la liste interne des entités.
Definition ItemTypes.h:466
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:428
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:540
eItemKind
Genre d'entité de maillage.
@ IK_Unknown
Entité de maillage de genre inconnu ou non initialisé
Array< Int32 > Int32Array
Tableau dynamique à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:214
std::int32_t Int32
Type entier signé sur 32 bits.