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