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