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"
44#include "arcane/mesh/ItemFamily.h"
45#include "arcane/mesh/DynamicMeshKindInfos.h"
46#include "arcane/mesh/UnstructuredMeshUtilities.h"
47#include "arcane/mesh/GhostLayerMng.h"
48#include "arcane/utils/ITraceMng.h"
49#include "arcane/utils/FatalErrorException.h"
51#ifdef ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
53#include "arcane/core/IMeshMng.h"
54#include "arcane/core/MeshHandle.h"
55#include "arcane/core/IItemFamily.h"
56#include "arcane/core/internal/IMeshInternal.h"
57#include "arcane/core/IVariableSynchronizer.h"
58#include "arcane/mesh/ItemFamilyPolicyMng.h"
59#include "arcane/mesh/ItemFamilySerializer.h"
60#include "arcane/utils/Collection.h"
61#include "arcane/utils/List.h"
62#include "arcane/utils/PlatformUtils.h"
66#include "ItemConnectivityMng.h"
68#include "arcane/core/ItemPrinter.h"
73#define ARCANE_DEBUG_LOAD_BALANCING
75#ifdef ARCANE_DEBUG_LOAD_BALANCING
76static bool arcane_debug_load_balancing =
true;
78static bool arcane_debug_load_balancing =
false;
84void Arcane::mesh::PolyhedralMesh::
85_errorEmptyMesh()
const
87 ARCANE_FATAL(
"Cannot use PolyhedralMesh if Arcane is not linked with lib Neo");
93#ifdef ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
106 namespace PolyhedralTools
110 Neo::FutureItemRange m_future_items;
111 std::shared_ptr<Neo::EndOfMeshUpdate> m_mesh_state =
nullptr;
115 void fillArrayView(Int32ArrayView local_ids, Neo::EndOfMeshUpdate mesh_state)
117 auto lids = m_future_items.get(mesh_state);
118 if (local_ids.size() != lids.size())
119 ARCANE_FATAL(
"Cannot fill local_ids view, its size {0} != {1} (added item size)", local_ids.size(), m_future_items.size());
120 std::copy(lids.begin(), lids.end(), local_ids.begin());
123 void fillArrayView(Int32ArrayView local_ids)
125 ARCANE_CHECK_POINTER2(m_mesh_state.get(),
"PolyhedralTools::ItemLocalIds must have a valid end of mesh state");
126 fillArrayView(local_ids, *m_mesh_state);
129 Integer size() const noexcept {
return m_future_items.size(); }
130 bool isFilled() const noexcept {
return m_mesh_state.get() !=
nullptr; };
131 void checkIsFilled(String error_message)
const noexcept
134 ARCANE_FATAL(
"Item local ids are not filled." + error_message);
136 friend class mesh::PolyhedralMeshImpl;
137 friend class mesh::PolyhedralMesh;
144 class PolyhedralFamilySerializer;
145 class PolyhedralFamilySerializerMng :
public IItemFamilySerializerMngInternal
147 PolyhedralMesh* m_mesh =
nullptr;
149 UniqueArray<PolyhedralFamilySerializer*> m_serializers;
153 explicit PolyhedralFamilySerializerMng(PolyhedralMesh* mesh)
159 void addSerializer(PolyhedralFamilySerializer* serializer)
161 m_serializers.push_back(serializer);
165 void finalizeItemAllocation()
override;
171 class PolyhedralFamilySerializer :
public IItemFamilySerializer
175 PolyhedralMesh* m_mesh =
nullptr;
176 IItemFamily* m_family =
nullptr;
177 PolyhedralFamilySerializerMng* m_mng =
nullptr;
178 ItemData m_item_data;
179 UniqueArray<Int32Array*> m_deserialized_lids_array;
180 UniqueArray<std::shared_ptr<PolyhedralTools::ItemLocalIds>> m_future_item_lids_array;
181 ItemAllocationInfo::FamilyInfo m_family_info;
185 explicit PolyhedralFamilySerializer(PolyhedralMesh* mesh, IItemFamily* family, PolyhedralFamilySerializerMng* mng)
191 PolyhedralFamilySerializer(
const PolyhedralFamilySerializer&) =
delete;
192 PolyhedralFamilySerializer& operator=(
const PolyhedralFamilySerializer&) =
delete;
194 ArrayView<std::shared_ptr<PolyhedralTools::ItemLocalIds>> itemLidsArray() {
return m_future_item_lids_array.view(); }
198 void serializeItems(ISerializer* buf, Int32ConstArrayView items_local_ids)
override;
199 void deserializeItems(ISerializer* buf, Int32Array* items_local_ids)
override;
204 m_deserialized_lids_array.clear();
205 m_future_item_lids_array.clear();
206 m_family_info.clear();
209 void fillDeserializedLocalIds()
212 for (
auto item_lids_array : m_deserialized_lids_array) {
213 auto& future_item_lids = m_future_item_lids_array[index];
214 future_item_lids->checkIsFilled(
"Cannot fill deserialized local ids, future item local ids are not filled.");
215 item_lids_array->resize(future_item_lids->size());
216 future_item_lids->fillArrayView(item_lids_array->view());
222 IItemFamilySerializerMngInternal* mng()
228 void serializeItemRelations(ISerializer*, Int32ConstArrayView)
override {}
229 void deserializeItemRelations(ISerializer*, Int32Array*)
override {}
233 void _fillItemData(Int32ConstArrayView items_local_ids);
234 void _fillItemFamilyInfo(
const ItemData& item_data,
235 StringConstArrayView connected_family_names,
236 StringConstArrayView connectivity_names)
239 m_family_info.clear();
241 if (m_family != item_data.itemFamily())
242 ARCANE_FATAL(
"PolyhedralFamilySerializer: Family mismatch. Synchronized family is {0} and serialized family is {1}",
243 m_family->name(), item_data.itemFamily()->name());
244 m_family_info.name = item_data.itemFamily()->name();
245 m_family_info.item_kind = item_data.itemFamily()->itemKind();
246 auto& connected_family_infos = m_family_info.connected_family_infos;
247 auto nb_connected_family = item_data.itemInfos()[0];
248 connected_family_infos.resize(nb_connected_family);
249 auto& item_uids = m_family_info._item_uids_data;
250 item_uids.reserve(item_data.nbItems());
251 auto item_infos = item_data.itemInfos();
252 for (
auto connected_family_info : connected_family_infos) {
253 connected_family_info._connected_items_uids_data.reserve(4 * item_uids.size());
254 connected_family_info._nb_connected_items_per_item_data.reserve(item_uids.size());
256 for (
auto index = 1; index < item_infos.size();) {
257 item_uids.push_back(item_infos[index + 1]);
259 for (
auto connected_family_index = 0; connected_family_index < nb_connected_family; ++connected_family_index) {
261 auto* connected_family = m_mesh->findItemFamily(family_kind, connected_family_names[connected_family_index],
false,
false);
263 auto& current_connected_family_infos = connected_family_infos[connected_family_index];
264 current_connected_family_infos.item_kind = family_kind;
265 current_connected_family_infos.name = connected_family->name();
266 current_connected_family_infos.connectivity_name = connectivity_names[connected_family_index];
268 auto nb_connected_items =
static_cast<Int32
>(item_infos[index]);
270 current_connected_family_infos._nb_connected_items_per_item_data.push_back(nb_connected_items);
271 auto real_nb_connected_items = nb_connected_items;
272 if (m_family->itemKind() == IK_Face && connected_family->itemKind() == IK_Cell)
273 real_nb_connected_items = 2;
274 current_connected_family_infos._connected_items_uids_data.addRange(item_infos.subView(index, real_nb_connected_items));
275 index += real_nb_connected_items;
279 m_family_info.updateViewsFromInternalData();
281 m_family_info.item_owners = item_data.itemOwners();
284 IItemFamily* family()
const override
293 void PolyhedralFamilySerializerMng::
294 finalizeItemAllocation()
296 UniqueArray<std::shared_ptr<PolyhedralTools::ItemLocalIds>> future_item_lids;
297 for (
auto family_serializer : m_serializers) {
298 for (
auto& item_lids : family_serializer->itemLidsArray()) {
299 future_item_lids.push_back(item_lids);
302 m_mesh->applyScheduledAllocateItems(future_item_lids);
303 for (
auto family_serializer : m_serializers) {
304 family_serializer->fillDeserializedLocalIds();
306 m_serializers.clear();
312 class PolyhedralFamilyPolicyMng
313 :
public ItemFamilyPolicyMng
317 PolyhedralFamilyPolicyMng(PolyhedralMesh* mesh, ItemFamily* family)
318 : ItemFamilyPolicyMng(family)
327 return new PolyhedralFamilySerializer(m_mesh, m_family, m_mesh->polyhedralFamilySerializerMng());
332 PolyhedralMesh* m_mesh =
nullptr;
333 ItemFamily* m_family =
nullptr;
339class PolyhedralFamily
343 ItemSharedInfoWithType* m_shared_info =
nullptr;
347 PolyhedralMesh* m_mesh =
nullptr;
351 inline static const String m_arcane_item_lids_property_name{
"Arcane_Item_Lids" };
352 inline static const String m_arcane_remove_item_property_name{
"Arcane_Remove_Items" };
356 PolyhedralFamily(PolyhedralMesh* mesh, eItemKind ik, String name)
357 : ItemFamily(mesh, ik, name)
363 void preAllocate(Integer nb_item)
365 Integer nb_hash = itemsMap().nbBucket();
366 Integer wanted_size = 2 * (nb_item + nbItem());
367 if (nb_hash < wanted_size)
368 itemsMap().resize(wanted_size,
true);
369 m_empty_connectivity_indexes.resize(nb_item + nbItem(), 0);
370 m_empty_connectivity_nb_item.resize(nb_item + nbItem(), 0);
371 _updateEmptyConnectivity();
374 ItemInternal* _allocItem(
const Int64 uid,
const Int32 owner)
377 ItemInternal* item_internal = ItemFamily::_findOrAllocOne(uid, need_alloc);
379 item_internal->setUniqueId(uid);
381 _allocateInfos(item_internal, uid, m_shared_info);
383 item_internal->setOwner(owner, m_sub_domain_id);
384 return item_internal;
387 void addItems(Int64ConstSmallSpan uids, Int32ArrayView items)
390 addItems(uids, items, owners);
393 void addItems(Int64ConstSmallSpan uids, Int32ArrayView items, Int32ConstArrayView owners)
397 ARCANE_ASSERT((uids.size() == items.size()), (
"one must have items.size==uids.size()"));
398 preAllocate(uids.size());
400 for (
auto uid : uids) {
401 ItemInternal* ii = _allocItem(uid,owners[index]);
402 items[index] = ii->localId();
405 m_need_prepare_dump =
true;
406 _updateItemInternalList();
409 void removeItems(Int32ConstArrayView local_ids)
411 _removeMany(local_ids);
414 void _updateItemInternalList()
416 switch (itemKind()) {
418 m_item_internal_list->cells = _itemsInternal();
421 m_item_internal_list->faces = _itemsInternal();
424 m_item_internal_list->edges = _itemsInternal();
427 m_item_internal_list->nodes = _itemsInternal();
436 void _updateEmptyConnectivity()
438 auto item_internal_connectivity_list = itemInternalConnectivityList();
439 for (
auto item_kind = 0; item_kind < ItemInternalConnectivityList::MAX_ITEM_KIND; ++item_kind) {
440 item_internal_connectivity_list->_setConnectivityList(item_kind, m_empty_connectivity);
441 item_internal_connectivity_list->_setConnectivityIndex(item_kind, m_empty_connectivity_indexes);
442 item_internal_connectivity_list->_setConnectivityNbItem(item_kind, m_empty_connectivity_nb_item);
447 IDoFFamily* toDoFFamily()
override
453 void build()
override
456 m_sub_domain_id = subDomain()->subDomainId();
457 ItemTypeMng* itm = m_mesh->itemTypeMng();
458 ItemTypeInfo* dof_type_info = itm->typeFromId(IT_NullType);
459 m_shared_info = _findSharedInfo(dof_type_info);
460 _updateEmptyConnectivity();
461 ItemFamily::setPolicyMng(
new PolyhedralFamilyPolicyMng{ m_mesh,
this });
464 void addGhostItems(Int64ConstArrayView unique_ids, Int32ArrayView items,Int32ConstArrayView owners)
override
466 auto* polyhedral_mesh_modifier = m_mesh->_internalApi()->polyhedralMeshModifier();
468 polyhedral_mesh_modifier->addItems(unique_ids, items, owners, ItemFamily::itemKind(), name());
472 String name()
const override {
return ItemFamily::name(); }
473 String fullName()
const override {
return ItemFamily::fullName(); }
474 Integer nbItem()
const override {
return ItemFamily::nbItem(); }
475 ItemGroup allItems()
const override {
return ItemFamily::allItems(); }
476 void endUpdate()
override
478 return ItemFamily::endUpdate();
480 IItemFamily* itemFamily()
override {
return this; }
482 DoFVectorView addDoFs(Int64ConstArrayView dof_uids, Int32ArrayView dof_lids)
override
484 auto* polyhedral_mesh_modifier = m_mesh->_internalApi()->polyhedralMeshModifier();
486 polyhedral_mesh_modifier->addItems(dof_uids, dof_lids, ItemFamily::itemKind(), name());
487 return ItemFamily::view(dof_lids);
490 DoFVectorView addGhostDoFs(Int64ConstArrayView dof_uids, Int32ArrayView dof_lids,
491 Int32ConstArrayView owners)
override
493 addGhostItems(dof_uids, dof_lids, owners);
494 return ItemFamily::view(dof_lids);
497 void removeDoFs(Int32ConstArrayView items_local_id)
override
499 auto* mesh_modifier = m_mesh->_internalApi()->polyhedralMeshModifier();
500 mesh_modifier->removeItems(items_local_id, ItemFamily::itemKind(), m_name);
525 class PolyhedralMeshImpl
527 ISubDomain* m_subdomain;
528 Neo::Mesh m_mesh{
"Test" };
530 template <eItemKind IK>
533 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_None;
538 static Neo::ItemKind itemKindArcaneToNeo(eItemKind ik)
542 return Neo::ItemKind::IK_Cell;
544 return Neo::ItemKind::IK_Face;
546 return Neo::ItemKind::IK_Edge;
548 return Neo::ItemKind::IK_Node;
550 return Neo::ItemKind::IK_Dof;
553 return Neo::ItemKind::IK_None;
555 return Neo::ItemKind::IK_Node;
558 static eItemKind itemKindNeoToArcane(Neo::ItemKind ik)
561 case Neo::ItemKind::IK_Cell:
563 case Neo::ItemKind::IK_Face:
565 case Neo::ItemKind::IK_Edge:
567 case Neo::ItemKind::IK_Node:
569 case Neo::ItemKind::IK_Dof:
571 case Neo::ItemKind::IK_None:
579 explicit PolyhedralMeshImpl(ISubDomain* subDomain)
580 : m_subdomain(subDomain)
581 , m_mesh(String::format(subDomain->defaultMeshHandle().meshName(),
"Polyhedral").localstr(),subDomain->parallelMng()->commRank())
586 String name()
const {
return m_mesh.name(); }
588 Integer dimension()
const {
return m_mesh.dimension(); }
590 Integer nbNode()
const {
return m_mesh.nbNodes(); }
591 Integer nbEdge()
const {
return m_mesh.nbEdges(); }
592 Integer nbFace()
const {
return m_mesh.nbFaces(); }
593 Integer nbCell()
const {
return m_mesh.nbCells(); }
594 Integer nbItem(eItemKind ik)
const {
return m_mesh.nbItems(itemKindArcaneToNeo(ik)); }
596 SmallSpan<const Neo::Mesh::Connectivity> connectivities(IItemFamily* source_family)
598 auto& neo_source_family = m_mesh.findFamily(itemKindArcaneToNeo(source_family->itemKind()), source_family->name().localstr());
599 auto connectivities = m_mesh.getConnectivities(neo_source_family);
600 return { connectivities.begin(), connectivities.size() };
603 static void _setFaceInfos(Int32 mod_flags, Face& face)
605 Int32 face_flags = face.itemBase().flags();
606 face_flags &= ~ItemFlags::II_InterfaceFlags;
607 face_flags |= mod_flags;
608 face.mutableItemBase().setFlags(face_flags);
613 void addFamily(eItemKind ik,
const String& name)
615 m_mesh.addFamily(itemKindArcaneToNeo(ik), name.localstr());
620 void scheduleAddItems(PolyhedralFamily* arcane_item_family,
621 Int64ConstSmallSpan uids,
622 PolyhedralTools::ItemLocalIds& item_local_ids)
624 scheduleAddItems(arcane_item_family, uids, Int32ConstSmallSpan{}, item_local_ids);
629 void scheduleAddItems(PolyhedralFamily* arcane_item_family,
630 Int64ConstSmallSpan uids,
631 Int32ConstSmallSpan owners,
632 PolyhedralTools::ItemLocalIds& item_local_ids)
634 auto& added_items = item_local_ids.m_future_items;
635 auto& item_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_item_family->itemKind()),
636 arcane_item_family->name().localstr());
637 m_mesh.scheduleAddItems(item_family, std::vector<Int64>{ uids.begin(), uids.end() }, added_items);
639 auto& mesh_graph = m_mesh.internalMeshGraph();
640 item_family.addMeshScalarProperty<Neo::utils::Int32>(PolyhedralFamily::m_arcane_item_lids_property_name.localstr());
642 UniqueArray<Int64> uids_copy(uids);
643 UniqueArray<Int32> owners_copy(owners);
644 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ item_family, item_family.lidPropName() },
645 Neo::MeshKernel::OutProperty{ item_family, PolyhedralFamily::m_arcane_item_lids_property_name.localstr() },
646 [arcane_item_family, uids_local=std::move(uids_copy), &added_items, owners_local=std::move(owners_copy)]
647 ([[maybe_unused]] Neo::ItemLidsProperty
const& lids_property,
648 Neo::MeshScalarPropertyT<Neo::utils::Int32>&) {
649 auto new_items_lids{added_items.new_items.localIds()};
650 Int32ConstSpan neo_items{ new_items_lids.data(),
static_cast<Int32
>(new_items_lids.size()) };
651 UniqueArray<Int32> arcane_items(added_items.new_items.size());
652 if (owners_local.empty())
653 arcane_item_family->addItems(uids_local, arcane_items);
655 arcane_item_family->addItems(uids_local, arcane_items, Int32ConstArrayView{ owners_local.size(), owners_local.data() });
657 if (!arcane_items.size() == added_items.new_items.size())
658 arcane_item_family->traceMng()->fatal() <<
"Inconsistent item lids generation between Arcane and Neo, nb items Neo "
659 << added_items.new_items.size() <<
" nb items Arcane " << arcane_items.size();
660 if (!std::equal(added_items.new_items.begin(), added_items.new_items.end(), arcane_items.begin()))
661 arcane_item_family->traceMng()->fatal() <<
"Inconsistent item lids generation between Arcane and Neo.";
667 void scheduleRemoveItems(PolyhedralFamily* arcane_item_family,
668 Int32ConstArrayView local_ids)
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 [arcane_item_family, local_ids](Neo::MeshScalarPropertyT<Neo::utils::Int32>
const&,
680 Neo::MeshScalarPropertyT<Neo::utils::Int32>&) {
681 arcane_item_family->removeItems(local_ids);
687 void scheduleAddConnectivity(PolyhedralFamily* arcane_source_item_family,
688 PolyhedralTools::ItemLocalIds& source_items,
689 Integer nb_connected_items_per_item,
690 PolyhedralFamily* arcane_target_item_family,
691 Int64ConstArrayView target_items_uids,
695 _scheduleAddConnectivity(arcane_source_item_family,
697 nb_connected_items_per_item,
698 arcane_target_item_family,
705 void scheduleAddConnectivity(PolyhedralFamily* arcane_source_item_family,
706 PolyhedralTools::ItemLocalIds& source_items,
707 Int32ConstSmallSpan nb_connected_items_per_item,
708 PolyhedralFamily* arcane_target_item_family,
709 Int64ConstSmallSpan target_items_uids,
710 String
const& connectivity_name)
712 _scheduleAddConnectivity(arcane_source_item_family,
714 std::vector<Int32>{ nb_connected_items_per_item.begin(), nb_connected_items_per_item.end() },
715 arcane_target_item_family,
723 void scheduleUpdateConnectivity(PolyhedralFamily* arcane_source_item_family,
724 PolyhedralTools::ItemLocalIds& source_items,
725 Integer nb_connected_items_per_item,
726 PolyhedralFamily* arcane_target_item_family,
727 Int64ConstArrayView target_items_uids,
731 _scheduleAddConnectivity(arcane_source_item_family,
733 nb_connected_items_per_item,
734 arcane_target_item_family,
737 Neo::Mesh::ConnectivityOperation::Modify);
742 void scheduleUpdateConnectivity(PolyhedralFamily* arcane_source_item_family,
743 PolyhedralTools::ItemLocalIds& source_items,
744 Int32ConstSmallSpan nb_connected_items_per_item,
745 PolyhedralFamily* arcane_target_item_family,
746 Int64ConstSmallSpan target_items_uids,
747 String
const& connectivity_name)
749 _scheduleAddConnectivity(arcane_source_item_family,
751 std::vector<Int32>{ nb_connected_items_per_item.begin(), nb_connected_items_per_item.end() },
752 arcane_target_item_family,
755 Neo::Mesh::ConnectivityOperation::Modify);
761 template <
typename ConnectivitySizeType>
762 void _scheduleAddConnectivity(PolyhedralFamily* arcane_source_item_family,
763 PolyhedralTools::ItemLocalIds& source_items,
764 ConnectivitySizeType&& nb_connected_items_per_item,
765 PolyhedralFamily* arcane_target_item_family,
766 Int64ConstSmallSpan target_item_uids,
767 String
const& connectivity_name,
768 Neo::Mesh::ConnectivityOperation operation = Neo::Mesh::ConnectivityOperation::Add)
771 auto& source_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_source_item_family->itemKind()),
772 arcane_source_item_family->name().localstr());
773 auto& target_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_target_item_family->itemKind()),
774 arcane_target_item_family->name().localstr());
776 UniqueArray<Int64> target_item_uids_copy(target_item_uids);
778 std::vector<Int64> target_item_uids_filtered;
779 target_item_uids_filtered.reserve(target_item_uids.size());
780 std::copy_if(target_item_uids.begin(),
781 target_item_uids.end(),
782 std::back_inserter(target_item_uids_filtered),
783 [](
auto uid) { return uid != NULL_ITEM_UNIQUE_ID; });
785 m_mesh.scheduleAddConnectivity(source_family, source_items.m_future_items, target_family,
786 std::forward<ConnectivitySizeType>(nb_connected_items_per_item),
787 std::move(target_item_uids_filtered),
788 connectivity_name.localstr(),
791 auto& mesh_graph = m_mesh.internalMeshGraph();
792 std::string connectivity_add_output_property_name = std::string{
"EndOf" } + connectivity_name.localstr() +
"Add";
793 source_family.addScalarProperty<Neo::utils::Int32>(connectivity_add_output_property_name);
795 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, connectivity_name.localstr() },
796 Neo::MeshKernel::OutProperty{ source_family, connectivity_add_output_property_name },
797 [arcane_source_item_family, arcane_target_item_family, &source_family, &target_family,
this]
798 (Neo::Mesh::ConnectivityPropertyType
const& neo_connectivity,
799 Neo::ScalarPropertyT<Neo::utils::Int32>&) {
800 auto rank = arcane_source_item_family->mesh()->parallelMng()->commRank();
801 Neo::printer(rank) <<
"==Algorithm update Arcane connectivity: "<< neo_connectivity.name() << Neo::endline;
802 auto item_internal_connectivity_list = arcane_source_item_family->itemInternalConnectivityList();
804 auto connectivity = m_mesh.getConnectivity(source_family, target_family, neo_connectivity.name());
806 auto& connectivity_values = source_family.getConcreteProperty<Neo::Mesh::ConnectivityPropertyType>(neo_connectivity.name());
807 Neo::MeshArrayPropertyProxyT<Neo::Mesh::ConnectivityPropertyType::PropertyDataType> connectivity_proxy{ connectivity_values };
808 auto nb_item_data = connectivity_proxy.arrayPropertyOffsets();
809 auto nb_item_size = connectivity_proxy.arrayPropertyOffsetsSize();
810 item_internal_connectivity_list->_setConnectivityNbItem(arcane_target_item_family->itemKind(),
811 Int32ArrayView{ Integer(nb_item_size), nb_item_data });
812 auto max_nb_connected_items = connectivity.maxNbConnectedItems();
813 item_internal_connectivity_list->_setMaxNbConnectedItem(arcane_target_item_family->itemKind(), max_nb_connected_items);
814 auto connectivity_values_data = connectivity_proxy.arrayPropertyData();
815 auto connectivity_values_size = connectivity_proxy.arrayPropertyDataSize();
816 item_internal_connectivity_list->_setConnectivityList(arcane_target_item_family->itemKind(),
817 Int32ArrayView{ Integer(connectivity_values_size), connectivity_values_data });
818 auto connectivity_index_data = connectivity_proxy.arrayPropertyIndex();
819 auto connectivity_index_size = connectivity_proxy.arrayPropertyIndexSize();
820 item_internal_connectivity_list->_setConnectivityIndex(arcane_target_item_family->itemKind(),
821 Int32ArrayView{ Integer(connectivity_index_size), connectivity_index_data });
822 },Neo::MeshKernel::AlgorithmPropertyGraph::AlgorithmPersistence::KeepAfterExecution);
824 if (arcane_source_item_family->itemKind() == IK_Face && arcane_target_item_family->itemKind() == IK_Cell) {
825 std::string flag_definition_output_property_name{
"EndOfFlagDefinition" };
826 source_family.addScalarProperty<Neo::utils::Int32>(flag_definition_output_property_name);
828 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, connectivity_add_output_property_name }, Neo::MeshKernel::OutProperty{ source_family, flag_definition_output_property_name },
829 [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&) {
830 auto current_face_index = 0;
831 auto arcane_faces = arcane_source_item_family->itemInfoListView();
833 arcane_target_item_family->itemsUniqueIdToLocalId(target_item_lids,target_item_uids_local,
false);
834 for (
auto face_lid : source_items.m_future_items.new_items) {
835 Face current_face = arcane_faces[face_lid].toFace();
836 if (target_item_lids[2 * current_face_index + 1] == NULL_ITEM_LOCAL_ID) {
838 Int32 mod_flags = (target_item_lids[2 * current_face_index] != NULL_ITEM_LOCAL_ID) ? (ItemFlags::II_Boundary | ItemFlags::II_HasBackCell | ItemFlags::II_BackCellIsFirst) : 0;
839 _setFaceInfos(mod_flags, current_face);
841 else if (target_item_lids[2 * current_face_index] == NULL_ITEM_LOCAL_ID) {
843 _setFaceInfos(ItemFlags::II_Boundary | ItemFlags::II_HasFrontCell | ItemFlags::II_FrontCellIsFirst, current_face);
847 _setFaceInfos(ItemFlags::II_HasFrontCell | ItemFlags::II_HasBackCell | ItemFlags::II_BackCellIsFirst, current_face);
849 ++current_face_index;
854 if (operation == Neo::Mesh::ConnectivityOperation::Modify)
return;
855 auto isolated_item_property_name = m_mesh._isolatedItemLidsPropertyName(source_family,target_family);
856 auto end_of_isolated_removal_property_name = std::string{
"EndOf" } + isolated_item_property_name;
857 source_family.addScalarProperty<Neo::utils::Int32>(end_of_isolated_removal_property_name);
858 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, isolated_item_property_name },
859 Neo::MeshKernel::OutProperty{source_family, end_of_isolated_removal_property_name},
860 [arcane_source_item_family](Neo::MeshScalarPropertyT<Neo::utils::Int32>
const& isolated_items_lids_property,
861 Neo::ScalarPropertyT<Neo::utils::Int32>& end_of_isolated_removal_property) {
862 end_of_isolated_removal_property.set(1);
865 isolated_item_lids.
reserve(isolated_items_lids_property.size());
866 ENUMERATE_(Item,iitem,arcane_source_item_family->allItems()) {
867 if (isolated_items_lids_property[iitem->localId()] == 1) {
868 isolated_item_lids.push_back(iitem->localId());
871 arcane_source_item_family->removeItems(isolated_item_lids);
872 }, Neo::MeshKernel::AlgorithmPropertyGraph::AlgorithmPersistence::KeepAfterExecution);
877 void scheduleSetItemCoordinates(PolyhedralFamily* item_family, PolyhedralTools::ItemLocalIds& local_ids, Real3ConstSmallSpan item_coords, VariableItemReal3& arcane_coords)
879 auto& _item_family = m_mesh.findFamily(itemKindArcaneToNeo(item_family->itemKind()), item_family->name().localstr());
880 std::vector<Neo::utils::Real3> _node_coords(item_coords.size());
882 for (
auto&& node_coord : item_coords) {
883 _node_coords[node_index++] = Neo::utils::Real3{ node_coord.x, node_coord.y, node_coord.z };
885 m_mesh.scheduleSetItemCoords(_item_family, local_ids.m_future_items, _node_coords);
887 auto& mesh_graph = m_mesh.internalMeshGraph();
888 _item_family.addScalarProperty<Int32>(
"NoOutProperty42");
889 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ _item_family, m_mesh._itemCoordPropertyName(_item_family) },
890 Neo::MeshKernel::OutProperty{ _item_family,
"NoOutProperty42" },
891 [
this, item_family, &_item_family, &arcane_coords](Neo::Mesh::CoordPropertyType
const& item_coords_property,
892 Neo::ScalarPropertyT<Neo::utils::Int32>&) {
894 auto& all_items = _item_family.all();
895 VariableNodeReal3 node_coords{ VariableBuildInfo{ item_family->mesh(),
"NodeCoord" } };
896 for (
auto item : all_items) {
897 arcane_coords[ItemLocalId{ item }] = { item_coords_property[item].x,
898 item_coords_property[item].y,
899 item_coords_property[item].z };
906 Neo::EndOfMeshUpdate applyScheduledOperations() noexcept
908 return m_mesh.applyScheduledOperations();
912 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Cell>
914 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Cell;
916 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Face>
918 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Face;
920 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Edge>
922 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Edge;
924 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Node>
926 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Node;
928 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_DoF>
930 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Dof;
935 void PolyhedralFamilySerializer::serializeItems(ISerializer* buf, Int32ConstArrayView items_local_ids)
940 switch (buf->mode()) {
941 case ISerializer::ModeReserve: {
942 _fillItemData(items_local_ids);
943 m_item_data.serialize(buf);
944 auto connectivities = m_mesh->_impl()->connectivities(m_family);
945 for (
auto out_connectivity : connectivities) {
946 buf->reserve(out_connectivity.target_family.name());
947 buf->reserve(out_connectivity.name);
951 case ISerializer::ModePut: {
952 m_item_data.serialize(buf);
953 auto connectivities = m_mesh->_impl()->connectivities(m_family);
954 for (
auto out_connectivity : connectivities) {
955 buf->put(out_connectivity.target_family.name());
956 buf->put(out_connectivity.name);
961 case ISerializer::ModeGet: {
962 deserializeItems(buf,
nullptr);
970 void PolyhedralFamilySerializer::deserializeItems(ISerializer* buf, Int32Array* items_local_ids)
972 ARCANE_ASSERT((buf->mode() == ISerializer::ModeGet),
973 (
"Impossible to deserialize a buffer not in ModeGet. In ItemData::deserialize.Exiting"))
979 item_data.deserialize(buf, m_mesh, *items_local_ids);
981 item_data.deserialize(buf, m_mesh);
982 auto connectivities = m_mesh->_impl()->connectivities(m_family);
983 auto nb_connectivities = connectivities.size();
984 StringUniqueArray connected_family_names(nb_connectivities);
985 StringUniqueArray connectivity_names(nb_connectivities);
987 for (auto out_connectivity : connectivities) {
988 buf->get(connected_family_names[index]);
989 buf->get(connectivity_names[index]);
992 _fillItemFamilyInfo(item_data, connected_family_names, connectivity_names);
994 if (items_local_ids) {
995 m_deserialized_lids_array.push_back(items_local_ids);
998 m_future_item_lids_array.push_back(std::make_shared<PolyhedralTools::ItemLocalIds>());
999 m_mesh->scheduleAllocateItems(m_family_info, *m_future_item_lids_array.back().get());
1002 m_mng->addSerializer(
this);
1006 void PolyhedralFamilySerializer::_fillItemData(Int32ConstArrayView items_local_ids)
1008 m_item_data = ItemData{ items_local_ids.size(), 0, m_family,
nullptr, m_family->parallelMng()->commRank() };
1009 Int64Array& item_infos = m_item_data.itemInfos();
1012 const Integer nb_item = items_local_ids.size();
1013 item_infos.reserve(1 + nb_item * 32);
1015 PolyhedralMeshImpl* mesh_impl = m_mesh->_impl();
1016 auto connectivities = mesh_impl->connectivities(m_family);
1017 item_infos.add(connectivities.size());
1018 bool is_face_family = m_family->itemKind() ==
IK_Face;
1021 item_infos.add(item->uniqueId().asInt64());
1022 item_owners[item.index()] = item->owner();
1023 for (
auto out_connectivity : connectivities) {
1024 auto target_family = m_mesh->findItemFamily(PolyhedralMeshImpl::itemKindNeoToArcane(out_connectivity.target_family.itemKind()),
1025 out_connectivity.target_family.name(),
false,
false);
1027 auto arcane_connected_items = target_family->itemInfoListView();
1028 bool is_face_cell_connection = is_face_family && target_family->itemKind() ==
IK_Cell;
1029 item_infos.add(PolyhedralMeshImpl::itemKindNeoToArcane(out_connectivity.target_family.itemKind()));
1030 auto connected_items = out_connectivity[item.localId()];
1031 auto nb_connected_items = connected_items.size();
1032 item_infos.add(nb_connected_items);
1033 if (is_face_cell_connection && item->itemBase().isBoundary() && item->itemBase().backCell().isNull()) {
1034 item_infos.add(NULL_ITEM_UNIQUE_ID);
1036 for (
auto connected_item_lid : connected_items) {
1037 item_infos.add(arcane_connected_items[connected_item_lid].uniqueId().asInt64());
1039 if (is_face_cell_connection && item->itemBase().isBoundary() && !item->itemBase().backCell().isNull()) {
1040 item_infos.add(NULL_ITEM_UNIQUE_ID);
1051class mesh::PolyhedralMesh::PolyhedralMeshModifier
1052:
public IPolyhedralMeshModifier
1056 explicit PolyhedralMeshModifier(PolyhedralMesh* mesh)
1060 void addItems(Int64ConstArrayView unique_ids, Int32ArrayView local_ids, eItemKind ik,
const String& family_name)
override
1062 m_mesh->addItems(unique_ids, local_ids, ik, family_name);
1065 void addItems(Int64ConstArrayView unique_ids, Int32ArrayView local_ids, Int32ConstArrayView owners, eItemKind ik,
const String& family_name)
override
1067 m_mesh->addItems(unique_ids, local_ids, owners, ik, family_name);
1070 void removeItems(Int32ConstArrayView local_ids, eItemKind ik,
const String& family_name)
override
1072 m_mesh->removeItems(local_ids, ik, family_name);
1077 PolyhedralMesh* m_mesh;
1083class mesh::PolyhedralMesh::InternalApi
1084:
public IMeshInternal
1085,
public IMeshModifierInternal
1089 explicit InternalApi(PolyhedralMesh* mesh)
1091 , m_connectivity_mng(std::make_unique<ItemConnectivityMng>(mesh->traceMng()))
1092 , m_polyhedral_mesh_modifier(std::make_unique<PolyhedralMeshModifier>(mesh))
1097 void setMeshKind(
const MeshKind& v)
override
1099 if (v.meshStructure() != eMeshStructure::Polyhedral && v.meshAMRKind() != eMeshAMRKind::None) {
1100 ARCANE_FATAL(
"Incompatible mesh structure ({0}) and amr kind ({1}) for Polyhedral mesh {2}. Must be (Polyhedral,None). ",
1101 v.meshStructure(), v.meshAMRKind(), m_mesh->name());
1103 m_mesh->m_mesh_kind = v;
1106 IItemConnectivityMng* dofConnectivityMng() const noexcept
override
1108 return m_connectivity_mng.get();
1111 IPolyhedralMeshModifier* polyhedralMeshModifier() const noexcept
override
1113 return m_polyhedral_mesh_modifier.get();
1116 void removeNeedRemoveMarkedItems()
override
1118 m_mesh->removeNeedRemoveMarkedItems();
1120 NodeLocalId addNode([[maybe_unused]] ItemUniqueId unique_id)
override
1124 FaceLocalId addFace([[maybe_unused]] ItemUniqueId unique_id,
1125 [[maybe_unused]] ItemTypeId type_id,
1126 [[maybe_unused]] ConstArrayView<Int64> nodes_uid)
override
1130 CellLocalId addCell([[maybe_unused]] ItemUniqueId unique_id,
1131 [[maybe_unused]] ItemTypeId type_id,
1132 [[maybe_unused]] ConstArrayView<Int64> nodes_uid)
override
1137 IItemFamilySerializerMngInternal* familySerializerMng() const noexcept
override
1139 return m_mesh->polyhedralFamilySerializerMng();
1144 PolyhedralMesh* m_mesh =
nullptr;
1145 std::unique_ptr<IItemConnectivityMng> m_connectivity_mng =
nullptr;
1146 std::unique_ptr<IPolyhedralMeshModifier> m_polyhedral_mesh_modifier =
nullptr;
1152class mesh::PolyhedralMesh::NoCompactionMeshCompacter
1153:
public IMeshCompacter
1157 explicit NoCompactionMeshCompacter(PolyhedralMesh* mesh)
1159 , m_trace_mng(mesh->traceMng())
1162 void doAllActions()
override { _info(); };
1164 void beginCompact()
override { _info(); };
1165 void compactVariablesAndGroups()
override { _info(); };
1166 void updateInternalReferences()
override { _info(); };
1167 void endCompact()
override { _info(); };
1168 void finalizeCompact()
override { _info(); };
1170 IMesh* mesh()
const override {
return m_mesh; };
1172 const ItemFamilyCompactInfos* findCompactInfos(IItemFamily*)
const override
1178 ePhase phase()
const override
1181 return ePhase::Ended;
1184 void setSorted(
bool)
override { _info(); };
1186 bool isSorted()
const override
1198 void _setCompactVariablesAndGroups(
bool)
override { _info(); };
1202 PolyhedralMesh* m_mesh =
nullptr;
1203 ITraceMng* m_trace_mng =
nullptr;
1205 void _info()
const { m_trace_mng->info() << A_FUNCINFO <<
"No compacting in PolyhedralMesh"; }
1211class mesh::PolyhedralMesh::NoCompactionMeshCompactMng
1212:
public IMeshCompactMng
1216 explicit NoCompactionMeshCompactMng(PolyhedralMesh* mesh)
1218 , m_trace_mng(mesh->traceMng())
1219 , m_mesh_compacter{ std::make_unique<NoCompactionMeshCompacter>(m_mesh) }
1222 IMesh* mesh()
const override {
return m_mesh; }
1223 IMeshCompacter* beginCompact()
override
1226 return m_mesh_compacter.get();
1229 IMeshCompacter* beginCompact(IItemFamily* family)
override
1231 ARCANE_UNUSED(family);
1233 return m_mesh_compacter.get();
1236 void endCompact()
override { _info(); };
1238 IMeshCompacter* compacter()
override
1241 return m_mesh_compacter.get();
1246 PolyhedralMesh* m_mesh =
nullptr;
1247 ITraceMng* m_trace_mng =
nullptr;
1248 std::unique_ptr<IMeshCompacter> m_mesh_compacter =
nullptr;
1250 void _info()
const { m_trace_mng->info() << A_FUNCINFO <<
"No compacting in PolyhedralMesh"; }
1256mesh::PolyhedralMesh::
1259 m_mesh_handle._setMesh(
nullptr);
1265ITraceMng* mesh::PolyhedralMesh::
1268 return m_subdomain->traceMng();
1274MeshHandle mesh::PolyhedralMesh::
1277 return m_mesh_handle;
1282mesh::PolyhedralMesh::
1283PolyhedralMesh(ISubDomain* subdomain,
const MeshBuildInfo& mbi)
1284: EmptyMesh{ subdomain->traceMng() }
1285, m_name{ mbi.name() }
1286, m_subdomain{ subdomain }
1287, m_mesh_handle{ m_subdomain->defaultMeshHandle() }
1288, m_properties(std::make_unique<Properties>(subdomain->propertyMng(), String(
"ArcaneMeshProperties_") + m_name))
1289, m_mesh{ std::make_unique<mesh::PolyhedralMeshImpl>(m_subdomain) }
1290, m_parallel_mng{ mbi.parallelMngRef().get() }
1291, m_mesh_part_info{ makeMeshPartInfoFromParallelMng(m_parallel_mng) }
1292, m_item_type_mng(ItemTypeMng::_singleton())
1293, m_mesh_kind(mbi.meshKind())
1294, m_polyhedral_family_serializer_mng{ std::make_unique<PolyhedralFamilySerializerMng>(this) }
1295, m_initial_allocator(*this)
1296, m_variable_mng{ subdomain->variableMng() }
1297, m_mesh_checker{ this }
1298, m_internal_api{ std::make_unique<InternalApi>(this) }
1299, m_compact_mng{ std::make_unique<NoCompactionMeshCompactMng>(this) }
1300, m_mesh_utilities{ std::make_unique<UnstructuredMeshUtilities>(this) }
1301, m_mesh_exchange_mng{ std::make_unique<MeshExchangeMng>(this) }
1302, m_item_family_network{ std::make_unique<ItemFamilyNetwork>(m_trace_mng) }
1303, m_ghost_layer_mng{ std::make_unique<GhostLayerMng>(m_trace_mng) }
1305 m_mesh_handle._setMesh(
this);
1306 m_mesh_item_internal_list.mesh =
this;
1307 m_default_arcane_families.fill(
nullptr);
1313void Arcane::mesh::PolyhedralMesh::
1316 _allocateItems(item_allocation_info, ArrayView<Int32UniqueArray>{});
1321void Arcane::mesh::PolyhedralMesh::
1322allocateItems(
const Arcane::ItemAllocationInfo& item_allocation_info, ArrayView<Int32UniqueArray> family_lids)
1324 _allocateItems(item_allocation_info, family_lids);
1329void Arcane::mesh::PolyhedralMesh::
1330_allocateItems(
const Arcane::ItemAllocationInfo& item_allocation_info, ArrayView<Int32UniqueArray> family_lids)
1333 m_subdomain->traceMng()->info() <<
"--PolyhedralMesh: allocate items --";
1334 UniqueArray<PolyhedralTools::ItemLocalIds> item_local_ids(item_allocation_info.family_infos.size());
1335 auto family_index = 0;
1337 for (
auto& family_info : item_allocation_info.family_infos) {
1338 bool create_if_needed =
true;
1339 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name, create_if_needed);
1340 m_trace_mng->debug(
Trace::High) <<
"- Create items " << family_info.name;
1341 m_mesh->scheduleAddItems(item_family, family_info.item_uids, family_info.item_owners.constSmallSpan(), item_local_ids[family_index++]);
1345 for (
auto& family_info : item_allocation_info.family_infos) {
1346 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
1347 m_trace_mng->debug(
Trace::High) <<
"- Current family " << family_info.name;
1348 for (
auto& current_connected_family_info : family_info.connected_family_infos) {
1349 auto connected_family = _findItemFamily(current_connected_family_info.item_kind, current_connected_family_info.name);
1350 m_trace_mng->debug(
Trace::High) <<
"- Create connectivity " << current_connected_family_info.connectivity_name;
1352 if (!connected_family) {
1353 ARCANE_WARNING((String::format(
"Cannot find family {0} with kind {1} "
1354 "The connectivity between {1} and this family is skipped",
1355 current_connected_family_info.name,
1356 current_connected_family_info.item_kind,
1357 item_family->name())
1361 m_mesh->scheduleAddConnectivity(item_family,
1362 item_local_ids[family_index],
1363 current_connected_family_info.nb_connected_items_per_item,
1365 current_connected_family_info.connected_items_uids,
1366 current_connected_family_info.connectivity_name);
1371 m_mesh->applyScheduledOperations();
1373 for (
auto& family_info : item_allocation_info.family_infos) {
1374 if (family_info.item_kind !=
IK_Node && family_info.item_coordinates.empty()) {
1377 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
1378 if (item_family == itemFamily(
IK_Node)) {
1379 if (!m_arcane_node_coords.get()) {
1380 m_arcane_node_coords = std::make_unique<VariableNodeReal3>(VariableBuildInfo(
this, family_info.item_coordinates_variable_name));
1381 m_arcane_node_coords->setUsed(
true);
1385 auto arcane_item_coords_var_ptr = std::make_unique<VariableItemReal3>(VariableBuildInfo(
this, family_info.item_coordinates_variable_name),
1386 item_family->itemKind());
1387 arcane_item_coords_var_ptr->setUsed(
true);
1388 m_arcane_item_coords.push_back(std::move(arcane_item_coords_var_ptr));
1392 for (
auto& family : m_arcane_families) {
1393 family->endUpdate();
1399 for (
auto& family_info : item_allocation_info.family_infos) {
1400 if (family_info.item_coordinates.empty()) {
1404 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
1405 if (item_family == itemFamily(
IK_Node)) {
1406 m_mesh->scheduleSetItemCoordinates(item_family, item_local_ids[family_index], family_info.item_coordinates, *m_arcane_node_coords);
1409 m_mesh->scheduleSetItemCoordinates(item_family, item_local_ids[family_index], family_info.item_coordinates, *m_arcane_item_coords[index++].get());
1411 auto mesh_state = m_mesh->applyScheduledOperations();
1412 m_is_allocated =
true;
1414 itemTypeMng()->setMeshWithGeneralCells(
this);
1416 if (!family_lids.empty()) {
1418 ARCANE_ASSERT((family_lids.size() == item_local_ids.size()),(
"Incoherence in item number"));
1419 for (
auto& lid_array : item_local_ids) {
1420 family_lids[index].resize(lid_array.size());
1421 lid_array.fillArrayView(family_lids[index].view(), mesh_state);
1429void Arcane::mesh::PolyhedralMesh::
1430scheduleAllocateItems(
const Arcane::ItemAllocationInfo::FamilyInfo& family_info, mesh::PolyhedralTools::ItemLocalIds& item_local_ids)
1433 m_subdomain->traceMng()->info() <<
"--PolyhedralMesh: schedule allocate items --";
1435 bool create_if_needed =
true;
1436 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name, create_if_needed);
1437 m_trace_mng->debug(
Trace::High) <<
"- Current family " << family_info.name;
1438 m_trace_mng->debug(
Trace::High) <<
"- Create items ";
1439 m_mesh->scheduleAddItems(item_family, family_info.item_uids, family_info.item_owners.
constSmallSpan(), item_local_ids);
1441 for (
auto& current_connected_family_info : family_info.connected_family_infos) {
1442 auto connected_family = _findItemFamily(current_connected_family_info.item_kind, current_connected_family_info.name);
1443 m_trace_mng->debug(
Trace::High) <<
"- Create connectivity " << current_connected_family_info.connectivity_name;
1445 if (!connected_family) {
1446 ARCANE_WARNING((String::format(
"Cannot find family {0} with kind {1} "
1447 "The connectivity between {1} and this family is skipped",
1448 current_connected_family_info.name,
1449 current_connected_family_info.item_kind,
1450 item_family->name())
1454 m_mesh->scheduleUpdateConnectivity(item_family,
1456 current_connected_family_info.nb_connected_items_per_item,
1458 current_connected_family_info.connected_items_uids,
1459 current_connected_family_info.connectivity_name);
1465void Arcane::mesh::PolyhedralMesh::
1466applyScheduledAllocateItems(UniqueArray<std::shared_ptr<PolyhedralTools::ItemLocalIds>> item_lids)
1469 auto mesh_state = m_mesh->applyScheduledOperations();
1471 for (
auto item_local_ids : item_lids) {
1472 item_local_ids->m_mesh_state = std::make_shared<Neo::EndOfMeshUpdate>(mesh_state);
1476 for (
auto& family : m_arcane_families) {
1477 family->endUpdate();
1480 m_is_allocated =
true;
1482 itemTypeMng()->setMeshWithGeneralCells(
this);
1487void mesh::PolyhedralMesh::removeNeedRemoveMarkedItems()
1490 for (
auto family_index = 0 ; family_index < m_arcane_families.size(); ++family_index) {
1492 auto* family = m_arcane_families[family_index].get();
1494 items_to_remove.
reserve(family->nbItem());
1495 auto& items_map = family->itemsMap();
1496 if (items_map.count() == 0)
continue;
1497 items_map.eachItem([&](ItemBase item) {
1499 auto f = item.flags();
1502 item.toMutable().setFlags(f);
1503 items_to_remove.add(item.localId());
1506 if (!items_to_remove.empty()) {
1507 removeItems(items_to_remove,family);
1514Arcane::mesh::PolyhedralFamilySerializerMng* mesh::PolyhedralMesh::
1515polyhedralFamilySerializerMng()
1517 return m_polyhedral_family_serializer_mng.get();
1523void Arcane::mesh::PolyhedralMesh::
1526 for (
auto& family : m_arcane_families) {
1527 family->endUpdate();
1534void Arcane::mesh::PolyhedralMesh::
1535_computeFamilySynchronizeInfos()
1537 m_subdomain->traceMng()->info() <<
"Computing family synchronization information for " << name();
1538 for(
auto& family : m_arcane_families ){
1539 family->computeSynchronizeInfos();
1544 auto* var_syncer = cellFamily()->allItemsSynchronizer();
1545 Int32 iteration = m_subdomain->commonVariables().globalIteration();
1546 String file_name = String::format(
"{0}_sync_topology_iter{1}.json",name(),iteration);
1547 mesh_utils::dumpSynchronizerTopologyJSON(var_syncer,file_name);
1554void Arcane::mesh::PolyhedralMesh::
1555_notifyEndUpdateForFamilies()
1557 for(
auto& family : m_arcane_families )
1558 family->_internalApi()->notifyEndUpdateFromMesh();
1564void Arcane::mesh::PolyhedralMesh::
1565_computeGroupSynchronizeInfos()
1567 auto action = [](ItemGroup& group) {
1568 if (group.hasSynchronizer())
1569 group.synchronizer()->compute();
1572 m_trace_mng->info() <<
"Computing group synchronization information for " << name();
1573 meshvisitor::visitGroups(
this, action);
1592 return m_mesh->dimension();
1601 return m_mesh->nbNode();
1610 return m_mesh->nbEdge();
1619 return m_mesh->nbFace();
1628 return m_mesh->nbCell();
1637 return m_mesh->nbItem(ik);
1646 if (m_default_arcane_families[
IK_Node])
1647 return m_default_arcane_families[
IK_Node]->allItems();
1658 if (m_default_arcane_families[
IK_Edge])
1659 return m_default_arcane_families[
IK_Edge]->allItems();
1670 if (m_default_arcane_families[
IK_Face])
1671 return m_default_arcane_families[
IK_Face]->allItems();
1682 if (m_default_arcane_families[
IK_Cell])
1683 return m_default_arcane_families[
IK_Cell]->allItems();
1694 if (m_default_arcane_families[
IK_Node])
1695 return m_default_arcane_families[
IK_Node]->allItems().own();
1706 if (m_default_arcane_families[
IK_Edge])
1707 return m_default_arcane_families[
IK_Edge]->allItems().own();
1718 if (m_default_arcane_families[
IK_Face])
1719 return m_default_arcane_families[
IK_Face]->allItems().own();
1730 if (m_default_arcane_families[
IK_Cell])
1731 return m_default_arcane_families[
IK_Cell]->allItems().own();
1742 if (m_default_arcane_families[
IK_Cell])
1751mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1752_createItemFamily(
eItemKind ik,
const String& name)
1754 m_mesh->addFamily(ik, name);
1755 m_arcane_families.push_back(std::make_unique<PolyhedralFamily>(
this, ik, name));
1756 auto current_family = m_arcane_families.back().get();
1757 if (m_default_arcane_families[ik] ==
nullptr) {
1758 m_default_arcane_families[ik] = current_family;
1759 _updateMeshInternalList(ik);
1761 m_item_family_collection.add(current_family);
1762 current_family->build();
1763 return current_family;
1772 return _createItemFamily(ik, name);
1778void mesh::PolyhedralMesh::
1781 createItemFamily(
IK_Cell,
"CellFamily");
1782 createItemFamily(
IK_Node,
"NodeFamily");
1783 auto cell_family = m_default_arcane_families[
IK_Cell];
1784 auto node_family = m_default_arcane_families[
IK_Node];
1787 PolyhedralTools::ItemLocalIds cell_lids, node_lids;
1788 m_mesh->scheduleAddItems(cell_family, cell_uids.constView(), cell_lids);
1789 m_mesh->scheduleAddItems(node_family, node_uids.constView(), node_lids);
1792 m_mesh->scheduleAddConnectivity(cell_family, cell_lids, nb_node, node_family, node_uids, String{
"CellToNodes" });
1793 m_mesh->scheduleAddConnectivity(node_family, node_lids, 1, cell_family,
1794 node_cells_uids, String{
"NodeToCells" });
1795 m_mesh->applyScheduledOperations();
1796 cell_family->endUpdate();
1797 node_family->endUpdate();
1810 for (
auto ik = 0; ik < NB_ITEM_KIND; ++ik) {
1813 m_empty_arcane_families[ik] = std::make_unique<mesh::PolyhedralFamily>(
this, (
eItemKind)ik, name);
1814 m_default_arcane_families[ik] = m_empty_arcane_families[ik].get();
1825 return m_default_arcane_families[
IK_Node];
1834 return m_default_arcane_families[
IK_Edge];
1843 return m_default_arcane_families[
IK_Face];
1852 return m_default_arcane_families[
IK_Cell];
1855void mesh::PolyhedralMesh::
1860 m_mesh_item_internal_list.cells = m_default_arcane_families[kind]->itemsInternal();
1861 m_mesh_item_internal_list._internalSetCellSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1864 m_mesh_item_internal_list.faces = m_default_arcane_families[kind]->itemsInternal();
1865 m_mesh_item_internal_list._internalSetFaceSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1868 m_mesh_item_internal_list.edges = m_default_arcane_families[kind]->itemsInternal();
1869 m_mesh_item_internal_list._internalSetEdgeSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1872 m_mesh_item_internal_list.nodes = m_default_arcane_families[kind]->itemsInternal();
1873 m_mesh_item_internal_list._internalSetNodeSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1885mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1888 return m_default_arcane_families[ik];
1897 return _itemFamily(ik);
1906 return m_item_type_mng;
1912mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1913_findItemFamily(
eItemKind ik,
const String& name,
bool create_if_needed)
1916 auto found_family = _itemFamily(ik);
1918 if (found_family->name() == name)
1919 return found_family;
1921 for (
auto& family : m_arcane_families) {
1922 if (family->itemKind() == ik && family->name() == name)
1923 return family.get();
1925 if (!create_if_needed)
1927 return _createItemFamily(ik, name);
1936 ARCANE_UNUSED(register_modifier_if_created);
1937 return _findItemFamily(ik, name, create_if_needed);
1943mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1946 return m_default_arcane_families[ik];
1955 ARCANE_ASSERT(m_arcane_node_coords, (
"Node coordinates not yet loaded."));
1956 return *m_arcane_node_coords;
1966 for (
auto& family : m_arcane_families) {
1967 group = family->findGroup(name);
1980 m_all_groups.
clear();
1981 for (
auto& family : m_arcane_families) {
1983 m_all_groups.add(*i_group);
1985 return m_all_groups;
1994 for (
auto& family : m_arcane_families) {
1995 family->destroyGroups();
2005 return m_item_family_collection;
2014 return m_internal_api.get();
2023 return m_compact_mng.get();
2029void mesh::PolyhedralMesh::
2032 ARCANE_ASSERT((unique_ids.size() == local_ids.size()),(
"local and unique ids arrays must have same size"))
2033 auto* item_family = _findItemFamily(ik, family_name, false);
2034 PolyhedralTools::ItemLocalIds item_local_ids;
2035 m_mesh->scheduleAddItems(item_family, unique_ids, item_local_ids);
2036 auto mesh_state = m_mesh->applyScheduledOperations();
2037 item_local_ids.fillArrayView(local_ids, mesh_state);
2046 ARCANE_ASSERT((unique_ids.size() == local_ids.size() && (unique_ids.size()== owners.size())),(
"local/unique ids and owners arrays must have same size"))
2047 auto* item_family = _findItemFamily(ik, family_name, false);
2048 PolyhedralTools::ItemLocalIds item_local_ids;
2049 m_mesh->scheduleAddItems(item_family, unique_ids, owners,item_local_ids);
2050 auto mesh_state = m_mesh->applyScheduledOperations();
2051 item_local_ids.fillArrayView(local_ids, mesh_state);
2060 auto* item_family = _findItemFamily(ik, family_name,
false);
2062 ARCANE_FATAL(
"ItemFamily with name {0} and kind {1} does not exist in the mesh.", family_name,ik);
2064 m_mesh->scheduleRemoveItems(item_family, local_ids);
2065 m_mesh->applyScheduledOperations();
2071void mesh::PolyhedralMesh::
2074 if (local_ids.empty())
return;
2076 ARCANE_FATAL(
"Invalid IItemFamily passed to removeItems.");
2078 removeItems(local_ids, family->itemKind(), family->name());
2087 addItems(nodes_uid, nodes_lid,
IK_Node, nodeFamily()->name());
2096 m_trace_mng->info() <<
"PolyhedralMesh::_exchangeItems() do_compact?=" <<
"false"
2097 <<
" nb_exchange=" << 0 <<
" version=" << 0;
2100 if (!check_exchange.null()) {
2101 m_mesh_checker.checkGhostCells();
2102 m_trace_mng->pwarning() <<
"CHECKING SYNCHRONISATION !";
2103 m_mesh_checker.checkVariablesSynchronization();
2104 m_mesh_checker.checkItemGroupsSynchronization();
2106 if (checkLevel() >= 2)
2107 m_mesh_checker.checkValidMesh();
2108 else if (checkLevel() >= 1)
2109 m_mesh_checker.checkValidConnectivity();
2115void mesh::PolyhedralMesh::
2120 Trace::Setter mci(traceMng(), _className());
2125 if (arcane_debug_load_balancing) {
2126 for (
auto& family : m_arcane_families) {
2127 family->itemsNewOwner().checkIfSync();
2131 IMeshExchanger* iexchanger = m_mesh_exchange_mng->beginExchange();
2134 if (iexchanger->computeExchangeInfos()) {
2135 m_trace_mng->pwarning() <<
"No load balance is performed";
2136 m_mesh_exchange_mng->endExchange();
2141 iexchanger->processExchange();
2144 iexchanger->removeNeededItems();
2149 auto action = [](ItemGroup& group) {
2150 if (group.internal()->hasComputeFunctor() || group.isLocalToSubDomain())
2153 group.internal()->removeSuppressedItems();
2155 meshvisitor::visitGroups(
this, action);
2158 iexchanger->allocateReceivedItems();
2161 _endUpdateFamilies();
2162 _computeFamilySynchronizeInfos();
2165 iexchanger->updateItemGroups();
2167 _computeGroupSynchronizeInfos();
2169 iexchanger->updateVariables();
2173 m_mesh_checker.checkMeshFromReferenceFile();
2174 _notifyEndUpdateForFamilies();
2176 iexchanger->finalizeExchange();
2178 m_mesh_exchange_mng->endExchange();
2194 auto want_dump =
false;
2195 auto need_compact =
false;
2196 m_trace_mng->info(4) <<
"DynamicMesh::prepareForDump() name=" << name()
2197 <<
" need_compact?=" << need_compact
2198 <<
" want_dump?=" << want_dump
2199 <<
" timestamp=" << 0;
2203 m_mesh_events.eventObservable(t).notify(MeshEventArgs(
this, t));
2208 for (
auto& family : m_arcane_families) {
2209 family->prepareForDump();
2215 m_mesh_events.eventObservable(t).notify(MeshEventArgs(
this, t));
2296 return m_mesh_utilities.get();
2305 IItemFamily* item_family = _itemFamily(ik);
2307 return item_family->itemsNewOwner();
2316 return m_mesh_checker.checkLevel();
2325 return m_item_family_network.get();
2334 return m_ghost_layer_mng.get();
2343 return m_internal_api.get();
2349mesh::PolyhedralMeshImpl* mesh::PolyhedralMesh::_impl()
2351 return m_mesh.get();
2367namespace Arcane::mesh
2376Arcane::mesh::PolyhedralMesh::
2377~PolyhedralMesh() =
default;
2382Arcane::mesh::PolyhedralMesh::
2384: EmptyMesh{ subdomain->traceMng() }
2385, m_subdomain{ subdomain }
2387, m_mesh_kind(mbi.meshKind())
2394void Arcane::mesh::PolyhedralMesh::
2395read([[maybe_unused]]
const String& filename)
2403void Arcane::mesh::PolyhedralMesh::
2404allocateItems(
const Arcane::ItemAllocationInfo& item_allocation_info)
2406 ARCANE_UNUSED(item_allocation_info);
2421class ARCANE_MESH_EXPORT PolyhedralMeshFactory
2440 static String name() {
return "ArcanePolyhedralMeshFactory"; }
2450#if ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
2458 return PolyhedralMeshFactory::name();
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_CHECK_POINTER2(ptr, text)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Ce fichier contient les différentes fabriques de services et macro pour enregistrer les services.
#define ARCANE_SERVICE_INTERFACE(ainterface)
Macro pour déclarer une interface lors de l'enregistrement d'un service.
AbstractService(const ServiceBuildInfo &)
Constructeur à partir d'un ServiceBuildInfo.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
SmallSpan< const T > constSmallSpan() const
Vue immutable sur ce tableau.
void clear()
Supprime tous les éléments de la collection.
EnumeratorT< ItemGroup > Enumerator
virtual NodeGroup ownNodes()=0
Groupe de tous les noeuds propres au domaine.
virtual IItemFamily * nodeFamily()=0
Retourne la famille des noeuds.
virtual String name() const =0
Nom du maillage.
virtual Integer nbCell()=0
Nombre de mailles du maillage.
virtual CellGroup ownCells()=0
Groupe de toutes les mailles propres au domaine.
virtual FaceGroup ownFaces()=0
Groupe de toutes les faces propres au domaine.
virtual FaceGroup allFaces()=0
Groupe de toutes les faces.
virtual Integer nbEdge()=0
Nombre d'arêtes du maillage.
virtual IItemFamily * itemFamily(eItemKind ik)=0
Retourne la famille d'entité de type ik.
virtual IItemFamily * edgeFamily()=0
Retourne la famille des arêtes.
virtual Integer nbNode()=0
Nombre de noeuds du maillage.
virtual FaceGroup outerFaces()=0
Groupe de toutes les faces sur la frontière.
virtual IItemFamily * findItemFamily(eItemKind ik, const String &name, bool create_if_needed=false, bool register_modifier_if_created=false)=0
Retourne la famille de nom name.
virtual Integer nbItem(eItemKind ik)=0
Nombre d'éléments du genre ik.
virtual Integer dimension()=0
Dimension du maillage (1D, 2D ou 3D).
virtual IItemFamily * faceFamily()=0
Retourne la famille des faces.
virtual EdgeGroup ownEdges()=0
Groupe de toutes les arêtes propres au domaine.
virtual NodeGroup allNodes()=0
Groupe de tous les noeuds.
virtual CellGroup allCells()=0
Groupe de toutes les mailles.
virtual Integer nbFace()=0
Nombre de faces du maillage.
virtual IItemFamily * cellFamily()=0
Retourne la famille des mailles.
virtual IItemFamily * createItemFamily(eItemKind ik, const String &name)=0
Créé une famille de particule de nom name.
virtual EdgeGroup allEdges()=0
Groupe de toutes les arêtes.
Interface du service gérant la lecture d'un maillage.
Interface du gestionnaire des maillages.
virtual IVariableMng * variableMng() const =0
Gestionnaire de variables associé à ce gestionnaire.
virtual void addNodes(Int64ConstArrayView nodes_uid, Int32ArrayView nodes_lid=Int32ArrayView())=0
Ajoute des noeuds.
virtual IMeshModifierInternal * _modifierInternalApi()=0
API interne à Arcane.
virtual VariableNodeReal3 & nodesCoordinates()=0
Coordonnées des noeuds.
virtual FaceGroup outerActiveFaces()=0
Groupe de toutes les faces actives sur la frontière.
virtual void destroyGroups()=0
Détruit tous les groupes de toutes les familles.
virtual IMeshUtilities * utilities()=0
Interface des fonctions utilitaires associée.
virtual CellGroup allLevelCells(const Integer &level)=0
Groupe de toutes les mailles de niveau level.
virtual FaceGroup innerActiveFaces()=0
Groupe de toutes les faces actives.
virtual ItemGroupCollection groups()=0
Liste des groupes.
virtual ItemGroup findGroup(const String &name)=0
Retourne le groupe de nom name ou le groupe nul s'il n'y en a pas.
virtual String factoryName() const =0
Nom de la fabrique utilisée pour créer le maillage.
virtual IMeshInternal * _internalApi()=0
API interne à Arcane.
virtual CellGroup allActiveCells()=0
virtual FaceGroup allActiveFaces()=0
Groupe de toutes les faces actives.
virtual ItemTypeMng * itemTypeMng() const =0
Gestionnaire de types d'entités associé
virtual void prepareForDump()=0
Prépare l'instance en vue d'une protection.
virtual CellGroup ownActiveCells()=0
Groupe de toutes les mailles actives et propres au domaine.
virtual CellGroup ownLevelCells(const Integer &level)=0
Groupe de toutes les mailles propres de niveau level.
virtual IGhostLayerMng * ghostLayerMng() const =0
Gestionnare de couche fantômes associé
virtual FaceGroup ownActiveFaces()=0
Groupe de toutes les faces actives propres au domaine.
virtual IItemFamilyNetwork * itemFamilyNetwork()=0
Interface du réseau de familles (familles connectées)
virtual IMeshCompactMng * _compactMng()=0
virtual Integer checkLevel() const =0
Niveau actuel de vérification.
virtual void exchangeItems()=0
Change les sous-domaines propriétaires des entités.
virtual VariableItemInt32 & itemsNewOwner(eItemKind kind)=0
Variable contenant l'identifiant du sous-domaine propriétaire.
Interface du gestionnaire d'un sous-domaine.
virtual ISubDomain * internalSubDomain() const =0
Fonction interne temporaire pour récupérer le sous-domaine.
virtual IVariableMngInternal * _internalApi()=0
API interne à Arcane.
@ II_NeedRemove
L'entité doit être supprimé
@ II_Suppressed
L'entité vient d'être supprimée.
FaceGroup activeFaceGroup() const
Groupe des faces actives.
FaceGroup innerActiveFaceGroup() const
Groupe des faces internes des éléments de ce groupe.
FaceGroup ownActiveFaceGroup() const
Groupe des faces actives propres au domaine des éléments de ce groupe.
CellGroup levelCellGroup(const Integer &level) const
Groupe des mailles de niveau l des éléments de ce groupe.
CellGroup ownActiveCellGroup() const
Groupe des mailles propres actives des éléments de ce groupe.
CellGroup ownLevelCellGroup(const Integer &level) const
Groupe des mailles propres de niveau l des éléments de ce groupe.
FaceGroup outerActiveFaceGroup() const
Groupe des faces externes actives des éléments de ce groupe.
CellGroup activeCellGroup() const
AMR.
FaceGroup outerFaceGroup() const
Groupe des faces externes des éléments de ce groupe.
Paramètres nécessaires à la construction d'un maillage.
void build() override
Construction de niveau build du service.
IPrimaryMesh * createMesh(IMeshMng *mm, const MeshBuildInfo &build_info) override
Créé un maillage avec les informations de build_info.
Structure contenant les informations pour créer un service.
Propriétés de création d'un service.
Chaîne de caractères unicode.
void endUpdate()
Notifie l'instance de la fin de la modification du maillage.
ItemVectorViewT< DoF > DoFVectorView
Vue sur un vecteur de degre de liberte.
ItemGroupT< Cell > CellGroup
Groupe de mailles.
ItemGroupT< Face > FaceGroup
Groupe de faces.
ItemGroupT< Edge > EdgeGroup
Groupe d'arêtes.
ItemGroupT< Node > NodeGroup
Groupe de noeuds.
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro pour enregistrer un service.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
ItemVariableScalarRefT< Int32 > VariableItemInt32
Grandeur de type entier 32 bits.
Array< Int64 > Int64Array
Tableau dynamique à une dimension d'entiers 64 bits.
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
Collection< ItemGroup > ItemGroupCollection
Collection de groupes d'éléments du maillage.
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Collection< IItemFamily * > ItemFamilyCollection
Collection de familles d'entités.
Collection< IItemFamily * > IItemFamilyCollection
Collection de familles d'entités.
@ ST_Application
Le service s'utilise au niveau de l'application.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
eMeshEventType
Evènements générés par IMesh.
@ EndPrepareDump
Evènement envoyé à la fin de prepareForDump()
@ BeginPrepareDump
Evènement envoyé au début de prepareForDump()
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
eItemKind
Genre d'entité de maillage.
@ IK_Particle
Entité de maillage de genre particule.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Unknown
Entité de maillage de genre inconnu ou non initialisé
@ IK_Face
Entité de maillage de genre face.
@ IK_DoF
Entité de maillage de genre degre de liberte.
@ IK_Edge
Entité de maillage de genre arête.
ARCCORE_SERIALIZE_EXPORT Ref< ISerializer > createSerializer()
Créé une instance de ISerializer.
const char * itemKindName(eItemKind kind)
Nom du genre d'entité.
Span< const Int32 > Int32ConstSpan
Vue en lecture seule d'un tableau à une dimension d'entiers 32 bits.
std::int32_t Int32
Type entier signé sur 32 bits.