Arcane  v3.15.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ItemFamily.cc
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.cc (C) 2000-2024 */
9/* */
10/* Infos de maillage pour un genre d'entité donnée. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/FatalErrorException.h"
15#include "arcane/utils/ITraceMng.h"
16#include "arcane/utils/StringBuilder.h"
17#include "arcane/utils/ScopedPtr.h"
18#include "arcane/utils/NotImplementedException.h"
19#include "arcane/utils/NotSupportedException.h"
20#include "arcane/utils/ArgumentException.h"
21#include "arcane/utils/CheckedConvert.h"
22#include "arcane/utils/PlatformUtils.h"
23#include "arcane/utils/OStringStream.h"
24#include "arcane/utils/ValueConvert.h"
25
26#include "arcane/core/IParallelMng.h"
27#include "arcane/core/ISubDomain.h"
28#include "arcane/core/VariableTypes.h"
29#include "arcane/core/IVariableMng.h"
30#include "arcane/core/IVariable.h"
31#include "arcane/core/IMesh.h"
32#include "arcane/core/IMeshSubMeshTransition.h"
33#include "arcane/core/IApplication.h"
34#include "arcane/core/IDataFactoryMng.h"
35#include "arcane/core/ItemInfoListView.h"
36#include "arcane/core/ItemPairGroup.h"
37#include "arcane/core/ItemPairGroupImpl.h"
38#include "arcane/core/IMeshUtilities.h"
39#include "arcane/core/IVariableSynchronizer.h"
40#include "arcane/core/ItemInternalSortFunction.h"
41#include "arcane/core/Properties.h"
42#include "arcane/core/ItemFamilyCompactInfos.h"
43#include "arcane/core/IMeshMng.h"
44#include "arcane/core/IMeshCompacter.h"
45#include "arcane/core/IMeshCompactMng.h"
46#include "arcane/core/MeshPartInfo.h"
47#include "arcane/core/ParallelMngUtils.h"
48#include "arcane/core/internal/IDataInternal.h"
49#include "arcane/core/internal/IItemFamilyInternal.h"
50#include "arcane/core/internal/IIncrementalItemConnectivityInternal.h"
51#include "arcane/core/datatype/IDataOperation.h"
52
53#include "arcane/mesh/ItemFamily.h"
54#include "arcane/mesh/ItemSharedInfoList.h"
55#include "arcane/mesh/ItemConnectivityInfo.h"
56#include "arcane/mesh/ItemConnectivitySelector.h"
57#include "arcane/mesh/AbstractItemFamilyTopologyModifier.h"
58#include "arcane/mesh/DynamicMeshKindInfos.h"
59
60#include "arcane/core/parallel/GhostItemsVariableParallelOperation.h"
61#include "arcane/core/parallel/IStat.h"
62
63#include "arcane/core/IIncrementalItemConnectivity.h"
64#include "arcane/core/IItemConnectivityMng.h"
65#include "arcane/core/IItemFamilyPolicyMng.h"
66
67#include "arcane/core/ItemPrinter.h"
68#include "arcane/core/ConnectivityItemVector.h"
69#include "arcane/core/IndexedItemConnectivityView.h"
70
71#include "arcane/mesh/ItemProperty.h"
72#include "arcane/mesh/ItemData.h"
73#include "arcane/mesh/ConnectivityNewWithDependenciesTypes.h"
74
75#include <array>
76
77/*---------------------------------------------------------------------------*/
78/*---------------------------------------------------------------------------*/
79
80namespace Arcane::mesh
81{
82
83/*---------------------------------------------------------------------------*/
84/*---------------------------------------------------------------------------*/
85
86namespace
87{
88
89 template <typename DataType> void
90 _offsetArrayByOne(Array<DataType>* array)
91 {
92 Array<DataType>& v = *array;
93 MeshUtils::checkResizeArray(v, v.size() + 1, false);
94 Int32 n = v.size();
95 for (Int32 i = (n - 1); i >= 1; --i)
96 v[i] = v[i - 1];
97 }
98
99}
100
101/*---------------------------------------------------------------------------*/
102/*---------------------------------------------------------------------------*/
103
105: public IItemFamilyInternal
106{
107 public:
108
109 explicit InternalApi(ItemFamily* family)
110 : m_family(family)
111 {}
112
113 public:
114
116 {
117 return m_family->_unstructuredItemInternalConnectivityList();
118 }
120 {
121 return m_family->_topologyModifier();
122 }
124 {
125 return m_family->commonItemSharedInfo();
126 }
127 void addSourceConnectivity(IIncrementalItemSourceConnectivity* connectivity) override
128 {
129 m_family->_addSourceConnectivity(connectivity);
130 }
131 void addTargetConnectivity(IIncrementalItemTargetConnectivity* connectivity) override
132 {
133 m_family->_addTargetConnectivity(connectivity);
134 }
135 void endAllocate() override
136 {
137 return m_family->_endAllocate();
138 }
140 {
141 return m_family->_notifyEndUpdateFromMesh();
142 }
143 void addVariable(IVariable* var) override
144 {
145 return m_family->_addVariable(var);
146 }
148 {
149 return m_family->_removeVariable(var);
150 }
151 void resizeVariables(bool force_resize) override
152 {
153 return m_family->_resizeVariables(force_resize);
154 }
155
156 private:
157
158 ItemFamily* m_family = nullptr;
159};
160
161/*---------------------------------------------------------------------------*/
162/*---------------------------------------------------------------------------*/
163
165{
166 public:
167
169 const String& family_name,
170 eItemKind item_kind,
172 const String& unique_ids_name,
177 const String& groups_name,
178 const String& current_id_name,
179 const String& new_owner_name,
191 , m_groups_name(VariableBuildInfo(mesh, groups_name))
192 , m_current_id(VariableBuildInfo(mesh, current_id_name))
199 {}
200
201 public:
202
203 void setUsed()
204 {
205 m_items_new_owner.setUsed(true);
206 }
207
208 public:
209
211 // TODO: utiliser un Int16 lorsqu'on aura limité le nombre de ItemSharedInfo sur un Int16
229 VariableArrayString m_groups_name;
230 VariableScalarInteger m_current_id;
242 VariableScalarString m_parent_mesh_name;
243 VariableScalarString m_parent_family_name;
244 VariableScalarInteger m_parent_family_depth;
245 VariableArrayString m_child_meshes_name;
246 VariableArrayString m_child_families_name;
247};
248
249/*---------------------------------------------------------------------------*/
250/*---------------------------------------------------------------------------*/
251
252/*---------------------------------------------------------------------------*/
253/*---------------------------------------------------------------------------*/
254
255ItemFamily::
256ItemFamily(IMesh* mesh, eItemKind ik, const String& name)
257: TraceAccessor(mesh->traceMng())
258, m_name(name)
259, m_mesh(mesh)
260, m_internal_api(new InternalApi(this))
261, m_sub_domain(mesh->subDomain())
262, m_infos(std::make_unique<DynamicMeshKindInfos>(mesh, ik, name))
263, m_item_internal_list(mesh->meshItemInternalList())
264, m_common_item_shared_info(new ItemSharedInfo(this, m_item_internal_list, &m_item_connectivity_list))
265, m_item_shared_infos(new ItemSharedInfoList(this, m_common_item_shared_info))
266, m_properties(new Properties(*mesh->properties(), name))
267, m_sub_domain_id(mesh->meshPartInfo().partRank())
268{
269 m_item_connectivity_list.m_items = mesh->meshItemInternalList();
270 m_infos->setItemFamily(this);
271 m_connectivity_selector_list_by_item_kind.resize(ItemInternalConnectivityList::MAX_ITEM_KIND);
272}
273
274/*---------------------------------------------------------------------------*/
275/*---------------------------------------------------------------------------*/
276
277ItemFamily::
278~ItemFamily()
279{
280 delete m_topology_modifier;
281 delete m_policy_mng;
282 delete m_properties;
283 delete m_local_connectivity_info;
284 delete m_global_connectivity_info;
285 delete m_item_sort_function;
286 delete m_internal_variables;
287 delete m_item_shared_infos;
288
289 for (ItemConnectivitySelector* ics : m_connectivity_selector_list)
290 delete ics;
291
292 delete m_common_item_shared_info;
293 delete m_internal_api;
294}
295
296/*---------------------------------------------------------------------------*/
297/*---------------------------------------------------------------------------*/
298
299String ItemFamily::
300_variableName(const String& base_name) const
301{
302 return m_name + base_name;
303}
304
305/*---------------------------------------------------------------------------*/
306/*---------------------------------------------------------------------------*/
307
308void ItemFamily::
309build()
310{
311 m_item_type_mng = m_mesh->itemTypeMng();
312
313 // Créé le modificateur de topologie si cela n'a pas encore été fait par
314 // la classe dérivée.
315 if (!m_topology_modifier)
316 m_topology_modifier = new AbstractItemFamilyTopologyModifier(this);
317
318 m_full_name = m_mesh->name() + "_" + m_name;
319
320 m_local_connectivity_info = new ItemConnectivityInfo();
321 m_global_connectivity_info = new ItemConnectivityInfo();
322
323 IParallelMng* pm = m_mesh->parallelMng();
324 if (!pm->isParallel()) {
325 m_default_sub_domain_owner = 0;
326 m_is_parallel = false;
327 }
328 else
329 m_is_parallel = true;
330
331 // D'abord initialiser les infos car cela créé les groupes d'entités
332 // et c'est indispensable avant de créer des variables dessus.
333 m_infos->build();
334
335 // Construit l'instance qui contiendra les variables
336 // NOTE: si on change les noms ici, il faut aussi les changer dans MeshStats.cc
337 // sinon les statistiques ne seront pas fiables.
338 {
339 String var_unique_ids_name(_variableName("FamilyUniqueIds"));
340 String var_owner_name(_variableName("FamilyOwner"));
341 String var_flags_name(_variableName("FamilyFlags"));
342 String var_typeid_name(_variableName("FamilyItemTypeId"));
343 String var_nb_parent_name(_variableName("FamilyItemNbParent"));
344 String var_count_name(_variableName("FamilyItemsShared"));
345 String var_groups_name(_variableName("FamilyGroupsName"));
346 String var_current_id_name(_variableName("FamilyCurrentId"));
347 String var_new_owner_name(_variableName("FamilyNewOwnerName"));
348 String var_parent_mesh_name(_variableName("ParentMeshName"));
349 String var_parent_family_name(_variableName("ParentFamilyName"));
350 String var_parent_family_depth_name(_variableName("ParentFamilyDepthName"));
351 String var_child_meshes_name(_variableName("ChildMeshesName"));
352 String var_child_families_name(_variableName("ChildFamiliesName"));
353 m_internal_variables = new Variables(m_mesh, name(), itemKind(), var_count_name,
354 var_unique_ids_name, var_owner_name,
355 var_flags_name, var_typeid_name, var_nb_parent_name, var_groups_name,
356 var_current_id_name, var_new_owner_name,
357 var_parent_mesh_name, var_parent_family_name,
358 var_parent_family_depth_name,
359 var_child_meshes_name,
360 var_child_families_name);
361 // Il ne faut pas utiliser ces tableaux pour accéder aux entités car il y a un décalage
362 // de 1 pour gérer l'entité nulle. Il faut passer par la vue associée
363 // qui est dans m_common_item_shared_info.
364 m_items_unique_id = &m_internal_variables->m_items_unique_id._internalTrueData()->_internalDeprecatedValue();
365 m_items_owner = &m_internal_variables->m_items_owner._internalTrueData()->_internalDeprecatedValue();
366 m_items_flags = &m_internal_variables->m_items_flags._internalTrueData()->_internalDeprecatedValue();
367 m_items_type_id = &m_internal_variables->m_items_type_id._internalTrueData()->_internalDeprecatedValue();
368 m_items_nb_parent = &m_internal_variables->m_items_nb_parent._internalTrueData()->_internalDeprecatedValue();
369 _updateItemViews();
370 }
371
372 m_variable_synchronizer = ParallelMngUtils::createSynchronizerRef(pm, this);
373
374 m_item_sort_function = _defaultItemSortFunction();
375
376 {
377 String s = platform::getEnvironmentVariable("ARCANE_USE_LEGACY_COMPACT_ITEMS");
378 if (s == "TRUE" || s == "1") {
379 info() << "WARNING: Using legacy 'compactItem()' without compactReference()'";
380 m_use_legacy_compact_item = true;
381 }
382 }
383 {
384 if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_ITEMFAMILY_SHRINK_AFTER_ALLOCATE", true))
385 m_do_shrink_after_allocate = (v.value() != 0);
386 }
387}
388
389/*---------------------------------------------------------------------------*/
390/*---------------------------------------------------------------------------*/
391
393findOneItem(Int64 uid)
394{
395 return m_infos->findOne(uid);
396}
397ItemInternalMap& ItemFamily::
398itemsMap()
399{
400 return m_infos->itemsMap();
401}
402const DynamicMeshKindInfos& ItemFamily::
403infos() const
404{
405 return *m_infos;
406}
407
408const DynamicMeshKindInfos& ItemFamily::
409_infos() const
410{
411 return *m_infos;
412}
413
414void ItemFamily::
415_removeOne(Item item)
416{
417 // TODO: vérifier en mode check avec les nouvelles connectivités que l'entité supprimée
418 // n'a pas d'objets connectés.
419 m_infos->removeOne(ItemCompatibility::_itemInternal(item));
420}
421void ItemFamily::
422_detachOne(Item item)
423{
424 m_infos->detachOne(ItemCompatibility::_itemInternal(item));
425}
426ItemInternalList ItemFamily::
427_itemsInternal()
428{
429 return m_infos->itemsInternal();
430}
431ItemInternal* ItemFamily::
432_itemInternal(Int32 local_id)
433{
434 return m_infos->itemInternal(local_id);
435}
436ItemInternal* ItemFamily::
437_allocOne(Int64 unique_id)
438{
439 return m_infos->allocOne(unique_id);
440}
441ItemInternal* ItemFamily::
442_allocOne(Int64 unique_id, bool& need_alloc)
443{
444 return m_infos->allocOne(unique_id, need_alloc);
445}
446ItemInternal* ItemFamily::
447_findOrAllocOne(Int64 uid, bool& is_alloc)
448{
449 return m_infos->findOrAllocOne(uid, is_alloc);
450}
451void ItemFamily::
452_setHasUniqueIdMap(bool v)
453{
454 m_infos->setHasUniqueIdMap(v);
455}
456void ItemFamily::
457_removeMany(Int32ConstArrayView local_ids)
458{
459 m_infos->removeMany(local_ids);
460}
461void ItemFamily::
462_removeDetachedOne(Item item)
463{
464 m_infos->removeDetachedOne(ItemCompatibility::_itemInternal(item));
465}
467itemKind() const
468{
469 return m_infos->kind();
470}
471
472/*---------------------------------------------------------------------------*/
473/*---------------------------------------------------------------------------*/
474
476nbItem() const
477{
478 return m_infos->nbItem();
479}
480
481/*---------------------------------------------------------------------------*/
482/*---------------------------------------------------------------------------*/
483
485maxLocalId() const
486{
487 return m_infos->maxUsedLocalId();
488}
489
490/*---------------------------------------------------------------------------*/
491/*---------------------------------------------------------------------------*/
492
495{
496 return m_infos->itemsInternal();
497}
498
499/*---------------------------------------------------------------------------*/
500/*---------------------------------------------------------------------------*/
501
504{
505 return ItemInfoListView(m_common_item_shared_info);
506}
507
508/*---------------------------------------------------------------------------*/
509/*---------------------------------------------------------------------------*/
510
512parentFamily() const
513{
514 return m_parent_family;
515}
516
517/*---------------------------------------------------------------------------*/
518/*---------------------------------------------------------------------------*/
519
522{
523 m_parent_family = parent;
524 if (parent == this) // Auto-référencement
525 m_parent_family_depth = 1;
526 else if (!parent) // Pas de parent
527 m_parent_family_depth = 0;
528 else { // Référencement croisé
529 m_parent_family_depth = parent->parentFamilyDepth() + 1;
530 m_parent_family->addChildFamily(this);
531 }
532 ARCANE_ASSERT((m_parent_family_depth < 2), ("Not test if more than one depth level"));
533}
534
535/*---------------------------------------------------------------------------*/
536/*---------------------------------------------------------------------------*/
537
539parentFamilyDepth() const
540{
541 return m_parent_family_depth;
542}
543
544/*---------------------------------------------------------------------------*/
545/*---------------------------------------------------------------------------*/
546
549{
550 ItemFamily* true_family = ARCANE_CHECK_POINTER(dynamic_cast<ItemFamily*>(family));
551 m_child_families.add(true_family);
552}
553
554/*---------------------------------------------------------------------------*/
555/*---------------------------------------------------------------------------*/
556
559{
561 for (Integer i = 0; i < m_child_families.size(); ++i) {
562 collection.add(m_child_families[i]);
563 }
564 return collection;
565}
566
567/*---------------------------------------------------------------------------*/
568/*---------------------------------------------------------------------------*/
569
572{
573 return m_internal_variables->m_items_new_owner;
574}
575
576/*---------------------------------------------------------------------------*/
577/*---------------------------------------------------------------------------*/
578
581{
582 _checkValid();
583 m_item_shared_infos->checkValid();
584}
585
586/*---------------------------------------------------------------------------*/
587/*---------------------------------------------------------------------------*/
588
591{
592 _checkValidConnectivity();
593}
594
595/*---------------------------------------------------------------------------*/
596/*---------------------------------------------------------------------------*/
604{
605 // Recalcule les infos de connectivités locale et globales à tous les sous-domaines
606 _computeConnectivityInfo(m_local_connectivity_info);
607 _computeConnectivityInfo(m_global_connectivity_info);
608 m_global_connectivity_info->reduce(parallelMng());
609}
610
611/*---------------------------------------------------------------------------*/
612/*---------------------------------------------------------------------------*/
613
615endUpdate()
616{
617 _endUpdate(true);
618 // TODO: tester la connectivité mais ca fait planter certains cas tests
619 // (dof, amr2 et mesh_modification). A voir si c'est normal.
620 //if (arcaneIsCheck())
621 //checkValidConnectivity();
622}
623
624/*---------------------------------------------------------------------------*/
625/*---------------------------------------------------------------------------*/
626
627void ItemFamily::
628_endAllocate()
629{
630 // La variable n'est pas "used" par défaut car la famille n'est pas encore prête.
631 // Sur les sous-familles, il suffit donc de filtrer setUsed au moment du endAllocate
632 if (!m_parent_family) {
633 m_internal_variables->setUsed();
634 }
635 if (m_do_shrink_after_allocate)
636 _shrinkConnectivityAndPrintInfos();
637}
638
639/*---------------------------------------------------------------------------*/
640/*---------------------------------------------------------------------------*/
641
642void ItemFamily::
643_shrinkConnectivityAndPrintInfos()
644{
645 {
646 ItemConnectivityMemoryInfo mem_info;
647 for (ItemConnectivitySelector* cs : m_connectivity_selector_list) {
648 IIncrementalItemConnectivity* c = cs->customConnectivity();
649 c->_internalApi()->addMemoryInfos(mem_info);
650 }
651 const Int64 total_capacity = mem_info.m_total_capacity;
652 const Int64 total_size = mem_info.m_total_size;
653 Int64 ratio = 100 * (total_capacity - total_size);
654 ratio /= (total_size + 1); // Ajoute 1 pour éviter la division par zéro
655 const Int64 sizeof_int32 = sizeof(Int32);
656 const Int64 mega_byte = 1024 * 1024;
657 Int64 capacity_mega_byte = (mem_info.m_total_capacity * sizeof_int32) / mega_byte;
658 info() << "MemoryUsed for family name=" << name() << " size=" << mem_info.m_total_size
659 << " capacity=" << mem_info.m_total_capacity
660 << " capacity (MegaByte)=" << capacity_mega_byte
661 << " ratio=" << ratio;
662 }
663 OStringStream ostr;
664 std::ostream& o = ostr();
665 o << "Mem=" << platform::getMemoryUsed();
666 for (ItemConnectivitySelector* cs : m_connectivity_selector_list) {
667 IIncrementalItemConnectivity* c = cs->customConnectivity();
668 c->dumpStats(o);
669 o << "\n";
670 c->_internalApi()->shrinkMemory();
671 c->dumpStats(o);
672 o << "\n";
673 }
674 o << "Mem=" << platform::getMemoryUsed();
675 info() << ostr.str();
676}
677
678/*---------------------------------------------------------------------------*/
679/*---------------------------------------------------------------------------*/
680
681bool ItemFamily::
682_partialEndUpdate()
683{
684 bool need_end_update = m_infos->changed();
685 info(4) << "ItemFamily::endUpdate() " << fullName() << " need_end_update?=" << need_end_update;
686 if (!need_end_update) {
687 // Même si aucune entité n'est ajoutée ou supprimée, si \a m_need_prepare_dump
688 // est vrai cela signifie que quelque chose a changé dans la famille. Dans ce
689 // cas il est préférable d'incrémenter le current_id. Sans cela, si on appelle
690 // readFromDump() (par exemple suite à un retour-arrière), les données ne seront
691 // pas restaurées si entre temps current_id n'a pas changé.
692 if (m_need_prepare_dump) {
693 _computeConnectivityInfo(m_local_connectivity_info);
694 ++m_current_id;
695 }
696 return true;
697 }
698 m_item_need_prepare_dump = true;
699 _computeConnectivityInfo(m_local_connectivity_info);
700 ++m_current_id;
701
702 // Update "external" connectivities
704 m_connectivity_mng->setModifiedItems(this, m_infos->addedItems(), m_infos->removedItems());
705 //
706 m_infos->finalizeMeshChanged();
707
708 return false;
709}
710
711/*---------------------------------------------------------------------------*/
712/*---------------------------------------------------------------------------*/
713
714void ItemFamily::
715_endUpdate(bool need_check_remove)
716{
717 if (_partialEndUpdate())
718 return;
719
720 _resizeVariables(false);
721 info(4) << "ItemFamily:endUpdate(): " << fullName()
722 << " hashmapsize=" << itemsMap().nbBucket()
723 << " nb_group=" << m_item_groups.count();
724
725 _updateGroups(need_check_remove);
726}
727
728/*---------------------------------------------------------------------------*/
729/*---------------------------------------------------------------------------*/
730
733{
734 _partialEndUpdate();
735}
736
737/*---------------------------------------------------------------------------*/
738/*---------------------------------------------------------------------------*/
739
742{
743 _updateGroup(group, true);
744}
745
746/*---------------------------------------------------------------------------*/
747/*---------------------------------------------------------------------------*/
748
749void ItemFamily::
750_updateGroup(ItemGroup group, bool need_check_remove)
751{
752 // Pas besoin de recalculer le groupe des entités globales
753 if (group == m_infos->allItems())
754 return;
755
756 if (group.internal()->hasComputeFunctor())
757 group.invalidate();
758 if (need_check_remove) {
759 debug(Trace::High) << "Reset SuppressedItems: " << group.name();
761 }
762 if (arcaneIsCheck())
763 group.checkValid();
764}
765
766/*---------------------------------------------------------------------------*/
767/*---------------------------------------------------------------------------*/
768
769void ItemFamily::
770_updateGroups(bool need_check_remove)
771{
772 for (ItemGroupList::Enumerator i(m_item_groups); ++i;) {
773 ItemGroup group = *i;
774 _updateGroup(group, need_check_remove);
775 }
776}
777
778/*---------------------------------------------------------------------------*/
779/*---------------------------------------------------------------------------*/
780
783{
784 _updateVariable(variable);
785}
786
787/*---------------------------------------------------------------------------*/
788/*---------------------------------------------------------------------------*/
789
790void ItemFamily::
791_updateVariable(IVariable* var)
792{
793 var->resizeFromGroup();
794}
795
796/*---------------------------------------------------------------------------*/
797/*---------------------------------------------------------------------------*/
798
799void ItemFamily::
800_resizeVariables(bool force_resize)
801{
802 debug(Trace::High) << "ItemFamily::resizeVariables: name=" << fullName()
803 << " varsize=" << maxLocalId()
804 << " nb_item=" << nbItem()
805 << " currentsize=" << m_current_variable_item_size;
806 if (force_resize || (maxLocalId() != m_current_variable_item_size)) {
807 info(4) << "ItemFamily::resizeVariables: name=" << fullName()
808 << " varsize=" << maxLocalId()
809 << " nb_item=" << nbItem()
810 << " currentsize=" << m_current_variable_item_size
811 << " group_nb_item=" << allItems().size()
812 << " nb_var=" << m_used_variables.size();
813
814 m_current_variable_item_size = maxLocalId();
815
816 for (IVariable* var : m_used_variables) {
817 _updateVariable(var);
818 }
819 }
820}
821
822/*---------------------------------------------------------------------------*/
823/*---------------------------------------------------------------------------*/
824
825void ItemFamily::
826itemsUniqueIdToLocalId(ArrayView<Int64> ids, bool do_fatal) const
827{
828 m_infos->itemsUniqueIdToLocalId(ids, do_fatal);
829}
830
831/*---------------------------------------------------------------------------*/
832/*---------------------------------------------------------------------------*/
833
834void ItemFamily::
835itemsUniqueIdToLocalId(Int32ArrayView local_ids,
837 bool do_fatal) const
838{
839 m_infos->itemsUniqueIdToLocalId(local_ids, unique_ids, do_fatal);
840}
841
842/*---------------------------------------------------------------------------*/
843/*---------------------------------------------------------------------------*/
844
845void ItemFamily::
846itemsUniqueIdToLocalId(Int32ArrayView local_ids,
848 bool do_fatal) const
849{
850 m_infos->itemsUniqueIdToLocalId(local_ids, unique_ids, do_fatal);
851}
852
853/*---------------------------------------------------------------------------*/
854/*---------------------------------------------------------------------------*/
855
857subDomain() const
858{
859 return m_sub_domain;
860}
861
862/*---------------------------------------------------------------------------*/
863/*---------------------------------------------------------------------------*/
864
866traceMng() const
867{
869}
870
871/*---------------------------------------------------------------------------*/
872/*---------------------------------------------------------------------------*/
873
875mesh() const
876{
877 return m_mesh;
878}
879
880/*---------------------------------------------------------------------------*/
881/*---------------------------------------------------------------------------*/
882
884parallelMng() const
885{
886 return m_mesh->parallelMng();
887}
888
889/*---------------------------------------------------------------------------*/
890/*---------------------------------------------------------------------------*/
891
893allItems() const
894{
895 _checkNeedEndUpdate();
896 return m_infos->allItems();
897}
898
899/*---------------------------------------------------------------------------*/
900/*---------------------------------------------------------------------------*/
901
904{
905 debug(Trace::High) << "ItemFamily:createGroup(name,Int32ConstArrayView): " << m_name << ":"
906 << " group_name=" << name
907 << " count=" << elements.size()
908 << " override=" << do_override;
909
910 _checkNeedEndUpdate();
911
912 {
913 ItemGroup group;
914 if (do_override) {
915 group = findGroup(name);
916 if (group.null())
917 group = createGroup(name);
918 }
919 else {
920 group = createGroup(name);
921 }
922 group.setItems(elements);
923 return group;
924 }
925}
926
927/*---------------------------------------------------------------------------*/
928/*---------------------------------------------------------------------------*/
929
931createGroup(const String& name)
932{
933 //#warning SDP CHANGE
934 // SDP: probleme protection-reprise ...
935 {
937 if (!g.null()) {
938 fatal() << "Attempting to create an already existing group '" << name << "'";
939 }
940 }
941 debug() << "ItemFamily:createGroup(name): " << m_name << ":"
942 << " name=" << name;
943 ItemGroup group(new ItemGroupImpl(this, name));
944 _processNewGroup(group);
945 return group;
946}
947
948/*---------------------------------------------------------------------------*/
949/*---------------------------------------------------------------------------*/
950
952createGroup(const String& name, const ItemGroup& parent, bool do_override)
953{
954 ItemGroup group = findGroup(name);
955 if (!group.null()) {
956 if (do_override) {
957 if (group.internal()->parentGroup() != parent)
958 fatal() << "Group already existing but with a different parent";
959 if (group == parent)
960 fatal() << "A group can not be its own parent name=" << name;
961 return group;
962 }
963 fatal() << "Attempting to create an already existing group '" << name << "'";
964 }
965 if (parent.null())
966 fatal() << "Attempting to create a group '" << name << "' with no parent.";
967 debug() << "ItemFamily:createGroup(name,parent): " << m_name << ":"
968 << " name=" << name
969 << " parent=" << parent.name();
970 group = ItemGroup(new ItemGroupImpl(this, parent.internal(), name));
971 _processNewGroup(group);
972 return group;
973}
974
975/*---------------------------------------------------------------------------*/
976/*---------------------------------------------------------------------------*/
977
980{
981 _invalidateComputedGroups();
982 ItemGroupList current_groups(m_item_groups.clone());
983 m_item_groups.clear();
985 ItemGroup group(*i);
986 if (group.isAllItems())
987 m_item_groups.add(group);
988 else
989 group.internal()->destroy();
990 }
992}
993
994/*---------------------------------------------------------------------------*/
995/*---------------------------------------------------------------------------*/
996
999{
1000 debug() << "ItemFamily::notifyItemsOwnerChanged()";
1001 for (ItemGroup group : m_item_groups) {
1002 if (m_is_parallel && group.internal()->hasComputeFunctor())
1003 group.invalidate();
1004 }
1005
1006 // Propage les modifications sur les sous-familles
1007 for (Integer i = 0; i < m_child_families.size(); ++i) {
1008 IItemFamily* family = m_child_families[i];
1009 ItemInternalArrayView items(family->itemsInternal());
1010 for (Integer z = 0, zs = items.size(); z < zs; ++z) {
1011 impl::MutableItemBase item(items[z]);
1012 if (item.isSuppressed())
1013 continue;
1014 Item parent_item = item.parentBase(0);
1015 ARCANE_ASSERT((parent_item.uniqueId() == item.uniqueId()), ("Inconsistent parent uid"));
1016 item.setOwner(parent_item.owner(), m_sub_domain_id);
1017 }
1018 family->notifyItemsOwnerChanged();
1019 }
1020}
1021
1022/*---------------------------------------------------------------------------*/
1023/*---------------------------------------------------------------------------*/
1024
1025void ItemFamily::
1026_processNewGroup(ItemGroup group)
1027{
1028 // Vérifie que le groupe à le bon type
1029 if (group.itemKind() != itemKind()) {
1030 ARCANE_FATAL("Incoherent family name={0} wanted={1} current={2}",
1031 fullName(), itemKind(), group.itemKind());
1032 }
1033 m_item_groups.add(group);
1034 m_need_prepare_dump = true;
1035 // En séquentiel, tous les groupes sont des groupes propres
1036 // TODO: regarder pour supprimer le test avec 'm_is_parallel' mais
1037 // si on le fait ca fait planter certains tests avec aleph_kappa.
1038 if (!m_is_parallel && m_mesh->meshPartInfo().nbPart() == 1)
1039 group.setOwn(true);
1040}
1041
1042/*---------------------------------------------------------------------------*/
1043/*---------------------------------------------------------------------------*/
1044
1046groups() const
1047{
1048 return m_item_groups;
1049}
1050
1051/*---------------------------------------------------------------------------*/
1052/*---------------------------------------------------------------------------*/
1053
1055findGroup(const String& name) const
1056{
1057 for (const ItemGroup& group : m_item_groups) {
1058 if (group.name() == name)
1059 return group;
1060 }
1061 return ItemGroup();
1062}
1063
1064/*---------------------------------------------------------------------------*/
1065/*---------------------------------------------------------------------------*/
1066
1069{
1070 ItemGroup group = findGroup(name);
1071 if (group.null()) {
1072 if (create_if_needed)
1073 group = createGroup(name);
1074 }
1075 return group;
1076}
1077
1078/*---------------------------------------------------------------------------*/
1079/*---------------------------------------------------------------------------*/
1080
1083{
1084 itemsMap().notifyUniqueIdsChanged();
1085}
1086
1087/*---------------------------------------------------------------------------*/
1088/*---------------------------------------------------------------------------*/
1089
1090void ItemFamily::
1091_checkNeedEndUpdate() const
1092{
1093 if (m_infos->changed())
1094 ARCANE_FATAL("missing call to endUpdate() after modification");
1095}
1096
1097/*---------------------------------------------------------------------------*/
1098/*---------------------------------------------------------------------------*/
1099
1102{
1103 info(4) << "ItemFamily::prepareForDump(): " << fullName()
1104 << " need=" << m_need_prepare_dump
1105 << " item-need=" << m_item_need_prepare_dump
1106 << " m_item_shared_infos->hasChanged()=" << m_item_shared_infos->hasChanged()
1107 << " nb_item=" << m_infos->nbItem();
1108
1109 {
1110 auto* p = m_properties;
1111 p->setInt32("dump-version", 0x0307);
1112 p->setInt32("nb-item", m_infos->nbItem());
1113 p->setInt32("current-change-id", m_current_id);
1114 }
1115
1116 // TODO: ajoute flag vérification si nécessaire
1117 if (m_item_need_prepare_dump || m_item_shared_infos->hasChanged()) {
1118 info(4) << "Prepare for dump:2: name=" << m_name << " nb_alloc=" << m_nb_allocate_info
1119 << " uid_size=" << m_items_unique_id->size() << " cap=" << m_items_unique_id->capacity()
1120 << " byte=" << m_items_unique_id->capacity() * sizeof(Int64);
1121
1122 // TODO: pouvoir spécifier si on souhaite compacter ou pas.
1123 _compactOnlyItems(false);
1124
1125 // Suppose compression
1126 m_infos->prepareForDump();
1127 m_item_shared_infos->prepareForDump();
1128 m_need_prepare_dump = true;
1129 }
1130 m_item_need_prepare_dump = false;
1131 if (m_need_prepare_dump) {
1132 Integer nb_item = m_infos->nbItem();
1133 // TODO: regarder si ce ne serait pas mieux de faire cela dans finishCompactItem()
1134 _resizeItemVariables(nb_item, true);
1135 m_internal_variables->m_current_id = m_current_id;
1136 info(4) << " SET FAMILY ID name=" << name() << " id= " << m_current_id
1137 << " saveid=" << m_internal_variables->m_current_id();
1138 ItemInternalList items(m_infos->itemsInternal());
1139 m_internal_variables->m_items_shared_data_index.resize(nb_item);
1141 info(4) << "ItemFamily::prepareForDump(): " << m_name
1142 << " count=" << nb_item << " currentid=" << m_current_id;
1143 // Normalement items[i]->localId()==i pour toute les entités car on a effectué un compactage
1144 if (arcaneIsCheck()) {
1145 for (Integer i = 0; i < nb_item; ++i) {
1146 ItemInternal* item = items[i];
1147 if (item->localId() != i)
1148 ARCANE_FATAL("Incoherence between index ({0}) and localId() ({1})", i, item->localId());
1149 }
1150 }
1151 for (Integer i = 0; i < nb_item; ++i) {
1152 ItemInternal* item = items[i];
1153 ItemSharedInfoWithType* isi = m_item_shared_infos->findSharedInfo(item->typeInfo());
1154 items_shared_data_index[i] = isi->index();
1155#if 0
1156#ifdef ARCANE_DEBUG
1157 //if (itemKind()==IK_Particle){
1158 info() << "Item: SHARED_INDEX = " << items_shared_data_index[i]
1159 << " uid = " << item->uniqueId()
1160 << " lid = " << item->localId()
1161 << " dataindex = " << item->dataIndex()
1162 << " flags = " << item->flags();
1163 //}
1164#endif
1165#endif
1166 }
1167
1168 // Données de liaison de familles
1169 {
1170 if (m_parent_family) {
1171 m_internal_variables->m_parent_family_name = m_parent_family->name();
1172 m_internal_variables->m_parent_mesh_name = m_parent_family->mesh()->name();
1173 }
1174 m_internal_variables->m_parent_family_depth = m_parent_family_depth;
1175 const Integer child_count = m_child_families.size();
1176 m_internal_variables->m_child_meshes_name.resize(child_count);
1177 m_internal_variables->m_child_families_name.resize(child_count);
1178 for (Integer i = 0; i < child_count; ++i) {
1179 m_internal_variables->m_child_meshes_name[i] = m_child_families[i]->mesh()->name();
1180 m_internal_variables->m_child_families_name[i] = m_child_families[i]->name();
1181 }
1182 }
1183
1184 {
1185 // Détermine le nombre de groupes et d'entités à sauver.
1186 // On ne sauve pas les groupes générés dynamiquement
1187 Integer nb_group_to_save = 0;
1188 for (ItemGroupList::Enumerator i(m_item_groups); ++i;) {
1189 const ItemGroup& group = *i;
1190 if (group.internal()->hasComputeFunctor() || group.isLocalToSubDomain())
1191 continue;
1192 debug(Trace::High) << "Save group info name=" << group.name();
1194 }
1195 m_internal_variables->m_groups_name.resize(nb_group_to_save);
1196 {
1197 Integer current_group_index = 0;
1198 for (ItemGroupList::Enumerator i(m_item_groups); ++i;) {
1199 const ItemGroup& group = *i;
1200 if (group.internal()->hasComputeFunctor() || group.isLocalToSubDomain())
1201 continue;
1202 m_internal_variables->m_groups_name[current_group_index] = group.name();
1204 }
1205 }
1206 }
1207 }
1208 // Fait en sorte que les groupes soient à jour, pour être sur que
1209 // la sauvegarde sera correcte.
1210 // NOTE: Est-ce ici qu'il faut le faire ?
1211 // NOTE: plutot utiliser un observer sur la variable du groupe?
1212 _applyCheckNeedUpdateOnGroups();
1213
1214 m_need_prepare_dump = false;
1215}
1216
1217/*---------------------------------------------------------------------------*/
1218/*---------------------------------------------------------------------------*/
1219
1222{
1223 // TODO: GG: utiliser un flag pour indiquer qu'il faudra reconstruire
1224 // les infos de synchro mais ne pas le faire directement dans cette methode.
1225
1226 Int32 nb_item = 0;
1227 Int32 dump_version = 0;
1228 // Indique si on utilise la variable contenant le type de l'entité pour
1229 // construire les ItemInternal. Cela n'est possible qu'avec les protections
1230 // effectuées depuis une version 3.7 de Arcane. Avant cela il faut utiliser
1231 // la variable m_items_shared_data_index.
1232 bool use_type_variable = false;
1233 {
1234 Int32 x = 0;
1235 auto* p = m_properties;
1236 if (p->get("dump-version", x))
1237 dump_version = x;
1238 if (dump_version >= 0x0307) {
1239 use_type_variable = true;
1240 nb_item = p->getInt32("nb-item");
1241 Int32 cid = p->getInt32("current-change-id");
1242 Int32 expected_cid = m_internal_variables->m_current_id();
1243 if (cid != expected_cid)
1244 ARCANE_FATAL("Bad value for current id mesh={0} id={1} expected={2}",
1246 }
1247 }
1248
1249 const bool allow_old_version = true;
1250 if (!allow_old_version)
1251 if (dump_version < 0x0307)
1252 ARCANE_FATAL("Your checkpoint is from a version of Arcane which is too old (mininum version is 3.7)");
1253
1254 // Le numéro de la partie peut changer en reprise. Il faut donc le
1255 // remettre à jour. De même, si on passe d'un maillage séquentiel à un
1256 // maillage en plusieurs parties en reprise, il faut supprimer le isOwn()
1257 // du groupe de toutes les entités.
1258 const MeshPartInfo& part_info = m_mesh->meshPartInfo();
1259 m_sub_domain_id = part_info.partRank();
1260 if (m_infos->allItems().isOwn() && part_info.nbPart() > 1)
1261 m_infos->allItems().setOwn(false);
1262
1263 // NOTE: l'implémentation actuelle suppose que les dataIndex() des
1264 // entites sont consécutifs et croissants avec le localId() des entités
1265 // (c.a.d l'entité de localId() valant 0 à aussi un dataIndex() de 0,
1266 // celle de localId() valant 1, le dataIndex() suivant ...)
1267 // Cette condition est vrai si compactReferences() a été appelé.
1268 // Lorsque ce ne sera plus le cas (trou dans la numérotation), il faudra
1269 // ajouter une variable data_index sur les entités.
1271 if (!use_type_variable)
1273
1274 info(4) << "ItemFamily::readFromDump(): " << fullName()
1275 << " count=" << nb_item
1276 << " currentid=" << m_current_id
1277 << " saveid=" << m_internal_variables->m_current_id()
1278 << " use_type_variable?=" << use_type_variable
1279 << " dump_version=" << dump_version;
1280
1281 if (!use_type_variable) {
1282 // Avec les anciennes protections il n'y a pas la variable pour le type de l'entité.
1283 // Il faut donc l'allouer ici car on s'en sert lorsqu'on appelle ItemInternal::setSharedInfo().
1284 if (nb_item > 0)
1285 MeshUtils::checkResizeArray(*m_items_type_id, nb_item + 1, false);
1286 // Il n'y a pas non plus le décalage de 1 pour les flags, owner et uniqueId.
1287 // On fait ce décalage ici.
1288 _handleOldCheckpoint();
1289 }
1290 _updateItemViews();
1291
1292 if (m_internal_variables->m_current_id() == m_current_id) {
1293 debug() << "Family unchanged. Nothing to do.";
1294 //GG: il faut quand meme recalculer les infos de synchro car cette famille
1295 // sur les autres sous-domaine peut avoir changee et dans ce cas cette
1296 // fonctione sera appelee. De meme, la liste des groupes peut avoir changée
1297 // et leur valeur aussi pour les groupes recalculés donc il faut les invalider
1299 _readGroups();
1300 _invalidateComputedGroups();
1301 return;
1302 }
1303
1304 m_current_id = m_internal_variables->m_current_id();
1305 // IMPORTANT: remise à zéro pour obligatoirement redimensionner les variables
1306 // au prochain ajout d'entités.
1307 m_current_variable_item_size = 0;
1308
1309 // Données de liaison de famille
1310 {
1311 IMeshMng* mesh_mng = m_mesh->meshMng();
1312 if (!m_internal_variables->m_parent_mesh_name().null()) {
1313 IMesh* parent_mesh = mesh_mng->findMeshHandle(m_internal_variables->m_parent_mesh_name()).mesh();
1314 m_parent_family = parent_mesh->findItemFamily(m_internal_variables->m_parent_family_name(), true); // true=> fatal si non trouvé
1315 }
1316 m_parent_family_depth = m_internal_variables->m_parent_family_depth();
1317 ARCANE_ASSERT((m_internal_variables->m_child_meshes_name.size() == m_internal_variables->m_child_families_name.size()),
1318 ("Incompatible child mesh/family sizes"));
1319 Integer child_count = m_internal_variables->m_child_families_name.size();
1320 for (Integer i = 0; i < child_count; ++i) {
1321 IMesh* child_mesh = mesh_mng->findMeshHandle(m_internal_variables->m_child_meshes_name[i]).mesh();
1322 IItemFamily* child_family = child_mesh->findItemFamily(m_internal_variables->m_child_families_name[i], true); // true=> fatal si non trouvé
1323 m_child_families.add(dynamic_cast<ItemFamily*>(child_family));
1324 }
1325 }
1326
1327 m_item_shared_infos->readFromDump();
1328 m_infos->readFromDump();
1329
1330 // En relecture les entités sont compactées donc la valeur max du localId()
1331 // est égal au nombre d'entités.
1332
1333 if (use_type_variable) {
1335 for (Integer i = 0; i < nb_item; ++i) {
1336 ;
1337 ItemTypeId type_id{ m_common_item_shared_info->m_type_ids[i] };
1338 ItemSharedInfoWithType* isi = _findSharedInfo(type_mng->typeFromId(type_id));
1339 Int64 uid = m_items_unique_id_view[i];
1340 ItemInternal* item = m_infos->allocOne(uid);
1341 item->_setSharedInfo(isi->sharedInfo(), type_id);
1342 }
1343 }
1344 else {
1345 // Méthode utilisée pour les protections issues des versions 3.6 et antérieure de Arcane.
1346 auto item_shared_infos = m_item_shared_infos->itemSharedInfos();
1347 for (Integer i = 0; i < nb_item; ++i) {
1350 Int64 uid = m_items_unique_id_view[i];
1351 ItemInternal* item = m_infos->allocOne(uid);
1352 item->_setSharedInfo(isi->sharedInfo(), isi->itemTypeId());
1353 }
1354 }
1355
1356 // Supprime les entités du groupe total car elles vont être remises à jour
1357 // lors de l'appel à _endUpdate()
1358 m_infos->allItems().clear();
1359
1360 // Notifie les connectivités sources qu'on vient de faire une relecture.
1361 for (auto& c : m_source_incremental_item_connectivities)
1362 c->notifyReadFromDump();
1363
1364 // Recréation des groupes si nécessaire
1365 _readGroups();
1366
1367 // Invalide les groupes recalculés
1368 _invalidateComputedGroups();
1369
1370 _endUpdate(false);
1371
1373}
1374
1375/*---------------------------------------------------------------------------*/
1376/*---------------------------------------------------------------------------*/
1377
1378void ItemFamily::
1379_applyCheckNeedUpdateOnGroups()
1380{
1381 for (ItemGroupList::Enumerator i(m_item_groups); ++i;) {
1382 ItemGroup group = *i;
1383 // Pas besoin de recalculer le groupe des entités globales
1384 if (group == m_infos->allItems())
1385 continue;
1386 group.internal()->checkNeedUpdate();
1387 }
1388}
1389
1390/*---------------------------------------------------------------------------*/
1391/*---------------------------------------------------------------------------*/
1392
1393void ItemFamily::
1394_invalidateComputedGroups()
1395{
1396 // Si le groupe a un parent, il n'a pas de variable associée et
1397 // de plus peut contenir des valeurs invalides suite à un retour-arrière.
1398 // Dans ce cas, on le vide et on l'invalide.
1399 for (ItemGroupList::Enumerator i(m_item_groups); ++i;) {
1400 ItemGroup group = *i;
1401 if (!group.internal()->parentGroup().null()) {
1402 group.clear();
1403 group.invalidate();
1404 }
1405 }
1406}
1407
1408/*---------------------------------------------------------------------------*/
1409/*---------------------------------------------------------------------------*/
1415{
1416 // Recréation des groupes si nécessaire
1417 VariableArrayString& groups_var = m_internal_variables->m_groups_name;
1418 debug() << "ItemFamily::readFromDump(): number of group: " << groups_var.size();
1419 for (Integer i = 0, is = groups_var.size(); i < is; ++i) {
1421 debug() << "Readign group again: " << name;
1422 ItemGroup group = findGroup(name);
1423 if (group.null())
1425 }
1426}
1427
1428/*---------------------------------------------------------------------------*/
1429/*---------------------------------------------------------------------------*/
1437_checkComputeSynchronizeInfos(Int32 changed)
1438{
1439 Int32 global_changed = parallelMng()->reduce(Parallel::ReduceMax, changed);
1440 if (global_changed != 0)
1442}
1443
1444/*---------------------------------------------------------------------------*/
1445/*---------------------------------------------------------------------------*/
1455{
1457
1458 // Il est necessaire de mettre a jour les groupes.
1459 // TODO verifier s'il faut le faire tout le temps
1460 m_need_prepare_dump = true;
1461
1462 // Indique aussi qu'il faudra refaire un compactReference()
1463 // lors du dump.
1464 // NOTE: spécifier cela forcera aussi un recompactage lors du prepareForDump()
1465 // et ce compactage est inutile dans le cas présent.
1466 // TODO: regarder comment indiquer au prepareForDump() qu'on souhaite
1467 // juste faire un compactReference().
1468 m_item_need_prepare_dump = true;
1469}
1470
1471/*---------------------------------------------------------------------------*/
1472/*---------------------------------------------------------------------------*/
1478{
1480
1481 if (!m_use_legacy_compact_item) {
1482 // Il est nécessaire de mettre à jour les groupes
1483 // après un compactReferences().
1484 _applyCheckNeedUpdateOnGroups();
1485 }
1486}
1487
1488/*---------------------------------------------------------------------------*/
1489/*---------------------------------------------------------------------------*/
1495{
1497 IMeshCompacter* compacter = compact_mng->beginCompact(this);
1498
1499 try {
1500 compacter->setSorted(do_sort);
1501 compacter->doAllActions();
1502 }
1503 catch (...) {
1504 compact_mng->endCompact();
1505 throw;
1506 }
1507 compact_mng->endCompact();
1508}
1509
1510/*---------------------------------------------------------------------------*/
1511/*---------------------------------------------------------------------------*/
1512
1513void ItemFamily::
1514beginCompactItems(ItemFamilyCompactInfos& compact_infos)
1515{
1516 m_infos->beginCompactItems(compact_infos);
1517
1518 if (arcaneIsCheck())
1519 m_infos->checkValid();
1520
1523
1524 for (auto& c : m_source_incremental_item_connectivities)
1525 c->notifySourceFamilyLocalIdChanged(new_to_old_ids);
1526
1527 for (auto& c : m_target_incremental_item_connectivities)
1528 c->notifyTargetFamilyLocalIdChanged(old_to_new_ids);
1529
1530 for (IItemConnectivity* c : m_source_item_connectivities)
1531 c->notifySourceFamilyLocalIdChanged(new_to_old_ids);
1532
1534 c->notifyTargetFamilyLocalIdChanged(old_to_new_ids);
1535
1538
1539 // Compactage des variables internes associées aux entités
1540 {
1541 if (m_parent_family_depth > 0)
1542 m_internal_variables->m_items_nb_parent.variable()->compact(new_to_old_ids);
1543
1544 _updateItemViews();
1545 }
1546}
1547
1548/*---------------------------------------------------------------------------*/
1549/*---------------------------------------------------------------------------*/
1550
1551void ItemFamily::
1552finishCompactItems(ItemFamilyCompactInfos& compact_infos)
1553{
1554 if (arcaneIsCheck())
1555 m_infos->checkValid();
1556
1557 m_infos->finishCompactItems(compact_infos);
1558
1559 for (ItemConnectivitySelector* ics : m_connectivity_selector_list)
1560 ics->compactConnectivities();
1561}
1562
1563/*---------------------------------------------------------------------------*/
1564/*---------------------------------------------------------------------------*/
1574{
1575 ARCANE_ASSERT(source.size() == destination.size(),
1576 ("Can't copy. Source and destination have different size !"));
1577
1578 if (source.size() != 0) {
1579 for (IVariable* var : m_used_variables) {
1580 // (HP) : comme vu avec Gilles et Stéphane, on ne met pas de filtre à ce niveau
1581 // // si la variable est temporaire ou no restore, on ne la copie pas
1582 // if (!(var->property() & (IVariable::PTemporary | IVariable::PNoRestore))) {
1583 //if (var->itemFamily()==this) {
1584 var->copyItemsValues(source, destination);
1585 }
1586 }
1587}
1588
1589/*---------------------------------------------------------------------------*/
1590/*---------------------------------------------------------------------------*/
1603 Int32ConstArrayView destination)
1604{
1605 ARCANE_ASSERT(first_source.size() == destination.size(),
1606 ("Can't copy. : first_source and destination have different size !"));
1607 ARCANE_ASSERT(second_source.size() == destination.size(),
1608 ("Can't copy : second_source and destination have different size !"));
1609
1610 if (first_source.size() != 0) {
1611 for (IVariable* var : m_used_variables) {
1612 if (!(var->property() & (IVariable::PTemporary | IVariable::PNoRestore))) {
1613 var->copyItemsMeanValues(first_source, second_source, destination);
1614 }
1615 }
1616 }
1617}
1618
1619/*---------------------------------------------------------------------------*/
1620/*---------------------------------------------------------------------------*/
1629{
1632
1633 for (IVariable* var : m_used_variables) {
1634 debug(Trace::High) << "Compact variable " << var->fullName();
1635 var->compact(new_to_old_ids);
1636 }
1637
1638 m_variable_synchronizer->changeLocalIds(old_to_new_ids);
1639
1640 for (ItemGroupList::Enumerator i(m_item_groups); ++i;) {
1641 ItemGroup group = *i;
1642 debug(Trace::High) << "Change group Ids: " << group.name();
1644 if (group.hasSynchronizer())
1646 }
1647
1648 for (Integer i = 0; i < m_child_families.size(); ++i)
1649 m_child_families[i]->_compactFromParentFamily(compact_infos);
1650
1651 info(4) << "End compact family=" << fullName()
1652 << " max_local_id=" << maxLocalId()
1653 << " nb_item=" << nbItem();
1654
1655 // Apres compactage, les variables seront allouées avec comme nombre
1656 // d'éléments le nombre d'entité (c'est dans DynamicMeshKindInfos::finishCompactItems()
1657 // que maxLocalId() devient égal à nbItem()).
1658 m_current_variable_item_size = nbItem();
1659}
1660
1661/*---------------------------------------------------------------------------*/
1662/*---------------------------------------------------------------------------*/
1669#ifdef NEED_MERGE
1670void ItemFamily::
1671compactConnectivities()
1672{
1673 Int32ConstArrayView new_to_old_ids = m_infos.newToOldLocalIds();
1674 Int32ConstArrayView old_to_new_ids = m_infos.oldToNewLocalIds();
1676 c->notifySourceFamilyLocalIdChanged(new_to_old_ids);
1677
1679 c->notifyTargetFamilyLocalIdChanged(old_to_new_ids);
1680
1683}
1684#endif
1685
1686/*---------------------------------------------------------------------------*/
1687/*---------------------------------------------------------------------------*/
1688
1691{
1692 debug() << "Compacting child family " << fullName();
1693 if (m_parent_family_depth > 1)
1694 throw NotImplementedException(A_FUNCINFO, "Too deep parent family: not yet implemented");
1696 ARCANE_ASSERT((nbItem() == 0 || !old_to_new_lids.empty()), ("Empty oldToNewLocalIds"));
1697 debug() << "\tfrom parent family " << m_parent_family->name();
1698 if (this == m_parent_family)
1699 return; // already self compacted
1701 for (Integer z = 0, zs = items.size(); z < zs; ++z) {
1702 ItemInternal* item = items[z];
1703 Int32 old_parent_lid = item->parentId(0); // depth==1 only !!
1705 }
1706 // Si depth>1, il faudrait plutot propager le compactage en modifiant les
1707 // oldToNewLocalIds des familles du sous-maillage courant et en appelant
1708 // DynamicMesh::_compactItems en cascade (à partir de ce sous-maillage)
1709}
1710
1711/*---------------------------------------------------------------------------*/
1712/*---------------------------------------------------------------------------*/
1713
1716{
1717 ARCANE_UNUSED(local_ids);
1718 ARCANE_UNUSED(keep_ghost);
1719 ARCANE_THROW(NotSupportedException, "this kind of family doesn't support this operation");
1720}
1721
1722/*---------------------------------------------------------------------------*/
1723/*---------------------------------------------------------------------------*/
1724
1725void ItemFamily::
1726_checkValid()
1727{
1728 // Vérifie que le numéro de la partie est le même que celui du maillage
1729 {
1730 Int32 part_rank = m_mesh->meshPartInfo().partRank();
1731 if (m_sub_domain_id != part_rank)
1732 ARCANE_FATAL("Family {0} Bad value for partRank ({1}) expected={2}",
1733 fullName(), m_sub_domain_id, part_rank);
1734 }
1735}
1736
1737/*---------------------------------------------------------------------------*/
1738/*---------------------------------------------------------------------------*/
1739
1740void ItemFamily::
1741_reserveInfosMemory(Integer memory)
1742{
1743 ARCANE_UNUSED(memory);
1744}
1745
1746/*---------------------------------------------------------------------------*/
1747/*---------------------------------------------------------------------------*/
1748
1749void ItemFamily::
1750_resizeInfos(Integer new_size)
1751{
1752 ARCANE_UNUSED(new_size);
1753}
1754
1755/*---------------------------------------------------------------------------*/
1756/*---------------------------------------------------------------------------*/
1757
1758Integer ItemFamily::
1759_allocMany(Integer memory)
1760{
1761 ARCANE_UNUSED(memory);
1762 return 0;
1763}
1764
1765/*---------------------------------------------------------------------------*/
1766/*---------------------------------------------------------------------------*/
1767
1768ItemSharedInfoWithType* ItemFamily::
1769_findSharedInfo(ItemTypeInfo* type)
1770{
1771 return m_item_shared_infos->findSharedInfo(type);
1772}
1773
1774/*---------------------------------------------------------------------------*/
1775/*---------------------------------------------------------------------------*/
1776
1777void ItemFamily::
1778_updateSharedInfo()
1779{
1780 //TODO: Regarder si cela est toujours utile
1781 m_need_prepare_dump = true;
1782}
1783
1784/*---------------------------------------------------------------------------*/
1785/*---------------------------------------------------------------------------*/
1786
1787void ItemFamily::
1788_allocateInfos(ItemInternal* item, Int64 uid, ItemTypeInfo* type)
1789{
1790 ItemSharedInfoWithType* isi = _findSharedInfo(type);
1791 _allocateInfos(item, uid, isi);
1792}
1793
1794/*---------------------------------------------------------------------------*/
1795/*---------------------------------------------------------------------------*/
1796
1797void ItemFamily::
1798_resizeItemVariables(Int32 new_size, bool force_resize)
1799{
1800 bool is_resize = MeshUtils::checkResizeArray(*m_items_unique_id, new_size + 1, force_resize);
1801 is_resize |= MeshUtils::checkResizeArray(*m_items_owner, new_size + 1, force_resize);
1802 is_resize |= MeshUtils::checkResizeArray(*m_items_flags, new_size + 1, force_resize);
1803 is_resize |= MeshUtils::checkResizeArray(*m_items_type_id, new_size + 1, force_resize);
1804 if (m_parent_family_depth > 0)
1805 is_resize |= MeshUtils::checkResizeArray(*m_items_nb_parent, new_size, force_resize);
1806 if (is_resize)
1807 _updateItemViews();
1808
1809 // Positionne les valeurs pour l'entité nulle.
1810 // NOTE: regarder pour faire cela à l'init.
1811 (*m_items_unique_id)[0] = NULL_ITEM_UNIQUE_ID;
1812 (*m_items_flags)[0] = 0;
1813 (*m_items_owner)[0] = A_NULL_RANK;
1814 (*m_items_type_id)[0] = IT_NullType;
1815}
1816
1817/*---------------------------------------------------------------------------*/
1818/*---------------------------------------------------------------------------*/
1819
1820void ItemFamily::
1821_allocateInfos(ItemInternal* item, Int64 uid, ItemSharedInfoWithType* isi)
1822{
1823 // TODO: faire en même temps que le réalloc de la variable uniqueId()
1824 // le réalloc des m_source_incremental_item_connectivities.
1825 Int32 local_id = item->localId();
1826 _resizeItemVariables(local_id + 1, false);
1827
1828 // TODO: regarder si encore utile car ItemInternal::reinitialize() doit le faire
1829 //(*m_items_unique_id)[local_id] = uid;
1830
1831 ItemTypeId iti = isi->itemTypeId();
1832 item->_setSharedInfo(isi->sharedInfo(), iti);
1833
1834 item->reinitialize(uid, m_default_sub_domain_owner, m_sub_domain_id);
1835 ++m_nb_allocate_info;
1836 // Notifie les connectivitées incrémentales qu'on a ajouté un élément à la source
1837 for (auto& c : m_source_incremental_item_connectivities)
1838 c->notifySourceItemAdded(ItemLocalId(local_id));
1839}
1840
1841/*---------------------------------------------------------------------------*/
1842/*---------------------------------------------------------------------------*/
1843
1844void ItemFamily::
1845_preAllocate(Int32 nb_item, bool pre_alloc_connectivity)
1846{
1847 if (nb_item > 1000)
1848 m_infos->itemsMap().resize(nb_item, true);
1849 _resizeItemVariables(nb_item, false);
1850 for (auto& c : m_source_incremental_item_connectivities)
1851 c->reserveMemoryForNbSourceItems(nb_item, pre_alloc_connectivity);
1852}
1853
1854/*---------------------------------------------------------------------------*/
1855/*---------------------------------------------------------------------------*/
1856
1857void ItemFamily::
1858_notifyDataIndexChanged()
1859{
1860 _updateItemViews();
1861}
1862
1863/*---------------------------------------------------------------------------*/
1864/*---------------------------------------------------------------------------*/
1865
1868{
1869 Int32ConstArrayView ranks = m_variable_synchronizer->communicatingRanks();
1870 Integer s = ranks.size();
1871 sub_domains.resize(s);
1872 sub_domains.copy(ranks);
1873}
1874
1875/*---------------------------------------------------------------------------*/
1876/*---------------------------------------------------------------------------*/
1877
1880{
1881 // Ne calcul les infos de synchronisation que si on est en parallèle
1882 // et que le nombre de parties est égal au nombre de rang du parallelMng(),
1883 // ce qui n'est pas le cas en reprise lors d'un changement du nombre de
1884 // sous-domaines.
1885 if (m_is_parallel && m_mesh->meshPartInfo().nbPart() == parallelMng()->commSize()) {
1886 m_variable_synchronizer->compute();
1888 }
1889}
1890
1891/*---------------------------------------------------------------------------*/
1892/*---------------------------------------------------------------------------*/
1893// TODO déplacer cette méthode en dehors de ItemFamily
1896{
1897 if (!v)
1898 return;
1899 if (v->itemFamily() != this && v->itemGroup().itemFamily() != this)
1900 throw ArgumentException(A_FUNCINFO, "Variable not in this family");
1902 op.setItemFamily(this);
1903 op.addVariable(v);
1904 op.applyOperation(operation);
1905}
1906
1907/*---------------------------------------------------------------------------*/
1908/*---------------------------------------------------------------------------*/
1909// TODO déplacer cette méthode en dehors de ItemFamily
1912{
1914 operation = v->dataFactoryMng()->createDataOperation(reduction);
1915 reduceFromGhostItems(v, operation.get());
1916}
1917
1918/*---------------------------------------------------------------------------*/
1919/*---------------------------------------------------------------------------*/
1920
1921Int64ArrayView* ItemFamily::
1922uniqueIds()
1923{
1924 return &m_items_unique_id_view;
1925}
1926
1927/*---------------------------------------------------------------------------*/
1928/*---------------------------------------------------------------------------*/
1929
1931findVariable(const String& var_name, bool throw_exception)
1932{
1935 vname += "_";
1936 vname += name();
1937 vname += "_";
1938 vname += var_name;
1939 IVariable* var = vm->findVariableFullyQualified(vname.toString());
1940 if (!var && throw_exception) {
1941 ARCANE_FATAL("No variable named '{0}' in family '{1}'", var_name, name());
1942 }
1943 return var;
1944}
1945
1946/*---------------------------------------------------------------------------*/
1947/*---------------------------------------------------------------------------*/
1948
1950clearItems()
1951{
1952 m_infos->clear();
1953
1954 endUpdate();
1955}
1956
1957/*---------------------------------------------------------------------------*/
1958/*---------------------------------------------------------------------------*/
1959
1962{
1963 Integer nb_item = unique_ids.size();
1965 IParallelMng* pm = m_mesh->parallelMng();
1968 info() << "ItemFamily::checkUniqueIds name=" << name() << " n=" << nb_item
1969 << " total=" << all_unique_ids.size();
1970 for (Integer i = 0; i < nb_item; ++i)
1971 items_map.add(unique_ids[i], 0);
1972 for (Integer i = 0, is = all_unique_ids.size(); i < is; ++i) {
1974 if (data)
1975 ++data->value();
1976 }
1977 for (Integer i = 0; i < nb_item; ++i) {
1978 Integer nb_ref = items_map[unique_ids[i]];
1979 if (nb_ref != 1) {
1980 fatal() << "Duplicate unique_id=" << unique_ids[i];
1981 }
1982 }
1983}
1984
1985/*---------------------------------------------------------------------------*/
1986/*---------------------------------------------------------------------------*/
1987
1994
1996findAdjacencyItems(const ItemGroup& group, const ItemGroup& sub_group,
1997 eItemKind link_kind, Integer layer)
1998{
2000 auto i = m_adjacency_groups.find(at);
2001
2002 if (i == m_adjacency_groups.end()) {
2003 debug() << "** BUILD ADJENCY_ITEMS : " << group.name() << " x "
2004 << sub_group.name() << " link=" << link_kind << " nblayer=" << layer;
2006 mesh()->utilities()->computeAdjacency(v, link_kind, layer);
2007 m_adjacency_groups.insert(std::make_pair(at, v));
2008 return v;
2009 }
2010 debug() << "** FOUND KNOWN ADJENCY_ITEMS! : " << group.name() << " x "
2011 << sub_group.name() << " link=" << link_kind << " nblayer=" << layer;
2012 return i->second;
2013}
2014
2015/*---------------------------------------------------------------------------*/
2016/*---------------------------------------------------------------------------*/
2017
2020{
2021 return m_local_connectivity_info;
2022}
2023
2024/*---------------------------------------------------------------------------*/
2025/*---------------------------------------------------------------------------*/
2026
2029{
2030 return m_global_connectivity_info;
2031}
2032
2033/*---------------------------------------------------------------------------*/
2034/*---------------------------------------------------------------------------*/
2035
2037setHasUniqueIdMap(bool v)
2038{
2039 ARCANE_UNUSED(v);
2040 throw NotSupportedException(A_FUNCINFO,"this kind of family doesn't support this function");
2041}
2042
2043/*---------------------------------------------------------------------------*/
2044/*---------------------------------------------------------------------------*/
2045
2047hasUniqueIdMap() const
2048{
2049 return true;
2050}
2051
2052/*---------------------------------------------------------------------------*/
2053/*---------------------------------------------------------------------------*/
2054
2060
2061/*---------------------------------------------------------------------------*/
2062/*---------------------------------------------------------------------------*/
2063
2065view()
2066{
2067 return allItems().view();
2068}
2069
2070/*---------------------------------------------------------------------------*/
2071/*---------------------------------------------------------------------------*/
2072
2073void ItemFamily::
2074_addVariable(IVariable* var)
2075{
2076 //info() << "Add var=" << var->fullName() << " to family=" << name();
2077 if (var->itemFamily()!=this)
2078 ARCANE_FATAL("Can not add a variable to a different family");
2079 m_used_variables.insert(var);
2080}
2081
2082/*---------------------------------------------------------------------------*/
2083/*---------------------------------------------------------------------------*/
2084
2085void ItemFamily::
2086_removeVariable(IVariable* var)
2087{
2088 //info() << "Remove var=" << var->fullName() << " to family=" << name();
2089 m_used_variables.erase(var);
2090}
2091
2092/*---------------------------------------------------------------------------*/
2093/*---------------------------------------------------------------------------*/
2094
2097{
2098 for( IVariable* var : m_used_variables ){
2099 collection.add(var);
2100 }
2101}
2102
2103/*---------------------------------------------------------------------------*/
2104/*---------------------------------------------------------------------------*/
2105
2108{
2109 return m_variable_synchronizer.get();
2110}
2111
2112/*---------------------------------------------------------------------------*/
2113/*---------------------------------------------------------------------------*/
2114
2117{
2118 if (m_item_sort_function==sort_function)
2119 return;
2120 delete m_item_sort_function;
2121 m_item_sort_function = sort_function;
2122 if (!m_item_sort_function)
2123 m_item_sort_function = _defaultItemSortFunction();
2124}
2125
2126/*---------------------------------------------------------------------------*/
2127/*---------------------------------------------------------------------------*/
2128
2130itemSortFunction() const
2131{
2132 return m_item_sort_function;
2133}
2134
2135/*---------------------------------------------------------------------------*/
2136/*---------------------------------------------------------------------------*/
2137
2140{
2141 m_variable_synchronizer->synchronize(variables);
2142}
2143
2144/*---------------------------------------------------------------------------*/
2145/*---------------------------------------------------------------------------*/
2146
2149{
2150 m_variable_synchronizer->synchronize(variables, local_ids);
2151}
2152
2153/*---------------------------------------------------------------------------*/
2154/*---------------------------------------------------------------------------*/
2155
2158{
2159 ARCANE_UNUSED(unique_ids);
2160 ARCANE_UNUSED(items);
2161 ARCANE_UNUSED(owners);
2162 ARCANE_THROW(NotImplementedException,"this kind of family doesn't support this operation yet. Only DoF at present.");
2163}
2164
2165/*---------------------------------------------------------------------------*/
2166/*---------------------------------------------------------------------------*/
2167
2168void ItemFamily::
2169removeItems2(ItemDataList& item_data_list)
2170{
2171 if (!m_mesh->itemFamilyNetwork())
2172 ARCANE_FATAL("Family name='{0}': IMesh::itemFamilyNetwork() is null",name());
2173
2175 // 1-Prepare : Get child connectivities and families
2176 SharedArray<IIncrementalItemConnectivity*> child_connectivities = m_mesh->itemFamilyNetwork()->getChildDependencies(this); // TODO : change return type ? (List to Array ?)
2179 UniqueArray<ItemScalarProperty<bool>> child_families_has_extra_parent_properties; // To indicate wheter child items have other parents.
2180 Integer index = 0;
2182 child_families.add(child_connectivity->targetFamily());
2183 child_families_to_current_family.add(m_mesh->itemFamilyNetwork()->getConnectivity(child_families.back(),this,connectivityName(child_families.back(),this)));
2184 if (child_families_to_current_family.back() == nullptr) fatal() << "removeItems2 needs reverse connectivity. Missing Connectivity " << connectivityName(child_families.back(),this);
2187 for (auto parent_connectivity : m_mesh->itemFamilyNetwork()->getParentDependencies(child_families.back())) { // exclure parent actuel
2188 if (parent_connectivity == child_connectivity) continue;
2190 _getConnectedItems(parent_connectivity,connected_items);
2191 _fillHasExtraParentProperty(child_families_has_extra_parent_properties[index],connected_items);
2192 }
2193 index++;
2194 }
2195 // 2-Propagates item removal to child families
2196 Int64ArrayView removed_item_lids = item_data.itemInfos().view(); // Todo change ItemData to store removed item lids in Int32
2197 for (auto removed_item_lid_int64 : removed_item_lids) {
2198 Int32 removed_item_lid = CheckedConvert::toInt32(removed_item_lid_int64);
2199 index = 0;
2200 for (auto child_connectivity : child_connectivities) {
2201 ConnectivityItemVector child_con_accessor(child_connectivity);
2202 ENUMERATE_ITEM(connected_item, child_con_accessor.connectedItems(ItemLocalId(removed_item_lid))) {
2203 if (!this->itemsInternal()[removed_item_lid]->isDetached()) {// test necessary when doing removeDetached (the relations are already deleted).
2204 child_families_to_current_family[index]->removeConnectedItem(ItemLocalId(connected_item),ItemLocalId(removed_item_lid));
2205 }
2206 // Check if connected item is to remove
2207 if (! child_families_has_extra_parent_properties[index][connected_item] && child_families_to_current_family[index]->nbConnectedItem(ItemLocalId(connected_item)) == 0) {
2208 item_data_list[child_connectivity->targetFamily()->itemKind()].itemInfos().add((Int64) connected_item.localId());
2209 }
2210 }
2211 index++;
2212 }
2213 }
2214 // => merge this loop with previous one ?
2215 // 3-1 Remove relations for child relations
2216 for (auto removed_item_lid_int64 : removed_item_lids) {
2217 Int32 removed_item_lid = CheckedConvert::toInt32(removed_item_lid_int64);
2218 for (auto child_relation : m_mesh->itemFamilyNetwork()->getChildRelations(this)) {
2219 ConnectivityItemVector connectivity_accessor(child_relation);
2220 ENUMERATE_ITEM(connected_item, connectivity_accessor.connectedItems(ItemLocalId(removed_item_lid))) {
2221 child_relation->removeConnectedItem(ItemLocalId(removed_item_lid),ItemLocalId(connected_item));
2222 }
2223 }
2224 }
2225 // 3-2 Remove relations for parent relations
2226 ItemScalarProperty<bool> is_removed_item;
2227 is_removed_item.resize(this,false);
2228 for (auto removed_item_lid_int64 : removed_item_lids) {
2229 Int32 removed_item_lid = CheckedConvert::toInt32(removed_item_lid_int64);
2230 is_removed_item[*(this->itemsInternal()[removed_item_lid])] = true;
2231 }
2232 for (auto parent_relation : m_mesh->itemFamilyNetwork()->getParentRelations(this)) {
2233 for (auto source_item : parent_relation->sourceFamily()->itemsInternal()) {
2234 if (source_item->isSuppressed()) continue;
2235 ConnectivityItemVector connectivity_accessor(parent_relation);
2236 ENUMERATE_ITEM(connected_item, connectivity_accessor.connectedItems(ItemLocalId(source_item))) {
2237 if (is_removed_item[connected_item])
2238 parent_relation->removeConnectedItem(ItemLocalId(source_item),connected_item);
2239 }
2240 }
2241 }
2242 // 4-Remove items. Child items will be removed by an automatic call of removeItems2 on their family...
2243 for (auto removed_item_lid_int64 : removed_item_lids) {
2244 Int32 removed_item_lid = CheckedConvert::toInt32(removed_item_lid_int64);
2245 ItemInternal* removed_item = m_infos->itemInternal(removed_item_lid);
2246 if (removed_item->isDetached()) {
2247 m_infos->removeDetachedOne(removed_item);
2248 }
2249 else {
2250 m_infos->removeOne(removed_item);
2251 }
2252 }
2253 this->endUpdate();// endUpdate is needed since we then go deeper in the dependency graph and will need to enumerate this changed family.
2254}
2255
2256/*---------------------------------------------------------------------------*/
2257/*---------------------------------------------------------------------------*/
2258
2259void ItemFamily::
2260_getConnectedItems(IIncrementalItemConnectivity* parent_connectivity,ItemVector& target_family_connected_items)
2261{
2262 ConnectivityItemVector connectivity_accessor(parent_connectivity);
2263 for(auto source_item : parent_connectivity->sourceFamily()->itemsInternal()) {
2264 if (source_item->isSuppressed()) continue;
2265 target_family_connected_items.add(connectivity_accessor.connectedItems(ItemLocalId(source_item)).localIds());
2266 }
2267}
2268
2269/*---------------------------------------------------------------------------*/
2270/*---------------------------------------------------------------------------*/
2271
2272void ItemFamily::
2273_fillHasExtraParentProperty(ItemScalarProperty<bool>& child_families_has_extra_parent,ItemVectorView connected_items)
2274{
2275 ENUMERATE_ITEM(connected_item, connected_items) {
2276 child_families_has_extra_parent[connected_item] = true;
2277 }
2278}
2279
2280/*---------------------------------------------------------------------------*/
2281/*---------------------------------------------------------------------------*/
2282
2283void ItemFamily::
2284_detachCells2(Int32ConstArrayView local_ids)
2285{
2286 //- Only cells are detached, ie no parent dependencies are to be found
2287 ARCANE_ASSERT((m_mesh->itemFamilyNetwork()->getParentDependencies(this).empty()),("Only cells are detached, no parent dependencies are to be found."))
2288 // Remove all the relations parent and child. Keep child dependencies => used when removing detach cells. No parent dependencies
2289 // 1 Remove relations for child relations
2290 for (auto removed_item_lid : local_ids) {
2291 for (auto child_relation : m_mesh->itemFamilyNetwork()->getChildRelations(this)) {
2292 ConnectivityItemVector connectivity_accessor(child_relation);
2293 ENUMERATE_ITEM(connected_item, connectivity_accessor.connectedItems(ItemLocalId(removed_item_lid))) {
2294 child_relation->removeConnectedItem(ItemLocalId(removed_item_lid),ItemLocalId(connected_item));
2295 }
2296 }
2297 }
2298 // 2 Remove relations for parent relations
2299 ItemScalarProperty<bool> is_detached_item;
2300 is_detached_item.resize(this,false);
2301 for (auto detached_item_lid : local_ids) {
2302 is_detached_item[*(this->itemsInternal()[detached_item_lid])] = true;
2303 }
2304 for (auto parent_relation : m_mesh->itemFamilyNetwork()->getParentRelations(this)) {
2305 for(auto source_item : parent_relation->sourceFamily()->itemsInternal()) {
2306 if (source_item->isSuppressed()) continue;
2307 ConnectivityItemVector connectivity_accessor(parent_relation);
2308 ENUMERATE_ITEM(connected_item, connectivity_accessor.connectedItems(ItemLocalId(source_item))) {
2309 if (is_detached_item[connected_item]) {
2310 parent_relation->removeConnectedItem(ItemLocalId(source_item),connected_item);
2311 }
2312 }
2313 }
2314 }
2315 // 4-Detach items.
2316 for (auto detached_item_lid : local_ids) {
2317 m_infos->detachOne(m_infos->itemInternal(detached_item_lid)); // when family/mesh endUpdate is done ? needed ?
2318 }
2319}
2320
2321/*---------------------------------------------------------------------------*/
2322/*---------------------------------------------------------------------------*/
2323
2326{
2327 ItemInternalMap& item_map = itemsMap();
2328 if (item_map.count()==0)
2329 return;
2330
2331 if (!m_mesh->itemFamilyNetwork())
2332 ARCANE_FATAL("Family name='{0}': IMesh::itemFamilyNetwork() is null",name());
2333 if (!IItemFamilyNetwork::plug_serializer)
2334 ARCANE_FATAL("family name='{0}': removeNeedMarkedItems() cannot be called if ItemFamilyNetwork is unplugged.",name());
2335
2338 items_to_remove.reserve(1000);
2339 items_to_remove_lids.reserve(1000);
2340
2341 item_map.eachItem([&](impl::ItemBase item) {
2342 Integer f = item.flags();
2343 if (f & ItemFlags::II_NeedRemove){
2344 f &= ~ItemFlags::II_NeedRemove & ItemFlags::II_Suppressed;
2345 item.toMutable().setFlags(f);
2346 items_to_remove.add(item._itemInternal());
2347 items_to_remove_lids.add(item.localId());
2348 }
2349 });
2350 info() << "Number of " << itemKind() << " of family "<< name()<<" to remove: " << items_to_remove.size();
2351 if (items_to_remove.size() == 0)
2352 return;
2353
2354 // Update connectivities => remove all con pointing on the removed items
2355 // Todo the nearly same procedure is done in _detachCells2 : mutualize in a method (watchout the connectivities used are parentConnectivities or parentRelations...)
2357 is_removed_item.resize(this,false);
2358 for (auto removed_item: items_to_remove) {
2360 }
2361 //for (auto parent_connectivity : m_mesh->itemFamilyNetwork()->getParentConnectivities(this)) {
2362 for (auto parent_connectivity : m_mesh->itemFamilyNetwork()->getParentRelations(this)) {
2363 for(auto source_item : parent_connectivity->sourceFamily()->itemsInternal()) {
2364 if (source_item->isSuppressed()) continue;
2369 }
2370 }
2371 }
2372 }
2373 // Remove items
2374 m_infos->removeMany(items_to_remove_lids);
2375}
2376
2377/*---------------------------------------------------------------------------*/
2378/*---------------------------------------------------------------------------*/
2379
2381{
2382 public:
2383 bool operator()(const ItemInternal* item1,const ItemInternal* item2) const
2384 {
2385 // Il faut mettre les entités détruites en fin de liste
2386 //cout << "Compare: " << item1->uniqueId() << " " << item2->uniqueId() << '\n';
2387 bool s1 = item1->isSuppressed();
2388 bool s2 = item2->isSuppressed();
2389 if (s1 && !s2)
2390 return false;
2391 if (!s1 && s2)
2392 return true;
2393 return item1->uniqueId() < item2->uniqueId();
2394 }
2395};
2396
2397/*---------------------------------------------------------------------------*/
2398/*---------------------------------------------------------------------------*/
2399
2400IItemInternalSortFunction* ItemFamily::
2401_defaultItemSortFunction()
2402{
2404}
2405
2406/*---------------------------------------------------------------------------*/
2407/*---------------------------------------------------------------------------*/
2408
2409void ItemFamily::
2410setPolicyMng(IItemFamilyPolicyMng* policy_mng)
2411{
2412 if (m_policy_mng==policy_mng)
2413 return;
2414 if (m_policy_mng)
2415 ARCANE_FATAL("PolicyMng already set");
2416 m_policy_mng = policy_mng;
2417}
2418
2419/*---------------------------------------------------------------------------*/
2420/*---------------------------------------------------------------------------*/
2421
2422void ItemFamily::
2423addSourceConnectivity(IItemConnectivity* connectivity)
2424{
2425 m_source_item_connectivities.insert(connectivity);
2426}
2427
2428/*---------------------------------------------------------------------------*/
2429/*---------------------------------------------------------------------------*/
2430
2431void ItemFamily::
2432addTargetConnectivity(IItemConnectivity* connectivity)
2433{
2434 m_target_item_connectivities.insert(connectivity);
2435}
2436
2437/*---------------------------------------------------------------------------*/
2438/*---------------------------------------------------------------------------*/
2439
2440void ItemFamily::
2441removeSourceConnectivity(IItemConnectivity* connectivity)
2442{
2443 m_source_item_connectivities.erase(m_source_item_connectivities.find(connectivity));
2444}
2445
2446/*---------------------------------------------------------------------------*/
2447/*---------------------------------------------------------------------------*/
2448
2449void ItemFamily::
2450removeTargetConnectivity(IItemConnectivity* connectivity)
2451{
2453}
2454
2455/*---------------------------------------------------------------------------*/
2456/*---------------------------------------------------------------------------*/
2457
2458void ItemFamily::
2459setConnectivityMng(IItemConnectivityMng* connectivity_mng)
2460{
2461 ARCANE_ASSERT((m_connectivity_mng == NULL || m_connectivity_mng== connectivity_mng),
2462 ("Connectivity Manager must be unique") )
2463 m_connectivity_mng = connectivity_mng;
2464}
2465
2466/*---------------------------------------------------------------------------*/
2467/*---------------------------------------------------------------------------*/
2468
2469void ItemFamily::
2470_addSourceConnectivity(IIncrementalItemSourceConnectivity* c)
2471{
2472 m_source_incremental_item_connectivities.add(c->toSourceReference());
2473}
2474
2475/*---------------------------------------------------------------------------*/
2476/*---------------------------------------------------------------------------*/
2477
2478void ItemFamily::
2479_addTargetConnectivity(IIncrementalItemTargetConnectivity* c)
2480{
2481 m_target_incremental_item_connectivities.add(c->toTargetReference());
2482}
2483
2484/*---------------------------------------------------------------------------*/
2485/*---------------------------------------------------------------------------*/
2486
2487void ItemFamily::
2488_checkValidConnectivity()
2489{
2490 {
2491 // Vérifie qu'il n'y a pas d'entité nulle.
2493 Item item = *i;
2494 if (item.null())
2495 ARCANE_FATAL("family={0}: local item lid={1} is null",fullName(),item);
2496 }
2497 }
2498 {
2499 // Vérifie la cohérence de la partie interne
2501 Item item = *i;
2502 Item i1 = item;
2503 Item i2 = m_common_item_shared_info->m_items_internal[item.localId()];
2504 if (i1!=i2)
2505 ARCANE_FATAL("family={0}: incoherent item internal lid={1} i1={2} i2={3}",
2506 fullName(),item.localId(),ItemPrinter(i1),ItemPrinter(i2));
2507 }
2508 }
2509 constexpr Int32 MAX_KIND = ItemInternalConnectivityList::MAX_ITEM_KIND;
2510 std::array<Int32,MAX_KIND> computed_max;
2511 computed_max.fill(0);
2512
2513 for( Integer i=0; i<MAX_KIND; ++i ){
2514 eItemKind target_kind = static_cast<eItemKind>(i);
2515 IndexedItemConnectivityViewBase con_view{m_item_connectivity_list.containerView(i),itemKind(),target_kind};
2517 const Int32 con_nb_item_size = con_view.nbSourceItem();
2518
2519 info(4) << "Family name=" << fullName() << " I=" << i << " nb_item_size=" << con_nb_item_size;
2520
2521 Int32 max_nb = 0;
2522 if (con_nb_item_size!=0){
2523 // Il faut itérer sur toutes les entités et pas sur \a con_nb_item
2524 // car certaines valeurs peuvent ne pas être valides s'il y a des
2525 // trous dans la numérotation.
2527 Int32 x = con_view.nbItem(i);
2528 if (x>max_nb)
2529 max_nb = x;
2530 }
2531 if (stored_max_nb<max_nb)
2532 ARCANE_FATAL("Bad value for max connected item family={0} kind={1} stored={2} computed={3}",
2533 name(),i,stored_max_nb,max_nb);
2534 computed_max[i] = max_nb;
2535 }
2536 }
2537 // Vérifie que la valeur retournée par m_local_connectivity_info
2538 // est au moins supérieure à 'computed_max'
2539 {
2540 std::array<Int32,MAX_KIND> stored_max;
2541 stored_max.fill(0);
2542 auto* ci = m_local_connectivity_info;
2543 stored_max[ItemInternalConnectivityList::NODE_IDX] = ci->maxNodePerItem();
2544 stored_max[ItemInternalConnectivityList::EDGE_IDX] = ci->maxEdgePerItem();
2545 stored_max[ItemInternalConnectivityList::FACE_IDX] = ci->maxFacePerItem();
2546 stored_max[ItemInternalConnectivityList::CELL_IDX] = ci->maxCellPerItem();
2547 // Pour les deux suivants, il n'y a pas l'équivalent dans 'ItemConnectivityInfo' donc
2548 // on mets les valeurs calculées pour ne pas générer d'erreur.
2549 stored_max[ItemInternalConnectivityList::HPARENT_IDX] = computed_max[ItemInternalConnectivityList::HPARENT_IDX];
2550 stored_max[ItemInternalConnectivityList::HCHILD_IDX] = computed_max[ItemInternalConnectivityList::HCHILD_IDX];
2551 for( Integer i=0; i<MAX_KIND; ++i )
2552 if (stored_max[i]<computed_max[i])
2553 ARCANE_FATAL("Bad value for local_connectivity_info family={0} kind={1} stored={2} computed={3}",
2554 name(),i,stored_max[i],computed_max[i]);
2555 }
2556 for( auto ics : m_connectivity_selector_list )
2557 ics->checkValidConnectivityList();
2558}
2559
2560/*---------------------------------------------------------------------------*/
2561/*---------------------------------------------------------------------------*/
2562
2563void ItemFamily::
2564_addConnectivitySelector(ItemConnectivitySelector* selector)
2565{
2566 m_connectivity_selector_list.add(selector);
2567}
2568
2569/*---------------------------------------------------------------------------*/
2570/*---------------------------------------------------------------------------*/
2571
2572void ItemFamily::
2573_buildConnectivitySelectors()
2574{
2575 m_connectivity_selector_list_by_item_kind.clear();
2576 m_connectivity_selector_list_by_item_kind.resize(ItemInternalConnectivityList::MAX_ITEM_KIND);
2577 m_connectivity_selector_list_by_item_kind.fill(nullptr);
2578
2579 for( ItemConnectivitySelector* ics : m_connectivity_selector_list ){
2580 ics->build();
2581 Int32 i = ics->itemConnectivityIndex();
2582 if (i>=0){
2583 if (m_connectivity_selector_list_by_item_kind[i])
2584 ARCANE_FATAL("Can not have two connectivity selector for same item kind");
2585 m_connectivity_selector_list_by_item_kind[i] = ics;
2586 }
2587 }
2588}
2589
2590/*---------------------------------------------------------------------------*/
2591/*---------------------------------------------------------------------------*/
2592
2593void ItemFamily::
2594_setTopologyModifier(IItemFamilyTopologyModifier* tm)
2595{
2596 delete m_topology_modifier;
2597 m_topology_modifier = tm;
2598}
2599
2600/*---------------------------------------------------------------------------*/
2601/*---------------------------------------------------------------------------*/
2611{
2612 ItemInternalList items(_itemsInternal());
2613 for( Integer i=0, n=items.size(); i<n; ++i )
2614 items[i]->removeFlags(ItemFlags::II_Shared);
2615 Int32ConstArrayView comm_ranks = m_variable_synchronizer->communicatingRanks();
2616 Integer nb_rank = comm_ranks.size();
2617 // Parcours les sharedItems() du synchroniseur et positionne le flag
2618 // II_Shared pour les entités de la liste.
2619 for( Integer i=0; i<nb_rank; ++i ){
2620 Int32ConstArrayView shared_ids = m_variable_synchronizer->sharedItems(i);
2621 for( auto id : shared_ids )
2622 items[id]->addFlags(ItemFlags::II_Shared);
2623 }
2624}
2625
2626/*---------------------------------------------------------------------------*/
2627/*---------------------------------------------------------------------------*/
2628
2629void ItemFamily::
2630_computeConnectivityInfo(ItemConnectivityInfo* ici)
2631{
2633 info(5) << "COMPUTE CONNECTIVITY INFO family=" << name() << " v=" << ici
2634 << " node=" << ici->maxNodePerItem() << " face=" << ici->maxFacePerItem()
2635 << " edge=" << ici->maxEdgePerItem() << " cell=" << ici->maxCellPerItem();
2636}
2637
2638/*---------------------------------------------------------------------------*/
2639/*---------------------------------------------------------------------------*/
2640
2641void ItemFamily::
2642_handleOldCheckpoint()
2643{
2644 // Pas besoin de gérer 'm_items_type_id' car il n'est pas présent dans
2645 // les anciennes protections.
2646 _offsetArrayByOne(m_items_unique_id);
2647 _offsetArrayByOne(m_items_flags);
2648 _offsetArrayByOne(m_items_owner);
2649 (*m_items_unique_id)[0] = NULL_ITEM_UNIQUE_ID;
2650 (*m_items_flags)[0] = 0;
2651 (*m_items_owner)[0] = A_NULL_RANK;
2652}
2653
2654/*---------------------------------------------------------------------------*/
2655/*---------------------------------------------------------------------------*/
2656
2657namespace
2658{
2659
2660// Retourne une vue qui commence sur le dexuème élément du tableau.
2661template<typename DataType>
2662ArrayView<DataType> _getView(Array<DataType>* v)
2663{
2664 Int32 n = v->size();
2665 return v->subView(1,n-1);
2666 }
2667
2668}
2669void ItemFamily::
2670_updateItemViews()
2671{
2672 m_common_item_shared_info->m_unique_ids = _getView(m_items_unique_id);
2673 m_common_item_shared_info->m_flags = _getView(m_items_flags);
2674 m_common_item_shared_info->m_type_ids = _getView(m_items_type_id);
2675 m_common_item_shared_info->m_owners = _getView(m_items_owner);
2676 m_common_item_shared_info->m_parent_item_ids = m_items_nb_parent->view();
2677
2678 m_items_unique_id_view = _getView(m_items_unique_id);
2679}
2680
2681/*---------------------------------------------------------------------------*/
2682/*---------------------------------------------------------------------------*/
2683
2686{
2687 return m_internal_api;
2688}
2689
2690/*---------------------------------------------------------------------------*/
2691/*---------------------------------------------------------------------------*/
2692
2693} // End namespace Arcane::mesh
2694
2695/*---------------------------------------------------------------------------*/
2696/*---------------------------------------------------------------------------*/
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ENUMERATE_ITEM(name, group)
Enumérateur générique d'un groupe de noeuds.
Tableau d'items de types quelconques.
void clear()
Supprime tous les éléments de la collection.
Definition Collection.h:68
Integer count() const
Nombre d'éléments de la collection.
Definition Collection.h:70
Gère la récupération des informations de connectivité.
Interface d'une opération sur une donnée.
Interface de la source d'une connectivité incrémentale.
Interface de la cible d'une connectivité incrémentale.
Interface des informations sur la connectivité par type d'entité.
virtual void notifyLocalIdChanged(IItemFamily *item_family, Int32ConstArrayView old_to_new_ids, Integer nb_item)=0
Mise à jour des items modifiés éventuellement compactés.
virtual void setModifiedItems(IItemFamily *family, Int32ConstArrayView added_items, Int32ConstArrayView removed_items)=0
Enregistrement de modifications d'une famille d'items.
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.
virtual Integer parentFamilyDepth() const =0
Donne la profondeur d'imbrication du maillage courant.
virtual ItemInternalArrayView itemsInternal()=0
Tableau interne des entités.
virtual String name() const =0
Nom de la famille.
virtual IMesh * mesh() const =0
Maillage associé
virtual void notifyItemsOwnerChanged()=0
Notifie que les entités propres au sous-domaine de la famille ont été modifiées.
virtual void addChildFamily(IItemFamily *family)=0
Ajoute d'une famile en dépendance.
Interface d'une fonction de tri des entités.
virtual String name() const =0
Nom du maillage.
Interface du gestionnaire des compactages de familles d'un maillage.
Gestion d'un compactage de familles du maillage.
virtual void setSorted(bool v)=0
Indique s'il faut trier les entités lors du compactage.
virtual void doAllActions()=0
Exécute successivement toutes les actions de compactage.
Interface du gestionnaire des maillages.
Definition IMeshMng.h:40
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
virtual IMeshUtilities * utilities()=0
Interface des fonctions utilitaires associée.
virtual ItemTypeMng * itemTypeMng() const =0
Gestionnaire de types d'entités associé
virtual IMeshMng * meshMng() const =0
Gestionnaire de maillage associé
virtual IItemFamilyNetwork * itemFamilyNetwork()=0
Interface du réseau de familles (familles connectées)
virtual IMeshCompactMng * _compactMng()=0
virtual const MeshPartInfo & meshPartInfo() const =0
Informations sur les parties du maillage.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual void allGatherVariable(ConstArrayView< char > send_buf, Array< char > &recv_buf)=0
Effectue un regroupement sur tous les processeurs.
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
virtual IVariableMng * variableMng()=0
Retourne le gestionnaire de variables.
Interface du gestionnaire de variables.
Interface d'un service de synchronisation de variable.
virtual void changeLocalIds(Int32ConstArrayView old_to_new_ids)=0
Appelé lorsque les numéros locaux des entités sont modifiés.
Interface d'une variable.
Definition IVariable.h:54
virtual IDataFactoryMng * dataFactoryMng() const =0
Fabrique de données associées à la variable.
virtual ItemGroup itemGroup() const =0
Groupe du maillage associé.
virtual void compact(Int32ConstArrayView new_to_old_ids)=0
Compacte les valeurs de la variable.
virtual IItemFamily * itemFamily() const =0
Famille d'entité associée.
@ PSubDomainDepend
Indique que la valeur de la variable est dépendante du sous-domaine.
Definition IVariable.h:91
@ PTemporary
Indique que la variable est temporaire.
Definition IVariable.h:126
@ PExecutionDepend
Indique que la valeur de la variable est dépendante de l'exécution.
Definition IVariable.h:106
@ PPrivate
Indique que la variable est privée.
Definition IVariable.h:114
@ PNoRestore
Indique que la variable ne doit pas être restaurée.
Definition IVariable.h:133
@ PNoDump
Indique que la variable ne doit pas être sauvegardée.
Definition IVariable.h:72
Classe de base pour les entités du maillage.
bool isSuppressed() const
Vrai si l'entité est supprimée.
ItemUniqueId uniqueId() const
Numéro unique de l'entité
MutableItemBase toMutable()
Interface modifiable de cette entité
Int32 flags() const
Flags de l'entité
ItemTypeInfo * typeInfo() const
Type de l'entité.
Int32 localId() const
Numéro local (au sous-domaine) de l'entité
Informations pour gérer le compactage des entités d'une famille.
Flags pour les caractéristiques des entités.
Definition ItemFlags.h:31
@ II_NeedRemove
L'entité doit être supprimé
Definition ItemFlags.h:55
@ II_Shared
L'entité est partagée par un autre sous-domaine.
Definition ItemFlags.h:51
@ II_Suppressed
L'entité vient d'être supprimée.
Definition ItemFlags.h:50
Implémentation d'un groupe d'entités de maillage.
bool checkNeedUpdate()
Réactualise le groupe si nécessaire.
void destroy()
Détruit le groupe. Après cet appel, le groupe devient un groupe nul.
void removeSuppressedItems()
Supprime du groupe les entités dont le flag isSuppressed() est vrai.
bool hasComputeFunctor() const
Indique si le groupe est calculé
ItemGroup parentGroup()
Groupe parent.
void changeIds(Int32ConstArrayView old_to_new_ids)
Change les indices des entités du groupe.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
void clear()
Supprime les entités du groupe.
Definition ItemGroup.cc:428
ItemGroupImpl * internal() const
Retourne l'implémentation du groupe.
Definition ItemGroup.h:120
IVariableSynchronizer * synchronizer() const
Synchronizer du groupe.
Definition ItemGroup.cc:618
const String & name() const
Nom du groupe.
Definition ItemGroup.h:76
bool isLocalToSubDomain() const
Vrai si le groupe est local au sous-domaine.
Definition ItemGroup.h:225
void invalidate(bool force_recompute=false)
Invalide le groupe.
Definition ItemGroup.h:252
ItemVectorView view() const
Vue sur les entités du groupe.
Definition ItemGroup.cc:582
Integer size() const
Nombre d'éléments du groupe.
Definition ItemGroup.h:88
void setItems(Int32ConstArrayView items_local_id)
Positionne les entités du groupe.
Definition ItemGroup.cc:488
eItemKind itemKind() const
Genre du groupe. Il s'agit du genre de ses éléments.
Definition ItemGroup.h:109
bool hasSynchronizer() const
Indique si le groupe possède un synchroniser actif.
Definition ItemGroup.cc:636
bool isAllItems() const
Indique si le groupe est celui de toutes les entités.
Definition ItemGroup.cc:609
void checkValid()
Vérification interne de la validité du groupe.
Definition ItemGroup.cc:521
bool null() const
true is le groupe est le groupe nul
Definition ItemGroup.h:70
void setOwn(bool v)
Positionne la propriété de groupe local ou non.
Definition ItemGroup.cc:169
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...
Int32 maxNbConnectedItem(Int32 item_kind) const
Nombre maximum d'entités connectées.
Structure interne d'une entité de maillage.
Index d'un Item dans une variable.
Definition ItemLocalId.h:40
Implémentation d'un tableau de listes d'entités.
Tableau de listes d'entités.
Structure interne partagée d'une entité de maillage.
ConstArrayView< ItemInternal * > m_items_internal
ItemInternal des entités.
Type d'une entité (Item).
Definition ItemTypeId.h:32
Gestionnaire des types d'entités de maillage.
Definition ItemTypeMng.h:66
Vue sur un vecteur d'entités.
Vecteur d'entités.
Definition ItemVector.h:59
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
void clone(const Collection< T > &base)
Clone la collection base.
Definition List.h:280
ListEnumeratorT< ItemGroup > Enumerator
Type d'un itérateur constant sur tout le tableau.
Definition List.h:243
Informations un maillage partitionné.
Méthodes permettant de modifier ItemBase.
void setOwner(Integer suid, Int32 current_sub_domain)
Positionne le numéro du sous-domaine propriétaire de l'entité.
void setParent(Int32 aindex, Int32 parent_local_id)
Positionne le i-ème parent (actuellement aindex doit valoir 0)
Liste de propriétés.
Definition Properties.h:64
Paramètres nécessaires à la construction d'une variable.
Collection de variables.
IArrayDataInternalT< T > * _internalTrueData()
virtual void resize(Integer new_size)
Redimensionne le tableau pour contenir new_size éléments.
IVariable * variable() const
Variable associée.
Infos de maillage pour un genre donné d'entité.
Informations sur la connectivité par type d'entité.
Integer maxNodePerItem() const override
Nombre maximal de noeuds par entité
Sélection entre les connectivités historiques et à la demande.
void resizeVariables(bool force_resize) override
Redimensionne les variables de cette famille.
void removeVariable(IVariable *var) override
Supprime une variable à cette famille.
void notifyEndUpdateFromMesh() override
Indique une fin de modification par le maillage.
ItemInternalConnectivityList * unstructuredItemInternalConnectivityList() override
Informations sur les connectivités non structurés.
void addVariable(IVariable *var) override
Ajoute une variable à cette famille.
void endAllocate() override
Indique une fin d'allocation.
ItemSharedInfo * commonItemSharedInfo() override
Instance de ItemSharedInfo pour les entités de la famille.
IItemFamilyTopologyModifier * topologyModifier() override
Interface du modificateur de topologie.
VariableArrayInt64 m_items_unique_id
Contient les uniqueIds() des entités de cette famille.
VariableArrayInteger m_items_shared_data_index
Indice dans le tableau des ItemSharedInfo pour chaque entité.
VariableArrayInt32 m_items_flags
Contient les flags() des entités de cette famille.
VariableArrayInt16 m_items_type_id
Contient les typeId() des entités de cette famille.
VariableArrayInt32 m_items_owner
Contient les owner() des entités de cette famille.
VariableItemInt32 m_items_new_owner
Contient le sous-domaine propriétaire de l'entité.
VariableArrayInt32 m_items_nb_parent
Contient le parent() des entités de cette famille.
Famille d'entités.
Definition ItemFamily.h:76
bool hasUniqueIdMap() const override
Indique si la famille possède une table de conversion uniqueId vers localId.
IMesh * mesh() const override
Maillage associé
void partialEndUpdateVariable(IVariable *variable) override
Met à jour une variable.
void _compactItems(bool do_sort)
Compacte les entités.
void partialEndUpdate() override
Mise à jour partielle.
String fullName() const override
Nom complet de la famille (avec celui du maillage)
Definition ItemFamily.h:131
void _compactFromParentFamily(const ItemFamilyCompactInfos &compact_infos)
Compacte les connectivités.
void _checkComputeSynchronizeInfos(Int32 changed)
Test collectif permettant de savoir s'il faut mettre à jour les infos de synchro.
void _compactOnlyItems(bool do_sort)
Compacte les entités sans mise à jour des références.
void clearItems() override
Supprime toutes les entités de la famille.
ItemPairGroup findAdjencyItems(const ItemGroup &group, const ItemGroup &sub_group, eItemKind link_kind, Integer layer) override
Cherche une liste d'adjacence.
void destroyGroups() override
Supprime tous les groupes de cette famille.
void prepareForDump() override
Prépare les données pour une protection.
ItemInternalConnectivityList m_item_connectivity_list
Accesseur pour les connectivités via Item et ItemInternal.
Definition ItemFamily.h:435
void addChildFamily(IItemFamily *family) override
Ajoute d'une famile en dépendance.
void checkValid() override
Vérification de la validité des structures internes (interne)
ItemInternal * findOneItem(Int64 uid) override
Entité de numéro unique unique_id.
IParallelMng * parallelMng() const override
Gestionnaire de parallélisme associé
void endUpdate() override
Notifie la fin de modification de la liste des entités.
void compactVariablesAndGroups(const ItemFamilyCompactInfos &compact_infos)
Compacte les variables et les groupes.
void usedVariables(VariableCollection collection) override
Ajoute à la collection collection la liste des variables utilisés de cette famille.
ITraceMng * traceMng() const override
Gestionnaire de trace associé
ItemGroup createGroup(const String &name, Int32ConstArrayView elements, bool do_override=false) override
Créé un groupe d'entités de nom name contenant les entités local_ids.
eItemKind itemKind() const override
Genre des entités.
Integer m_current_id
Identifiant de la famille.
Definition ItemFamily.h:421
VariableItemInt32 & itemsNewOwner() override
Variable contenant le numéro du nouveau sous-domaine propriétaire de l'entité.
ItemInternalConnectivityList * itemInternalConnectivityList()
Accesseur pour les connectivités via Item et ItemInternal.
Definition ItemFamily.h:292
IItemFamilyTopologyModifier * _topologyModifier() override
Interface du modificateur de topologie.
Definition ItemFamily.h:388
void copyItemsValues(Int32ConstArrayView source, Int32ConstArrayView destination) override
void copyItemsMeanValues(Int32ConstArrayView first_source, Int32ConstArrayView second_source, Int32ConstArrayView destination) override
ItemGroup allItems() const override
Groupe de toutes les entités.
void internalRemoveItems(Int32ConstArrayView local_ids, bool keep_ghost=false) override
Supprime les entités donnés par local_ids.
void addGhostItems(Int64ConstArrayView unique_ids, Int32ArrayView items, Int32ConstArrayView owners) override
Alloue des entités fantômes.
IItemFamilyInternal * _internalApi() override
API interne à Arcane.
void getCommunicatingSubDomains(Int32Array &sub_domains) const override
Liste des sous-domaines communiquants pour les entités.
void reduceFromGhostItems(IVariable *v, IDataOperation *operation) override
Applique une opération de réduction depuis les entités fantômes.
ItemConnectivitySet m_target_item_connectivities
connectivite ou ItemFamily == SourceFamily
Definition ItemFamily.h:354
IItemFamily * parentFamily() const override
IItemFamily parent.
void setHasUniqueIdMap(bool v) override
Indique si la famille possède une table de conversion uniqueId vers localId.
ItemInfoListView itemInfoListView() override
Vue sur la liste d'informations sur les entités.
void setParentFamily(IItemFamily *parent) override
Positionne l'IItemFamily parent.
void compactItems(bool do_sort) override
Compacte les entités.
Integer nbItem() const override
Nombre d'entités.
void notifyItemsUniqueIdChanged() override
Notifie que les numéros uniques des entités ont été modifiées.
ItemVectorView view() override
Vue sur toutes les entités de la famille.
void synchronize(VariableCollection variables) override
Synchronise les variables variables.
ItemPairGroup findAdjacencyItems(const ItemGroup &group, const ItemGroup &sub_group, eItemKind link_kind, Integer layer) override
Cherche une liste d'adjacence.
ItemInternalList itemsInternal() override
Tableau interne des entités.
void computeSynchronizeInfos() override
Construit les structures nécessaires à la synchronisation.
void checkValidConnectivity() override
Vérification de la validité des structures internes concernant la connectivité.
void _updateItemsSharedFlag()
Positionne les infos Item::isShared() pour les entités de la famille.
IVariable * findVariable(const String &name, bool throw_exception) override
Recherche la variable de nom name associée à cette famille.
void _readGroups()
Relit les groupes depuis une protection et les recréer si besoin.
Int32 maxLocalId() const override
void setItemSortFunction(IItemInternalSortFunction *sort_function) override
Positionne la fonction de tri des entités.
IItemInternalSortFunction * itemSortFunction() const override
Fonction de tri des entités.
ISubDomain * subDomain() const override
Sous-domaine associé
virtual void _notifyEndUpdateFromMesh()
IVariableSynchronizer * allItemsSynchronizer() override
Synchroniseur sur toutes les entités de la famille.
void notifyItemsOwnerChanged() override
Notifie que les entités propres au sous-domaine de la famille ont été modifiées.
Integer parentFamilyDepth() const override
Donne la profondeur d'imbrication du maillage courant.
ItemGroupCollection groups() const override
Liste des groupes de cette famille.
IItemConnectivityMng * m_connectivity_mng
connectivite ou ItemFamily == TargetFamily
Definition ItemFamily.h:355
IItemConnectivityInfo * localConnectivityInfos() const override
Informations sur la connectivité locale au sous-domaine pour à cette famille.
IItemFamilyCollection childFamilies() override
Familles enfantes de cette famille.
void partialEndUpdateGroup(const ItemGroup &group) override
Met à jour un groupe.
void removeNeedRemoveMarkedItems() override
Supprime des entités et met a jour les connectivites.
IItemConnectivityInfo * globalConnectivityInfos() const override
Informations sur la connectivité globales à tous les sous-domaines.
void checkUniqueIds(Int64ConstArrayView unique_ids) override
Vérifie que les identifiants unique_ids sont bien uniques pour tous les sous-domaines.
ItemGroup findGroup(const String &name) const override
Recherche un groupe.
void readFromDump() override
Relit les données à partir d'une protection.
String name() const override
Nom de la famille.
Definition ItemFamily.h:130
Tableau associatif de ItemInternal.
void notifyUniqueIdsChanged()
Notifie que les numéros uniques des entités ont changés.
Int32 nbBucket() const
Nombre de buckets.
Infos de maillage pour un genre donné d'entité.
bool hasChanged()
Indique si la liste a changée depuis le dernier appel à prepareForDump()
void checkValid()
Vérifie si les structures internes de l'instance sont valides.
Classe temporaire pour conserver un ItemSharedInfo et un type d'entité.
Exception lorsqu'un argument est invalide.
Vue modifiable d'un tableau d'un type T.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Interface du gestionnaire de traces.
Exception lorsqu'une fonction n'est pas implémentée.
Exception lorsqu'une opération n'est pas supportée.
Constructeur de chaîne de caractère unicode.
Chaîne de caractères unicode.
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage fatal() const
Flot pour un message d'erreur fatale.
Vecteur 1D de données avec sémantique par valeur (style STL).
Int32 toInt32(Int64 v)
Converti un Int64 en un Int32.
Ref< IVariableSynchronizer > createSynchronizerRef(IParallelMng *pm, IItemFamily *family)
Retourne une interface pour synchroniser des variables sur le groupe de la famille family.
bool arcaneIsCheck()
Vrai si on est en mode vérification.
Definition Misc.cc:163
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:687
ConstArrayView< ItemInternal * > ItemInternalList
Type de la liste interne des entités.
Definition ItemTypes.h:466
ArrayView< Int64 > Int64ArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:656
eItemKind
Genre d'entité de maillage.
eReduceType
Types des réductions supportées.
Int32 Integer
Type représentant un entier.