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"
26#include "arcane/core/IParallelMng.h"
27#include "arcane/core/ISubDomain.h"
28#include "arcane/core/VariableTypes.h"
29#include "arcane/core/IVariableMng.h"
30#include "arcane/core/IVariable.h"
31#include "arcane/core/IMesh.h"
32#include "arcane/core/IMeshSubMeshTransition.h"
33#include "arcane/core/IApplication.h"
34#include "arcane/core/IDataFactoryMng.h"
35#include "arcane/core/ItemInfoListView.h"
36#include "arcane/core/ItemPairGroup.h"
37#include "arcane/core/ItemPairGroupImpl.h"
38#include "arcane/core/IMeshUtilities.h"
39#include "arcane/core/IVariableSynchronizer.h"
40#include "arcane/core/ItemInternalSortFunction.h"
41#include "arcane/core/Properties.h"
42#include "arcane/core/ItemFamilyCompactInfos.h"
43#include "arcane/core/IMeshMng.h"
44#include "arcane/core/IMeshCompacter.h"
45#include "arcane/core/IMeshCompactMng.h"
46#include "arcane/core/MeshPartInfo.h"
47#include "arcane/core/ParallelMngUtils.h"
48#include "arcane/core/internal/IDataInternal.h"
49#include "arcane/core/internal/IItemFamilyInternal.h"
50#include "arcane/core/internal/IIncrementalItemConnectivityInternal.h"
51#include "arcane/core/datatype/IDataOperation.h"
53#include "arcane/mesh/ItemFamily.h"
54#include "arcane/mesh/ItemSharedInfoList.h"
55#include "arcane/mesh/ItemConnectivityInfo.h"
56#include "arcane/mesh/ItemConnectivitySelector.h"
57#include "arcane/mesh/AbstractItemFamilyTopologyModifier.h"
58#include "arcane/mesh/DynamicMeshKindInfos.h"
60#include "arcane/core/parallel/GhostItemsVariableParallelOperation.h"
61#include "arcane/core/parallel/IStat.h"
63#include "arcane/core/IIncrementalItemConnectivity.h"
64#include "arcane/core/IItemConnectivityMng.h"
65#include "arcane/core/IItemFamilyPolicyMng.h"
67#include "arcane/core/ItemPrinter.h"
68#include "arcane/core/ConnectivityItemVector.h"
69#include "arcane/core/IndexedItemConnectivityView.h"
71#include "arcane/mesh/ItemProperty.h"
72#include "arcane/mesh/ItemData.h"
73#include "arcane/mesh/ConnectivityNewWithDependenciesTypes.h"
89 template <
typename DataType>
void
90 _offsetArrayByOne(Array<DataType>* array)
92 Array<DataType>& v = *array;
93 MeshUtils::checkResizeArray(v, v.size() + 1,
false);
95 for (
Int32 i = (n - 1); i >= 1; --i)
109 explicit InternalApi(ItemFamily* family)
117 return m_family->_unstructuredItemInternalConnectivityList();
121 return m_family->_topologyModifier();
125 return m_family->commonItemSharedInfo();
129 m_family->_addSourceConnectivity(connectivity);
133 m_family->_addTargetConnectivity(connectivity);
137 return m_family->_endAllocate();
141 return m_family->_notifyEndUpdateFromMesh();
145 return m_family->_addVariable(var);
149 return m_family->_removeVariable(var);
153 return m_family->_resizeVariables(force_resize);
158 ItemFamily* m_family =
nullptr;
169 const String& family_name,
171 const String& shared_data_name,
172 const String& unique_ids_name,
173 const String& items_owner_name,
174 const String& items_flags_name,
175 const String& items_type_id_name,
176 const String& items_nb_parent_name,
177 const String& groups_name,
178 const String& current_id_name,
179 const String& new_owner_name,
180 const String& parent_mesh_name,
181 const String& parent_family_name,
182 const String& parent_family_depth_name,
183 const String& child_meshes_name,
184 const String& child_families_name)
263, m_item_internal_list(
mesh->meshItemInternalList())
267, m_sub_domain_id(
mesh->meshPartInfo().partRank())
270 m_infos->setItemFamily(
this);
271 m_connectivity_selector_list_by_item_kind.resize(ItemInternalConnectivityList::MAX_ITEM_KIND);
280 delete m_topology_modifier;
283 delete m_local_connectivity_info;
284 delete m_global_connectivity_info;
285 delete m_item_sort_function;
286 delete m_internal_variables;
287 delete m_item_shared_infos;
292 delete m_common_item_shared_info;
293 delete m_internal_api;
300_variableName(
const String& base_name)
const
302 return m_name + base_name;
315 if (!m_topology_modifier)
316 m_topology_modifier =
new AbstractItemFamilyTopologyModifier(
this);
318 m_full_name = m_mesh->
name() +
"_" + m_name;
320 m_local_connectivity_info =
new ItemConnectivityInfo();
321 m_global_connectivity_info =
new ItemConnectivityInfo();
324 if (!pm->isParallel()) {
325 m_default_sub_domain_owner = 0;
326 m_is_parallel =
false;
329 m_is_parallel =
true;
339 String var_unique_ids_name(_variableName(
"FamilyUniqueIds"));
340 String var_owner_name(_variableName(
"FamilyOwner"));
341 String var_flags_name(_variableName(
"FamilyFlags"));
342 String var_typeid_name(_variableName(
"FamilyItemTypeId"));
343 String var_nb_parent_name(_variableName(
"FamilyItemNbParent"));
344 String var_count_name(_variableName(
"FamilyItemsShared"));
345 String var_groups_name(_variableName(
"FamilyGroupsName"));
346 String var_current_id_name(_variableName(
"FamilyCurrentId"));
347 String var_new_owner_name(_variableName(
"FamilyNewOwnerName"));
348 String var_parent_mesh_name(_variableName(
"ParentMeshName"));
349 String var_parent_family_name(_variableName(
"ParentFamilyName"));
350 String var_parent_family_depth_name(_variableName(
"ParentFamilyDepthName"));
351 String var_child_meshes_name(_variableName(
"ChildMeshesName"));
352 String var_child_families_name(_variableName(
"ChildFamiliesName"));
354 var_unique_ids_name, var_owner_name,
355 var_flags_name, var_typeid_name, var_nb_parent_name, var_groups_name,
356 var_current_id_name, var_new_owner_name,
357 var_parent_mesh_name, var_parent_family_name,
358 var_parent_family_depth_name,
359 var_child_meshes_name,
360 var_child_families_name);
364 m_items_unique_id = &m_internal_variables->m_items_unique_id._internalTrueData()->_internalDeprecatedValue();
365 m_items_owner = &m_internal_variables->m_items_owner._internalTrueData()->_internalDeprecatedValue();
366 m_items_flags = &m_internal_variables->m_items_flags._internalTrueData()->_internalDeprecatedValue();
367 m_items_type_id = &m_internal_variables->m_items_type_id._internalTrueData()->_internalDeprecatedValue();
368 m_items_nb_parent = &m_internal_variables->m_items_nb_parent._internalTrueData()->_internalDeprecatedValue();
371 _addOnSizeChangedObservable(m_internal_variables->m_items_unique_id);
372 _addOnSizeChangedObservable(m_internal_variables->m_items_owner);
373 _addOnSizeChangedObservable(m_internal_variables->m_items_flags);
374 _addOnSizeChangedObservable(m_internal_variables->m_items_type_id);
375 _addOnSizeChangedObservable(m_internal_variables->m_items_nb_parent);
382 m_item_sort_function = _defaultItemSortFunction();
386 if (s ==
"TRUE" || s ==
"1") {
387 info() <<
"WARNING: Using legacy 'compactItem()' without compactReference()'";
388 m_use_legacy_compact_item =
true;
393 m_do_shrink_after_allocate = (v.value() != 0);
403 return m_infos->findOne(uid);
408 return m_infos->itemsMap();
410const DynamicMeshKindInfos& ItemFamily::
416const DynamicMeshKindInfos& ItemFamily::
427 m_infos->removeOne(ItemCompatibility::_itemInternal(item));
432 m_infos->detachOne(ItemCompatibility::_itemInternal(item));
437 return m_infos->itemsInternal();
439ItemInternal* ItemFamily::
440_itemInternal(
Int32 local_id)
442 return m_infos->itemInternal(local_id);
444ItemInternal* ItemFamily::
445_allocOne(
Int64 unique_id)
447 return m_infos->allocOne(unique_id);
449ItemInternal* ItemFamily::
450_allocOne(
Int64 unique_id,
bool& need_alloc)
452 return m_infos->allocOne(unique_id, need_alloc);
454ItemInternal* ItemFamily::
455_findOrAllocOne(
Int64 uid,
bool& is_alloc)
457 return m_infos->findOrAllocOne(uid, is_alloc);
460_setHasUniqueIdMap(
bool v)
462 m_infos->setHasUniqueIdMap(v);
467 m_infos->removeMany(local_ids);
470_removeDetachedOne(Item item)
472 m_infos->removeDetachedOne(ItemCompatibility::_itemInternal(item));
477 return m_infos->kind();
486 return m_infos->nbItem();
495 return m_infos->maxUsedLocalId();
504 return m_infos->itemsInternal();
522 return m_parent_family;
531 m_parent_family = parent;
533 m_parent_family_depth = 1;
535 m_parent_family_depth = 0;
538 m_parent_family->addChildFamily(
this);
540 ARCANE_ASSERT((m_parent_family_depth < 2), (
"Not test if more than one depth level"));
549 return m_parent_family_depth;
559 m_child_families.add(true_family);
569 for (
Integer i = 0; i < m_child_families.size(); ++i) {
570 collection.add(m_child_families[i]);
581 return m_internal_variables->m_items_new_owner;
591 m_item_shared_infos->checkValid();
600 _checkValidConnectivity();
614 _computeConnectivityInfo(m_local_connectivity_info);
615 _computeConnectivityInfo(m_global_connectivity_info);
640 if (!m_parent_family) {
641 m_internal_variables->setUsed();
643 if (m_do_shrink_after_allocate)
644 _shrinkConnectivityAndPrintInfos();
651_shrinkConnectivityAndPrintInfos()
654 ItemConnectivityMemoryInfo mem_info;
655 for (ItemConnectivitySelector* cs : m_connectivity_selector_list) {
656 IIncrementalItemConnectivity* c = cs->customConnectivity();
657 c->_internalApi()->addMemoryInfos(mem_info);
659 const Int64 total_capacity = mem_info.m_total_capacity;
660 const Int64 total_size = mem_info.m_total_size;
661 Int64 ratio = 100 * (total_capacity - total_size);
662 ratio /= (total_size + 1);
664 const Int64 mega_byte = 1024 * 1024;
665 Int64 capacity_mega_byte = (mem_info.m_total_capacity * sizeof_int32) / mega_byte;
666 info() <<
"MemoryUsed for family name=" <<
name() <<
" size=" << mem_info.m_total_size
667 <<
" capacity=" << mem_info.m_total_capacity
668 <<
" capacity (MegaByte)=" << capacity_mega_byte
669 <<
" ratio=" << ratio;
672 std::ostream& o = ostr();
674 for (ItemConnectivitySelector* cs : m_connectivity_selector_list) {
675 IIncrementalItemConnectivity* c = cs->customConnectivity();
678 c->_internalApi()->shrinkMemory();
683 info() << ostr.str();
692 bool need_end_update = m_infos->changed();
693 info(4) <<
"ItemFamily::endUpdate() " <<
fullName() <<
" need_end_update?=" << need_end_update;
694 if (!need_end_update) {
700 if (m_need_prepare_dump) {
701 _computeConnectivityInfo(m_local_connectivity_info);
706 m_item_need_prepare_dump =
true;
707 _computeConnectivityInfo(m_local_connectivity_info);
712 m_connectivity_mng->setModifiedItems(
this, m_infos->addedItems(), m_infos->removedItems());
714 m_infos->finalizeMeshChanged();
723_endUpdate(
bool need_check_remove)
725 if (_partialEndUpdate())
728 _resizeVariables(
false);
730 <<
" hashmapsize=" << itemsMap().nbBucket()
731 <<
" nb_group=" << m_item_groups.count();
733 _updateGroups(need_check_remove);
751 _updateGroup(group,
true);
758_updateGroup(
ItemGroup group,
bool need_check_remove)
761 if (group == m_infos->allItems())
766 if (need_check_remove) {
778_updateGroups(
bool need_check_remove)
781 ItemGroup group = *i;
782 _updateGroup(group, need_check_remove);
792 _updateVariable(variable);
808_resizeVariables(
bool force_resize)
812 <<
" nb_item=" <<
nbItem()
813 <<
" currentsize=" << m_current_variable_item_size;
814 if (force_resize || (
maxLocalId() != m_current_variable_item_size)) {
815 info(4) <<
"ItemFamily::resizeVariables: name=" <<
fullName()
817 <<
" nb_item=" <<
nbItem()
818 <<
" currentsize=" << m_current_variable_item_size
820 <<
" nb_var=" << m_used_variables.size();
824 for (
IVariable* var : m_used_variables) {
825 _updateVariable(var);
834itemsUniqueIdToLocalId(ArrayView<Int64> ids,
bool do_fatal)
const
836 m_infos->itemsUniqueIdToLocalId(ids, do_fatal);
847 m_infos->itemsUniqueIdToLocalId(local_ids, unique_ids, do_fatal);
858 m_infos->itemsUniqueIdToLocalId(local_ids, unique_ids, do_fatal);
894 return m_mesh->parallelMng();
903 _checkNeedEndUpdate();
904 return m_infos->allItems();
913 debug(
Trace::High) <<
"ItemFamily:createGroup(name,Int32ConstArrayView): " << m_name <<
":"
914 <<
" group_name=" <<
name
915 <<
" count=" << elements.
size()
916 <<
" override=" << do_override;
918 _checkNeedEndUpdate();
946 fatal() <<
"Attempting to create an already existing group '" <<
name <<
"'";
949 debug() <<
"ItemFamily:createGroup(name): " << m_name <<
":"
952 _processNewGroup(group);
966 fatal() <<
"Group already existing but with a different parent";
968 fatal() <<
"A group can not be its own parent name=" <<
name;
971 fatal() <<
"Attempting to create an already existing group '" <<
name <<
"'";
974 fatal() <<
"Attempting to create a group '" <<
name <<
"' with no parent.";
975 debug() <<
"ItemFamily:createGroup(name,parent): " << m_name <<
":"
977 <<
" parent=" << parent.
name();
979 _processNewGroup(group);
989 _invalidateComputedGroups();
991 m_item_groups.clear();
995 m_item_groups.add(group);
1008 debug() <<
"ItemFamily::notifyItemsOwnerChanged()";
1015 for (
Integer i = 0; i < m_child_families.size(); ++i) {
1018 for (
Integer z = 0, zs = items.
size(); z < zs; ++z) {
1019 impl::MutableItemBase item(items[z]);
1022 Item parent_item = item.parentBase(0);
1023 ARCANE_ASSERT((parent_item.
uniqueId() == item.
uniqueId()), (
"Inconsistent parent uid"));
1038 ARCANE_FATAL(
"Incoherent family name={0} wanted={1} current={2}",
1041 m_item_groups.add(group);
1042 m_need_prepare_dump =
true;
1046 if (!m_is_parallel && m_mesh->
meshPartInfo().nbPart() == 1)
1056 return m_item_groups;
1065 for (
const ItemGroup& group : m_item_groups) {
1080 if (create_if_needed)
1092 itemsMap().notifyUniqueIdsChanged();
1099_checkNeedEndUpdate()
const
1101 if (m_infos->changed())
1102 ARCANE_FATAL(
"missing call to endUpdate() after modification");
1111 info(4) <<
"ItemFamily::prepareForDump(): " <<
fullName()
1112 <<
" need=" << m_need_prepare_dump
1113 <<
" item-need=" << m_item_need_prepare_dump
1114 <<
" m_item_shared_infos->hasChanged()=" << m_item_shared_infos->hasChanged()
1115 <<
" nb_item=" << m_infos->nbItem();
1118 auto* p = m_properties;
1119 p->setInt32(
"dump-version", 0x0307);
1120 p->setInt32(
"nb-item", m_infos->nbItem());
1125 if (m_item_need_prepare_dump || m_item_shared_infos->hasChanged()) {
1126 info(4) <<
"Prepare for dump:2: name=" << m_name <<
" nb_alloc=" << m_nb_allocate_info
1127 <<
" uid_size=" << m_items_unique_id->size() <<
" cap=" << m_items_unique_id->capacity()
1128 <<
" byte=" << m_items_unique_id->capacity() *
sizeof(
Int64);
1134 m_infos->prepareForDump();
1135 m_item_shared_infos->prepareForDump();
1136 m_need_prepare_dump =
true;
1138 m_item_need_prepare_dump =
false;
1139 if (m_need_prepare_dump) {
1140 Integer nb_item = m_infos->nbItem();
1142 _resizeItemVariables(nb_item,
true);
1145 <<
" saveid=" << m_internal_variables->m_current_id();
1147 m_internal_variables->m_items_shared_data_index.resize(nb_item);
1148 IntegerArrayView items_shared_data_index(m_internal_variables->m_items_shared_data_index);
1149 info(4) <<
"ItemFamily::prepareForDump(): " << m_name
1150 <<
" count=" << nb_item <<
" currentid=" <<
m_current_id;
1153 for (
Integer i = 0; i < nb_item; ++i) {
1159 for (
Integer i = 0; i < nb_item; ++i) {
1162 items_shared_data_index[i] = isi->index();
1166 info() <<
"Item: SHARED_INDEX = " << items_shared_data_index[i]
1168 <<
" lid = " << item->
localId()
1169 <<
" dataindex = " << item->dataIndex()
1170 <<
" flags = " << item->
flags();
1178 if (m_parent_family) {
1179 m_internal_variables->m_parent_family_name = m_parent_family->name();
1180 m_internal_variables->m_parent_mesh_name = m_parent_family->mesh()->name();
1182 m_internal_variables->m_parent_family_depth = m_parent_family_depth;
1183 const Integer child_count = m_child_families.size();
1184 m_internal_variables->m_child_meshes_name.resize(child_count);
1185 m_internal_variables->m_child_families_name.resize(child_count);
1186 for (
Integer i = 0; i < child_count; ++i) {
1187 m_internal_variables->m_child_meshes_name[i] = m_child_families[i]->mesh()->name();
1188 m_internal_variables->m_child_families_name[i] = m_child_families[i]->name();
1203 m_internal_variables->m_groups_name.resize(nb_group_to_save);
1205 Integer current_group_index = 0;
1210 m_internal_variables->m_groups_name[current_group_index] = group.
name();
1211 ++current_group_index;
1220 _applyCheckNeedUpdateOnGroups();
1222 m_need_prepare_dump =
false;
1235 Int32 dump_version = 0;
1240 bool use_type_variable =
false;
1243 auto* p = m_properties;
1244 if (p->get(
"dump-version", x))
1246 if (dump_version >= 0x0307) {
1247 use_type_variable =
true;
1248 nb_item = p->getInt32(
"nb-item");
1249 Int32 cid = p->getInt32(
"current-change-id");
1250 Int32 expected_cid = m_internal_variables->m_current_id();
1251 if (cid != expected_cid)
1252 ARCANE_FATAL(
"Bad value for current id mesh={0} id={1} expected={2}",
1257 const bool allow_old_version =
true;
1258 if (!allow_old_version)
1259 if (dump_version < 0x0307)
1260 ARCANE_FATAL(
"Your checkpoint is from a version of Arcane which is too old (mininum version is 3.7)");
1266 const MeshPartInfo& part_info = m_mesh->meshPartInfo();
1267 m_sub_domain_id = part_info.partRank();
1268 if (m_infos->allItems().isOwn() && part_info.nbPart() > 1)
1269 m_infos->allItems().setOwn(
false);
1278 IntegerArrayView items_shared_data_index(m_internal_variables->m_items_shared_data_index);
1279 if (!use_type_variable)
1280 nb_item = items_shared_data_index.
size();
1282 info(4) <<
"ItemFamily::readFromDump(): " <<
fullName()
1283 <<
" count=" << nb_item
1285 <<
" saveid=" << m_internal_variables->m_current_id()
1286 <<
" use_type_variable?=" << use_type_variable
1287 <<
" dump_version=" << dump_version;
1289 if (!use_type_variable) {
1296 _handleOldCheckpoint();
1300 if (m_internal_variables->m_current_id() ==
m_current_id) {
1301 debug() <<
"Family unchanged. Nothing to do.";
1308 _invalidateComputedGroups();
1315 m_current_variable_item_size = 0;
1319 IMeshMng* mesh_mng = m_mesh->meshMng();
1320 if (!m_internal_variables->m_parent_mesh_name().null()) {
1322 m_parent_family = parent_mesh->
findItemFamily(m_internal_variables->m_parent_family_name(),
true);
1324 m_parent_family_depth = m_internal_variables->m_parent_family_depth();
1325 ARCANE_ASSERT((m_internal_variables->m_child_meshes_name.size() == m_internal_variables->m_child_families_name.size()),
1326 (
"Incompatible child mesh/family sizes"));
1327 Integer child_count = m_internal_variables->m_child_families_name.size();
1328 for (
Integer i = 0; i < child_count; ++i) {
1331 m_child_families.add(
dynamic_cast<ItemFamily*
>(child_family));
1335 m_item_shared_infos->readFromDump();
1336 m_infos->readFromDump();
1341 if (use_type_variable) {
1343 for (
Integer i = 0; i < nb_item; ++i) {
1345 ItemTypeId type_id{ m_common_item_shared_info->m_type_ids[i] };
1347 Int64 uid = m_items_unique_id_view[i];
1349 item->_setSharedInfo(isi->sharedInfo(), type_id);
1354 auto item_shared_infos = m_item_shared_infos->itemSharedInfos();
1355 for (
Integer i = 0; i < nb_item; ++i) {
1356 Integer shared_data_index = items_shared_data_index[i];
1358 Int64 uid = m_items_unique_id_view[i];
1360 item->_setSharedInfo(isi->sharedInfo(), isi->itemTypeId());
1366 m_infos->allItems().clear();
1369 for (
auto& c : m_source_incremental_item_connectivities)
1370 c->notifyReadFromDump();
1376 _invalidateComputedGroups();
1387_applyCheckNeedUpdateOnGroups()
1392 if (group == m_infos->allItems())
1402_invalidateComputedGroups()
1408 ItemGroup group = *i;
1409 if (!group.internal()->parentGroup().null()) {
1426 debug() <<
"ItemFamily::readFromDump(): number of group: " << groups_var.
size();
1427 for (
Integer i = 0, is = groups_var.
size(); i < is; ++i) {
1429 debug() <<
"Readign group again: " <<
name;
1448 if (global_changed != 0)
1468 m_need_prepare_dump =
true;
1476 m_item_need_prepare_dump =
true;
1489 if (!m_use_legacy_compact_item) {
1492 _applyCheckNeedUpdateOnGroups();
1524 m_infos->beginCompactItems(compact_infos);
1527 m_infos->checkValid();
1532 for (
auto& c : m_source_incremental_item_connectivities)
1533 c->notifySourceFamilyLocalIdChanged(new_to_old_ids);
1535 for (
auto& c : m_target_incremental_item_connectivities)
1536 c->notifyTargetFamilyLocalIdChanged(old_to_new_ids);
1539 c->notifySourceFamilyLocalIdChanged(new_to_old_ids);
1542 c->notifyTargetFamilyLocalIdChanged(old_to_new_ids);
1549 if (m_parent_family_depth > 0)
1560finishCompactItems(ItemFamilyCompactInfos& compact_infos)
1563 m_infos->checkValid();
1565 m_infos->finishCompactItems(compact_infos);
1567 for (ItemConnectivitySelector* ics : m_connectivity_selector_list)
1568 ics->compactConnectivities();
1583 ARCANE_ASSERT(source.size() == destination.
size(),
1584 (
"Can't copy. Source and destination have different size !"));
1586 if (source.size() != 0) {
1587 for (
IVariable* var : m_used_variables) {
1613 ARCANE_ASSERT(first_source.
size() == destination.
size(),
1614 (
"Can't copy. : first_source and destination have different size !"));
1615 ARCANE_ASSERT(second_source.
size() == destination.
size(),
1616 (
"Can't copy : second_source and destination have different size !"));
1618 if (first_source.
size() != 0) {
1619 for (
IVariable* var : m_used_variables) {
1641 for (
IVariable* var : m_used_variables) {
1646 m_variable_synchronizer->changeLocalIds(old_to_new_ids);
1656 for (
Integer i = 0; i < m_child_families.size(); ++i)
1661 <<
" nb_item=" <<
nbItem();
1666 m_current_variable_item_size =
nbItem();
1679compactConnectivities()
1684 c->notifySourceFamilyLocalIdChanged(new_to_old_ids);
1687 c->notifyTargetFamilyLocalIdChanged(old_to_new_ids);
1701 if (m_parent_family_depth > 1)
1704 ARCANE_ASSERT((
nbItem() == 0 || !old_to_new_lids.
empty()), (
"Empty oldToNewLocalIds"));
1705 debug() <<
"\tfrom parent family " << m_parent_family->name();
1706 if (
this == m_parent_family)
1709 for (
Integer z = 0, zs = items.
size(); z < zs; ++z) {
1711 Int32 old_parent_lid = item->parentId(0);
1712 item->
setParent(0, old_to_new_lids[old_parent_lid]);
1725 ARCANE_UNUSED(local_ids);
1726 ARCANE_UNUSED(keep_ghost);
1739 if (m_sub_domain_id != part_rank)
1740 ARCANE_FATAL(
"Family {0} Bad value for partRank ({1}) expected={2}",
1741 fullName(), m_sub_domain_id, part_rank);
1749_reserveInfosMemory(
Integer memory)
1751 ARCANE_UNUSED(memory);
1760 ARCANE_UNUSED(new_size);
1769 ARCANE_UNUSED(memory);
1776ItemSharedInfoWithType* ItemFamily::
1777_findSharedInfo(ItemTypeInfo* type)
1779 return m_item_shared_infos->findSharedInfo(type);
1789 m_need_prepare_dump =
true;
1796_allocateInfos(ItemInternal* item,
Int64 uid, ItemTypeInfo* type)
1798 ItemSharedInfoWithType* isi = _findSharedInfo(type);
1799 _allocateInfos(item, uid, isi);
1806_resizeItemVariables(
Int32 new_size,
bool force_resize)
1808 bool is_resize = MeshUtils::checkResizeArray(*m_items_unique_id, new_size + 1, force_resize);
1809 is_resize |= MeshUtils::checkResizeArray(*m_items_owner, new_size + 1, force_resize);
1810 is_resize |= MeshUtils::checkResizeArray(*m_items_flags, new_size + 1, force_resize);
1811 is_resize |= MeshUtils::checkResizeArray(*m_items_type_id, new_size + 1, force_resize);
1812 if (m_parent_family_depth > 0)
1813 is_resize |= MeshUtils::checkResizeArray(*m_items_nb_parent, new_size, force_resize);
1819 (*m_items_unique_id)[0] = NULL_ITEM_UNIQUE_ID;
1820 (*m_items_flags)[0] = 0;
1821 (*m_items_owner)[0] = A_NULL_RANK;
1822 (*m_items_type_id)[0] = IT_NullType;
1829_allocateInfos(ItemInternal* item,
Int64 uid, ItemSharedInfoWithType* isi)
1833 Int32 local_id = item->localId();
1834 _resizeItemVariables(local_id + 1,
false);
1839 ItemTypeId iti = isi->itemTypeId();
1840 item->_setSharedInfo(isi->sharedInfo(), iti);
1842 item->reinitialize(uid, m_default_sub_domain_owner, m_sub_domain_id);
1843 ++m_nb_allocate_info;
1845 for (
auto& c : m_source_incremental_item_connectivities)
1846 c->notifySourceItemAdded(ItemLocalId(local_id));
1853_preAllocate(
Int32 nb_item,
bool pre_alloc_connectivity)
1856 m_infos->itemsMap().resize(nb_item,
true);
1857 _resizeItemVariables(nb_item,
false);
1858 for (
auto& c : m_source_incremental_item_connectivities)
1859 c->reserveMemoryForNbSourceItems(nb_item, pre_alloc_connectivity);
1866_notifyDataIndexChanged()
1880 sub_domains.
copy(ranks);
1893 if (m_is_parallel && m_mesh->meshPartInfo().nbPart() ==
parallelMng()->commSize()) {
1894 m_variable_synchronizer->compute();
1932 return &m_items_unique_id_view;
1948 if (!var && throw_exception) {
1976 info() <<
"ItemFamily::checkUniqueIds name=" <<
name() <<
" n=" << nb_item
1977 <<
" total=" << all_unique_ids.
size();
1978 for (
Integer i = 0; i < nb_item; ++i)
1979 items_map.
add(unique_ids[i], 0);
1980 for (
Integer i = 0, is = all_unique_ids.
size(); i < is; ++i) {
1985 for (
Integer i = 0; i < nb_item; ++i) {
1986 Integer nb_ref = items_map[unique_ids[i]];
1988 fatal() <<
"Duplicate unique_id=" << unique_ids[i];
2008 auto i = m_adjacency_groups.find(at);
2010 if (i == m_adjacency_groups.end()) {
2011 debug() <<
"** BUILD ADJENCY_ITEMS : " << group.
name() <<
" x "
2012 << sub_group.
name() <<
" link=" << link_kind <<
" nblayer=" << layer;
2015 m_adjacency_groups.insert(std::make_pair(at, v));
2018 debug() <<
"** FOUND KNOWN ADJENCY_ITEMS! : " << group.
name() <<
" x "
2019 << sub_group.
name() <<
" link=" << link_kind <<
" nblayer=" << layer;
2029 return m_local_connectivity_info;
2038 return m_global_connectivity_info;
2086 ARCANE_FATAL(
"Can not add a variable to a different family");
2087 m_used_variables.insert(var);
2097 m_used_variables.erase(var);
2106 for(
IVariable* var : m_used_variables ){
2107 collection.add(var);
2117 return m_variable_synchronizer.get();
2126 if (m_item_sort_function==sort_function)
2128 delete m_item_sort_function;
2129 m_item_sort_function = sort_function;
2130 if (!m_item_sort_function)
2131 m_item_sort_function = _defaultItemSortFunction();
2140 return m_item_sort_function;
2149 m_variable_synchronizer->synchronize(variables);
2158 m_variable_synchronizer->synchronize(variables, local_ids);
2167 ARCANE_UNUSED(unique_ids);
2168 ARCANE_UNUSED(items);
2169 ARCANE_UNUSED(owners);
2180 ARCANE_FATAL(
"Family name='{0}': IMesh::itemFamilyNetwork() is null",
name());
2189 for (
auto child_connectivity : child_connectivities) {
2190 child_families.
add(child_connectivity->targetFamily());
2192 if (child_families_to_current_family.
back() ==
nullptr)
fatal() <<
"removeItems2 needs reverse connectivity. Missing Connectivity " << connectivityName(child_families.
back(),
this);
2194 child_families_has_extra_parent_properties.
back().resize(child_families.
back(),
false);
2195 for (
auto parent_connectivity : m_mesh->
itemFamilyNetwork()->getParentDependencies(child_families.
back())) {
2196 if (parent_connectivity == child_connectivity)
continue;
2198 _getConnectedItems(parent_connectivity,connected_items);
2199 _fillHasExtraParentProperty(child_families_has_extra_parent_properties[index],connected_items);
2205 for (
auto removed_item_lid_int64 : removed_item_lids) {
2208 for (
auto child_connectivity : child_connectivities) {
2209 ConnectivityItemVector child_con_accessor(child_connectivity);
2210 ENUMERATE_ITEM(connected_item, child_con_accessor.connectedItems(ItemLocalId(removed_item_lid))) {
2211 if (!this->
itemsInternal()[removed_item_lid]->isDetached()) {
2212 child_families_to_current_family[index]->removeConnectedItem(ItemLocalId(connected_item),ItemLocalId(removed_item_lid));
2215 if (! child_families_has_extra_parent_properties[index][connected_item] && child_families_to_current_family[index]->nbConnectedItem(ItemLocalId(connected_item)) == 0) {
2216 item_data_list[child_connectivity->targetFamily()->itemKind()].itemInfos().add((
Int64) connected_item.localId());
2224 for (
auto removed_item_lid_int64 : removed_item_lids) {
2226 for (
auto child_relation : m_mesh->itemFamilyNetwork()->getChildRelations(
this)) {
2227 ConnectivityItemVector connectivity_accessor(child_relation);
2228 ENUMERATE_ITEM(connected_item, connectivity_accessor.connectedItems(ItemLocalId(removed_item_lid))) {
2229 child_relation->removeConnectedItem(ItemLocalId(removed_item_lid),ItemLocalId(connected_item));
2234 ItemScalarProperty<bool> is_removed_item;
2235 is_removed_item.resize(
this,
false);
2236 for (
auto removed_item_lid_int64 : removed_item_lids) {
2238 is_removed_item[*(this->
itemsInternal()[removed_item_lid])] =
true;
2240 for (
auto parent_relation : m_mesh->itemFamilyNetwork()->getParentRelations(
this)) {
2241 for (
auto source_item : parent_relation->sourceFamily()->itemsInternal()) {
2242 if (source_item->isSuppressed())
continue;
2243 ConnectivityItemVector connectivity_accessor(parent_relation);
2244 ENUMERATE_ITEM(connected_item, connectivity_accessor.connectedItems(ItemLocalId(source_item))) {
2245 if (is_removed_item[connected_item])
2246 parent_relation->removeConnectedItem(ItemLocalId(source_item),connected_item);
2251 for (
auto removed_item_lid_int64 : removed_item_lids) {
2253 ItemInternal* removed_item = m_infos->itemInternal(removed_item_lid);
2254 if (removed_item->isDetached()) {
2255 m_infos->removeDetachedOne(removed_item);
2258 m_infos->removeOne(removed_item);
2268_getConnectedItems(IIncrementalItemConnectivity* parent_connectivity,ItemVector& target_family_connected_items)
2270 ConnectivityItemVector connectivity_accessor(parent_connectivity);
2271 for(
auto source_item : parent_connectivity->sourceFamily()->itemsInternal()) {
2272 if (source_item->isSuppressed())
continue;
2273 target_family_connected_items.add(connectivity_accessor.connectedItems(ItemLocalId(source_item)).localIds());
2281_fillHasExtraParentProperty(ItemScalarProperty<bool>& child_families_has_extra_parent,ItemVectorView connected_items)
2284 child_families_has_extra_parent[connected_item] =
true;
2295 ARCANE_ASSERT((m_mesh->itemFamilyNetwork()->getParentDependencies(
this).empty()),(
"Only cells are detached, no parent dependencies are to be found."))
2298 for (auto removed_item_lid : local_ids) {
2299 for (
auto child_relation : m_mesh->itemFamilyNetwork()->getChildRelations(
this)) {
2300 ConnectivityItemVector connectivity_accessor(child_relation);
2301 ENUMERATE_ITEM(connected_item, connectivity_accessor.connectedItems(ItemLocalId(removed_item_lid))) {
2302 child_relation->removeConnectedItem(ItemLocalId(removed_item_lid),ItemLocalId(connected_item));
2307 ItemScalarProperty<bool> is_detached_item;
2308 is_detached_item.resize(
this,
false);
2309 for (
auto detached_item_lid : local_ids) {
2310 is_detached_item[*(this->
itemsInternal()[detached_item_lid])] =
true;
2312 for (
auto parent_relation : m_mesh->itemFamilyNetwork()->getParentRelations(
this)) {
2313 for(auto source_item : parent_relation->sourceFamily()->itemsInternal()) {
2314 if (source_item->isSuppressed()) continue;
2315 ConnectivityItemVector connectivity_accessor(parent_relation);
2316 ENUMERATE_ITEM(connected_item, connectivity_accessor.connectedItems(ItemLocalId(source_item))) {
2317 if (is_detached_item[connected_item]) {
2318 parent_relation->removeConnectedItem(ItemLocalId(source_item),connected_item);
2324 for (
auto detached_item_lid : local_ids) {
2325 m_infos->detachOne(m_infos->itemInternal(detached_item_lid));
2335 ItemInternalMap& item_map = itemsMap();
2336 if (item_map.
count()==0)
2339 if (!m_mesh->itemFamilyNetwork())
2340 ARCANE_FATAL(
"Family name='{0}': IMesh::itemFamilyNetwork() is null",
name());
2341 if (!IItemFamilyNetwork::plug_serializer)
2342 ARCANE_FATAL(
"family name='{0}': removeNeedMarkedItems() cannot be called if ItemFamilyNetwork is unplugged.",
name());
2346 items_to_remove.
reserve(1000);
2347 items_to_remove_lids.
reserve(1000);
2349 item_map.
eachItem([&](impl::ItemBase item) {
2354 items_to_remove.
add(item._itemInternal());
2358 info() <<
"Number of " <<
itemKind() <<
" of family "<<
name()<<
" to remove: " << items_to_remove.
size();
2359 if (items_to_remove.
size() == 0)
2365 is_removed_item.resize(
this,
false);
2366 for (
auto removed_item: items_to_remove) {
2367 is_removed_item[*removed_item] =
true;
2370 for (
auto parent_connectivity : m_mesh->itemFamilyNetwork()->getParentRelations(
this)) {
2371 for(
auto source_item : parent_connectivity->sourceFamily()->itemsInternal()) {
2372 if (source_item->isSuppressed())
continue;
2375 if (is_removed_item[connected_item]) {
2376 parent_connectivity->removeConnectedItem(
ItemLocalId(source_item),connected_item);
2382 m_infos->removeMany(items_to_remove_lids);
2409_defaultItemSortFunction()
2420 if (m_policy_mng==policy_mng)
2424 m_policy_mng = policy_mng;
2431addSourceConnectivity(IItemConnectivity* connectivity)
2433 m_source_item_connectivities.insert(connectivity);
2440addTargetConnectivity(IItemConnectivity* connectivity)
2449removeSourceConnectivity(IItemConnectivity* connectivity)
2451 m_source_item_connectivities.erase(m_source_item_connectivities.find(connectivity));
2458removeTargetConnectivity(IItemConnectivity* connectivity)
2467setConnectivityMng(IItemConnectivityMng* connectivity_mng)
2470 (
"Connectivity Manager must be unique") )
2480 return m_infos->itemListChangedEvent();
2491 if (old_uid==unique_id)
2494 iitem->setUniqueId(unique_id);
2496 if (m_infos->hasUniqueIdMap()){
2497 ItemInternalMap& item_map = itemsMap();
2498 item_map.
remove(old_uid);
2499 item_map.
add(unique_id,iitem);
2525_checkValidConnectivity()
2540 Item i2 = m_common_item_shared_info->m_items_internal[item.localId()];
2542 ARCANE_FATAL(
"family={0}: incoherent item internal lid={1} i1={2} i2={3}",
2543 fullName(),item.localId(),ItemPrinter(i1),ItemPrinter(i2));
2546 constexpr Int32 MAX_KIND = ItemInternalConnectivityList::MAX_ITEM_KIND;
2547 std::array<Int32,MAX_KIND> computed_max;
2548 computed_max.fill(0);
2550 for(
Integer i=0; i<MAX_KIND; ++i ){
2554 const Int32 con_nb_item_size = con_view.nbSourceItem();
2556 info(4) <<
"Family name=" <<
fullName() <<
" I=" << i <<
" nb_item_size=" << con_nb_item_size;
2559 if (con_nb_item_size!=0){
2564 Int32 x = con_view.nbItem(i);
2568 if (stored_max_nb<max_nb)
2569 ARCANE_FATAL(
"Bad value for max connected item family={0} kind={1} stored={2} computed={3}",
2570 name(),i,stored_max_nb,max_nb);
2571 computed_max[i] = max_nb;
2577 std::array<Int32,MAX_KIND> stored_max;
2579 auto* ci = m_local_connectivity_info;
2580 stored_max[ItemInternalConnectivityList::NODE_IDX] = ci->maxNodePerItem();
2581 stored_max[ItemInternalConnectivityList::EDGE_IDX] = ci->maxEdgePerItem();
2582 stored_max[ItemInternalConnectivityList::FACE_IDX] = ci->maxFacePerItem();
2583 stored_max[ItemInternalConnectivityList::CELL_IDX] = ci->maxCellPerItem();
2586 stored_max[ItemInternalConnectivityList::HPARENT_IDX] = computed_max[ItemInternalConnectivityList::HPARENT_IDX];
2587 stored_max[ItemInternalConnectivityList::HCHILD_IDX] = computed_max[ItemInternalConnectivityList::HCHILD_IDX];
2588 for(
Integer i=0; i<MAX_KIND; ++i )
2589 if (stored_max[i]<computed_max[i])
2590 ARCANE_FATAL(
"Bad value for local_connectivity_info family={0} kind={1} stored={2} computed={3}",
2591 name(),i,stored_max[i],computed_max[i]);
2593 for(
auto ics : m_connectivity_selector_list )
2594 ics->checkValidConnectivityList();
2601_addConnectivitySelector(ItemConnectivitySelector* selector)
2603 m_connectivity_selector_list.add(selector);
2610_buildConnectivitySelectors()
2612 m_connectivity_selector_list_by_item_kind.clear();
2613 m_connectivity_selector_list_by_item_kind.resize(ItemInternalConnectivityList::MAX_ITEM_KIND);
2614 m_connectivity_selector_list_by_item_kind.fill(
nullptr);
2616 for( ItemConnectivitySelector* ics : m_connectivity_selector_list ){
2618 Int32 i = ics->itemConnectivityIndex();
2620 if (m_connectivity_selector_list_by_item_kind[i])
2621 ARCANE_FATAL(
"Can not have two connectivity selector for same item kind");
2622 m_connectivity_selector_list_by_item_kind[i] = ics;
2631_setTopologyModifier(IItemFamilyTopologyModifier* tm)
2633 delete m_topology_modifier;
2634 m_topology_modifier = tm;
2656 for(
Integer i=0; i<nb_rank; ++i ){
2658 for(
auto id : shared_ids )
2670 info(5) <<
"COMPUTE CONNECTIVITY INFO family=" <<
name() <<
" v=" << ici
2679_handleOldCheckpoint()
2683 _offsetArrayByOne(m_items_unique_id);
2684 _offsetArrayByOne(m_items_flags);
2685 _offsetArrayByOne(m_items_owner);
2686 (*m_items_unique_id)[0] = NULL_ITEM_UNIQUE_ID;
2687 (*m_items_flags)[0] = 0;
2688 (*m_items_owner)[0] = A_NULL_RANK;
2698template<
typename DataType>
2699ArrayView<DataType> _getView(Array<DataType>* v)
2701 Int32 n = v->size();
2702 return v->subView(1,n-1);
2710 m_common_item_shared_info->m_unique_ids = _getView(m_items_unique_id);
2711 m_common_item_shared_info->m_flags = _getView(m_items_flags);
2712 m_common_item_shared_info->m_type_ids = _getView(m_items_type_id);
2713 m_common_item_shared_info->m_owners = _getView(m_items_owner);
2714 m_common_item_shared_info->m_parent_item_ids = m_items_nb_parent->view();
2716 m_items_unique_id_view = _getView(m_items_unique_id);
2723_addOnSizeChangedObservable(VariableRef& var_ref)
2725 m_observers.addObserver(
this,&ItemFamily::_updateItemViews,
2726 var_ref.variable()->onSizeChangedObservable());
2735 return m_internal_api;
#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.
bool checkResizeArray(Array< DataType > &array, Int64 new_size, bool force_resize)
Redimensionne un tableau qui est indexé par des 'ItemLocalId'.
Integer size() const
Nombre d'éléments du vecteur.
Exception lorsqu'un argument est invalide.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
void copy(Span< const T > rhs)
Copie les valeurs de rhs dans l'instance.
ArrayView< T > view() const
Vue mutable sur ce tableau.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
T & back()
Dernier élément du tableau.
Gère la récupération des informations de connectivité.
ItemVectorView connectedItems(ItemLocalId item)
Retourne les entités connectées à item.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
constexpr bool empty() const noexcept
true si le tableau est vide (size()==0)
static std::optional< Int32 > tryParseFromEnvironment(StringView s, bool throw_if_invalid)
Classe 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.
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.
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 IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
virtual IMeshUtilities * utilities()=0
Interface des fonctions utilitaires associée.
virtual ItemTypeMng * itemTypeMng() const =0
Gestionnaire de types d'entités associé
virtual 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 void build()=0
Construit l'instance.
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.
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.
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.
@ PTemporary
Indique que la variable est temporaire.
@ PExecutionDepend
Indique que la valeur de la variable est dépendante de l'exécution.
@ PPrivate
Indique que la variable est privée.
@ PNoRestore
Indique que la variable ne doit pas être restaurée.
@ PNoDump
Indique que la variable ne doit pas être sauvegardée.
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 void copyItemsValues(Int32ConstArrayView source, Int32ConstArrayView destination)=0
Copie les valeurs des entités numéros source dans les entités numéro destination.
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.
@ II_NeedRemove
L'entité doit être supprimé
@ II_Shared
L'entité est partagée par un autre sous-domaine.
@ II_Suppressed
L'entité vient d'être supprimée.
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.
ItemGroupImpl * internal() const
Retourne l'implémentation du groupe.
IVariableSynchronizer * synchronizer() const
Synchronizer du groupe.
const String & name() const
Nom du groupe.
bool isLocalToSubDomain() const
Vrai si le groupe est local au sous-domaine.
void invalidate(bool force_recompute=false)
Invalide le groupe.
ItemVectorView view() const
Vue sur les entités du groupe.
Integer size() const
Nombre d'éléments du groupe.
IItemFamily * itemFamily() const
Famille d'entité à laquelle appartient ce groupe (0 pour le group nul)
void setItems(Int32ConstArrayView items_local_id)
Positionne les entités du groupe.
eItemKind itemKind() const
Genre du groupe. Il s'agit du genre de ses éléments.
bool hasSynchronizer() const
Indique si le groupe possède un synchroniser actif.
bool isAllItems() const
Indique si le groupe est celui de toutes les entités.
void checkValid()
Vérification interne de la validité du groupe.
bool null() const
true is le groupe est le groupe nul
void setOwn(bool v)
Positionne la propriété de groupe local ou non.
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.
Implémentation d'un tableau de listes d'entités.
Tableau de listes d'entités.
Structure interne partagée d'une entité de maillage.
Type d'une entité (Item).
Gestionnaire des types d'entités de maillage.
ItemTypeInfo * typeFromId(Integer id) const
Type correspondant au numéro id.
Identifiant unique d'une entité.
Vue sur un vecteur d'entités.
Classe de base d'un élément de maillage.
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Implémentation d'une collection d'éléments sous forme de vecteur.
ListEnumeratorT< ItemGroup > Enumerator
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.
Opérations parallèle sur les entités fantômes.
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.
T * get() const
Retourne l'objet référé par l'instance.
Encapsulation d'un pointeur qui se détruit automatiquement.
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.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
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.
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é
Sélection entre les connectivités historiques et à la demande.
void resizeVariables(bool force_resize) override
Redimensionne les variables de cette famille.
void removeVariable(IVariable *var) override
Supprime une variable à cette famille.
void notifyEndUpdateFromMesh() override
Indique une fin de modification par le maillage.
ItemInternalConnectivityList * unstructuredItemInternalConnectivityList() override
Informations sur les connectivités non structurés.
void addVariable(IVariable *var) override
Ajoute une variable à cette famille.
void endAllocate() override
Indique une fin d'allocation.
ItemSharedInfo * commonItemSharedInfo() override
Instance de ItemSharedInfo pour les entités de la famille.
IItemFamilyTopologyModifier * topologyModifier() override
Interface du modificateur de topologie.
VariableArrayInt64 m_items_unique_id
Contient les uniqueIds() des entités de cette famille.
VariableArrayInteger m_items_shared_data_index
Indice dans le tableau des ItemSharedInfo pour chaque entité.
VariableArrayInt32 m_items_flags
Contient les flags() des entités de cette famille.
VariableArrayInt16 m_items_type_id
Contient les typeId() des entités de cette famille.
VariableArrayInt32 m_items_owner
Contient les owner() des entités de cette famille.
VariableItemInt32 m_items_new_owner
Contient le sous-domaine propriétaire de l'entité.
VariableArrayInt32 m_items_nb_parent
Contient le parent() des entités de cette famille.
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)
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.
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.
VariableItemInt32 & itemsNewOwner() override
Variable contenant le numéro du nouveau sous-domaine propriétaire de l'entité.
ItemInternalConnectivityList * itemInternalConnectivityList()
Accesseur pour les connectivités via Item et ItemInternal.
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 experimentalChangeUniqueId(ItemLocalId local_id, ItemUniqueId unique_id) override
Change le numéro unique de l'entité.
void internalRemoveItems(Int32ConstArrayView local_ids, bool keep_ghost=false) override
Supprime les entités donnés par local_ids.
void addGhostItems(Int64ConstArrayView unique_ids, Int32ArrayView items, Int32ConstArrayView owners) override
Alloue des entités fantômes.
IItemFamilyInternal * _internalApi() override
API interne à Arcane.
void getCommunicatingSubDomains(Int32Array &sub_domains) const override
Liste des sous-domaines communiquants pour les entités.
void reduceFromGhostItems(IVariable *v, IDataOperation *operation) override
Applique une opération de réduction depuis les entités fantômes.
ItemConnectivitySet m_target_item_connectivities
connectivite ou ItemFamily == SourceFamily
IItemFamily * parentFamily() const override
IItemFamily parent.
void setHasUniqueIdMap(bool v) override
Indique si la famille possède une table de conversion uniqueId vers localId.
ItemInfoListView itemInfoListView() override
Vue sur la liste d'informations sur les entités.
void setParentFamily(IItemFamily *parent) override
Positionne l'IItemFamily parent.
void compactItems(bool do_sort) override
Compacte les entités.
Integer nbItem() const override
Nombre d'entités.
void notifyItemsUniqueIdChanged() override
Notifie que les numéros uniques des entités ont été modifiées.
ItemVectorView view() override
Vue sur toutes les entités de la famille.
void synchronize(VariableCollection variables) override
Synchronise les variables variables.
ItemPairGroup findAdjacencyItems(const ItemGroup &group, const ItemGroup &sub_group, eItemKind link_kind, Integer layer) override
Cherche une liste d'adjacence.
ItemInternalList itemsInternal() override
Tableau interne des entités.
void computeSynchronizeInfos() override
Construit les structures nécessaires à la synchronisation.
void checkValidConnectivity() override
Vérification de la validité des structures internes concernant la connectivité.
void _updateItemsSharedFlag()
Positionne les infos Item::isShared() pour les entités de la famille.
IVariable * findVariable(const String &name, bool throw_exception) override
Recherche la variable de nom name associée à cette famille.
void _readGroups()
Relit les groupes depuis une protection et les recréer si besoin.
Int32 maxLocalId() const override
void setItemSortFunction(IItemInternalSortFunction *sort_function) override
Positionne la fonction de tri des entités.
IItemInternalSortFunction * itemSortFunction() const override
Fonction de tri des entités.
ISubDomain * subDomain() const override
Sous-domaine associé
virtual void _notifyEndUpdateFromMesh()
IVariableSynchronizer * allItemsSynchronizer() override
Synchroniseur sur toutes les entités de la famille.
void notifyItemsOwnerChanged() override
Notifie que les entités propres au sous-domaine de la famille ont été modifiées.
Integer parentFamilyDepth() const override
Donne la profondeur d'imbrication du maillage courant.
ItemGroupCollection groups() const override
Liste des groupes de cette famille.
IItemConnectivityMng * m_connectivity_mng
connectivite ou ItemFamily == TargetFamily
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.
Properties * properties() override
Propriétés associées à cette famille.
void removeNeedRemoveMarkedItems() override
Supprime des entités et met a jour les connectivites.
IItemConnectivityInfo * globalConnectivityInfos() const override
Informations sur la connectivité globales à tous les sous-domaines.
void checkUniqueIds(Int64ConstArrayView unique_ids) override
Vérifie que les identifiants unique_ids sont bien uniques pour tous les sous-domaines.
ItemGroup findGroup(const String &name) const override
Recherche un groupe.
void readFromDump() override
Relit les données à partir d'une protection.
String name() const override
Nom de la famille.
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.
Int32 toInt32(Int64 v)
Converti un Int64 en un Int32.
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.
ArrayView< Int64 > Int64ArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
bool arcaneIsCheck()
Vrai si on est en mode vérification.
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
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.
List< ItemGroup > ItemGroupList
Tableau de groupes d'éléments du maillage.
ArrayView< Integer > IntegerArrayView
Equivalent C d'un tableau à une dimension d'entiers.
ConstArrayView< ItemInternal * > ItemInternalList
Type de la liste interne des entités.
Collection< IItemFamily * > IItemFamilyCollection
Collection de familles d'entités.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
eItemKind
Genre d'entité de maillage.
Array< Int32 > Int32Array
Tableau dynamique à une dimension d'entiers 32 bits.
std::int32_t Int32
Type entier signé sur 32 bits.