Arcane  4.1.11.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ItemConnectivityMng.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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/* ItemConnectivityMng.cc (C) 2000-2023 */
9/* */
10/* Connectivity Manager for Entities. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include <algorithm>
15
16#include "arcane/mesh/ItemConnectivityMng.h"
17#include "arcane/mesh/ItemConnectivitySynchronizer.h"
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21
22namespace Arcane
23{
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
29createSynchronizer(IItemConnectivity* connectivity, IItemConnectivityGhostPolicy* connectivity_ghost_policy)
30{
31 std::map<IItemConnectivity*, IItemConnectivitySynchronizer*>::iterator ite = m_synchronizers.find(connectivity);
32 IItemConnectivitySynchronizer* synchronizer = NULL;
33 if (ite == m_synchronizers.end()) {
34 synchronizer = new ItemConnectivitySynchronizer(connectivity, connectivity_ghost_policy);
35 m_synchronizers[connectivity] = synchronizer;
36 }
37 else {
38 // Create a new synchronizer for this connectivity
39 delete ite->second;
40 synchronizer = new ItemConnectivitySynchronizer(connectivity, connectivity_ghost_policy);
41 m_synchronizers.erase(ite);
42 m_synchronizers[connectivity] = synchronizer;
43 }
44 return synchronizer;
45}
46
47/*---------------------------------------------------------------------------*/
48/*---------------------------------------------------------------------------*/
49
50void ItemConnectivityMng::
51_register(const String& connectivity_name, const String& source_family_name, const String& target_family_name)
52{
53 std::pair<FamilyStateMap::iterator, bool> source_family_state_insertor = m_family_states.insert(std::make_pair(source_family_name, FamilyState()));
54 std::pair<FamilyStateMap::iterator, bool> target_family_state_insertor = m_family_states.insert(std::make_pair(target_family_name, FamilyState()));
55 std::pair<ConnectivityStateMap::iterator, bool> connectivity_state_insertor = m_connectivity_states.insert(std::make_pair(connectivity_name, ConnectivityState()));
56 FamilyState& source_family_state = source_family_state_insertor.first->second;
57 FamilyState& target_family_state = target_family_state_insertor.first->second;
58 ConnectivityState& connectivity_state = connectivity_state_insertor.first->second;
59 // If insertion occurs for connectivity, set its state to the family current state
60 if (connectivity_state_insertor.second) {
61 connectivity_state.m_state_with_source_family.m_last_family_state = source_family_state.m_state;
62 connectivity_state.m_state_with_source_family.m_last_added_item_index = source_family_state.m_added_items.size() - 1;
63 connectivity_state.m_state_with_source_family.m_last_removed_item_index = source_family_state.m_removed_items.size() - 1;
64 connectivity_state.m_state_with_target_family.m_last_family_state = target_family_state.m_state;
65 connectivity_state.m_state_with_target_family.m_last_added_item_index = target_family_state.m_added_items.size() - 1;
66 connectivity_state.m_state_with_target_family.m_last_removed_item_index = target_family_state.m_removed_items.size() - 1;
67 }
68 else
69 m_trace_mng->warning() << "Connectivity " << connectivity_name << " already registered.";
70}
71
72/*---------------------------------------------------------------------------*/
73/*---------------------------------------------------------------------------*/
74
77{
78 FamilyState& family_state = _findFamily(family->fullName());
79
80 // Add added items
81 family_state.m_added_items.addRange(added_items);
82 // Add removed items
83 family_state.m_removed_items.addRange(removed_items);
84 // Increment family state
85 ++family_state.m_state;
86}
87
88/*---------------------------------------------------------------------------*/
89/*---------------------------------------------------------------------------*/
90
92getSourceFamilyModifiedItems(IItemConnectivity* connectivity, Int32ArrayView& added_items, Int32ArrayView& removed_items)
93{
94 ConnectivityState& connectivity_state = _findConnectivity(connectivity->name());
95 FamilyState& family_state = _findFamily(connectivity->sourceFamily()->fullName());
96 _getModifiedItems(connectivity_state.m_state_with_source_family, family_state, added_items, removed_items);
97}
98
99/*---------------------------------------------------------------------------*/
100/*---------------------------------------------------------------------------*/
101
102void ItemConnectivityMng::
103getTargetFamilyModifiedItems(IItemConnectivity* connectivity, Int32ArrayView& added_items, Int32ArrayView& removed_items)
104{
105 ConnectivityState& connectivity_state = _findConnectivity(connectivity->name());
106 FamilyState& family_state = _findFamily(connectivity->targetFamily()->fullName());
107 _getModifiedItems(connectivity_state.m_state_with_target_family, family_state, added_items, removed_items);
108}
109
111getSourceFamilyModifiedItems(IIncrementalItemConnectivity* connectivity, Int32ArrayView& added_items, Int32ArrayView& removed_items)
112{
113 ConnectivityState& connectivity_state = _findConnectivity(connectivity->name());
114 FamilyState& family_state = _findFamily(connectivity->sourceFamily()->fullName());
115 _getModifiedItems(connectivity_state.m_state_with_source_family, family_state, added_items, removed_items);
116}
117
118/*---------------------------------------------------------------------------*/
119/*---------------------------------------------------------------------------*/
120
121void ItemConnectivityMng::
122getTargetFamilyModifiedItems(IIncrementalItemConnectivity* connectivity, Int32ArrayView& added_items, Int32ArrayView& removed_items)
123{
124 ConnectivityState& connectivity_state = _findConnectivity(connectivity->name());
125 FamilyState& family_state = _findFamily(connectivity->targetFamily()->fullName());
126 _getModifiedItems(connectivity_state.m_state_with_target_family, family_state, added_items, removed_items);
127}
128/*---------------------------------------------------------------------------*/
129/*---------------------------------------------------------------------------*/
130
131void ItemConnectivityMng::
132_getModifiedItems(ConnectivityStateData& connectivity_state, FamilyState& family_state,
133 Int32ArrayView& added_items, Int32ArrayView& removed_items)
134{
135 if (connectivity_state.m_last_family_state == family_state.m_state)
136 return; // Connectivity is up to date
137
138 Integer first_added_item_index = connectivity_state.m_last_added_item_index + 1;
139 Integer nb_added_items = family_state.m_added_items.size() - first_added_item_index;
140 auto unfiltered_added_items = family_state.m_added_items.subView(first_added_item_index, nb_added_items);
141 // Filter null lid (may occur if both add and remove actions occur before calling this method)
142 family_state.m_current_added_items.clear();
143 family_state.m_current_added_items.resize(nb_added_items);
144 auto true_size = 0;
145 std::copy_if(unfiltered_added_items.begin(), unfiltered_added_items.end(),
146 family_state.m_current_added_items.begin(),
147 [&true_size](Int32 const& item_lid) {
148 auto do_copy = (item_lid != NULL_ITEM_LOCAL_ID);
149 if (do_copy)
150 ++true_size;
151 return do_copy;
152 });
153 family_state.m_current_added_items.resize(true_size);
154 added_items = family_state.m_current_added_items.view();
155
156 Integer first_removed_item_index = connectivity_state.m_last_removed_item_index + 1;
157 Integer nb_removed_items = family_state.m_removed_items.size() - first_removed_item_index;
158 removed_items = family_state.m_removed_items.subView(first_removed_item_index, nb_removed_items);
159}
160
161/*---------------------------------------------------------------------------*/
162/*---------------------------------------------------------------------------*/
163
165setUpToDate(IItemConnectivity* connectivity)
166{
167 ConnectivityState& connectivity_state = _findConnectivity(connectivity->name());
168 FamilyState& source_family_state = _findFamily(connectivity->sourceFamily()->fullName());
169 FamilyState& target_family_state = _findFamily(connectivity->targetFamily()->fullName());
170 _setUpToDate(connectivity_state.m_state_with_source_family, source_family_state);
171 _setUpToDate(connectivity_state.m_state_with_target_family, target_family_state);
172}
173
176{
177 ConnectivityState& connectivity_state = _findConnectivity(connectivity->name());
178 FamilyState& source_family_state = _findFamily(connectivity->sourceFamily()->fullName());
179 FamilyState& target_family_state = _findFamily(connectivity->targetFamily()->fullName());
180 _setUpToDate(connectivity_state.m_state_with_source_family, source_family_state);
181 _setUpToDate(connectivity_state.m_state_with_target_family, target_family_state);
182}
183
184/*---------------------------------------------------------------------------*/
185/*---------------------------------------------------------------------------*/
186
187void ItemConnectivityMng::
188_setUpToDate(ConnectivityStateData& connectivity_state, FamilyState& family_state)
189{
190 connectivity_state.m_last_family_state = family_state.m_state;
191 connectivity_state.m_last_added_item_index = family_state.m_added_items.size() - 1;
192 connectivity_state.m_last_removed_item_index = family_state.m_removed_items.size() - 1;
193}
194/*---------------------------------------------------------------------------*/
195/*---------------------------------------------------------------------------*/
196
197Integer ItemConnectivityMng::
198_lastUpdateSourceFamilyState(const String& connectivity_name)
199{
200 return _findConnectivity(connectivity_name).m_state_with_source_family.m_last_family_state;
201}
202
203/*---------------------------------------------------------------------------*/
204/*---------------------------------------------------------------------------*/
205
206Integer ItemConnectivityMng::
207_lastUpdateTargetFamilyState(const String& connectivity_name)
208{
209 return _findConnectivity(connectivity_name).m_state_with_target_family.m_last_family_state;
210}
211
212/*---------------------------------------------------------------------------*/
213/*---------------------------------------------------------------------------*/
214
215Integer ItemConnectivityMng::
216_familyState(const String& family_full_name)
217{
218 return _findFamily(family_full_name).m_state;
219}
220
221/*---------------------------------------------------------------------------*/
222/*---------------------------------------------------------------------------*/
223
224ConnectivityState& ItemConnectivityMng::
225_findConnectivity(const String& connectivity_name)
226{
227 ConnectivityStateMap::iterator connectivity_state_iterator = m_connectivity_states.find(connectivity_name);
228 if (connectivity_state_iterator == m_connectivity_states.end())
229 throw FatalErrorException(String::format(
230 "Cannot find connectivity {0}. Use registerConnectivity(connectivity) first", connectivity_name));
231 return connectivity_state_iterator->second;
232}
233
234/*---------------------------------------------------------------------------*/
235/*---------------------------------------------------------------------------*/
236
237FamilyState& ItemConnectivityMng::
238_findFamily(const String& family_full_name)
239{
240 FamilyStateMap::iterator family_state_iterator = m_family_states.find(family_full_name);
241 if (family_state_iterator == m_family_states.end())
242 throw FatalErrorException(String::format(
243 "Cannot find family {0}. Use registerConnectivity(connectivity) first", family_full_name));
244 return family_state_iterator->second;
245}
246
247/*---------------------------------------------------------------------------*/
248/*---------------------------------------------------------------------------*/
249
251notifyLocalIdChanged(IItemFamily* family, Int32ConstArrayView old_to_new_ids, Integer nb_item)
252{
253 // Rk this is a temporary patch, connectivity update has to be refactored !
254 FamilyState& family_state = _findFamily(family->fullName());
255 // Treat added items
256 Integer new_id;
257 for (Arcane::Integer i = 0; i < family_state.m_added_items.size(); ++i) {
258 if (family_state.m_added_items[i] != NULL_ITEM_LOCAL_ID) {
259 new_id = old_to_new_ids[family_state.m_added_items[i]];
260 if (new_id < nb_item)
261 family_state.m_added_items[i] = new_id; // OK valid item
262 else
263 family_state.m_added_items[i] = NULL_ITEM_LOCAL_ID; // KO invalid item. old_to_new has no null_item_lid. it has lid > nb_item. These lids will be removed in finish compact items...
264 }
265 }
266 // Clear removed items, connectivity update is automatically launched by compaction
267 family_state.m_removed_items.clear();
268}
269
270/*---------------------------------------------------------------------------*/
271/*---------------------------------------------------------------------------*/
272
273} // namespace Arcane
274
275/*---------------------------------------------------------------------------*/
276/*---------------------------------------------------------------------------*/
Integer size() const
Nombre d'éléments du vecteur.
void clear()
Supprime les éléments du tableau.
void addRange(ConstReferenceType val, Int64 n)
Ajoute n élément de valeur val à la fin du tableau.
Int32SharedArray m_removed_items
idem
Int32SharedArray m_added_items
Concatenation of all the family changes during the simulation.
Interface pour gérer une connectivité incrémentale.
virtual String name() const =0
Nom de la connectivité
virtual IItemFamily * targetFamily() const =0
Famille cible.
virtual IItemFamily * sourceFamily() const =0
Famille source.
Interface pour gérer une connectivité.
virtual IItemFamily * targetFamily() const =0
Famille cible.
virtual IItemFamily * sourceFamily() const =0
Famille source.
virtual const String & name() const =0
Nom de la connectivité
Interface d'une famille d'entités.
Definition IItemFamily.h:84
virtual String fullName() const =0
Nom complet de la famille (avec celui du maillage).
virtual TraceMessage warning()=0
Flot pour un message d'avertissement.
void setUpToDate(IItemConnectivity *connectivity) override
Register the connectivity as up to date compared to the two families (source and target).
IItemConnectivitySynchronizer * createSynchronizer(IItemConnectivity *connectivity, IItemConnectivityGhostPolicy *connectivity_ghost_policy) override
Creation of a synchronization object for a connectivity.
void getSourceFamilyModifiedItems(IItemConnectivity *connectivity, Int32ArrayView &added_items, Int32ArrayView &removed_items) override
Retrieval of modified items to update a connectivity.
void notifyLocalIdChanged(IItemFamily *family, Int32ConstArrayView old_to_new_ids, Integer nb_item) override
Update of modified items, possibly compacted.
void setModifiedItems(IItemFamily *family, Int32ConstArrayView added_items, Int32ConstArrayView removed_items) override
Registering modifications of an item family.
Chaîne de caractères unicode.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
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
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:453
std::int32_t Int32
Type entier signé sur 32 bits.