16#include "arcane/mesh/ItemConnectivityMng.h"
17#include "arcane/mesh/ItemConnectivitySynchronizer.h"
31 std::map<IItemConnectivity*, IItemConnectivitySynchronizer*>::iterator ite = m_synchronizers.find(connectivity);
33 if (ite == m_synchronizers.end()) {
35 m_synchronizers[connectivity] = synchronizer;
41 m_synchronizers.erase(ite);
42 m_synchronizers[connectivity] = synchronizer;
50void ItemConnectivityMng::
51_register(
const String& connectivity_name,
const String& source_family_name,
const String& target_family_name)
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;
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;
69 m_trace_mng->
warning() <<
"Connectivity " << connectivity_name <<
" already registered.";
96 _getModifiedItems(connectivity_state.m_state_with_source_family, family_state, added_items, removed_items);
102void ItemConnectivityMng::
107 _getModifiedItems(connectivity_state.m_state_with_target_family, family_state, added_items, removed_items);
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);
121void ItemConnectivityMng::
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);
131void ItemConnectivityMng::
135 if (connectivity_state.m_last_family_state == family_state.m_state)
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);
142 family_state.m_current_added_items.clear();
143 family_state.m_current_added_items.resize(nb_added_items);
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);
153 family_state.m_current_added_items.resize(true_size);
154 added_items = family_state.m_current_added_items.view();
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);
170 _setUpToDate(connectivity_state.m_state_with_source_family, source_family_state);
171 _setUpToDate(connectivity_state.m_state_with_target_family, target_family_state);
180 _setUpToDate(connectivity_state.m_state_with_source_family, source_family_state);
181 _setUpToDate(connectivity_state.m_state_with_target_family, target_family_state);
187void ItemConnectivityMng::
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;
198_lastUpdateSourceFamilyState(
const String& connectivity_name)
200 return _findConnectivity(connectivity_name).m_state_with_source_family.m_last_family_state;
207_lastUpdateTargetFamilyState(
const String& connectivity_name)
209 return _findConnectivity(connectivity_name).m_state_with_target_family.m_last_family_state;
216_familyState(
const String& family_full_name)
218 return _findFamily(family_full_name).m_state;
225_findConnectivity(
const String& connectivity_name)
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;
238_findFamily(
const String& family_full_name)
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;
260 if (new_id < nb_item)
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.
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.
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
std::int32_t Int32
Type entier signé sur 32 bits.