16#include "arcane/mesh/PolyhedralMesh.h"
18#include "ItemFamilyNetwork.h"
19#include "ItemFamilyPolicyMng.h"
20#include "arcane/mesh/MeshExchangeMng.h"
21#include "arcane/core/ISubDomain.h"
22#include "arcane/core/ItemSharedInfo.h"
23#include "arcane/core/ItemTypeInfo.h"
24#include "arcane/core/ItemTypeMng.h"
25#include "arcane/core/VariableBuildInfo.h"
26#include "arcane/core/MeshBuildInfo.h"
28#include "arcane/core/AbstractService.h"
29#include "arcane/core/CommonVariables.h"
30#include "arcane/core/IMeshFactory.h"
31#include "arcane/core/ItemInternal.h"
32#include "arcane/core/IDoFFamily.h"
33#include "arcane/core/IMeshCompactMng.h"
34#include "arcane/core/IMeshCompacter.h"
35#include "arcane/core/IMeshExchanger.h"
36#include "arcane/core/IGhostLayerMng.h"
37#include "arcane/core/MeshVisitor.h"
38#include "arcane/core/internal/IItemFamilyInternal.h"
39#include "arcane/core/internal/IItemFamilySerializerMngInternal.h"
40#include "arcane/core/internal/IVariableMngInternal.h"
41#include "arcane/core/internal/IPolyhedralMeshModifier.h"
42#include "arcane/core/internal/IMeshModifierInternal.h"
43#include "arcane/core/Connectivity.h"
45#include "arcane/mesh/ItemFamily.h"
46#include "arcane/mesh/DynamicMeshKindInfos.h"
47#include "arcane/mesh/UnstructuredMeshUtilities.h"
48#include "arcane/mesh/GhostLayerMng.h"
49#include "arcane/utils/ITraceMng.h"
50#include "arcane/utils/FatalErrorException.h"
51#include "arccore/base/StringBuilder.h"
53#ifdef ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
55#include "arcane/core/IMeshMng.h"
56#include "arcane/core/MeshHandle.h"
57#include "arcane/core/IItemFamily.h"
58#include "arcane/core/internal/IMeshInternal.h"
59#include "arcane/core/IVariableSynchronizer.h"
60#include "arcane/mesh/ItemFamilyPolicyMng.h"
61#include "arcane/mesh/ItemFamilySerializer.h"
62#include "arcane/utils/Collection.h"
63#include "arcane/utils/List.h"
64#include "arcane/utils/PlatformUtils.h"
68#include "ItemConnectivityMng.h"
70#include "arcane/core/ItemPrinter.h"
75#define ARCANE_DEBUG_LOAD_BALANCING
77#ifdef ARCANE_DEBUG_LOAD_BALANCING
78static bool arcane_debug_load_balancing =
true;
80static bool arcane_debug_load_balancing =
false;
86void Arcane::mesh::PolyhedralMesh::
87_errorEmptyMesh()
const
89 ARCANE_FATAL(
"Cannot use PolyhedralMesh if Arcane is not linked with lib Neo");
95#ifdef ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
100namespace Arcane::mesh
102namespace PolyhedralTools
106 Neo::FutureItemRange m_future_items;
107 std::shared_ptr<Neo::EndOfMeshUpdate> m_mesh_state =
nullptr;
111 void fillArrayView(Int32ArrayView local_ids, Neo::EndOfMeshUpdate mesh_state)
113 auto lids = m_future_items.get(mesh_state);
114 if (local_ids.size() != lids.size())
115 ARCANE_FATAL(
"Cannot fill local_ids view, its size {0} != {1} (added item size)", local_ids.size(), m_future_items.size());
116 std::copy(lids.begin(), lids.end(), local_ids.begin());
119 void fillArrayView(Int32ArrayView local_ids)
121 ARCANE_CHECK_POINTER2(m_mesh_state.get(),
"PolyhedralTools::ItemLocalIds must have a valid end of mesh state");
122 fillArrayView(local_ids, *m_mesh_state);
125 Integer size() const noexcept {
return m_future_items.size(); }
126 bool isFilled() const noexcept {
return m_mesh_state.get() !=
nullptr; };
127 void checkIsFilled(String error_message)
const noexcept
130 ARCANE_FATAL(
"Item local ids are not filled." + error_message);
132 friend class mesh::PolyhedralMeshImpl;
133 friend class mesh::PolyhedralMesh;
140class PolyhedralFamilySerializer;
141class PolyhedralFamilySerializerMng :
public IItemFamilySerializerMngInternal
143 PolyhedralMesh* m_mesh =
nullptr;
145 UniqueArray<PolyhedralFamilySerializer*> m_serializers;
149 explicit PolyhedralFamilySerializerMng(PolyhedralMesh* mesh)
155 void addSerializer(PolyhedralFamilySerializer* serializer)
157 m_serializers.push_back(serializer);
161 void finalizeItemAllocation()
override;
167class PolyhedralFamilySerializer :
public IItemFamilySerializer
171 PolyhedralMesh* m_mesh =
nullptr;
172 IItemFamily* m_family =
nullptr;
173 PolyhedralFamilySerializerMng* m_mng =
nullptr;
174 ItemData m_item_data;
175 UniqueArray<Int32Array*> m_deserialized_lids_array;
176 UniqueArray<std::shared_ptr<PolyhedralTools::ItemLocalIds>> m_future_item_lids_array;
177 ItemAllocationInfo::FamilyInfo m_family_info;
181 explicit PolyhedralFamilySerializer(PolyhedralMesh* mesh, IItemFamily* family, PolyhedralFamilySerializerMng* mng)
187 PolyhedralFamilySerializer(
const PolyhedralFamilySerializer&) =
delete;
188 PolyhedralFamilySerializer& operator=(
const PolyhedralFamilySerializer&) =
delete;
190 ArrayView<std::shared_ptr<PolyhedralTools::ItemLocalIds>> itemLidsArray() {
return m_future_item_lids_array.view(); }
194 void serializeItems(ISerializer* buf, Int32ConstArrayView items_local_ids)
override;
195 void deserializeItems(ISerializer* buf, Int32Array* items_local_ids)
override;
200 m_deserialized_lids_array.clear();
201 m_future_item_lids_array.clear();
202 m_family_info.clear();
205 void fillDeserializedLocalIds()
208 for (
auto item_lids_array : m_deserialized_lids_array) {
209 auto& future_item_lids = m_future_item_lids_array[index];
210 future_item_lids->checkIsFilled(
"Cannot fill deserialized local ids, future item local ids are not filled.");
211 item_lids_array->resize(future_item_lids->size());
212 future_item_lids->fillArrayView(item_lids_array->view());
218 IItemFamilySerializerMngInternal* mng()
224 void serializeItemRelations(ISerializer*, Int32ConstArrayView)
override {}
225 void deserializeItemRelations(ISerializer*, Int32Array*)
override {}
229 void _fillItemData(Int32ConstArrayView items_local_ids);
230 void _fillItemFamilyInfo(
const ItemData& item_data,
231 StringConstArrayView connected_family_names,
232 StringConstArrayView connectivity_names)
235 m_family_info.clear();
237 if (m_family != item_data.itemFamily())
238 ARCANE_FATAL(
"PolyhedralFamilySerializer: Family mismatch. Synchronized family is {0} and serialized family is {1}",
239 m_family->name(), item_data.itemFamily()->name());
240 m_family_info.name = item_data.itemFamily()->name();
241 m_family_info.item_kind = item_data.itemFamily()->itemKind();
242 auto& connected_family_infos = m_family_info.connected_family_infos;
243 auto nb_connected_family = item_data.itemInfos()[0];
244 connected_family_infos.resize(nb_connected_family);
245 auto& item_uids = m_family_info._item_uids_data;
246 item_uids.reserve(item_data.nbItems());
247 auto item_infos = item_data.itemInfos();
248 for (
auto connected_family_info : connected_family_infos) {
249 connected_family_info._connected_items_uids_data.reserve(4 * item_uids.size());
250 connected_family_info._nb_connected_items_per_item_data.reserve(item_uids.size());
252 for (
auto index = 1; index < item_infos.size();) {
253 item_uids.push_back(item_infos[index + 1]);
255 for (
auto connected_family_index = 0; connected_family_index < nb_connected_family; ++connected_family_index) {
257 auto* connected_family = m_mesh->findItemFamily(family_kind, connected_family_names[connected_family_index],
false,
false);
259 auto& current_connected_family_infos = connected_family_infos[connected_family_index];
260 current_connected_family_infos.item_kind = family_kind;
261 current_connected_family_infos.name = connected_family->name();
262 current_connected_family_infos.connectivity_name = connectivity_names[connected_family_index];
264 auto nb_connected_items =
static_cast<Int32
>(item_infos[index]);
266 current_connected_family_infos._nb_connected_items_per_item_data.push_back(nb_connected_items);
267 auto real_nb_connected_items = nb_connected_items;
268 if (m_family->itemKind() == IK_Face && connected_family->itemKind() == IK_Cell)
269 real_nb_connected_items = 2;
270 current_connected_family_infos._connected_items_uids_data.addRange(item_infos.subView(index, real_nb_connected_items));
271 index += real_nb_connected_items;
275 m_family_info.updateViewsFromInternalData();
277 m_family_info.item_owners = item_data.itemOwners();
280 IItemFamily* family()
const override
289void PolyhedralFamilySerializerMng::
290finalizeItemAllocation()
292 UniqueArray<std::shared_ptr<PolyhedralTools::ItemLocalIds>> future_item_lids;
293 for (
auto family_serializer : m_serializers) {
294 for (
auto& item_lids : family_serializer->itemLidsArray()) {
295 future_item_lids.push_back(item_lids);
298 m_mesh->applyScheduledAllocateItems(future_item_lids);
299 for (
auto family_serializer : m_serializers) {
300 family_serializer->fillDeserializedLocalIds();
302 m_serializers.clear();
308class PolyhedralFamilyPolicyMng
313 PolyhedralFamilyPolicyMng(PolyhedralMesh* mesh, ItemFamily* family)
314 : ItemFamilyPolicyMng(family)
323 return new PolyhedralFamilySerializer(m_mesh, m_family, m_mesh->polyhedralFamilySerializerMng());
328 PolyhedralMesh* m_mesh =
nullptr;
329 ItemFamily* m_family =
nullptr;
335class PolyhedralFamily
339 ItemSharedInfoWithType* m_shared_info =
nullptr;
343 PolyhedralMesh* m_mesh =
nullptr;
347 inline static const String m_arcane_item_lids_property_name{
"Arcane_Item_Lids" };
348 inline static const String m_arcane_remove_item_property_name{
"Arcane_Remove_Items" };
352 PolyhedralFamily(PolyhedralMesh* mesh, eItemKind ik, String name)
353 : ItemFamily(mesh, ik, name)
359 void preAllocate(Integer nb_item)
361 Integer nb_hash = itemsMap().nbBucket();
362 Integer wanted_size = 2 * (nb_item + nbItem());
363 if (nb_hash < wanted_size)
364 itemsMap().resize(wanted_size,
true);
365 m_empty_connectivity_indexes.resize(nb_item + nbItem(), 0);
366 m_empty_connectivity_nb_item.resize(nb_item + nbItem(), 0);
367 _updateEmptyConnectivity();
370 ItemInternal* _allocItem(
const Int64 uid,
const Int32 owner)
373 ItemInternal* item_internal = ItemFamily::_findOrAllocOne(uid, need_alloc);
375 item_internal->setUniqueId(uid);
377 _allocateInfos(item_internal, uid, m_shared_info);
379 item_internal->setOwner(owner, m_sub_domain_id);
380 return item_internal;
383 void addItems(Int64ConstSmallSpan uids, Int32ArrayView items)
386 addItems(uids, items, owners);
389 void addItems(Int64ConstSmallSpan uids, Int32ArrayView items, Int32ConstArrayView owners)
393 ARCANE_ASSERT((uids.size() == items.size()), (
"one must have items.size==uids.size()"));
394 preAllocate(uids.size());
396 for (
auto uid : uids) {
397 ItemInternal* ii = _allocItem(uid, owners[index]);
398 items[index] = ii->localId();
401 m_need_prepare_dump =
true;
402 _updateItemInternalList();
405 void removeItems(Int32ConstArrayView local_ids)
407 _removeMany(local_ids);
410 void _updateItemInternalList()
412 switch (itemKind()) {
414 m_item_internal_list->cells = _itemsInternal();
417 m_item_internal_list->faces = _itemsInternal();
420 m_item_internal_list->edges = _itemsInternal();
423 m_item_internal_list->nodes = _itemsInternal();
432 void _updateEmptyConnectivity()
434 auto item_internal_connectivity_list = itemInternalConnectivityList();
435 for (
auto item_kind = 0; item_kind < ItemInternalConnectivityList::MAX_ITEM_KIND; ++item_kind) {
436 item_internal_connectivity_list->_setConnectivityList(item_kind, m_empty_connectivity);
437 item_internal_connectivity_list->_setConnectivityIndex(item_kind, m_empty_connectivity_indexes);
438 item_internal_connectivity_list->_setConnectivityNbItem(item_kind, m_empty_connectivity_nb_item);
443 IDoFFamily* toDoFFamily()
override
449 void build()
override
452 m_sub_domain_id = subDomain()->subDomainId();
453 ItemTypeMng* itm = m_mesh->itemTypeMng();
454 ItemTypeInfo* dof_type_info = itm->typeFromId(IT_NullType);
455 m_shared_info = _findSharedInfo(dof_type_info);
456 _updateEmptyConnectivity();
457 ItemFamily::setPolicyMng(
new PolyhedralFamilyPolicyMng{ m_mesh,
this });
460 void addGhostItems(Int64ConstArrayView unique_ids, Int32ArrayView items, Int32ConstArrayView owners)
override
462 auto* polyhedral_mesh_modifier = m_mesh->_internalApi()->polyhedralMeshModifier();
464 polyhedral_mesh_modifier->addItems(unique_ids, items, owners, ItemFamily::itemKind(), name());
468 String name()
const override {
return ItemFamily::name(); }
469 String fullName()
const override {
return ItemFamily::fullName(); }
470 Integer nbItem()
const override {
return ItemFamily::nbItem(); }
471 ItemGroup allItems()
const override {
return ItemFamily::allItems(); }
472 void endUpdate()
override
474 return ItemFamily::endUpdate();
476 IItemFamily* itemFamily()
override {
return this; }
478 DoFVectorView addDoFs(Int64ConstArrayView dof_uids, Int32ArrayView dof_lids)
override
480 auto* polyhedral_mesh_modifier = m_mesh->_internalApi()->polyhedralMeshModifier();
482 polyhedral_mesh_modifier->addItems(dof_uids, dof_lids, ItemFamily::itemKind(), name());
483 return ItemFamily::view(dof_lids);
486 DoFVectorView addGhostDoFs(Int64ConstArrayView dof_uids, Int32ArrayView dof_lids,
487 Int32ConstArrayView owners)
override
489 addGhostItems(dof_uids, dof_lids, owners);
490 return ItemFamily::view(dof_lids);
493 void removeDoFs(Int32ConstArrayView items_local_id)
override
495 auto* mesh_modifier = m_mesh->_internalApi()->polyhedralMeshModifier();
496 mesh_modifier->removeItems(items_local_id, ItemFamily::itemKind(), m_name);
521 ISubDomain* m_subdomain;
522 Neo::Mesh m_mesh{
"Test" };
524 template <eItemKind IK>
527 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_None;
532 static Neo::ItemKind itemKindArcaneToNeo(
eItemKind ik)
536 return Neo::ItemKind::IK_Cell;
538 return Neo::ItemKind::IK_Face;
540 return Neo::ItemKind::IK_Edge;
542 return Neo::ItemKind::IK_Node;
544 return Neo::ItemKind::IK_Dof;
547 return Neo::ItemKind::IK_None;
549 return Neo::ItemKind::IK_Node;
552 static eItemKind itemKindNeoToArcane(Neo::ItemKind ik)
555 case Neo::ItemKind::IK_Cell:
557 case Neo::ItemKind::IK_Face:
559 case Neo::ItemKind::IK_Edge:
561 case Neo::ItemKind::IK_Node:
563 case Neo::ItemKind::IK_Dof:
565 case Neo::ItemKind::IK_None:
573 explicit PolyhedralMeshImpl(ISubDomain* subDomain)
574 : m_subdomain(subDomain)
575 , m_mesh(String::format(subDomain->defaultMeshHandle().meshName(),
"Polyhedral").localstr(), subDomain->parallelMng()->commRank())
580 String name()
const {
return m_mesh.name(); }
582 Integer dimension()
const {
return m_mesh.dimension(); }
584 Integer nbNode()
const {
return m_mesh.nbNodes(); }
585 Integer nbEdge()
const {
return m_mesh.nbEdges(); }
586 Integer nbFace()
const {
return m_mesh.nbFaces(); }
587 Integer nbCell()
const {
return m_mesh.nbCells(); }
588 Integer nbItem(
eItemKind ik)
const {
return m_mesh.nbItems(itemKindArcaneToNeo(ik)); }
590 SmallSpan<const Neo::Mesh::Connectivity> connectivities(IItemFamily* source_family)
592 auto& neo_source_family = m_mesh.findFamily(itemKindArcaneToNeo(source_family->itemKind()), source_family->name().localstr());
593 auto connectivities = m_mesh.getConnectivities(neo_source_family);
594 return { connectivities.begin(), connectivities.size() };
597 static void _setFaceInfos(
Int32 mod_flags, Face& face)
599 Int32 face_flags = face.itemBase().flags();
600 face_flags &= ~ItemFlags::II_InterfaceFlags;
601 face_flags |= mod_flags;
602 face.mutableItemBase().setFlags(face_flags);
607 void addFamily(
eItemKind ik,
const String& name)
609 m_mesh.addFamily(itemKindArcaneToNeo(ik), name.localstr());
614 void scheduleAddItems(PolyhedralFamily* arcane_item_family,
616 PolyhedralTools::ItemLocalIds& item_local_ids)
623 void scheduleAddItems(PolyhedralFamily* arcane_item_family,
626 PolyhedralTools::ItemLocalIds& item_local_ids)
628 auto& added_items = item_local_ids.m_future_items;
629 auto& item_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_item_family->itemKind()),
630 arcane_item_family->name().localstr());
631 m_mesh.scheduleAddItems(item_family, std::vector<Int64>{ uids.begin(), uids.end() }, added_items);
633 auto& mesh_graph = m_mesh.internalMeshGraph();
634 item_family.addMeshScalarProperty<Neo::utils::Int32>(PolyhedralFamily::m_arcane_item_lids_property_name.localstr());
636 UniqueArray<Int64> uids_copy(uids);
637 UniqueArray<Int32> owners_copy(owners);
638 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ item_family, item_family.lidPropName() },
639 Neo::MeshKernel::OutProperty{ item_family, PolyhedralFamily::m_arcane_item_lids_property_name.localstr() },
640 "AddArcaneItems"+std::string{arcane_item_family->name().localstr()},
641 [arcane_item_family, uids_local=std::move(uids_copy), &added_items, owners_local=std::move(owners_copy)]
642 ([[maybe_unused]] Neo::ItemLidsProperty
const& lids_property,
643 Neo::MeshScalarPropertyT<Neo::utils::Int32>&) {
644 auto new_items_lids{added_items.new_items.localIds()};
645 Int32ConstSpan neo_items{ new_items_lids.data(),
static_cast<Int32>(new_items_lids.size()) };
646 UniqueArray<Int32> arcane_items(added_items.new_items.size());
647 if (owners_local.empty())
648 arcane_item_family->addItems(uids_local, arcane_items);
650 arcane_item_family->addItems(uids_local, arcane_items,
Int32ConstArrayView{ owners_local.size(), owners_local.data() });
652 if (!arcane_items.size() == added_items.new_items.size())
653 arcane_item_family->traceMng()->fatal() <<
"Inconsistent item lids generation between Arcane and Neo, nb items Neo "
654 << added_items.new_items.size() <<
" nb items Arcane " << arcane_items.size();
655 if (!std::equal(added_items.new_items.begin(), added_items.new_items.end(), arcane_items.begin())) {
656 arcane_item_family->traceMng()->info() <<
"Arcane Items " << arcane_items;
657 std::cout <<
"Neo Items ";
658 std::ranges::copy(neo_items,std::ostream_iterator<int>(std::cout,
" "));
660 arcane_item_family->traceMng()->fatal() <<
"Inconsistent item lids generation between Arcane and Neo in ItemFamily " << arcane_item_family->name();
667 void scheduleRemoveItems(PolyhedralFamily* arcane_item_family,
670 auto& item_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_item_family->itemKind()),
671 arcane_item_family->name().localstr());
672 Neo::ItemRange removed_items{ Neo::ItemLocalIds{ { local_ids.begin(), local_ids.end() }, 0, 0 } };
673 m_mesh.scheduleRemoveItems(item_family, removed_items);
675 auto& mesh_graph = m_mesh.internalMeshGraph();
676 item_family.addMeshScalarProperty<Neo::utils::Int32>(PolyhedralFamily::m_arcane_remove_item_property_name.localstr());
677 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ item_family, m_mesh._removeItemPropertyName(item_family) },
678 Neo::MeshKernel::OutProperty{ item_family, PolyhedralFamily::m_arcane_remove_item_property_name.localstr() },
679 "RemoveArcaneFamily"+std::string{arcane_item_family->name().localstr()},
680 [arcane_item_family, local_ids](Neo::MeshScalarPropertyT<Neo::utils::Int32>
const&,
681 Neo::MeshScalarPropertyT<Neo::utils::Int32>&) {
682 arcane_item_family->removeItems(local_ids);
688 void scheduleAddConnectivity(PolyhedralFamily* arcane_source_item_family,
689 PolyhedralTools::ItemLocalIds& source_items,
690 Integer nb_connected_items_per_item,
691 PolyhedralFamily* arcane_target_item_family,
696 _scheduleAddConnectivity(arcane_source_item_family,
698 nb_connected_items_per_item,
699 arcane_target_item_family,
706 void scheduleAddConnectivity(PolyhedralFamily* arcane_source_item_family,
707 PolyhedralTools::ItemLocalIds& source_items,
709 PolyhedralFamily* arcane_target_item_family,
711 String
const& connectivity_name)
713 _scheduleAddConnectivity(arcane_source_item_family,
715 std::vector<Int32>{ nb_connected_items_per_item.begin(), nb_connected_items_per_item.end() },
716 arcane_target_item_family,
724 void scheduleUpdateConnectivity(PolyhedralFamily* arcane_source_item_family,
725 PolyhedralTools::ItemLocalIds& source_items,
726 Integer nb_connected_items_per_item,
727 PolyhedralFamily* arcane_target_item_family,
732 _scheduleAddConnectivity(arcane_source_item_family,
734 nb_connected_items_per_item,
735 arcane_target_item_family,
738 Neo::Mesh::ConnectivityOperation::Modify);
743 void scheduleUpdateConnectivity(PolyhedralFamily* arcane_source_item_family,
744 PolyhedralTools::ItemLocalIds& source_items,
746 PolyhedralFamily* arcane_target_item_family,
748 String
const& connectivity_name)
750 _scheduleAddConnectivity(arcane_source_item_family,
752 std::vector<Int32>{ nb_connected_items_per_item.begin(), nb_connected_items_per_item.end() },
753 arcane_target_item_family,
756 Neo::Mesh::ConnectivityOperation::Modify);
762 template <
typename ConnectivitySizeType>
763 void _scheduleAddConnectivity(PolyhedralFamily* arcane_source_item_family,
764 PolyhedralTools::ItemLocalIds& source_items,
765 ConnectivitySizeType&& nb_connected_items_per_item,
766 PolyhedralFamily* arcane_target_item_family,
768 String
const& connectivity_name,
769 Neo::Mesh::ConnectivityOperation operation = Neo::Mesh::ConnectivityOperation::Add)
772 auto& source_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_source_item_family->itemKind()),
773 arcane_source_item_family->name().localstr());
774 auto& target_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_target_item_family->itemKind()),
775 arcane_target_item_family->name().localstr());
777 UniqueArray<Int64> target_item_uids_copy(target_item_uids);
779 std::vector<Int64> target_item_uids_filtered;
780 target_item_uids_filtered.reserve(target_item_uids.size());
781 std::copy_if(target_item_uids.begin(),
782 target_item_uids.end(),
783 std::back_inserter(target_item_uids_filtered),
784 [](
auto uid) { return uid != NULL_ITEM_UNIQUE_ID; });
786 m_mesh.scheduleAddConnectivity(source_family, source_items.m_future_items, target_family,
787 std::forward<ConnectivitySizeType>(nb_connected_items_per_item),
788 std::move(target_item_uids_filtered),
789 connectivity_name.localstr(),
792 auto& mesh_graph = m_mesh.internalMeshGraph();
793 std::string connectivity_add_output_property_name = std::string{
"EndOf" } + connectivity_name.localstr() +
"Add";
794 source_family.addScalarProperty<Neo::utils::Int32>(connectivity_add_output_property_name);
796 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, connectivity_name.localstr() },
797 Neo::MeshKernel::OutProperty{ source_family, connectivity_add_output_property_name },
798 "UpdateArcaneConnectivity"+std::string{connectivity_name.localstr()},
799 [arcane_source_item_family, arcane_target_item_family, &source_family, &target_family,
this]
800 (Neo::Mesh::ConnectivityPropertyType
const& neo_connectivity,
801 Neo::ScalarPropertyT<Neo::utils::Int32>&) {
802 auto rank = arcane_source_item_family->mesh()->parallelMng()->commRank();
803 Neo::printer(rank) <<
"==Algorithm update Arcane connectivity: "<< neo_connectivity.name() << Neo::endline;
804 auto item_internal_connectivity_list = arcane_source_item_family->itemInternalConnectivityList();
806 auto connectivity = m_mesh.getConnectivity(source_family, target_family, neo_connectivity.name());
808 auto& connectivity_values = source_family.getConcreteProperty<Neo::Mesh::ConnectivityPropertyType>(neo_connectivity.name());
809 Neo::MeshArrayPropertyProxyT<Neo::Mesh::ConnectivityPropertyType::PropertyDataType> connectivity_proxy{ connectivity_values };
810 auto nb_item_data = connectivity_proxy.arrayPropertySizes();
811 auto nb_item_size = connectivity_proxy.arrayPropertySizesSize();
812 item_internal_connectivity_list->_setConnectivityNbItem(arcane_target_item_family->itemKind(),
814 auto max_nb_connected_items = connectivity.maxNbConnectedItems();
815 item_internal_connectivity_list->_setMaxNbConnectedItem(arcane_target_item_family->itemKind(), max_nb_connected_items);
816 auto connectivity_values_data = connectivity_proxy.arrayPropertyData();
817 auto connectivity_values_size = connectivity_proxy.arrayPropertyDataSize();
818 item_internal_connectivity_list->_setConnectivityList(arcane_target_item_family->itemKind(),
819 Int32ArrayView{ Integer(connectivity_values_size), connectivity_values_data });
820 auto connectivity_index_data = connectivity_proxy.arrayPropertyIndex();
821 auto connectivity_index_size = connectivity_proxy.arrayPropertyIndexSize();
822 item_internal_connectivity_list->_setConnectivityIndex(arcane_target_item_family->itemKind(),
823 Int32ArrayView{ Integer(connectivity_index_size), connectivity_index_data }); }, Neo::MeshKernel::AlgorithmPropertyGraph::AlgorithmPersistence::KeepAfterExecution);
825 if (arcane_source_item_family->itemKind() ==
IK_Face && arcane_target_item_family->itemKind() ==
IK_Cell) {
826 std::string flag_definition_output_property_name{
"EndOfFlagDefinition" };
827 source_family.addScalarProperty<Neo::utils::Int32>(flag_definition_output_property_name);
829 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, connectivity_add_output_property_name }, Neo::MeshKernel::OutProperty{ source_family, flag_definition_output_property_name },
830 "UpdateFaceFlagsAfterConnectivityDefinition",
831 [arcane_source_item_family, arcane_target_item_family, target_item_uids_local = std::move(target_item_uids_copy), &source_items](Neo::ScalarPropertyT<Neo::utils::Int32>
const&, Neo::ScalarPropertyT<Neo::utils::Int32>
const&) {
832 auto current_face_index = 0;
833 auto arcane_faces = arcane_source_item_family->itemInfoListView();
835 arcane_target_item_family->itemsUniqueIdToLocalId(target_item_lids, target_item_uids_local,
false);
836 for (
auto face_lid : source_items.m_future_items.new_items) {
837 Face current_face = arcane_faces[face_lid].toFace();
838 if (target_item_lids[2 * current_face_index + 1] == NULL_ITEM_LOCAL_ID) {
841 _setFaceInfos(mod_flags, current_face);
843 else if (target_item_lids[2 * current_face_index] == NULL_ITEM_LOCAL_ID) {
851 ++current_face_index;
856 if (operation == Neo::Mesh::ConnectivityOperation::Modify)
858 auto isolated_item_property_name = m_mesh._isolatedItemLidsPropertyName(source_family, target_family);
859 auto end_of_isolated_removal_property_name = std::string{
"EndOf" } + isolated_item_property_name;
860 source_family.addScalarProperty<Neo::utils::Int32>(end_of_isolated_removal_property_name);
861 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, isolated_item_property_name },
862 Neo::MeshKernel::OutProperty{ source_family, end_of_isolated_removal_property_name },
863 "RemoveIsolatedArcaneItemsIn"+std::string{ arcane_source_item_family->name().localstr() },
864 [arcane_source_item_family](Neo::MeshScalarPropertyT<Neo::utils::Int32>
const& isolated_items_lids_property,
865 Neo::ScalarPropertyT<Neo::utils::Int32>& end_of_isolated_removal_property) {
866 end_of_isolated_removal_property.set(1);
869 isolated_item_lids.
reserve(isolated_items_lids_property.size());
870 ENUMERATE_(Item,iitem,arcane_source_item_family->allItems()) {
871 if (isolated_items_lids_property[iitem->localId()] == 1) {
872 isolated_item_lids.push_back(iitem->localId());
875 std::sort(isolated_item_lids.begin(), isolated_item_lids.end());
876 arcane_source_item_family->traceMng()->info() <<
"Remove isolated in Arcane for family "
877 <<
" lids : " << isolated_item_lids;
878 isolated_items_lids_property.debugPrint();
879 arcane_source_item_family->removeItems(isolated_item_lids);
880 }, Neo::MeshKernel::AlgorithmPropertyGraph::AlgorithmPersistence::KeepAfterExecution);
887 auto& _item_family = m_mesh.findFamily(itemKindArcaneToNeo(item_family->itemKind()), item_family->name().localstr());
888 std::vector<Neo::utils::Real3> _node_coords(item_coords.size());
890 for (
auto&& node_coord : item_coords) {
891 _node_coords[node_index++] = Neo::utils::Real3{ node_coord.x, node_coord.y, node_coord.z };
893 m_mesh.scheduleSetItemCoords(_item_family, local_ids.m_future_items, _node_coords);
895 auto& mesh_graph = m_mesh.internalMeshGraph();
896 _item_family.addScalarProperty<
Int32>(
"NoOutProperty42");
897 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ _item_family, m_mesh._itemCoordPropertyName(_item_family) },
898 Neo::MeshKernel::OutProperty{ _item_family,
"NoOutProperty42" },
899 "UpdateArcaneCoordsIn"+std::string{item_family->name().localstr()},
900 [
this, item_family, &_item_family, &arcane_coords](Neo::Mesh::CoordPropertyType
const& item_coords_property,
901 Neo::ScalarPropertyT<Neo::utils::Int32>&) {
903 auto& all_items = _item_family.all();
904 VariableNodeReal3 node_coords{ VariableBuildInfo{ item_family->mesh(),
"NodeCoord" } };
905 for (
auto item : all_items) {
906 arcane_coords[ItemLocalId{ item }] = { item_coords_property[item].x,
907 item_coords_property[item].y,
908 item_coords_property[item].z };
915 Neo::EndOfMeshUpdate applyScheduledOperations() noexcept
917 return m_mesh.applyScheduledOperations();
921 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Cell>
923 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Cell;
925 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Face>
927 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Face;
929 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Edge>
931 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Edge;
933 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Node>
935 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Node;
937 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_DoF>
939 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Dof;
944 void PolyhedralFamilySerializer::serializeItems(ISerializer* buf,
Int32ConstArrayView items_local_ids)
949 switch (buf->mode()) {
950 case ISerializer::ModeReserve: {
951 _fillItemData(items_local_ids);
952 m_item_data.serialize(buf);
953 auto connectivities = m_mesh->_impl()->connectivities(m_family);
954 for (
auto out_connectivity : connectivities) {
955 buf->reserve(out_connectivity.target_family.name());
956 buf->reserve(out_connectivity.name);
961 m_item_data.serialize(buf);
962 auto connectivities = m_mesh->_impl()->connectivities(m_family);
963 for (
auto out_connectivity : connectivities) {
964 buf->put(out_connectivity.target_family.name());
965 buf->put(out_connectivity.name);
971 deserializeItems(buf,
nullptr);
979 void PolyhedralFamilySerializer::deserializeItems(ISerializer* buf,
Int32Array* items_local_ids)
982 (
"Impossible to deserialize a buffer not in ModeGet. In ItemData::deserialize.Exiting"))
988 item_data.deserialize(buf, m_mesh, *items_local_ids);
990 item_data.deserialize(buf, m_mesh);
991 auto connectivities = m_mesh->_impl()->connectivities(m_family);
992 auto nb_connectivities = connectivities.size();
996 for (auto out_connectivity : connectivities) {
997 buf->get(connected_family_names[index]);
998 buf->get(connectivity_names[index]);
1001 _fillItemFamilyInfo(item_data, connected_family_names, connectivity_names);
1003 if (items_local_ids) {
1004 m_deserialized_lids_array.push_back(items_local_ids);
1007 m_future_item_lids_array.push_back(std::make_shared<PolyhedralTools::ItemLocalIds>());
1008 m_mesh->scheduleAllocateItems(m_family_info, *m_future_item_lids_array.back().get());
1011 m_mng->addSerializer(
this);
1017 m_item_data =
ItemData{ items_local_ids.size(), 0, m_family,
nullptr, m_family->parallelMng()->commRank() };
1018 Int64Array& item_infos = m_item_data.itemInfos();
1022 item_infos.reserve(1 + nb_item * 32);
1025 auto connectivities = mesh_impl->connectivities(m_family);
1026 item_infos.add(connectivities.size());
1027 bool is_face_family = m_family->itemKind() ==
IK_Face;
1030 item_infos.add(item->uniqueId().asInt64());
1031 item_owners[item.index()] = item->owner();
1032 for (
auto out_connectivity : connectivities) {
1033 auto target_family = m_mesh->findItemFamily(PolyhedralMeshImpl::itemKindNeoToArcane(out_connectivity.target_family.itemKind()),
1034 out_connectivity.target_family.name(),
false,
false);
1036 auto arcane_connected_items = target_family->itemInfoListView();
1037 bool is_face_cell_connection = is_face_family && target_family->itemKind() ==
IK_Cell;
1038 item_infos.add(PolyhedralMeshImpl::itemKindNeoToArcane(out_connectivity.target_family.itemKind()));
1039 auto connected_items = out_connectivity[item.localId()];
1040 auto nb_connected_items = connected_items.size();
1041 item_infos.add(nb_connected_items);
1042 if (is_face_cell_connection && item->itemBase().isBoundary() && item->itemBase().backCell().isNull()) {
1043 item_infos.add(NULL_ITEM_UNIQUE_ID);
1045 for (
auto connected_item_lid : connected_items) {
1046 item_infos.add(arcane_connected_items[connected_item_lid].uniqueId().asInt64());
1048 if (is_face_cell_connection && item->itemBase().isBoundary() && !item->itemBase().backCell().isNull()) {
1049 item_infos.add(NULL_ITEM_UNIQUE_ID);
1060class mesh::PolyhedralMesh::PolyhedralMeshModifier
1065 explicit PolyhedralMeshModifier(PolyhedralMesh* mesh)
1069 void addItems(Int64ConstArrayView unique_ids, Int32ArrayView local_ids, eItemKind ik,
const String& family_name)
override
1071 m_mesh->addItems(unique_ids, local_ids, ik, family_name);
1074 void addItems(Int64ConstArrayView unique_ids, Int32ArrayView local_ids, Int32ConstArrayView owners, eItemKind ik,
const String& family_name)
override
1076 m_mesh->addItems(unique_ids, local_ids, owners, ik, family_name);
1079 void removeItems(Int32ConstArrayView local_ids, eItemKind ik,
const String& family_name)
override
1081 m_mesh->removeItems(local_ids, ik, family_name);
1086 PolyhedralMesh* m_mesh;
1092class mesh::PolyhedralMesh::InternalApi
1098 explicit InternalApi(PolyhedralMesh* mesh)
1100 , m_connectivity_mng(std::make_unique<ItemConnectivityMng>(mesh->traceMng()))
1101 , m_polyhedral_mesh_modifier(std::make_unique<PolyhedralMeshModifier>(mesh))
1106 void setMeshKind(
const MeshKind& v)
override
1108 if (v.meshStructure() != eMeshStructure::Polyhedral && v.meshAMRKind() != eMeshAMRKind::None) {
1109 ARCANE_FATAL(
"Incompatible mesh structure ({0}) and amr kind ({1}) for Polyhedral mesh {2}. Must be (Polyhedral,None). ",
1110 v.meshStructure(), v.meshAMRKind(), m_mesh->name());
1112 m_mesh->m_mesh_kind = v;
1115 IItemConnectivityMng* dofConnectivityMng() const noexcept
override
1117 return m_connectivity_mng.get();
1120 IPolyhedralMeshModifier* polyhedralMeshModifier() const noexcept
override
1122 return m_polyhedral_mesh_modifier.get();
1125 void removeNeedRemoveMarkedItems()
override
1127 m_mesh->removeNeedRemoveMarkedItems();
1129 NodeLocalId addNode([[maybe_unused]] ItemUniqueId unique_id)
override
1133 FaceLocalId addFace([[maybe_unused]] ItemUniqueId unique_id,
1134 [[maybe_unused]] ItemTypeId type_id,
1135 [[maybe_unused]] ConstArrayView<Int64> nodes_uid)
override
1139 CellLocalId addCell([[maybe_unused]] ItemUniqueId unique_id,
1140 [[maybe_unused]] ItemTypeId type_id,
1141 [[maybe_unused]] ConstArrayView<Int64> nodes_uid)
override
1146 IItemFamilySerializerMngInternal* familySerializerMng() const noexcept
override
1148 return m_mesh->polyhedralFamilySerializerMng();
1153 PolyhedralMesh* m_mesh =
nullptr;
1154 std::unique_ptr<IItemConnectivityMng> m_connectivity_mng =
nullptr;
1155 std::unique_ptr<IPolyhedralMeshModifier> m_polyhedral_mesh_modifier =
nullptr;
1161class mesh::PolyhedralMesh::NoCompactionMeshCompacter
1166 explicit NoCompactionMeshCompacter(PolyhedralMesh* mesh)
1168 , m_trace_mng(mesh->traceMng())
1171 void doAllActions()
override { _info(); };
1173 void beginCompact()
override { _info(); };
1174 void compactVariablesAndGroups()
override { _info(); };
1175 void updateInternalReferences()
override { _info(); };
1176 void endCompact()
override { _info(); };
1177 void finalizeCompact()
override { _info(); };
1179 IMesh* mesh()
const override {
return m_mesh; };
1181 const ItemFamilyCompactInfos* findCompactInfos(IItemFamily*)
const override
1187 ePhase phase()
const override
1190 return ePhase::Ended;
1193 void setSorted(
bool)
override { _info(); };
1195 bool isSorted()
const override
1207 void _setCompactVariablesAndGroups(
bool)
override { _info(); };
1211 PolyhedralMesh* m_mesh =
nullptr;
1212 ITraceMng* m_trace_mng =
nullptr;
1214 void _info()
const { m_trace_mng->info() << A_FUNCINFO <<
"No compacting in PolyhedralMesh"; }
1220class mesh::PolyhedralMesh::NoCompactionMeshCompactMng
1225 explicit NoCompactionMeshCompactMng(PolyhedralMesh* mesh)
1227 , m_trace_mng(mesh->traceMng())
1228 , m_mesh_compacter{ std::make_unique<NoCompactionMeshCompacter>(m_mesh) }
1231 IMesh* mesh()
const override {
return m_mesh; }
1232 IMeshCompacter* beginCompact()
override
1235 return m_mesh_compacter.get();
1238 IMeshCompacter* beginCompact(IItemFamily* family)
override
1240 ARCANE_UNUSED(family);
1242 return m_mesh_compacter.get();
1245 void endCompact()
override { _info(); };
1247 IMeshCompacter* compacter()
override
1250 return m_mesh_compacter.get();
1255 PolyhedralMesh* m_mesh =
nullptr;
1256 ITraceMng* m_trace_mng =
nullptr;
1257 std::unique_ptr<IMeshCompacter> m_mesh_compacter =
nullptr;
1259 void _info()
const { m_trace_mng->info() << A_FUNCINFO <<
"No compacting in PolyhedralMesh"; }
1265mesh::PolyhedralMesh::
1268 m_mesh_handle._setMesh(
nullptr);
1277 return m_subdomain->traceMng();
1286 return m_mesh_handle;
1291mesh::PolyhedralMesh::
1292PolyhedralMesh(ISubDomain* subdomain,
const MeshBuildInfo& mbi)
1294, m_name{ mbi.name() }
1295, m_subdomain{ subdomain }
1296, m_mesh_handle{ m_subdomain->defaultMeshHandle() }
1297, m_properties(std::make_unique<Properties>(subdomain->propertyMng(), String(
"ArcaneMeshProperties_") + m_name))
1299, m_parallel_mng{ mbi.parallelMngRef().get() }
1300, m_mesh_part_info{ makeMeshPartInfoFromParallelMng(m_parallel_mng) }
1301, m_item_type_mng(ItemTypeMng::_singleton())
1302, m_mesh_kind(mbi.meshKind())
1303, m_polyhedral_family_serializer_mng{ std::make_unique<PolyhedralFamilySerializerMng>(this) }
1304, m_initial_allocator(*this)
1305, m_variable_mng{ subdomain->variableMng() }
1306, m_mesh_checker{ this }
1307, m_internal_api{ std::make_unique<InternalApi>(this) }
1308, m_compact_mng{ std::make_unique<NoCompactionMeshCompactMng>(this) }
1309, m_mesh_utilities{ std::make_unique<UnstructuredMeshUtilities>(this) }
1312, m_ghost_layer_mng{ std::make_unique<
GhostLayerMng>(m_trace_mng) }
1313, m_connectivity(VariableBuildInfo{ subdomain, mbi.name() +
"MeshConnectivity" })
1315 m_mesh_handle._setMesh(
this);
1316 m_mesh_item_internal_list.mesh =
this;
1317 m_default_arcane_families.fill(
nullptr);
1323void Arcane::mesh::PolyhedralMesh::
1326 _allocateItems(item_allocation_info, ArrayView<Int32UniqueArray>{});
1331void Arcane::mesh::PolyhedralMesh::
1332allocateItems(
const Arcane::ItemAllocationInfo& item_allocation_info, ArrayView<Int32UniqueArray> family_lids)
1334 _allocateItems(item_allocation_info, family_lids);
1339void Arcane::mesh::PolyhedralMesh::
1340_allocateItems(
const Arcane::ItemAllocationInfo& item_allocation_info, ArrayView<Int32UniqueArray> family_lids)
1343 m_subdomain->traceMng()->info() <<
"--PolyhedralMesh: allocate items --";
1344 UniqueArray<PolyhedralTools::ItemLocalIds> item_local_ids(item_allocation_info.family_infos.size());
1345 auto family_index = 0;
1347 for (
auto& family_info : item_allocation_info.family_infos) {
1348 bool create_if_needed =
true;
1349 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name, create_if_needed);
1350 m_trace_mng->debug(
Trace::High) <<
"- Create items " << family_info.name;
1351 m_mesh->scheduleAddItems(item_family, family_info.item_uids, family_info.item_owners.constSmallSpan(), item_local_ids[family_index++]);
1355 for (
auto& family_info : item_allocation_info.family_infos) {
1356 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
1357 m_trace_mng->debug(
Trace::High) <<
"- Current family " << family_info.name;
1358 for (
auto& current_connected_family_info : family_info.connected_family_infos) {
1359 auto connected_family = _findItemFamily(current_connected_family_info.item_kind, current_connected_family_info.name);
1360 m_trace_mng->debug(
Trace::High) <<
"- Create connectivity " << current_connected_family_info.connectivity_name;
1362 if (!connected_family) {
1363 ARCANE_WARNING((String::format(
"Cannot find family {0} with kind {1} "
1364 "The connectivity between {1} and this family is skipped",
1365 current_connected_family_info.name,
1366 current_connected_family_info.item_kind,
1367 item_family->name())
1371 m_mesh->scheduleAddConnectivity(item_family,
1372 item_local_ids[family_index],
1373 current_connected_family_info.nb_connected_items_per_item,
1375 current_connected_family_info.connected_items_uids,
1376 current_connected_family_info.connectivity_name);
1377 Connectivity connectivity{ m_connectivity };
1383 m_mesh->applyScheduledOperations();
1385 for (
auto& family_info : item_allocation_info.family_infos) {
1386 if (family_info.item_kind !=
IK_Node && family_info.item_coordinates.empty()) {
1389 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
1390 if (item_family == itemFamily(
IK_Node)) {
1391 if (!m_arcane_node_coords.get()) {
1392 m_arcane_node_coords = std::make_unique<VariableNodeReal3>(VariableBuildInfo(
this, family_info.item_coordinates_variable_name));
1393 m_arcane_node_coords->setUsed(
true);
1397 auto arcane_item_coords_var_ptr = std::make_unique<VariableItemReal3>(VariableBuildInfo(
this, family_info.item_coordinates_variable_name),
1398 item_family->itemKind());
1399 arcane_item_coords_var_ptr->setUsed(
true);
1400 m_arcane_item_coords.push_back(std::move(arcane_item_coords_var_ptr));
1404 for (
auto& family : m_arcane_families) {
1405 family->endUpdate();
1411 for (
auto& family_info : item_allocation_info.family_infos) {
1412 if (family_info.item_coordinates.empty()) {
1416 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
1417 if (item_family == itemFamily(
IK_Node)) {
1418 m_mesh->scheduleSetItemCoordinates(item_family, item_local_ids[family_index], family_info.item_coordinates, *m_arcane_node_coords);
1421 m_mesh->scheduleSetItemCoordinates(item_family, item_local_ids[family_index], family_info.item_coordinates, *m_arcane_item_coords[index++].get());
1423 auto mesh_state = m_mesh->applyScheduledOperations();
1424 m_is_allocated =
true;
1426 itemTypeMng()->setMeshWithGeneralCells(
this);
1428 if (!family_lids.empty()) {
1430 ARCANE_ASSERT((family_lids.size() == item_local_ids.size()), (
"Incoherence in item number"));
1431 for (
auto& lid_array : item_local_ids) {
1432 family_lids[index].resize(lid_array.size());
1433 lid_array.fillArrayView(family_lids[index].view(), mesh_state);
1441void Arcane::mesh::PolyhedralMesh::
1442scheduleAllocateItems(
const Arcane::ItemAllocationInfo::FamilyInfo& family_info, mesh::PolyhedralTools::ItemLocalIds& item_local_ids)
1445 m_subdomain->traceMng()->info() <<
"--PolyhedralMesh: schedule allocate items --";
1447 bool create_if_needed =
true;
1448 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name, create_if_needed);
1449 m_trace_mng->debug(
Trace::High) <<
"- Current family " << family_info.name;
1450 m_trace_mng->debug(
Trace::High) <<
"- Create items ";
1451 m_mesh->scheduleAddItems(item_family, family_info.item_uids, family_info.item_owners.
constSmallSpan(), item_local_ids);
1453 for (
auto& current_connected_family_info : family_info.connected_family_infos) {
1454 auto connected_family = _findItemFamily(current_connected_family_info.item_kind, current_connected_family_info.name);
1455 m_trace_mng->debug(
Trace::High) <<
"- Create connectivity " << current_connected_family_info.connectivity_name;
1457 if (!connected_family) {
1458 ARCANE_WARNING((String::format(
"Cannot find family {0} with kind {1} "
1459 "The connectivity between {1} and this family is skipped",
1460 current_connected_family_info.name,
1461 current_connected_family_info.item_kind,
1462 item_family->name())
1466 m_mesh->scheduleUpdateConnectivity(item_family,
1468 current_connected_family_info.nb_connected_items_per_item,
1470 current_connected_family_info.connected_items_uids,
1471 current_connected_family_info.connectivity_name);
1477void Arcane::mesh::PolyhedralMesh::
1478applyScheduledAllocateItems(UniqueArray<std::shared_ptr<PolyhedralTools::ItemLocalIds>> item_lids)
1481 auto mesh_state = m_mesh->applyScheduledOperations();
1483 for (
auto item_local_ids : item_lids) {
1484 item_local_ids->m_mesh_state = std::make_shared<Neo::EndOfMeshUpdate>(mesh_state);
1488 for (
auto& family : m_arcane_families) {
1489 family->endUpdate();
1492 m_is_allocated =
true;
1494 itemTypeMng()->setMeshWithGeneralCells(
this);
1499void mesh::PolyhedralMesh::removeNeedRemoveMarkedItems()
1502 for (
auto family_index = 0; family_index < m_arcane_families.size(); ++family_index) {
1504 auto* family = m_arcane_families[family_index].get();
1506 items_to_remove.
reserve(family->nbItem());
1507 auto& items_map = family->itemsMap();
1508 if (items_map.count() == 0)
1510 items_map.eachItem([&](ItemBase item) {
1512 auto f = item.flags();
1515 item.toMutable().setFlags(f);
1516 items_to_remove.add(item.localId());
1519 if (!items_to_remove.empty()) {
1520 removeItems(items_to_remove, family);
1527Arcane::mesh::PolyhedralFamilySerializerMng* mesh::PolyhedralMesh::
1528polyhedralFamilySerializerMng()
1530 return m_polyhedral_family_serializer_mng.get();
1536void Arcane::mesh::PolyhedralMesh::
1539 for (
auto& family : m_arcane_families) {
1540 family->endUpdate();
1547void Arcane::mesh::PolyhedralMesh::
1548_computeFamilySynchronizeInfos()
1550 m_subdomain->traceMng()->info() <<
"Computing family synchronization information for " << name();
1551 for (
auto& family : m_arcane_families) {
1552 family->computeSynchronizeInfos();
1557 auto* var_syncer = cellFamily()->allItemsSynchronizer();
1558 Int32 iteration = m_subdomain->commonVariables().globalIteration();
1559 String file_name = String::format(
"{0}_sync_topology_iter{1}.json", name(), iteration);
1560 mesh_utils::dumpSynchronizerTopologyJSON(var_syncer, file_name);
1567void Arcane::mesh::PolyhedralMesh::
1568_notifyEndUpdateForFamilies()
1570 for (
auto& family : m_arcane_families)
1571 family->_internalApi()->notifyEndUpdateFromMesh();
1577void Arcane::mesh::PolyhedralMesh::
1578_computeGroupSynchronizeInfos()
1580 auto action = [](ItemGroup& group) {
1581 if (group.hasSynchronizer())
1582 group.synchronizer()->compute();
1585 m_trace_mng->info() <<
"Computing group synchronization information for " << name();
1586 meshvisitor::visitGroups(
this, action);
1604 return m_mesh->dimension();
1613 return m_mesh->nbNode();
1622 return m_mesh->nbEdge();
1631 return m_mesh->nbFace();
1640 return m_mesh->nbCell();
1649 return m_mesh->nbItem(ik);
1658 if (m_default_arcane_families[
IK_Node])
1659 return m_default_arcane_families[
IK_Node]->allItems();
1670 if (m_default_arcane_families[
IK_Edge])
1671 return m_default_arcane_families[
IK_Edge]->allItems();
1682 if (m_default_arcane_families[
IK_Face])
1683 return m_default_arcane_families[
IK_Face]->allItems();
1694 if (m_default_arcane_families[
IK_Cell])
1695 return m_default_arcane_families[
IK_Cell]->allItems();
1706 if (m_default_arcane_families[
IK_Node])
1707 return m_default_arcane_families[
IK_Node]->allItems().own();
1718 if (m_default_arcane_families[
IK_Edge])
1719 return m_default_arcane_families[
IK_Edge]->allItems().own();
1730 if (m_default_arcane_families[
IK_Face])
1731 return m_default_arcane_families[
IK_Face]->allItems().own();
1742 if (m_default_arcane_families[
IK_Cell])
1743 return m_default_arcane_families[
IK_Cell]->allItems().own();
1754 if (m_default_arcane_families[
IK_Cell])
1763mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1764_createItemFamily(
eItemKind ik,
const String& name)
1766 m_mesh->addFamily(ik, name);
1767 m_arcane_families.push_back(std::make_unique<PolyhedralFamily>(
this, ik, name));
1768 auto current_family = m_arcane_families.back().get();
1769 if (m_default_arcane_families[ik] ==
nullptr) {
1770 m_default_arcane_families[ik] = current_family;
1771 _updateMeshInternalList(ik);
1773 m_item_family_collection.add(current_family);
1774 current_family->build();
1775 return current_family;
1784 return _createItemFamily(ik, name);
1790void mesh::PolyhedralMesh::
1793 createItemFamily(
IK_Cell,
"CellFamily");
1794 createItemFamily(
IK_Node,
"NodeFamily");
1795 auto cell_family = m_default_arcane_families[
IK_Cell];
1796 auto node_family = m_default_arcane_families[
IK_Node];
1799 PolyhedralTools::ItemLocalIds cell_lids, node_lids;
1800 m_mesh->scheduleAddItems(cell_family, cell_uids.constView(), cell_lids);
1801 m_mesh->scheduleAddItems(node_family, node_uids.constView(), node_lids);
1804 m_mesh->scheduleAddConnectivity(cell_family, cell_lids, nb_node, node_family, node_uids, String{
"CellToNodes" });
1805 m_mesh->scheduleAddConnectivity(node_family, node_lids, 1, cell_family,
1806 node_cells_uids, String{
"NodeToCells" });
1807 m_mesh->applyScheduledOperations();
1808 cell_family->endUpdate();
1809 node_family->endUpdate();
1822 for (
auto ik = 0; ik < NB_ITEM_KIND; ++ik) {
1825 m_empty_arcane_families[ik] = std::make_unique<mesh::PolyhedralFamily>(
this, (
eItemKind)ik, name);
1826 m_default_arcane_families[ik] = m_empty_arcane_families[ik].get();
1837 return m_default_arcane_families[
IK_Node];
1846 return m_default_arcane_families[
IK_Edge];
1855 return m_default_arcane_families[
IK_Face];
1864 return m_default_arcane_families[
IK_Cell];
1867void mesh::PolyhedralMesh::
1872 m_mesh_item_internal_list.cells = m_default_arcane_families[kind]->itemsInternal();
1873 m_mesh_item_internal_list._internalSetCellSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1876 m_mesh_item_internal_list.faces = m_default_arcane_families[kind]->itemsInternal();
1877 m_mesh_item_internal_list._internalSetFaceSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1880 m_mesh_item_internal_list.edges = m_default_arcane_families[kind]->itemsInternal();
1881 m_mesh_item_internal_list._internalSetEdgeSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1884 m_mesh_item_internal_list.nodes = m_default_arcane_families[kind]->itemsInternal();
1885 m_mesh_item_internal_list._internalSetNodeSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1897mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1900 return m_default_arcane_families[ik];
1909 return _itemFamily(ik);
1918 return m_item_type_mng;
1924mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1925_findItemFamily(
eItemKind ik,
const String& name,
bool create_if_needed)
1928 auto found_family = _itemFamily(ik);
1930 if (found_family->name() == name)
1931 return found_family;
1933 for (
auto& family : m_arcane_families) {
1934 if (family->itemKind() == ik && family->name() == name)
1935 return family.get();
1937 if (!create_if_needed)
1939 return _createItemFamily(ik, name);
1948 ARCANE_UNUSED(register_modifier_if_created);
1949 return _findItemFamily(ik, name, create_if_needed);
1955mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1958 return m_default_arcane_families[ik];
1967 ARCANE_ASSERT(m_arcane_node_coords, (
"Node coordinates not yet loaded."));
1968 return *m_arcane_node_coords;
1978 for (
auto& family : m_arcane_families) {
1979 group = family->findGroup(name);
1992 m_all_groups.
clear();
1993 for (
auto& family : m_arcane_families) {
1995 m_all_groups.add(*i_group);
1997 return m_all_groups;
2006 for (
auto& family : m_arcane_families) {
2007 family->destroyGroups();
2017 return m_item_family_collection;
2026 return m_internal_api.get();
2035 return m_compact_mng.get();
2041void mesh::PolyhedralMesh::
2044 ARCANE_ASSERT((unique_ids.size() == local_ids.size()), (
"local and unique ids arrays must have same size"))
2045 auto* item_family = _findItemFamily(ik, family_name, false);
2046 PolyhedralTools::ItemLocalIds item_local_ids;
2047 m_mesh->scheduleAddItems(item_family, unique_ids, item_local_ids);
2048 auto mesh_state = m_mesh->applyScheduledOperations();
2049 item_local_ids.fillArrayView(local_ids, mesh_state);
2058 ARCANE_ASSERT((unique_ids.size() == local_ids.size() && (unique_ids.size() == owners.size())), (
"local/unique ids and owners arrays must have same size"))
2059 auto* item_family = _findItemFamily(ik, family_name, false);
2060 PolyhedralTools::ItemLocalIds item_local_ids;
2061 m_mesh->scheduleAddItems(item_family, unique_ids, owners, item_local_ids);
2062 auto mesh_state = m_mesh->applyScheduledOperations();
2063 item_local_ids.fillArrayView(local_ids, mesh_state);
2072 auto* item_family = _findItemFamily(ik, family_name,
false);
2074 ARCANE_FATAL(
"ItemFamily with name {0} and kind {1} does not exist in the mesh.", family_name, ik);
2076 m_mesh->scheduleRemoveItems(item_family, local_ids);
2077 m_mesh->applyScheduledOperations();
2083void mesh::PolyhedralMesh::
2086 if (local_ids.empty())
2089 ARCANE_FATAL(
"Invalid IItemFamily passed to removeItems.");
2091 removeItems(local_ids, family->itemKind(), family->name());
2100 addItems(nodes_uid, nodes_lid,
IK_Node, nodeFamily()->name());
2109 m_trace_mng->info() <<
"PolyhedralMesh::_exchangeItems() do_compact?=" <<
"false"
2110 <<
" nb_exchange=" << 0 <<
" version=" << 0;
2113 if (!check_exchange.null()) {
2114 m_mesh_checker.checkGhostCells();
2115 m_trace_mng->pwarning() <<
"CHECKING SYNCHRONISATION !";
2116 m_mesh_checker.checkVariablesSynchronization();
2117 m_mesh_checker.checkItemGroupsSynchronization();
2119 if (checkLevel() >= 2)
2120 m_mesh_checker.checkValidMesh();
2121 else if (checkLevel() >= 1)
2122 m_mesh_checker.checkValidConnectivity();
2128void mesh::PolyhedralMesh::
2133 Trace::Setter mci(traceMng(), _className());
2138 if (arcane_debug_load_balancing) {
2139 for (
auto& family : m_arcane_families) {
2140 family->itemsNewOwner().checkIfSync();
2144 IMeshExchanger* iexchanger = m_mesh_exchange_mng->beginExchange();
2147 if (iexchanger->computeExchangeInfos()) {
2148 m_trace_mng->pwarning() <<
"No load balance is performed";
2149 m_mesh_exchange_mng->endExchange();
2154 iexchanger->processExchange();
2157 iexchanger->removeNeededItems();
2162 auto action = [](ItemGroup& group) {
2163 if (group.internal()->hasComputeFunctor() || group.isLocalToSubDomain())
2166 group.internal()->removeSuppressedItems();
2168 meshvisitor::visitGroups(
this, action);
2171 iexchanger->allocateReceivedItems();
2174 _endUpdateFamilies();
2175 _computeFamilySynchronizeInfos();
2178 iexchanger->updateItemGroups();
2180 _computeGroupSynchronizeInfos();
2182 iexchanger->updateVariables();
2186 m_mesh_checker.checkMeshFromReferenceFile();
2187 _notifyEndUpdateForFamilies();
2189 iexchanger->finalizeExchange();
2191 m_mesh_exchange_mng->endExchange();
2207 auto want_dump =
false;
2208 auto need_compact =
false;
2209 m_trace_mng->info(4) <<
"DynamicMesh::prepareForDump() name=" << name()
2210 <<
" need_compact?=" << need_compact
2211 <<
" want_dump?=" << want_dump
2212 <<
" timestamp=" << 0;
2216 m_mesh_events.eventObservable(t).notify(MeshEventArgs(
this, t));
2221 for (
auto& family : m_arcane_families) {
2222 family->prepareForDump();
2228 m_mesh_events.eventObservable(t).notify(MeshEventArgs(
this, t));
2309 return m_mesh_utilities.get();
2318 IItemFamily* item_family = _itemFamily(ik);
2320 return item_family->itemsNewOwner();
2329 return m_mesh_checker.checkLevel();
2338 return m_item_family_network.get();
2347 return m_ghost_layer_mng.get();
2356 return m_internal_api.get();
2362mesh::PolyhedralMeshImpl* mesh::PolyhedralMesh::_impl()
2364 return m_mesh.get();
2380namespace Arcane::mesh
2389Arcane::mesh::PolyhedralMesh::
2390~PolyhedralMesh() =
default;
2395Arcane::mesh::PolyhedralMesh::
2397: EmptyMesh{ subdomain->traceMng() }
2398, m_subdomain{ subdomain }
2400, m_mesh_kind(mbi.meshKind())
2407void Arcane::mesh::PolyhedralMesh::
2408read([[maybe_unused]]
const String& filename)
2416void Arcane::mesh::PolyhedralMesh::
2417allocateItems(
const Arcane::ItemAllocationInfo& item_allocation_info)
2419 ARCANE_UNUSED(item_allocation_info);
2434class ARCANE_MESH_EXPORT PolyhedralMeshFactory
2453 static String name() {
return "ArcanePolyhedralMeshFactory"; }
2463#if ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
2471 return PolyhedralMeshFactory::name();
#define ARCANE_CHECK_POINTER(ptr)
Macro returning the pointer ptr if it is not null or throwing an exception if it is null.
#define ARCANE_CHECK_POINTER2(ptr, text)
Macro returning the pointer ptr if it is not null or throwing an exception if it is null.
#define ARCANE_THROW(exception_class,...)
Macro for throwing an exception with formatting.
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
This file contains the various service factories and macros for registering services.
#define ARCANE_SERVICE_INTERFACE(ainterface)
Macro to declare an interface when registering a service.
AbstractService(const ServiceBuildInfo &)
Constructor from a ServiceBuildInfo.
constexpr Integer size() const noexcept
Returns the size of the array.
SmallSpan< const T > constSmallSpan() const
Immutable view of this array.
void reserve(Int64 new_capacity)
Reserves memory for new_capacity elements.
void clear()
Removes all elements from the collection.
EnumeratorT< ItemGroup > Enumerator
static Integer kindsToConnectivity(eItemKind kindA, eItemKind kindB)
Type to connectivity conversion.
virtual ITraceMng * traceMng()=0
Associated message manager.
virtual NodeGroup ownNodes()=0
Group of all domain-specific nodes.
virtual MeshHandle handle() const =0
Handle on this mesh.
virtual IItemFamily * nodeFamily()=0
Returns the node family.
virtual String name() const =0
Mesh name.
virtual Integer nbCell()=0
Number of mesh cells.
virtual CellGroup ownCells()=0
Group of all domain-specific cells.
virtual FaceGroup ownFaces()=0
Group of all domain-specific faces.
virtual FaceGroup allFaces()=0
Group of all faces.
virtual Integer nbEdge()=0
Number of mesh edges.
virtual IItemFamily * itemFamily(eItemKind ik)=0
Returns the entity family of type ik.
virtual IItemFamily * edgeFamily()=0
Returns the edge family.
virtual Integer nbNode()=0
Number of mesh nodes.
virtual FaceGroup outerFaces()=0
Group of all faces on the boundary.
virtual IItemFamily * findItemFamily(eItemKind ik, const String &name, bool create_if_needed=false, bool register_modifier_if_created=false)=0
Returns the family named name.
virtual Integer nbItem(eItemKind ik)=0
Number of elements of type ik.
virtual Integer dimension()=0
Mesh dimension (1D, 2D, or 3D).
virtual IItemFamily * faceFamily()=0
Returns the face family.
virtual EdgeGroup ownEdges()=0
Group of all domain-specific edges.
virtual NodeGroup allNodes()=0
Group of all nodes.
virtual CellGroup allCells()=0
Group of all cells.
virtual Integer nbFace()=0
Number of mesh faces.
virtual IItemFamily * cellFamily()=0
Returns the cell family.
virtual IItemFamily * createItemFamily(eItemKind ik, const String &name)=0
Create a particle family named name.
virtual EdgeGroup allEdges()=0
Group of all edges.
Interface for managing the compaction of mesh families.
Management of mesh family compaction.
Interface of the service managing mesh reading.
virtual IVariableMng * variableMng() const =0
Variable manager associated with this manager.
Internal part of IMeshModifier.
virtual void addNodes(Int64ConstArrayView nodes_uid, Int32ArrayView nodes_lid=Int32ArrayView())=0
Adds nodes.
virtual IMeshModifierInternal * _modifierInternalApi()=0
Internal API for Arcane.
virtual VariableNodeReal3 & nodesCoordinates()=0
Node coordinates.
virtual FaceGroup outerActiveFaces()=0
Group of all active faces on the boundary.
virtual void destroyGroups()=0
Destroys all groups of all families.
virtual IMeshUtilities * utilities()=0
Associated utility functions interface.
virtual CellGroup allLevelCells(const Integer &level)=0
Group of all cells of level level.
virtual FaceGroup innerActiveFaces()=0
Group of all active faces.
virtual ItemGroupCollection groups()=0
List of groups.
virtual ItemGroup findGroup(const String &name)=0
Returns the group with name name or a null group if none exists.
virtual String factoryName() const =0
Name of the factory used to create the mesh.
virtual IMeshInternal * _internalApi()=0
Internal Arcane API.
virtual CellGroup allActiveCells()=0
virtual FaceGroup allActiveFaces()=0
Group of all active faces.
virtual ItemTypeMng * itemTypeMng() const =0
Associated entity type manager.
virtual void prepareForDump()=0
Prepares the instance for dumping.
virtual CellGroup ownActiveCells()=0
Group of all active cells specific to the domain.
virtual CellGroup ownLevelCells(const Integer &level)=0
Group of all cells specific to the domain of level level.
virtual IGhostLayerMng * ghostLayerMng() const =0
Associated ghost layer manager.
virtual FaceGroup ownActiveFaces()=0
Group of all active faces specific to the domain.
virtual IItemFamilyNetwork * itemFamilyNetwork()=0
Family network interface (connected families).
virtual IMeshCompactMng * _compactMng()=0
virtual Integer checkLevel() const =0
Current check level.
virtual void exchangeItems()=0
Changes the owning subdomains of entities.
virtual VariableItemInt32 & itemsNewOwner(eItemKind kind)=0
Variable containing the identifier of the owning subdomain.
@ ModePut
The serializer expects reserve().
@ ModeGet
The serializer expects get().
Interface of the subdomain manager.
virtual ISubDomain * internalSubDomain() const =0
Temporary internal function to retrieve the subdomain.
virtual IVariableMngInternal * _internalApi()=0
Internal Arcane API.
@ II_FrontCellIsFirst
The first cell of the entity is the front cell.
@ II_NeedRemove
The entity must be removed.
@ II_HasBackCell
The entity has a back cell.
@ II_Suppressed
The entity has just been suppressed.
@ II_Boundary
The entity is on the boundary.
@ II_HasFrontCell
The entity has a front cell.
@ II_BackCellIsFirst
The first cell of the entity is the back cell.
FaceGroup activeFaceGroup() const
Group of active faces.
FaceGroup innerActiveFaceGroup() const
Group of internal faces of the elements of this group.
FaceGroup ownActiveFaceGroup() const
Group of active faces belonging to the domain of the elements of this group.
CellGroup levelCellGroup(const Integer &level) const
Group of level l cells of the elements of this group.
CellGroup ownActiveCellGroup() const
Group of own active cells of the elements of this group.
CellGroup ownLevelCellGroup(const Integer &level) const
Group of own level l cells of the elements of this group.
FaceGroup outerActiveFaceGroup() const
Group of active external faces of the elements of this group.
CellGroup activeCellGroup() const
AMR.
FaceGroup outerFaceGroup() const
Group of external faces of the elements of this group.
Parameters necessary for building a mesh.
void build() override
Build-level construction of the service.
IPrimaryMesh * createMesh(IMeshMng *mm, const MeshBuildInfo &build_info) override
Creates a mesh with the information from build_info.
Structure containing the information to create a service.
Service creation properties.
Unicode character string.
Manager for the policies of a family of entities.
Interface for the mesh exchange manager between subdomains.
void endUpdate()
Notifies the instance that mesh modification is finished.
ItemVectorViewT< DoF > DoFVectorView
View over a vector of degrees of freedom.
ItemGroupT< Cell > CellGroup
Group of cells.
ItemGroupT< Face > FaceGroup
Group of faces.
ItemGroupT< Edge > EdgeGroup
Group of edges.
ItemGroupT< Node > NodeGroup
Group of nodes.
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro for registering a service.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Coordinate type quantity at node.
ItemVariableScalarRefT< Real3 > VariableItemReal3
3D coordinate type quantity
ItemVariableScalarRefT< Int32 > VariableItemInt32
32-bit integer type quantity
Array< Int64 > Int64Array
Dynamic one-dimensional array of 64-bit integers.
UniqueArray< Int64 > Int64UniqueArray
Dynamic 1D array of 64-bit integers.
Collection< ItemGroup > ItemGroupCollection
Collection of mesh item groups.
Int32 Integer
Type representing an integer.
ConstArrayView< Int32 > Int32ConstArrayView
C equivalent of a 1D array of 32-bit integers.
Collection< IItemFamily * > ItemFamilyCollection
Collection of item families.
Collection< IItemFamily * > IItemFamilyCollection
Collection of item families.
@ ST_Application
The service is used at the application level.
ConstArrayView< Int64 > Int64ConstArrayView
C equivalent of a 1D array of 64-bit integers.
SmallSpan< const Real3 > Real3ConstSmallSpan
Read-only view of a 1D array of Real3.
eMeshEventType
Events generated by IMesh.
@ EndPrepareDump
Event sent at the end of prepareForDump().
@ BeginPrepareDump
Event sent at the beginning of prepareForDump().
UniqueArray< Int32 > Int32UniqueArray
Dynamic 1D array of 32-bit integers.
ArrayView< Int32 > Int32ArrayView
C equivalent of a 1D array of 32-bit integers.
eItemKind
Mesh entity type.
@ IK_Particle
Particle mesh entity.
@ IK_Node
Node mesh entity.
@ IK_Cell
Cell mesh entity.
@ IK_Unknown
Unknown or uninitialized mesh entity.
@ IK_Face
Face mesh entity.
@ IK_DoF
Degree of Freedom mesh entity.
@ IK_Edge
Edge mesh entity.
SmallSpan< const Int64 > Int64ConstSmallSpan
Read-only view of a 1D array of 64-bit integers.
ARCCORE_SERIALIZE_EXPORT Ref< ISerializer > createSerializer()
Creates an instance of ISerializer.
const char * itemKindName(eItemKind kind)
Entity kind name.
Array< Int32 > Int32Array
Dynamic one-dimensional array of 32-bit integers.
UniqueArray< String > StringUniqueArray
Dynamic 1D array of strings.
Span< const Int32 > Int32ConstSpan
Read-only view of a 1D array of 32-bit integers.
SmallSpan< const Int32 > Int32ConstSmallSpan
Read-only view of a 1D array of 32-bit integers.
std::int32_t Int32
Signed integer type of 32 bits.