Arcane  v4.1.2.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/*---------------------------------------------------------------------------*/
50class ItemGroupSubPartsByType
51{
52 public:
53
54 explicit ItemGroupSubPartsByType(ItemGroupInternal* igi);
55
56 public:
57
58 void setImpl(ItemGroupImpl* group_impl) { m_group_impl = group_impl; }
59 void clear()
60 {
61 m_children_by_type.clear();
63 }
64 void applyOperation(IItemOperationByBasicType* operation);
65 bool isUseV2ForApplyOperation() const { return m_use_v2_for_apply_operation; }
66
67 void _computeChildrenByTypeV1();
68
69 private:
70
71 void _initChildrenByTypeV2();
72 void _computeChildrenByTypeV2();
73 void _initChildrenByTypeV1();
74
75 private:
76
79
86
94
105
108
109 bool m_is_debug_apply_operation = false;
110
111 ItemGroupInternal* m_group_internal = nullptr;
112
115};
116
117/*---------------------------------------------------------------------------*/
118/*---------------------------------------------------------------------------*/
136class ItemGroupInternal
137{
138 friend class ItemGroupImplInternal;
139
140 public:
141
149 {
150 public:
151
152 class ScopedLock
153 {
154 public:
155
156 explicit ScopedLock(const CheckNeedUpdateMutex& mutex)
157 : m_update_mutex(mutex)
158 {
159 m_update_mutex._lock();
160 }
161 ~ScopedLock()
162 {
163 m_update_mutex._unlock();
164 }
165
166 private:
167
168 const CheckNeedUpdateMutex& m_update_mutex;
169 };
170
171 public:
172
174 {
175 delete m_mutex;
176 }
177 void create()
178 {
179 m_mutex = new std::mutex();
180 }
181
182 private:
183
184 std::mutex* m_mutex = nullptr;
185
186 private:
187
188 void _lock() const
189 {
190 if (m_mutex)
191 m_mutex->lock();
192 }
193 void _unlock() const
194 {
195 if (m_mutex)
196 m_mutex->unlock();
197 }
198 };
199
200 public:
201
202 ItemGroupInternal();
203 ItemGroupInternal(IItemFamily* family, const String& name);
204 ItemGroupInternal(IItemFamily* family, ItemGroupImpl* parent, const String& name);
205 ~ItemGroupInternal();
206
207 public:
208
209 const String& name() const { return m_name; }
210 const String& fullName() const { return m_full_name; }
211 bool null() const { return m_is_null; }
212 IMesh* mesh() const { return m_mesh; }
213 eItemKind kind() const { return m_kind; }
214 Integer maxLocalId() const;
215 ItemInternalList items() const;
216 ItemInfoListView itemInfoListView() const;
217
218 Int32ArrayView itemsLocalId() { return *m_items_local_id; }
219 Int32ConstArrayView itemsLocalId() const { return *m_items_local_id; }
220 Int32Array& mutableItemsLocalId() { return *m_items_local_id; }
221 VariableArrayInt32* variableItemsLocalid() { return m_variable_items_local_id; }
222
223 Int64 timestamp() const { return m_timestamp; }
224 bool isContiguous() const { return m_is_contiguous; }
225 void checkIsContiguous();
226
227 void updateTimestamp()
228 {
229 ++m_timestamp;
230 m_is_contiguous = false;
231 }
232
233 void setNeedRecompute()
234 {
235 // NOTE: normalement, il ne faudrait mettre cette valeur à 'true' que pour
236 // les groupes recalculés (qui ont un parent ou pour lequel 'm_compute_functor' n'est
237 // pas nul). Cependant, cette méthode est aussi appelé sur le groupe de toutes les entités
238 // et peut-être d'autres groupes.
239 // Changer ce comportement risque d'impacter pas mal de code donc il faudrait bien vérifier
240 // que tout est OK avant de faire cette modification.
241 m_need_recompute = true;
242 }
243
245 void applySimdPadding();
246
248 bool isAllItems() const { return m_is_all_items; }
249 bool isOwn() const { return m_is_own; }
250 Int32 nbItem() const { return itemsLocalId().size(); }
251 void checkValid();
252
253 public:
254
255 void _removeItems(SmallSpan<const Int32> items_local_id);
256
257 private:
258
259 void _notifyDirectRemoveItems(SmallSpan<const Int32> removed_ids, Int32 nb_remaining);
260
261 public:
262
263 ItemGroupImplInternal m_internal_api;
264 IMesh* m_mesh = nullptr;
266 ItemGroupImpl* m_parent = nullptr;
269 bool m_is_null = true;
272 bool m_is_own = false;
273
274 private:
275
277
278 public:
279
292 // FIXME on peut éviter de stocker ces groupes en introduisant des predicats
293 // sur les groupes parents
300 std::map<Integer, ItemGroupImpl*> m_level_cell_group;
301 std::map<Integer, ItemGroupImpl*> m_own_level_cell_group;
302
304 std::map<String, AutoRefT<ItemGroupImpl>> m_sub_groups;
305 bool m_need_recompute = false;
307 bool m_transaction_mode = false;
310 bool m_is_all_items = false;
314
315 // Anciennement dans DynamicMeshKindInfo
316 UniqueArray<Int32> m_items_index_in_all_group;
317
318 std::map<const void*, IItemGroupObserver*> m_observers;
319 bool m_observer_need_info = false;
320 void notifyExtendObservers(const Int32ConstArrayView* info);
321 void notifyReduceObservers(const Int32ConstArrayView* info);
322 void notifyCompactObservers(const Int32ConstArrayView* info);
323 void notifyInvalidateObservers();
324
325 void resetSubGroups();
326
327 public:
328
330 Array<Int32>* m_items_local_id = &m_local_buffer;
331 VariableArrayInt32* m_variable_items_local_id = nullptr;
332 bool m_is_contiguous = false;
334 bool m_is_print_check_simd_padding = false;
335 bool m_is_print_apply_simd_padding = false;
336 bool m_is_print_stack_apply_simd_padding = false;
337
338 public:
339
342
343 public:
344
347
348 private:
349
350 void _init();
351};
352
353/*---------------------------------------------------------------------------*/
354/*---------------------------------------------------------------------------*/
355
356} // namespace Arcane
357
358/*---------------------------------------------------------------------------*/
359/*---------------------------------------------------------------------------*/
360
361#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
Interface d'un opérateur sur des entités rangées par type.
Implémentation d'un groupe d'entités de maillage.
Mutex pour protéger les appels à ItemGroupImpl::_checkNeedUpdate().
Implémentation de la classe ItemGroupImpl.
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é
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.
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.
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.
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)
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.
ItemGroupSubPartsByType m_sub_parts_by_type
Sous-partie d'un groupe en fonction de son type.
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.
Gestion des sous-parties d'un groupe suivant le type de ses éléments.
ItemGroupImpl * m_group_impl
A supprimer quand la version V1 sera supprimée.
UniqueArray< UniqueArray< Int32 > > m_children_by_type_ids
Liste des localId() par type d'entité.
bool m_use_v2_for_apply_operation
Vrai si on utilise la version 2 de la gestion pour applyOperation().
Int64 m_children_by_type_ids_computed_timestamp
Timestamp indiquant quand a été calculé la liste des ids des enfants.
UniqueArray< ItemGroupImpl * > m_children_by_type
Liste des fils de ce groupe par type d'entité.
ItemTypeId m_unique_children_type
Indique le type des entités 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.
ARCCORE_COMMON_EXPORT 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:482
ConstArrayView< ItemInternal * > ItemInternalList
Type de la liste interne des entités.
Definition ItemTypes.h:466
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:453
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:127
std::int32_t Int32
Type entier signé sur 32 bits.