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;
855 auto const isolated_items_property_name = m_mesh._isolatedItemLidsPropertyName(source_family,target_family);
856 std::string
const flag_update_output_property_name{
"EndOfFlagUpdate" };
857 source_family.addScalarProperty<Neo::utils::Int32>(flag_update_output_property_name);
859 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, isolated_items_property_name },
860 Neo::MeshKernel::OutProperty{ source_family, flag_update_output_property_name },
861 "UpdateFaceFlagsAfterCellRemoval",
862 [arcane_source_item_family,&source_family,connectivity_name](Neo::MeshScalarPropertyT<Neo::utils::Int32>
const&, Neo::ScalarPropertyT<Neo::utils::Int32>
const&) {
863 auto const rank = arcane_source_item_family->mesh()->parallelMng()->commRank();
864 Neo::printer(rank) <<
"==Algorithm update Face flags after cell removal" << Neo::endline;
866 auto const removed_target_item_index_prop_name = Neo::Mesh::removedTargetItemIndexfilteredItemPropertyName(connectivity_name.localstr());
867 auto& null_item_connected = source_family.getConcreteProperty<Neo::MeshArrayPropertyT<Neo::utils::Int32>>(removed_target_item_index_prop_name);
868 null_item_connected.debugPrint(rank);
869 ENUMERATE_(Face,iface,arcane_source_item_family->allItems())
871 Face current_face = *iface;
872 auto null_items_connected_to_face = null_item_connected[iface.localId()];
873 if (null_items_connected_to_face.size() > 2)
875 ARCANE_FATAL(
"More than one null item connected to face {0}",iface.localId());
878 if (null_items_connected_to_face.size() == 0)
882 if (null_items_connected_to_face[0] == 0)
887 else if (null_items_connected_to_face[0] == 1)
895 Neo::MeshKernel::AlgorithmPropertyGraph::AlgorithmPersistence::KeepAfterExecution
899 if (operation == Neo::Mesh::ConnectivityOperation::Modify)
901 auto isolated_item_property_name = m_mesh._isolatedItemLidsPropertyName(source_family, target_family);
902 auto end_of_isolated_removal_property_name = std::string{
"EndOf" } + isolated_item_property_name;
903 source_family.addScalarProperty<Neo::utils::Int32>(end_of_isolated_removal_property_name);
904 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, isolated_item_property_name },
905 Neo::MeshKernel::OutProperty{ source_family, end_of_isolated_removal_property_name },
906 "RemoveIsolatedArcaneItemsIn"+std::string{ arcane_source_item_family->name().localstr() },
907 [arcane_source_item_family](Neo::MeshScalarPropertyT<Neo::utils::Int32>
const& isolated_items_lids_property,
908 Neo::ScalarPropertyT<Neo::utils::Int32>& end_of_isolated_removal_property) {
909 end_of_isolated_removal_property.set(1);
912 isolated_item_lids.
reserve(isolated_items_lids_property.size());
913 ENUMERATE_(Item,iitem,arcane_source_item_family->allItems()) {
914 if (isolated_items_lids_property[iitem->localId()] == 1) {
915 isolated_item_lids.push_back(iitem->localId());
918 std::sort(isolated_item_lids.begin(), isolated_item_lids.end());
919 arcane_source_item_family->traceMng()->info() <<
"Remove isolated in Arcane for family "
920 << arcane_source_item_family->name() <<
" lids : " << isolated_item_lids;
921 isolated_items_lids_property.debugPrint();
922 arcane_source_item_family->removeItems(isolated_item_lids);
923 }, Neo::MeshKernel::AlgorithmPropertyGraph::AlgorithmPersistence::KeepAfterExecution);
930 auto& _item_family = m_mesh.findFamily(itemKindArcaneToNeo(item_family->itemKind()), item_family->name().localstr());
931 std::vector<Neo::utils::Real3> _node_coords(item_coords.size());
933 for (
auto&& node_coord : item_coords) {
934 _node_coords[node_index++] = Neo::utils::Real3{ node_coord.x, node_coord.y, node_coord.z };
936 m_mesh.scheduleSetItemCoords(_item_family, local_ids.m_future_items, _node_coords);
938 auto& mesh_graph = m_mesh.internalMeshGraph();
939 _item_family.addScalarProperty<
Int32>(
"NoOutProperty42");
940 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ _item_family, m_mesh._itemCoordPropertyName(_item_family) },
941 Neo::MeshKernel::OutProperty{ _item_family,
"NoOutProperty42" },
942 "UpdateArcaneCoordsIn"+std::string{item_family->name().localstr()},
943 [
this, item_family, &_item_family, &arcane_coords](Neo::Mesh::CoordPropertyType
const& item_coords_property,
944 Neo::ScalarPropertyT<Neo::utils::Int32>&) {
946 auto& all_items = _item_family.all();
947 VariableNodeReal3 node_coords{ VariableBuildInfo{ item_family->mesh(),
"NodeCoord" } };
948 for (
auto item : all_items) {
949 arcane_coords[ItemLocalId{ item }] = { item_coords_property[item].x,
950 item_coords_property[item].y,
951 item_coords_property[item].z };
958 Neo::EndOfMeshUpdate applyScheduledOperations() noexcept
960 return m_mesh.applyScheduledOperations();
964 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Cell>
966 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Cell;
968 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Face>
970 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Face;
972 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Edge>
974 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Edge;
976 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Node>
978 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Node;
980 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_DoF>
982 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Dof;
987 void PolyhedralFamilySerializer::serializeItems(ISerializer* buf,
Int32ConstArrayView items_local_ids)
992 switch (buf->mode()) {
993 case ISerializer::ModeReserve: {
994 _fillItemData(items_local_ids);
995 m_item_data.serialize(buf);
996 auto connectivities = m_mesh->_impl()->connectivities(m_family);
997 for (
auto out_connectivity : connectivities) {
998 buf->reserve(out_connectivity.target_family.name());
999 buf->reserve(out_connectivity.name);
1004 m_item_data.serialize(buf);
1005 auto connectivities = m_mesh->_impl()->connectivities(m_family);
1006 for (
auto out_connectivity : connectivities) {
1007 buf->put(out_connectivity.target_family.name());
1008 buf->put(out_connectivity.name);
1014 deserializeItems(buf,
nullptr);
1022 void PolyhedralFamilySerializer::deserializeItems(ISerializer* buf,
Int32Array* items_local_ids)
1025 (
"Impossible to deserialize a buffer not in ModeGet. In ItemData::deserialize.Exiting"))
1030 if (items_local_ids)
1031 item_data.deserialize(buf, m_mesh, *items_local_ids);
1033 item_data.deserialize(buf, m_mesh);
1034 auto connectivities = m_mesh->_impl()->connectivities(m_family);
1035 auto nb_connectivities = connectivities.size();
1039 for (auto out_connectivity : connectivities) {
1040 buf->get(connected_family_names[index]);
1041 buf->get(connectivity_names[index]);
1044 _fillItemFamilyInfo(item_data, connected_family_names, connectivity_names);
1046 if (items_local_ids) {
1047 m_deserialized_lids_array.push_back(items_local_ids);
1050 m_future_item_lids_array.push_back(std::make_shared<PolyhedralTools::ItemLocalIds>());
1051 m_mesh->scheduleAllocateItems(m_family_info, *m_future_item_lids_array.back().get());
1054 m_mng->addSerializer(
this);
1060 m_item_data =
ItemData{ items_local_ids.size(), 0, m_family,
nullptr, m_family->parallelMng()->commRank() };
1061 Int64Array& item_infos = m_item_data.itemInfos();
1065 item_infos.reserve(1 + nb_item * 32);
1068 auto connectivities = mesh_impl->connectivities(m_family);
1069 item_infos.add(connectivities.size());
1070 bool is_face_family = m_family->itemKind() ==
IK_Face;
1073 item_infos.add(item->uniqueId().asInt64());
1074 item_owners[item.index()] = item->owner();
1075 for (
auto out_connectivity : connectivities) {
1076 auto target_family = m_mesh->findItemFamily(PolyhedralMeshImpl::itemKindNeoToArcane(out_connectivity.target_family.itemKind()),
1077 out_connectivity.target_family.name(),
false,
false);
1079 auto arcane_connected_items = target_family->itemInfoListView();
1080 bool is_face_cell_connection = is_face_family && target_family->itemKind() ==
IK_Cell;
1081 item_infos.add(PolyhedralMeshImpl::itemKindNeoToArcane(out_connectivity.target_family.itemKind()));
1082 auto connected_items = out_connectivity[item.localId()];
1083 auto nb_connected_items = connected_items.size();
1084 item_infos.add(nb_connected_items);
1085 if (is_face_cell_connection && item->itemBase().isBoundary() && item->itemBase().backCell().isNull()) {
1086 item_infos.add(NULL_ITEM_UNIQUE_ID);
1088 for (
auto connected_item_lid : connected_items) {
1089 item_infos.add(arcane_connected_items[connected_item_lid].uniqueId().asInt64());
1091 if (is_face_cell_connection && item->itemBase().isBoundary() && !item->itemBase().backCell().isNull()) {
1092 item_infos.add(NULL_ITEM_UNIQUE_ID);
1103class mesh::PolyhedralMesh::PolyhedralMeshModifier
1108 explicit PolyhedralMeshModifier(PolyhedralMesh* mesh)
1112 void addItems(Int64ConstArrayView unique_ids, Int32ArrayView local_ids, eItemKind ik,
const String& family_name)
override
1114 m_mesh->addItems(unique_ids, local_ids, ik, family_name);
1117 void addItems(Int64ConstArrayView unique_ids, Int32ArrayView local_ids, Int32ConstArrayView owners, eItemKind ik,
const String& family_name)
override
1119 m_mesh->addItems(unique_ids, local_ids, owners, ik, family_name);
1122 void removeItems(Int32ConstArrayView local_ids, eItemKind ik,
const String& family_name)
override
1124 m_mesh->removeItems(local_ids, ik, family_name);
1129 PolyhedralMesh* m_mesh;
1135class mesh::PolyhedralMesh::InternalApi
1141 explicit InternalApi(PolyhedralMesh* mesh)
1143 , m_connectivity_mng(std::make_unique<ItemConnectivityMng>(mesh->traceMng()))
1144 , m_polyhedral_mesh_modifier(std::make_unique<PolyhedralMeshModifier>(mesh))
1149 void setMeshKind(
const MeshKind& v)
override
1151 if (v.meshStructure() != eMeshStructure::Polyhedral && v.meshAMRKind() != eMeshAMRKind::None) {
1152 ARCANE_FATAL(
"Incompatible mesh structure ({0}) and amr kind ({1}) for Polyhedral mesh {2}. Must be (Polyhedral,None). ",
1153 v.meshStructure(), v.meshAMRKind(), m_mesh->name());
1155 m_mesh->m_mesh_kind = v;
1158 IItemConnectivityMng* dofConnectivityMng() const noexcept
override
1160 return m_connectivity_mng.get();
1163 IPolyhedralMeshModifier* polyhedralMeshModifier() const noexcept
override
1165 return m_polyhedral_mesh_modifier.get();
1168 void removeNeedRemoveMarkedItems()
override
1170 m_mesh->removeNeedRemoveMarkedItems();
1172 NodeLocalId addNode([[maybe_unused]] ItemUniqueId unique_id)
override
1176 FaceLocalId addFace([[maybe_unused]] ItemUniqueId unique_id,
1177 [[maybe_unused]] ItemTypeId type_id,
1178 [[maybe_unused]] ConstArrayView<Int64> nodes_uid)
override
1182 CellLocalId addCell([[maybe_unused]] ItemUniqueId unique_id,
1183 [[maybe_unused]] ItemTypeId type_id,
1184 [[maybe_unused]] ConstArrayView<Int64> nodes_uid)
override
1189 IItemFamilySerializerMngInternal* familySerializerMng() const noexcept
override
1191 return m_mesh->polyhedralFamilySerializerMng();
1196 PolyhedralMesh* m_mesh =
nullptr;
1197 std::unique_ptr<IItemConnectivityMng> m_connectivity_mng =
nullptr;
1198 std::unique_ptr<IPolyhedralMeshModifier> m_polyhedral_mesh_modifier =
nullptr;
1204class mesh::PolyhedralMesh::NoCompactionMeshCompacter
1209 explicit NoCompactionMeshCompacter(PolyhedralMesh* mesh)
1211 , m_trace_mng(mesh->traceMng())
1214 void doAllActions()
override { _info(); };
1216 void beginCompact()
override { _info(); };
1217 void compactVariablesAndGroups()
override { _info(); };
1218 void updateInternalReferences()
override { _info(); };
1219 void endCompact()
override { _info(); };
1220 void finalizeCompact()
override { _info(); };
1222 IMesh* mesh()
const override {
return m_mesh; };
1224 const ItemFamilyCompactInfos* findCompactInfos(IItemFamily*)
const override
1230 ePhase phase()
const override
1233 return ePhase::Ended;
1236 void setSorted(
bool)
override { _info(); };
1238 bool isSorted()
const override
1250 void _setCompactVariablesAndGroups(
bool)
override { _info(); };
1254 PolyhedralMesh* m_mesh =
nullptr;
1255 ITraceMng* m_trace_mng =
nullptr;
1257 void _info()
const { m_trace_mng->info() << A_FUNCINFO <<
"No compacting in PolyhedralMesh"; }
1263class mesh::PolyhedralMesh::NoCompactionMeshCompactMng
1268 explicit NoCompactionMeshCompactMng(PolyhedralMesh* mesh)
1270 , m_trace_mng(mesh->traceMng())
1271 , m_mesh_compacter{ std::make_unique<NoCompactionMeshCompacter>(m_mesh) }
1274 IMesh* mesh()
const override {
return m_mesh; }
1275 IMeshCompacter* beginCompact()
override
1278 return m_mesh_compacter.get();
1281 IMeshCompacter* beginCompact(IItemFamily* family)
override
1283 ARCANE_UNUSED(family);
1285 return m_mesh_compacter.get();
1288 void endCompact()
override { _info(); };
1290 IMeshCompacter* compacter()
override
1293 return m_mesh_compacter.get();
1298 PolyhedralMesh* m_mesh =
nullptr;
1299 ITraceMng* m_trace_mng =
nullptr;
1300 std::unique_ptr<IMeshCompacter> m_mesh_compacter =
nullptr;
1302 void _info()
const { m_trace_mng->info() << A_FUNCINFO <<
"No compacting in PolyhedralMesh"; }
1308mesh::PolyhedralMesh::
1311 m_mesh_handle._setMesh(
nullptr);
1320 return m_subdomain->traceMng();
1329 return m_mesh_handle;
1334mesh::PolyhedralMesh::
1335PolyhedralMesh(ISubDomain* subdomain,
const MeshBuildInfo& mbi)
1337, m_name{ mbi.name() }
1338, m_subdomain{ subdomain }
1339, m_mesh_handle{ m_subdomain->defaultMeshHandle() }
1340, m_properties(std::make_unique<Properties>(subdomain->propertyMng(), String(
"ArcaneMeshProperties_") + m_name))
1342, m_parallel_mng{ mbi.parallelMngRef().get() }
1343, m_mesh_part_info{ makeMeshPartInfoFromParallelMng(m_parallel_mng) }
1344, m_item_type_mng(ItemTypeMng::_singleton())
1345, m_mesh_kind(mbi.meshKind())
1346, m_polyhedral_family_serializer_mng{ std::make_unique<PolyhedralFamilySerializerMng>(this) }
1347, m_initial_allocator(*this)
1348, m_variable_mng{ subdomain->variableMng() }
1349, m_mesh_checker{ this }
1350, m_internal_api{ std::make_unique<InternalApi>(this) }
1351, m_compact_mng{ std::make_unique<NoCompactionMeshCompactMng>(this) }
1352, m_mesh_utilities{ std::make_unique<UnstructuredMeshUtilities>(this) }
1355, m_ghost_layer_mng{ std::make_unique<
GhostLayerMng>(m_trace_mng) }
1356, m_connectivity(VariableBuildInfo{ subdomain, mbi.name() +
"MeshConnectivity" })
1358 m_mesh_handle._setMesh(
this);
1359 m_mesh_item_internal_list.mesh =
this;
1360 m_default_arcane_families.fill(
nullptr);
1366void Arcane::mesh::PolyhedralMesh::
1369 _allocateItems(item_allocation_info, ArrayView<Int32UniqueArray>{});
1374void Arcane::mesh::PolyhedralMesh::
1375allocateItems(
const Arcane::ItemAllocationInfo& item_allocation_info, ArrayView<Int32UniqueArray> family_lids)
1377 _allocateItems(item_allocation_info, family_lids);
1382void Arcane::mesh::PolyhedralMesh::
1383_allocateItems(
const Arcane::ItemAllocationInfo& item_allocation_info, ArrayView<Int32UniqueArray> family_lids)
1386 m_subdomain->traceMng()->info() <<
"--PolyhedralMesh: allocate items --";
1387 UniqueArray<PolyhedralTools::ItemLocalIds> item_local_ids(item_allocation_info.family_infos.size());
1388 auto family_index = 0;
1390 for (
auto& family_info : item_allocation_info.family_infos) {
1391 bool create_if_needed =
true;
1392 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name, create_if_needed);
1393 m_trace_mng->debug(
Trace::High) <<
"- Create items " << family_info.name;
1394 m_mesh->scheduleAddItems(item_family, family_info.item_uids, family_info.item_owners.constSmallSpan(), item_local_ids[family_index++]);
1398 for (
auto& family_info : item_allocation_info.family_infos) {
1399 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
1400 m_trace_mng->debug(
Trace::High) <<
"- Current family " << family_info.name;
1401 for (
auto& current_connected_family_info : family_info.connected_family_infos) {
1402 auto connected_family = _findItemFamily(current_connected_family_info.item_kind, current_connected_family_info.name);
1403 m_trace_mng->debug(
Trace::High) <<
"- Create connectivity " << current_connected_family_info.connectivity_name;
1405 if (!connected_family) {
1406 ARCANE_WARNING((String::format(
"Cannot find family {0} with kind {1} "
1407 "The connectivity between {1} and this family is skipped",
1408 current_connected_family_info.name,
1409 current_connected_family_info.item_kind,
1410 item_family->name())
1414 m_mesh->scheduleAddConnectivity(item_family,
1415 item_local_ids[family_index],
1416 current_connected_family_info.nb_connected_items_per_item,
1418 current_connected_family_info.connected_items_uids,
1419 current_connected_family_info.connectivity_name);
1420 Connectivity connectivity{ m_connectivity };
1426 m_mesh->applyScheduledOperations();
1428 for (
auto& family_info : item_allocation_info.family_infos) {
1429 if (family_info.item_kind !=
IK_Node && family_info.item_coordinates.empty()) {
1432 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
1433 if (item_family == itemFamily(
IK_Node)) {
1434 if (!m_arcane_node_coords.get()) {
1435 m_arcane_node_coords = std::make_unique<VariableNodeReal3>(VariableBuildInfo(
this, family_info.item_coordinates_variable_name));
1436 m_arcane_node_coords->setUsed(
true);
1440 auto arcane_item_coords_var_ptr = std::make_unique<VariableItemReal3>(VariableBuildInfo(
this, family_info.item_coordinates_variable_name),
1441 item_family->itemKind());
1442 arcane_item_coords_var_ptr->setUsed(
true);
1443 m_arcane_item_coords.push_back(std::move(arcane_item_coords_var_ptr));
1447 for (
auto& family : m_arcane_families) {
1448 family->endUpdate();
1454 for (
auto& family_info : item_allocation_info.family_infos) {
1455 if (family_info.item_coordinates.empty()) {
1459 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
1460 if (item_family == itemFamily(
IK_Node)) {
1461 m_mesh->scheduleSetItemCoordinates(item_family, item_local_ids[family_index], family_info.item_coordinates, *m_arcane_node_coords);
1464 m_mesh->scheduleSetItemCoordinates(item_family, item_local_ids[family_index], family_info.item_coordinates, *m_arcane_item_coords[index++].get());
1466 auto mesh_state = m_mesh->applyScheduledOperations();
1467 m_is_allocated =
true;
1469 itemTypeMng()->setMeshWithGeneralCells(
this);
1471 if (!family_lids.empty()) {
1473 ARCANE_ASSERT((family_lids.size() == item_local_ids.size()), (
"Incoherence in item number"));
1474 for (
auto& lid_array : item_local_ids) {
1475 family_lids[index].resize(lid_array.size());
1476 lid_array.fillArrayView(family_lids[index].view(), mesh_state);
1484void Arcane::mesh::PolyhedralMesh::
1485scheduleAllocateItems(
const Arcane::ItemAllocationInfo::FamilyInfo& family_info, mesh::PolyhedralTools::ItemLocalIds& item_local_ids)
1488 m_subdomain->traceMng()->info() <<
"--PolyhedralMesh: schedule allocate items --";
1490 bool create_if_needed =
true;
1491 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name, create_if_needed);
1492 m_trace_mng->debug(
Trace::High) <<
"- Current family " << family_info.name;
1493 m_trace_mng->debug(
Trace::High) <<
"- Create items ";
1494 m_mesh->scheduleAddItems(item_family, family_info.item_uids, family_info.item_owners.
constSmallSpan(), item_local_ids);
1496 for (
auto& current_connected_family_info : family_info.connected_family_infos) {
1497 auto connected_family = _findItemFamily(current_connected_family_info.item_kind, current_connected_family_info.name);
1498 m_trace_mng->debug(
Trace::High) <<
"- Create connectivity " << current_connected_family_info.connectivity_name;
1500 if (!connected_family) {
1501 ARCANE_WARNING((String::format(
"Cannot find family {0} with kind {1} "
1502 "The connectivity between {1} and this family is skipped",
1503 current_connected_family_info.name,
1504 current_connected_family_info.item_kind,
1505 item_family->name())
1509 m_mesh->scheduleUpdateConnectivity(item_family,
1511 current_connected_family_info.nb_connected_items_per_item,
1513 current_connected_family_info.connected_items_uids,
1514 current_connected_family_info.connectivity_name);
1520void Arcane::mesh::PolyhedralMesh::
1521applyScheduledAllocateItems(UniqueArray<std::shared_ptr<PolyhedralTools::ItemLocalIds>> item_lids)
1524 auto mesh_state = m_mesh->applyScheduledOperations();
1526 for (
auto item_local_ids : item_lids) {
1527 item_local_ids->m_mesh_state = std::make_shared<Neo::EndOfMeshUpdate>(mesh_state);
1531 for (
auto& family : m_arcane_families) {
1532 family->endUpdate();
1535 m_is_allocated =
true;
1537 itemTypeMng()->setMeshWithGeneralCells(
this);
1542void mesh::PolyhedralMesh::removeNeedRemoveMarkedItems()
1545 for (
auto family_index = 0; family_index < m_arcane_families.size(); ++family_index) {
1547 auto* family = m_arcane_families[family_index].get();
1549 items_to_remove.
reserve(family->nbItem());
1550 auto& items_map = family->itemsMap();
1551 if (items_map.count() == 0)
1553 items_map.eachItem([&](ItemBase item) {
1555 auto f = item.flags();
1558 item.toMutable().setFlags(f);
1559 items_to_remove.add(item.localId());
1562 if (!items_to_remove.empty()) {
1563 removeItems(items_to_remove, family);
1570Arcane::mesh::PolyhedralFamilySerializerMng* mesh::PolyhedralMesh::
1571polyhedralFamilySerializerMng()
1573 return m_polyhedral_family_serializer_mng.get();
1579void Arcane::mesh::PolyhedralMesh::
1582 for (
auto& family : m_arcane_families) {
1583 family->endUpdate();
1590void Arcane::mesh::PolyhedralMesh::
1591_computeFamilySynchronizeInfos()
1593 m_subdomain->traceMng()->info() <<
"Computing family synchronization information for " << name();
1594 for (
auto& family : m_arcane_families) {
1595 family->computeSynchronizeInfos();
1600 auto* var_syncer = cellFamily()->allItemsSynchronizer();
1601 Int32 iteration = m_subdomain->commonVariables().globalIteration();
1602 String file_name = String::format(
"{0}_sync_topology_iter{1}.json", name(), iteration);
1603 mesh_utils::dumpSynchronizerTopologyJSON(var_syncer, file_name);
1610void Arcane::mesh::PolyhedralMesh::
1611_notifyEndUpdateForFamilies()
1613 for (
auto& family : m_arcane_families)
1614 family->_internalApi()->notifyEndUpdateFromMesh();
1620void Arcane::mesh::PolyhedralMesh::
1621_computeGroupSynchronizeInfos()
1623 auto action = [](ItemGroup& group) {
1624 if (group.hasSynchronizer())
1625 group.synchronizer()->compute();
1628 m_trace_mng->info() <<
"Computing group synchronization information for " << name();
1629 meshvisitor::visitGroups(
this, action);
1647 return m_mesh->dimension();
1656 return m_mesh->nbNode();
1665 return m_mesh->nbEdge();
1674 return m_mesh->nbFace();
1683 return m_mesh->nbCell();
1692 return m_mesh->nbItem(ik);
1701 if (m_default_arcane_families[
IK_Node])
1702 return m_default_arcane_families[
IK_Node]->allItems();
1713 if (m_default_arcane_families[
IK_Edge])
1714 return m_default_arcane_families[
IK_Edge]->allItems();
1725 if (m_default_arcane_families[
IK_Face])
1726 return m_default_arcane_families[
IK_Face]->allItems();
1737 if (m_default_arcane_families[
IK_Cell])
1738 return m_default_arcane_families[
IK_Cell]->allItems();
1749 if (m_default_arcane_families[
IK_Node])
1750 return m_default_arcane_families[
IK_Node]->allItems().own();
1761 if (m_default_arcane_families[
IK_Edge])
1762 return m_default_arcane_families[
IK_Edge]->allItems().own();
1773 if (m_default_arcane_families[
IK_Face])
1774 return m_default_arcane_families[
IK_Face]->allItems().own();
1785 if (m_default_arcane_families[
IK_Cell])
1786 return m_default_arcane_families[
IK_Cell]->allItems().own();
1797 if (m_default_arcane_families[
IK_Cell])
1806mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1807_createItemFamily(
eItemKind ik,
const String& name)
1809 m_mesh->addFamily(ik, name);
1810 m_arcane_families.push_back(std::make_unique<PolyhedralFamily>(
this, ik, name));
1811 auto current_family = m_arcane_families.back().get();
1812 if (m_default_arcane_families[ik] ==
nullptr) {
1813 m_default_arcane_families[ik] = current_family;
1814 _updateMeshInternalList(ik);
1816 m_item_family_collection.add(current_family);
1817 current_family->build();
1818 return current_family;
1827 return _createItemFamily(ik, name);
1833void mesh::PolyhedralMesh::
1836 createItemFamily(
IK_Cell,
"CellFamily");
1837 createItemFamily(
IK_Node,
"NodeFamily");
1838 auto cell_family = m_default_arcane_families[
IK_Cell];
1839 auto node_family = m_default_arcane_families[
IK_Node];
1842 PolyhedralTools::ItemLocalIds cell_lids, node_lids;
1843 m_mesh->scheduleAddItems(cell_family, cell_uids.constView(), cell_lids);
1844 m_mesh->scheduleAddItems(node_family, node_uids.constView(), node_lids);
1847 m_mesh->scheduleAddConnectivity(cell_family, cell_lids, nb_node, node_family, node_uids, String{
"CellToNodes" });
1848 m_mesh->scheduleAddConnectivity(node_family, node_lids, 1, cell_family,
1849 node_cells_uids, String{
"NodeToCells" });
1850 m_mesh->applyScheduledOperations();
1851 cell_family->endUpdate();
1852 node_family->endUpdate();
1865 for (
auto ik = 0; ik < NB_ITEM_KIND; ++ik) {
1868 m_empty_arcane_families[ik] = std::make_unique<mesh::PolyhedralFamily>(
this, (
eItemKind)ik, name);
1869 m_default_arcane_families[ik] = m_empty_arcane_families[ik].get();
1880 return m_default_arcane_families[
IK_Node];
1889 return m_default_arcane_families[
IK_Edge];
1898 return m_default_arcane_families[
IK_Face];
1907 return m_default_arcane_families[
IK_Cell];
1910void mesh::PolyhedralMesh::
1915 m_mesh_item_internal_list.cells = m_default_arcane_families[kind]->itemsInternal();
1916 m_mesh_item_internal_list._internalSetCellSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1919 m_mesh_item_internal_list.faces = m_default_arcane_families[kind]->itemsInternal();
1920 m_mesh_item_internal_list._internalSetFaceSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1923 m_mesh_item_internal_list.edges = m_default_arcane_families[kind]->itemsInternal();
1924 m_mesh_item_internal_list._internalSetEdgeSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1927 m_mesh_item_internal_list.nodes = m_default_arcane_families[kind]->itemsInternal();
1928 m_mesh_item_internal_list._internalSetNodeSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1940mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1943 return m_default_arcane_families[ik];
1952 return _itemFamily(ik);
1961 return m_item_type_mng;
1967mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1968_findItemFamily(
eItemKind ik,
const String& name,
bool create_if_needed)
1971 auto found_family = _itemFamily(ik);
1973 if (found_family->name() == name)
1974 return found_family;
1976 for (
auto& family : m_arcane_families) {
1977 if (family->itemKind() == ik && family->name() == name)
1978 return family.get();
1980 if (!create_if_needed)
1982 return _createItemFamily(ik, name);
1991 ARCANE_UNUSED(register_modifier_if_created);
1992 return _findItemFamily(ik, name, create_if_needed);
1998mesh::PolyhedralFamily* mesh::PolyhedralMesh::
2001 return m_default_arcane_families[ik];
2010 ARCANE_ASSERT(m_arcane_node_coords, (
"Node coordinates not yet loaded."));
2011 return *m_arcane_node_coords;
2021 for (
auto& family : m_arcane_families) {
2022 group = family->findGroup(name);
2035 m_all_groups.
clear();
2036 for (
auto& family : m_arcane_families) {
2038 m_all_groups.add(*i_group);
2040 return m_all_groups;
2049 for (
auto& family : m_arcane_families) {
2050 family->destroyGroups();
2060 return m_item_family_collection;
2069 return m_internal_api.get();
2078 return m_compact_mng.get();
2084void mesh::PolyhedralMesh::
2087 ARCANE_ASSERT((unique_ids.size() == local_ids.size()), (
"local and unique ids arrays must have same size"))
2088 auto* item_family = _findItemFamily(ik, family_name, false);
2089 PolyhedralTools::ItemLocalIds item_local_ids;
2090 m_mesh->scheduleAddItems(item_family, unique_ids, item_local_ids);
2091 auto mesh_state = m_mesh->applyScheduledOperations();
2092 item_local_ids.fillArrayView(local_ids, mesh_state);
2101 ARCANE_ASSERT((unique_ids.size() == local_ids.size() && (unique_ids.size() == owners.size())), (
"local/unique ids and owners arrays must have same size"))
2102 auto* item_family = _findItemFamily(ik, family_name, false);
2103 PolyhedralTools::ItemLocalIds item_local_ids;
2104 m_mesh->scheduleAddItems(item_family, unique_ids, owners, item_local_ids);
2105 auto mesh_state = m_mesh->applyScheduledOperations();
2106 item_local_ids.fillArrayView(local_ids, mesh_state);
2115 auto* item_family = _findItemFamily(ik, family_name,
false);
2117 ARCANE_FATAL(
"ItemFamily with name {0} and kind {1} does not exist in the mesh.", family_name, ik);
2119 m_mesh->scheduleRemoveItems(item_family, local_ids);
2120 m_mesh->applyScheduledOperations();
2126void mesh::PolyhedralMesh::
2129 if (local_ids.empty())
2132 ARCANE_FATAL(
"Invalid IItemFamily passed to removeItems.");
2134 removeItems(local_ids, family->itemKind(), family->name());
2143 addItems(nodes_uid, nodes_lid,
IK_Node, nodeFamily()->name());
2152 m_trace_mng->info() <<
"PolyhedralMesh::_exchangeItems() do_compact?=" <<
"false"
2153 <<
" nb_exchange=" << 0 <<
" version=" << 0;
2156 if (!check_exchange.null()) {
2157 m_mesh_checker.checkGhostCells();
2158 m_trace_mng->pwarning() <<
"CHECKING SYNCHRONISATION !";
2159 m_mesh_checker.checkVariablesSynchronization();
2160 m_mesh_checker.checkItemGroupsSynchronization();
2162 if (checkLevel() >= 2)
2163 m_mesh_checker.checkValidMesh();
2164 else if (checkLevel() >= 1)
2165 m_mesh_checker.checkValidConnectivity();
2171void mesh::PolyhedralMesh::
2176 Trace::Setter mci(traceMng(), _className());
2181 if (arcane_debug_load_balancing) {
2182 for (
auto& family : m_arcane_families) {
2183 family->itemsNewOwner().checkIfSync();
2187 IMeshExchanger* iexchanger = m_mesh_exchange_mng->beginExchange();
2190 if (iexchanger->computeExchangeInfos()) {
2191 m_trace_mng->pwarning() <<
"No load balance is performed";
2192 m_mesh_exchange_mng->endExchange();
2197 iexchanger->processExchange();
2200 iexchanger->removeNeededItems();
2205 auto action = [](ItemGroup& group) {
2206 if (group.internal()->hasComputeFunctor() || group.isLocalToSubDomain())
2209 group.internal()->removeSuppressedItems();
2211 meshvisitor::visitGroups(
this, action);
2214 iexchanger->allocateReceivedItems();
2217 _endUpdateFamilies();
2218 _computeFamilySynchronizeInfos();
2221 iexchanger->updateItemGroups();
2223 _computeGroupSynchronizeInfos();
2225 iexchanger->updateVariables();
2229 m_mesh_checker.checkMeshFromReferenceFile();
2230 _notifyEndUpdateForFamilies();
2232 iexchanger->finalizeExchange();
2234 m_mesh_exchange_mng->endExchange();
2250 auto want_dump =
false;
2251 auto need_compact =
false;
2252 m_trace_mng->info(4) <<
"DynamicMesh::prepareForDump() name=" << name()
2253 <<
" need_compact?=" << need_compact
2254 <<
" want_dump?=" << want_dump
2255 <<
" timestamp=" << 0;
2259 m_mesh_events.eventObservable(t).notify(MeshEventArgs(
this, t));
2264 for (
auto& family : m_arcane_families) {
2265 family->prepareForDump();
2271 m_mesh_events.eventObservable(t).notify(MeshEventArgs(
this, t));
2352 return m_mesh_utilities.get();
2361 IItemFamily* item_family = _itemFamily(ik);
2363 return item_family->itemsNewOwner();
2372 return m_mesh_checker.checkLevel();
2381 return m_item_family_network.get();
2390 return m_ghost_layer_mng.get();
2399 return m_internal_api.get();
2405mesh::PolyhedralMeshImpl* mesh::PolyhedralMesh::_impl()
2407 return m_mesh.get();
2423namespace Arcane::mesh
2432Arcane::mesh::PolyhedralMesh::
2433~PolyhedralMesh() =
default;
2438Arcane::mesh::PolyhedralMesh::
2440: EmptyMesh{ subdomain->traceMng() }
2441, m_subdomain{ subdomain }
2443, m_mesh_kind(mbi.meshKind())
2450void Arcane::mesh::PolyhedralMesh::
2451read([[maybe_unused]]
const String& filename)
2459void Arcane::mesh::PolyhedralMesh::
2460allocateItems(
const Arcane::ItemAllocationInfo& item_allocation_info)
2462 ARCANE_UNUSED(item_allocation_info);
2477class ARCANE_MESH_EXPORT PolyhedralMeshFactory
2496 static String name() {
return "ArcanePolyhedralMeshFactory"; }
2506#if ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
2514 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_SubDomainBoundary
The entity is at the boundary of two subdomains.
@ 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.