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
108 namespace PolyhedralTools
112 Neo::FutureItemRange m_future_items;
113 std::shared_ptr<Neo::EndOfMeshUpdate> m_mesh_state =
nullptr;
117 void fillArrayView(Int32ArrayView local_ids, Neo::EndOfMeshUpdate mesh_state)
119 auto lids = m_future_items.get(mesh_state);
120 if (local_ids.size() != lids.size())
121 ARCANE_FATAL(
"Cannot fill local_ids view, its size {0} != {1} (added item size)", local_ids.size(), m_future_items.size());
122 std::copy(lids.begin(), lids.end(), local_ids.begin());
125 void fillArrayView(Int32ArrayView local_ids)
127 ARCANE_CHECK_POINTER2(m_mesh_state.get(),
"PolyhedralTools::ItemLocalIds must have a valid end of mesh state");
128 fillArrayView(local_ids, *m_mesh_state);
131 Integer size() const noexcept {
return m_future_items.size(); }
132 bool isFilled() const noexcept {
return m_mesh_state.get() !=
nullptr; };
133 void checkIsFilled(String error_message)
const noexcept
136 ARCANE_FATAL(
"Item local ids are not filled." + error_message);
138 friend class mesh::PolyhedralMeshImpl;
139 friend class mesh::PolyhedralMesh;
146 class PolyhedralFamilySerializer;
147 class PolyhedralFamilySerializerMng :
public IItemFamilySerializerMngInternal
149 PolyhedralMesh* m_mesh =
nullptr;
151 UniqueArray<PolyhedralFamilySerializer*> m_serializers;
155 explicit PolyhedralFamilySerializerMng(PolyhedralMesh* mesh)
161 void addSerializer(PolyhedralFamilySerializer* serializer)
163 m_serializers.push_back(serializer);
167 void finalizeItemAllocation()
override;
173 class PolyhedralFamilySerializer :
public IItemFamilySerializer
177 PolyhedralMesh* m_mesh =
nullptr;
178 IItemFamily* m_family =
nullptr;
179 PolyhedralFamilySerializerMng* m_mng =
nullptr;
180 ItemData m_item_data;
181 UniqueArray<Int32Array*> m_deserialized_lids_array;
182 UniqueArray<std::shared_ptr<PolyhedralTools::ItemLocalIds>> m_future_item_lids_array;
183 ItemAllocationInfo::FamilyInfo m_family_info;
187 explicit PolyhedralFamilySerializer(PolyhedralMesh* mesh, IItemFamily* family, PolyhedralFamilySerializerMng* mng)
193 PolyhedralFamilySerializer(
const PolyhedralFamilySerializer&) =
delete;
194 PolyhedralFamilySerializer& operator=(
const PolyhedralFamilySerializer&) =
delete;
196 ArrayView<std::shared_ptr<PolyhedralTools::ItemLocalIds>> itemLidsArray() {
return m_future_item_lids_array.view(); }
200 void serializeItems(ISerializer* buf, Int32ConstArrayView items_local_ids)
override;
201 void deserializeItems(ISerializer* buf, Int32Array* items_local_ids)
override;
206 m_deserialized_lids_array.clear();
207 m_future_item_lids_array.clear();
208 m_family_info.clear();
211 void fillDeserializedLocalIds()
214 for (
auto item_lids_array : m_deserialized_lids_array) {
215 auto& future_item_lids = m_future_item_lids_array[index];
216 future_item_lids->checkIsFilled(
"Cannot fill deserialized local ids, future item local ids are not filled.");
217 item_lids_array->resize(future_item_lids->size());
218 future_item_lids->fillArrayView(item_lids_array->view());
224 IItemFamilySerializerMngInternal* mng()
230 void serializeItemRelations(ISerializer*, Int32ConstArrayView)
override {}
231 void deserializeItemRelations(ISerializer*, Int32Array*)
override {}
235 void _fillItemData(Int32ConstArrayView items_local_ids);
236 void _fillItemFamilyInfo(
const ItemData& item_data,
237 StringConstArrayView connected_family_names,
238 StringConstArrayView connectivity_names)
241 m_family_info.clear();
243 if (m_family != item_data.itemFamily())
244 ARCANE_FATAL(
"PolyhedralFamilySerializer: Family mismatch. Synchronized family is {0} and serialized family is {1}",
245 m_family->name(), item_data.itemFamily()->name());
246 m_family_info.name = item_data.itemFamily()->name();
247 m_family_info.item_kind = item_data.itemFamily()->itemKind();
248 auto& connected_family_infos = m_family_info.connected_family_infos;
249 auto nb_connected_family = item_data.itemInfos()[0];
250 connected_family_infos.resize(nb_connected_family);
251 auto& item_uids = m_family_info._item_uids_data;
252 item_uids.reserve(item_data.nbItems());
253 auto item_infos = item_data.itemInfos();
254 for (
auto connected_family_info : connected_family_infos) {
255 connected_family_info._connected_items_uids_data.reserve(4 * item_uids.size());
256 connected_family_info._nb_connected_items_per_item_data.reserve(item_uids.size());
258 for (
auto index = 1; index < item_infos.size();) {
259 item_uids.push_back(item_infos[index + 1]);
261 for (
auto connected_family_index = 0; connected_family_index < nb_connected_family; ++connected_family_index) {
263 auto* connected_family = m_mesh->findItemFamily(family_kind, connected_family_names[connected_family_index],
false,
false);
265 auto& current_connected_family_infos = connected_family_infos[connected_family_index];
266 current_connected_family_infos.item_kind = family_kind;
267 current_connected_family_infos.name = connected_family->name();
268 current_connected_family_infos.connectivity_name = connectivity_names[connected_family_index];
270 auto nb_connected_items =
static_cast<Int32
>(item_infos[index]);
272 current_connected_family_infos._nb_connected_items_per_item_data.push_back(nb_connected_items);
273 auto real_nb_connected_items = nb_connected_items;
274 if (m_family->itemKind() == IK_Face && connected_family->itemKind() == IK_Cell)
275 real_nb_connected_items = 2;
276 current_connected_family_infos._connected_items_uids_data.addRange(item_infos.subView(index, real_nb_connected_items));
277 index += real_nb_connected_items;
281 m_family_info.updateViewsFromInternalData();
283 m_family_info.item_owners = item_data.itemOwners();
286 IItemFamily* family()
const override
295 void PolyhedralFamilySerializerMng::
296 finalizeItemAllocation()
298 UniqueArray<std::shared_ptr<PolyhedralTools::ItemLocalIds>> future_item_lids;
299 for (
auto family_serializer : m_serializers) {
300 for (
auto& item_lids : family_serializer->itemLidsArray()) {
301 future_item_lids.push_back(item_lids);
304 m_mesh->applyScheduledAllocateItems(future_item_lids);
305 for (
auto family_serializer : m_serializers) {
306 family_serializer->fillDeserializedLocalIds();
308 m_serializers.clear();
314 class PolyhedralFamilyPolicyMng
315 :
public ItemFamilyPolicyMng
319 PolyhedralFamilyPolicyMng(PolyhedralMesh* mesh, ItemFamily* family)
320 : ItemFamilyPolicyMng(family)
329 return new PolyhedralFamilySerializer(m_mesh, m_family, m_mesh->polyhedralFamilySerializerMng());
334 PolyhedralMesh* m_mesh =
nullptr;
335 ItemFamily* m_family =
nullptr;
341class PolyhedralFamily
345 ItemSharedInfoWithType* m_shared_info =
nullptr;
349 PolyhedralMesh* m_mesh =
nullptr;
353 inline static const String m_arcane_item_lids_property_name{
"Arcane_Item_Lids" };
354 inline static const String m_arcane_remove_item_property_name{
"Arcane_Remove_Items" };
358 PolyhedralFamily(PolyhedralMesh* mesh, eItemKind ik, String name)
359 : ItemFamily(mesh, ik, name)
365 void preAllocate(Integer nb_item)
367 Integer nb_hash = itemsMap().nbBucket();
368 Integer wanted_size = 2 * (nb_item + nbItem());
369 if (nb_hash < wanted_size)
370 itemsMap().resize(wanted_size,
true);
371 m_empty_connectivity_indexes.resize(nb_item + nbItem(), 0);
372 m_empty_connectivity_nb_item.resize(nb_item + nbItem(), 0);
373 _updateEmptyConnectivity();
376 ItemInternal* _allocItem(
const Int64 uid,
const Int32 owner)
379 ItemInternal* item_internal = ItemFamily::_findOrAllocOne(uid, need_alloc);
381 item_internal->setUniqueId(uid);
383 _allocateInfos(item_internal, uid, m_shared_info);
385 item_internal->setOwner(owner, m_sub_domain_id);
386 return item_internal;
389 void addItems(Int64ConstSmallSpan uids, Int32ArrayView items)
392 addItems(uids, items, owners);
395 void addItems(Int64ConstSmallSpan uids, Int32ArrayView items, Int32ConstArrayView owners)
399 ARCANE_ASSERT((uids.size() == items.size()), (
"one must have items.size==uids.size()"));
400 preAllocate(uids.size());
402 for (
auto uid : uids) {
403 ItemInternal* ii = _allocItem(uid,owners[index]);
404 items[index] = ii->localId();
407 m_need_prepare_dump =
true;
408 _updateItemInternalList();
411 void removeItems(Int32ConstArrayView local_ids)
413 _removeMany(local_ids);
416 void _updateItemInternalList()
418 switch (itemKind()) {
420 m_item_internal_list->cells = _itemsInternal();
423 m_item_internal_list->faces = _itemsInternal();
426 m_item_internal_list->edges = _itemsInternal();
429 m_item_internal_list->nodes = _itemsInternal();
438 void _updateEmptyConnectivity()
440 auto item_internal_connectivity_list = itemInternalConnectivityList();
441 for (
auto item_kind = 0; item_kind < ItemInternalConnectivityList::MAX_ITEM_KIND; ++item_kind) {
442 item_internal_connectivity_list->_setConnectivityList(item_kind, m_empty_connectivity);
443 item_internal_connectivity_list->_setConnectivityIndex(item_kind, m_empty_connectivity_indexes);
444 item_internal_connectivity_list->_setConnectivityNbItem(item_kind, m_empty_connectivity_nb_item);
449 IDoFFamily* toDoFFamily()
override
455 void build()
override
458 m_sub_domain_id = subDomain()->subDomainId();
459 ItemTypeMng* itm = m_mesh->itemTypeMng();
460 ItemTypeInfo* dof_type_info = itm->typeFromId(IT_NullType);
461 m_shared_info = _findSharedInfo(dof_type_info);
462 _updateEmptyConnectivity();
463 ItemFamily::setPolicyMng(
new PolyhedralFamilyPolicyMng{ m_mesh,
this });
466 void addGhostItems(Int64ConstArrayView unique_ids, Int32ArrayView items,Int32ConstArrayView owners)
override
468 auto* polyhedral_mesh_modifier = m_mesh->_internalApi()->polyhedralMeshModifier();
470 polyhedral_mesh_modifier->addItems(unique_ids, items, owners, ItemFamily::itemKind(), name());
474 String name()
const override {
return ItemFamily::name(); }
475 String fullName()
const override {
return ItemFamily::fullName(); }
476 Integer nbItem()
const override {
return ItemFamily::nbItem(); }
477 ItemGroup allItems()
const override {
return ItemFamily::allItems(); }
478 void endUpdate()
override
480 return ItemFamily::endUpdate();
482 IItemFamily* itemFamily()
override {
return this; }
484 DoFVectorView addDoFs(Int64ConstArrayView dof_uids, Int32ArrayView dof_lids)
override
486 auto* polyhedral_mesh_modifier = m_mesh->_internalApi()->polyhedralMeshModifier();
488 polyhedral_mesh_modifier->addItems(dof_uids, dof_lids, ItemFamily::itemKind(), name());
489 return ItemFamily::view(dof_lids);
492 DoFVectorView addGhostDoFs(Int64ConstArrayView dof_uids, Int32ArrayView dof_lids,
493 Int32ConstArrayView owners)
override
495 addGhostItems(dof_uids, dof_lids, owners);
496 return ItemFamily::view(dof_lids);
499 void removeDoFs(Int32ConstArrayView items_local_id)
override
501 auto* mesh_modifier = m_mesh->_internalApi()->polyhedralMeshModifier();
502 mesh_modifier->removeItems(items_local_id, ItemFamily::itemKind(), m_name);
527 class PolyhedralMeshImpl
529 ISubDomain* m_subdomain;
530 Neo::Mesh m_mesh{
"Test" };
532 template <eItemKind IK>
535 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_None;
540 static Neo::ItemKind itemKindArcaneToNeo(eItemKind ik)
544 return Neo::ItemKind::IK_Cell;
546 return Neo::ItemKind::IK_Face;
548 return Neo::ItemKind::IK_Edge;
550 return Neo::ItemKind::IK_Node;
552 return Neo::ItemKind::IK_Dof;
555 return Neo::ItemKind::IK_None;
557 return Neo::ItemKind::IK_Node;
560 static eItemKind itemKindNeoToArcane(Neo::ItemKind ik)
563 case Neo::ItemKind::IK_Cell:
565 case Neo::ItemKind::IK_Face:
567 case Neo::ItemKind::IK_Edge:
569 case Neo::ItemKind::IK_Node:
571 case Neo::ItemKind::IK_Dof:
573 case Neo::ItemKind::IK_None:
581 explicit PolyhedralMeshImpl(ISubDomain* subDomain)
582 : m_subdomain(subDomain)
583 , m_mesh(String::format(subDomain->defaultMeshHandle().meshName(),
"Polyhedral").localstr(),subDomain->parallelMng()->commRank())
588 String name()
const {
return m_mesh.name(); }
590 Integer dimension()
const {
return m_mesh.dimension(); }
592 Integer nbNode()
const {
return m_mesh.nbNodes(); }
593 Integer nbEdge()
const {
return m_mesh.nbEdges(); }
594 Integer nbFace()
const {
return m_mesh.nbFaces(); }
595 Integer nbCell()
const {
return m_mesh.nbCells(); }
596 Integer nbItem(eItemKind ik)
const {
return m_mesh.nbItems(itemKindArcaneToNeo(ik)); }
598 SmallSpan<const Neo::Mesh::Connectivity> connectivities(IItemFamily* source_family)
600 auto& neo_source_family = m_mesh.findFamily(itemKindArcaneToNeo(source_family->itemKind()), source_family->name().localstr());
601 auto connectivities = m_mesh.getConnectivities(neo_source_family);
602 return { connectivities.begin(), connectivities.size() };
605 static void _setFaceInfos(Int32 mod_flags, Face& face)
607 Int32 face_flags = face.itemBase().flags();
608 face_flags &= ~ItemFlags::II_InterfaceFlags;
609 face_flags |= mod_flags;
610 face.mutableItemBase().setFlags(face_flags);
615 void addFamily(eItemKind ik,
const String& name)
617 m_mesh.addFamily(itemKindArcaneToNeo(ik), name.localstr());
622 void scheduleAddItems(PolyhedralFamily* arcane_item_family,
623 Int64ConstSmallSpan uids,
624 PolyhedralTools::ItemLocalIds& item_local_ids)
626 scheduleAddItems(arcane_item_family, uids, Int32ConstSmallSpan{}, item_local_ids);
631 void scheduleAddItems(PolyhedralFamily* arcane_item_family,
632 Int64ConstSmallSpan uids,
633 Int32ConstSmallSpan owners,
634 PolyhedralTools::ItemLocalIds& item_local_ids)
636 auto& added_items = item_local_ids.m_future_items;
637 auto& item_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_item_family->itemKind()),
638 arcane_item_family->name().localstr());
639 m_mesh.scheduleAddItems(item_family, std::vector<Int64>{ uids.begin(), uids.end() }, added_items);
641 auto& mesh_graph = m_mesh.internalMeshGraph();
642 item_family.addMeshScalarProperty<Neo::utils::Int32>(PolyhedralFamily::m_arcane_item_lids_property_name.localstr());
644 UniqueArray<Int64> uids_copy(uids);
645 UniqueArray<Int32> owners_copy(owners);
646 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ item_family, item_family.lidPropName() },
647 Neo::MeshKernel::OutProperty{ item_family, PolyhedralFamily::m_arcane_item_lids_property_name.localstr() },
648 "AddArcaneItems"+std::string{arcane_item_family->name().localstr()},
649 [arcane_item_family, uids_local=std::move(uids_copy), &added_items, owners_local=std::move(owners_copy)]
650 ([[maybe_unused]] Neo::ItemLidsProperty
const& lids_property,
651 Neo::MeshScalarPropertyT<Neo::utils::Int32>&) {
652 auto new_items_lids{added_items.new_items.localIds()};
653 Int32ConstSpan neo_items{ new_items_lids.data(),
static_cast<Int32
>(new_items_lids.size()) };
654 UniqueArray<Int32> arcane_items(added_items.new_items.size());
655 if (owners_local.empty())
656 arcane_item_family->addItems(uids_local, arcane_items);
658 arcane_item_family->addItems(uids_local, arcane_items, Int32ConstArrayView{ owners_local.size(), owners_local.data() });
660 if (!arcane_items.size() == added_items.new_items.size())
661 arcane_item_family->traceMng()->fatal() <<
"Inconsistent item lids generation between Arcane and Neo, nb items Neo "
662 << added_items.new_items.size() <<
" nb items Arcane " << arcane_items.size();
663 if (!std::equal(added_items.new_items.begin(), added_items.new_items.end(), arcane_items.begin())) {
664 arcane_item_family->traceMng()->info() <<
"Arcane Items " << arcane_items;
665 std::cout <<
"Neo Items ";
666 std::ranges::copy(neo_items,std::ostream_iterator<int>(std::cout,
" "));
668 arcane_item_family->traceMng()->fatal() <<
"Inconsistent item lids generation between Arcane and Neo in ItemFamily " << arcane_item_family->name();
675 void scheduleRemoveItems(PolyhedralFamily* arcane_item_family,
676 Int32ConstArrayView local_ids)
678 auto& item_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_item_family->itemKind()),
679 arcane_item_family->name().localstr());
680 Neo::ItemRange removed_items{ Neo::ItemLocalIds{ { local_ids.begin(), local_ids.end() }, 0, 0 } };
681 m_mesh.scheduleRemoveItems(item_family, removed_items);
683 auto& mesh_graph = m_mesh.internalMeshGraph();
684 item_family.addMeshScalarProperty<Neo::utils::Int32>(PolyhedralFamily::m_arcane_remove_item_property_name.localstr());
685 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ item_family, m_mesh._removeItemPropertyName(item_family) },
686 Neo::MeshKernel::OutProperty{ item_family, PolyhedralFamily::m_arcane_remove_item_property_name.localstr() },
687 "RemoveArcaneFamily"+std::string{arcane_item_family->name().localstr()},
688 [arcane_item_family, local_ids](Neo::MeshScalarPropertyT<Neo::utils::Int32>
const&,
689 Neo::MeshScalarPropertyT<Neo::utils::Int32>&) {
690 arcane_item_family->removeItems(local_ids);
696 void scheduleAddConnectivity(PolyhedralFamily* arcane_source_item_family,
697 PolyhedralTools::ItemLocalIds& source_items,
698 Integer nb_connected_items_per_item,
699 PolyhedralFamily* arcane_target_item_family,
700 Int64ConstArrayView target_items_uids,
704 _scheduleAddConnectivity(arcane_source_item_family,
706 nb_connected_items_per_item,
707 arcane_target_item_family,
714 void scheduleAddConnectivity(PolyhedralFamily* arcane_source_item_family,
715 PolyhedralTools::ItemLocalIds& source_items,
716 Int32ConstSmallSpan nb_connected_items_per_item,
717 PolyhedralFamily* arcane_target_item_family,
718 Int64ConstSmallSpan target_items_uids,
719 String
const& connectivity_name)
721 _scheduleAddConnectivity(arcane_source_item_family,
723 std::vector<Int32>{ nb_connected_items_per_item.begin(), nb_connected_items_per_item.end() },
724 arcane_target_item_family,
732 void scheduleUpdateConnectivity(PolyhedralFamily* arcane_source_item_family,
733 PolyhedralTools::ItemLocalIds& source_items,
734 Integer nb_connected_items_per_item,
735 PolyhedralFamily* arcane_target_item_family,
736 Int64ConstArrayView target_items_uids,
740 _scheduleAddConnectivity(arcane_source_item_family,
742 nb_connected_items_per_item,
743 arcane_target_item_family,
746 Neo::Mesh::ConnectivityOperation::Modify);
751 void scheduleUpdateConnectivity(PolyhedralFamily* arcane_source_item_family,
752 PolyhedralTools::ItemLocalIds& source_items,
753 Int32ConstSmallSpan nb_connected_items_per_item,
754 PolyhedralFamily* arcane_target_item_family,
755 Int64ConstSmallSpan target_items_uids,
756 String
const& connectivity_name)
758 _scheduleAddConnectivity(arcane_source_item_family,
760 std::vector<Int32>{ nb_connected_items_per_item.begin(), nb_connected_items_per_item.end() },
761 arcane_target_item_family,
764 Neo::Mesh::ConnectivityOperation::Modify);
770 template <
typename ConnectivitySizeType>
771 void _scheduleAddConnectivity(PolyhedralFamily* arcane_source_item_family,
772 PolyhedralTools::ItemLocalIds& source_items,
773 ConnectivitySizeType&& nb_connected_items_per_item,
774 PolyhedralFamily* arcane_target_item_family,
775 Int64ConstSmallSpan target_item_uids,
776 String
const& connectivity_name,
777 Neo::Mesh::ConnectivityOperation operation = Neo::Mesh::ConnectivityOperation::Add)
780 auto& source_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_source_item_family->itemKind()),
781 arcane_source_item_family->name().localstr());
782 auto& target_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_target_item_family->itemKind()),
783 arcane_target_item_family->name().localstr());
785 UniqueArray<Int64> target_item_uids_copy(target_item_uids);
787 std::vector<Int64> target_item_uids_filtered;
788 target_item_uids_filtered.reserve(target_item_uids.size());
789 std::copy_if(target_item_uids.begin(),
790 target_item_uids.end(),
791 std::back_inserter(target_item_uids_filtered),
792 [](
auto uid) { return uid != NULL_ITEM_UNIQUE_ID; });
794 m_mesh.scheduleAddConnectivity(source_family, source_items.m_future_items, target_family,
795 std::forward<ConnectivitySizeType>(nb_connected_items_per_item),
796 std::move(target_item_uids_filtered),
797 connectivity_name.localstr(),
800 auto& mesh_graph = m_mesh.internalMeshGraph();
801 std::string connectivity_add_output_property_name = std::string{
"EndOf" } + connectivity_name.localstr() +
"Add";
802 source_family.addScalarProperty<Neo::utils::Int32>(connectivity_add_output_property_name);
804 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, connectivity_name.localstr() },
805 Neo::MeshKernel::OutProperty{ source_family, connectivity_add_output_property_name },
806 "UpdateArcaneConnectivity"+std::string{connectivity_name.localstr()},
807 [arcane_source_item_family, arcane_target_item_family, &source_family, &target_family,
this]
808 (Neo::Mesh::ConnectivityPropertyType
const& neo_connectivity,
809 Neo::ScalarPropertyT<Neo::utils::Int32>&) {
810 auto rank = arcane_source_item_family->mesh()->parallelMng()->commRank();
811 Neo::printer(rank) <<
"==Algorithm update Arcane connectivity: "<< neo_connectivity.name() << Neo::endline;
812 auto item_internal_connectivity_list = arcane_source_item_family->itemInternalConnectivityList();
814 auto connectivity = m_mesh.getConnectivity(source_family, target_family, neo_connectivity.name());
816 auto& connectivity_values = source_family.getConcreteProperty<Neo::Mesh::ConnectivityPropertyType>(neo_connectivity.name());
817 Neo::MeshArrayPropertyProxyT<Neo::Mesh::ConnectivityPropertyType::PropertyDataType> connectivity_proxy{ connectivity_values };
818 auto nb_item_data = connectivity_proxy.arrayPropertySizes();
819 auto nb_item_size = connectivity_proxy.arrayPropertySizesSize();
820 item_internal_connectivity_list->_setConnectivityNbItem(arcane_target_item_family->itemKind(),
821 Int32ArrayView{ Integer(nb_item_size), nb_item_data });
822 auto max_nb_connected_items = connectivity.maxNbConnectedItems();
823 item_internal_connectivity_list->_setMaxNbConnectedItem(arcane_target_item_family->itemKind(), max_nb_connected_items);
824 auto connectivity_values_data = connectivity_proxy.arrayPropertyData();
825 auto connectivity_values_size = connectivity_proxy.arrayPropertyDataSize();
826 item_internal_connectivity_list->_setConnectivityList(arcane_target_item_family->itemKind(),
827 Int32ArrayView{ Integer(connectivity_values_size), connectivity_values_data });
828 auto connectivity_index_data = connectivity_proxy.arrayPropertyIndex();
829 auto connectivity_index_size = connectivity_proxy.arrayPropertyIndexSize();
830 item_internal_connectivity_list->_setConnectivityIndex(arcane_target_item_family->itemKind(),
831 Int32ArrayView{ Integer(connectivity_index_size), connectivity_index_data });
832 },Neo::MeshKernel::AlgorithmPropertyGraph::AlgorithmPersistence::KeepAfterExecution);
834 if (arcane_source_item_family->itemKind() == IK_Face && arcane_target_item_family->itemKind() == IK_Cell) {
835 std::string flag_definition_output_property_name{
"EndOfFlagDefinition" };
836 source_family.addScalarProperty<Neo::utils::Int32>(flag_definition_output_property_name);
838 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, connectivity_add_output_property_name }, Neo::MeshKernel::OutProperty{ source_family, flag_definition_output_property_name },
839 "UpdateFaceFlagsAfterConnectivityDefinition",
840 [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&) {
841 auto current_face_index = 0;
842 auto arcane_faces = arcane_source_item_family->itemInfoListView();
844 arcane_target_item_family->itemsUniqueIdToLocalId(target_item_lids,target_item_uids_local,
false);
845 for (
auto face_lid : source_items.m_future_items.new_items) {
846 Face current_face = arcane_faces[face_lid].toFace();
847 if (target_item_lids[2 * current_face_index + 1] == NULL_ITEM_LOCAL_ID) {
849 Int32 mod_flags = (target_item_lids[2 * current_face_index] != NULL_ITEM_LOCAL_ID) ? (ItemFlags::II_Boundary | ItemFlags::II_HasBackCell | ItemFlags::II_BackCellIsFirst) : 0;
850 _setFaceInfos(mod_flags, current_face);
852 else if (target_item_lids[2 * current_face_index] == NULL_ITEM_LOCAL_ID) {
854 _setFaceInfos(ItemFlags::II_Boundary | ItemFlags::II_HasFrontCell | ItemFlags::II_FrontCellIsFirst, current_face);
858 _setFaceInfos(ItemFlags::II_HasFrontCell | ItemFlags::II_HasBackCell | ItemFlags::II_BackCellIsFirst, current_face);
860 ++current_face_index;
865 if (operation == Neo::Mesh::ConnectivityOperation::Modify)
return;
866 auto isolated_item_property_name = m_mesh._isolatedItemLidsPropertyName(source_family,target_family);
867 auto end_of_isolated_removal_property_name = std::string{
"EndOf" } + isolated_item_property_name;
868 source_family.addScalarProperty<Neo::utils::Int32>(end_of_isolated_removal_property_name);
869 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, isolated_item_property_name },
870 Neo::MeshKernel::OutProperty{source_family, end_of_isolated_removal_property_name},
871 "RemoveIsolatedArcaneItemsIn"+std::string{ arcane_source_item_family->name().localstr() },
872 [arcane_source_item_family](Neo::MeshScalarPropertyT<Neo::utils::Int32>
const& isolated_items_lids_property,
873 Neo::ScalarPropertyT<Neo::utils::Int32>& end_of_isolated_removal_property) {
874 end_of_isolated_removal_property.set(1);
877 isolated_item_lids.
reserve(isolated_items_lids_property.size());
878 ENUMERATE_(Item,iitem,arcane_source_item_family->allItems()) {
879 if (isolated_items_lids_property[iitem->localId()] == 1) {
880 isolated_item_lids.push_back(iitem->localId());
883 std::sort(isolated_item_lids.begin(), isolated_item_lids.end());
884 arcane_source_item_family->traceMng()->info() <<
"Remove isolated in Arcane for family "
885 <<
" lids : " << isolated_item_lids;
886 isolated_items_lids_property.debugPrint();
887 arcane_source_item_family->removeItems(isolated_item_lids);
888 }, Neo::MeshKernel::AlgorithmPropertyGraph::AlgorithmPersistence::KeepAfterExecution);
893 void scheduleSetItemCoordinates(PolyhedralFamily* item_family, PolyhedralTools::ItemLocalIds& local_ids, Real3ConstSmallSpan item_coords, VariableItemReal3& arcane_coords)
895 auto& _item_family = m_mesh.findFamily(itemKindArcaneToNeo(item_family->itemKind()), item_family->name().localstr());
896 std::vector<Neo::utils::Real3> _node_coords(item_coords.size());
898 for (
auto&& node_coord : item_coords) {
899 _node_coords[node_index++] = Neo::utils::Real3{ node_coord.x, node_coord.y, node_coord.z };
901 m_mesh.scheduleSetItemCoords(_item_family, local_ids.m_future_items, _node_coords);
903 auto& mesh_graph = m_mesh.internalMeshGraph();
904 _item_family.addScalarProperty<Int32>(
"NoOutProperty42");
905 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ _item_family, m_mesh._itemCoordPropertyName(_item_family) },
906 Neo::MeshKernel::OutProperty{ _item_family,
"NoOutProperty42" },
907 "UpdateArcaneCoordsIn"+std::string{item_family->name().localstr()},
908 [
this, item_family, &_item_family, &arcane_coords](Neo::Mesh::CoordPropertyType
const& item_coords_property,
909 Neo::ScalarPropertyT<Neo::utils::Int32>&) {
911 auto& all_items = _item_family.all();
912 VariableNodeReal3 node_coords{ VariableBuildInfo{ item_family->mesh(),
"NodeCoord" } };
913 for (
auto item : all_items) {
914 arcane_coords[ItemLocalId{ item }] = { item_coords_property[item].x,
915 item_coords_property[item].y,
916 item_coords_property[item].z };
923 Neo::EndOfMeshUpdate applyScheduledOperations() noexcept
925 return m_mesh.applyScheduledOperations();
929 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Cell>
931 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Cell;
933 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Face>
935 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Face;
937 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Edge>
939 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Edge;
941 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Node>
943 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Node;
945 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_DoF>
947 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Dof;
952 void PolyhedralFamilySerializer::serializeItems(ISerializer* buf, Int32ConstArrayView items_local_ids)
957 switch (buf->mode()) {
958 case ISerializer::ModeReserve: {
959 _fillItemData(items_local_ids);
960 m_item_data.serialize(buf);
961 auto connectivities = m_mesh->_impl()->connectivities(m_family);
962 for (
auto out_connectivity : connectivities) {
963 buf->reserve(out_connectivity.target_family.name());
964 buf->reserve(out_connectivity.name);
968 case ISerializer::ModePut: {
969 m_item_data.serialize(buf);
970 auto connectivities = m_mesh->_impl()->connectivities(m_family);
971 for (
auto out_connectivity : connectivities) {
972 buf->put(out_connectivity.target_family.name());
973 buf->put(out_connectivity.name);
978 case ISerializer::ModeGet: {
979 deserializeItems(buf,
nullptr);
987 void PolyhedralFamilySerializer::deserializeItems(ISerializer* buf, Int32Array* items_local_ids)
989 ARCANE_ASSERT((buf->mode() == ISerializer::ModeGet),
990 (
"Impossible to deserialize a buffer not in ModeGet. In ItemData::deserialize.Exiting"))
996 item_data.deserialize(buf, m_mesh, *items_local_ids);
998 item_data.deserialize(buf, m_mesh);
999 auto connectivities = m_mesh->_impl()->connectivities(m_family);
1000 auto nb_connectivities = connectivities.size();
1001 StringUniqueArray connected_family_names(nb_connectivities);
1002 StringUniqueArray connectivity_names(nb_connectivities);
1004 for (auto out_connectivity : connectivities) {
1005 buf->get(connected_family_names[index]);
1006 buf->get(connectivity_names[index]);
1009 _fillItemFamilyInfo(item_data, connected_family_names, connectivity_names);
1011 if (items_local_ids) {
1012 m_deserialized_lids_array.push_back(items_local_ids);
1015 m_future_item_lids_array.push_back(std::make_shared<PolyhedralTools::ItemLocalIds>());
1016 m_mesh->scheduleAllocateItems(m_family_info, *m_future_item_lids_array.back().get());
1019 m_mng->addSerializer(
this);
1023 void PolyhedralFamilySerializer::_fillItemData(Int32ConstArrayView items_local_ids)
1025 m_item_data = ItemData{ items_local_ids.size(), 0, m_family,
nullptr, m_family->parallelMng()->commRank() };
1026 Int64Array& item_infos = m_item_data.itemInfos();
1029 const Integer nb_item = items_local_ids.size();
1030 item_infos.reserve(1 + nb_item * 32);
1032 PolyhedralMeshImpl* mesh_impl = m_mesh->_impl();
1033 auto connectivities = mesh_impl->connectivities(m_family);
1034 item_infos.add(connectivities.size());
1035 bool is_face_family = m_family->itemKind() ==
IK_Face;
1038 item_infos.add(item->uniqueId().asInt64());
1039 item_owners[item.index()] = item->owner();
1040 for (
auto out_connectivity : connectivities) {
1041 auto target_family = m_mesh->findItemFamily(PolyhedralMeshImpl::itemKindNeoToArcane(out_connectivity.target_family.itemKind()),
1042 out_connectivity.target_family.name(),
false,
false);
1044 auto arcane_connected_items = target_family->itemInfoListView();
1045 bool is_face_cell_connection = is_face_family && target_family->itemKind() ==
IK_Cell;
1046 item_infos.add(PolyhedralMeshImpl::itemKindNeoToArcane(out_connectivity.target_family.itemKind()));
1047 auto connected_items = out_connectivity[item.localId()];
1048 auto nb_connected_items = connected_items.size();
1049 item_infos.add(nb_connected_items);
1050 if (is_face_cell_connection && item->itemBase().isBoundary() && item->itemBase().backCell().isNull()) {
1051 item_infos.add(NULL_ITEM_UNIQUE_ID);
1053 for (
auto connected_item_lid : connected_items) {
1054 item_infos.add(arcane_connected_items[connected_item_lid].uniqueId().asInt64());
1056 if (is_face_cell_connection && item->itemBase().isBoundary() && !item->itemBase().backCell().isNull()) {
1057 item_infos.add(NULL_ITEM_UNIQUE_ID);
1068class mesh::PolyhedralMesh::PolyhedralMeshModifier
1069:
public IPolyhedralMeshModifier
1073 explicit PolyhedralMeshModifier(PolyhedralMesh* mesh)
1077 void addItems(Int64ConstArrayView unique_ids, Int32ArrayView local_ids, eItemKind ik,
const String& family_name)
override
1079 m_mesh->addItems(unique_ids, local_ids, ik, family_name);
1082 void addItems(Int64ConstArrayView unique_ids, Int32ArrayView local_ids, Int32ConstArrayView owners, eItemKind ik,
const String& family_name)
override
1084 m_mesh->addItems(unique_ids, local_ids, owners, ik, family_name);
1087 void removeItems(Int32ConstArrayView local_ids, eItemKind ik,
const String& family_name)
override
1089 m_mesh->removeItems(local_ids, ik, family_name);
1094 PolyhedralMesh* m_mesh;
1100class mesh::PolyhedralMesh::InternalApi
1101:
public IMeshInternal
1102,
public IMeshModifierInternal
1106 explicit InternalApi(PolyhedralMesh* mesh)
1108 , m_connectivity_mng(std::make_unique<ItemConnectivityMng>(mesh->traceMng()))
1109 , m_polyhedral_mesh_modifier(std::make_unique<PolyhedralMeshModifier>(mesh))
1114 void setMeshKind(
const MeshKind& v)
override
1116 if (v.meshStructure() != eMeshStructure::Polyhedral && v.meshAMRKind() != eMeshAMRKind::None) {
1117 ARCANE_FATAL(
"Incompatible mesh structure ({0}) and amr kind ({1}) for Polyhedral mesh {2}. Must be (Polyhedral,None). ",
1118 v.meshStructure(), v.meshAMRKind(), m_mesh->name());
1120 m_mesh->m_mesh_kind = v;
1123 IItemConnectivityMng* dofConnectivityMng() const noexcept
override
1125 return m_connectivity_mng.get();
1128 IPolyhedralMeshModifier* polyhedralMeshModifier() const noexcept
override
1130 return m_polyhedral_mesh_modifier.get();
1133 void removeNeedRemoveMarkedItems()
override
1135 m_mesh->removeNeedRemoveMarkedItems();
1137 NodeLocalId addNode([[maybe_unused]] ItemUniqueId unique_id)
override
1141 FaceLocalId addFace([[maybe_unused]] ItemUniqueId unique_id,
1142 [[maybe_unused]] ItemTypeId type_id,
1143 [[maybe_unused]] ConstArrayView<Int64> nodes_uid)
override
1147 CellLocalId addCell([[maybe_unused]] ItemUniqueId unique_id,
1148 [[maybe_unused]] ItemTypeId type_id,
1149 [[maybe_unused]] ConstArrayView<Int64> nodes_uid)
override
1154 IItemFamilySerializerMngInternal* familySerializerMng() const noexcept
override
1156 return m_mesh->polyhedralFamilySerializerMng();
1161 PolyhedralMesh* m_mesh =
nullptr;
1162 std::unique_ptr<IItemConnectivityMng> m_connectivity_mng =
nullptr;
1163 std::unique_ptr<IPolyhedralMeshModifier> m_polyhedral_mesh_modifier =
nullptr;
1169class mesh::PolyhedralMesh::NoCompactionMeshCompacter
1170:
public IMeshCompacter
1174 explicit NoCompactionMeshCompacter(PolyhedralMesh* mesh)
1176 , m_trace_mng(mesh->traceMng())
1179 void doAllActions()
override { _info(); };
1181 void beginCompact()
override { _info(); };
1182 void compactVariablesAndGroups()
override { _info(); };
1183 void updateInternalReferences()
override { _info(); };
1184 void endCompact()
override { _info(); };
1185 void finalizeCompact()
override { _info(); };
1187 IMesh* mesh()
const override {
return m_mesh; };
1189 const ItemFamilyCompactInfos* findCompactInfos(IItemFamily*)
const override
1195 ePhase phase()
const override
1198 return ePhase::Ended;
1201 void setSorted(
bool)
override { _info(); };
1203 bool isSorted()
const override
1215 void _setCompactVariablesAndGroups(
bool)
override { _info(); };
1219 PolyhedralMesh* m_mesh =
nullptr;
1220 ITraceMng* m_trace_mng =
nullptr;
1222 void _info()
const { m_trace_mng->info() << A_FUNCINFO <<
"No compacting in PolyhedralMesh"; }
1228class mesh::PolyhedralMesh::NoCompactionMeshCompactMng
1229:
public IMeshCompactMng
1233 explicit NoCompactionMeshCompactMng(PolyhedralMesh* mesh)
1235 , m_trace_mng(mesh->traceMng())
1236 , m_mesh_compacter{ std::make_unique<NoCompactionMeshCompacter>(m_mesh) }
1239 IMesh* mesh()
const override {
return m_mesh; }
1240 IMeshCompacter* beginCompact()
override
1243 return m_mesh_compacter.get();
1246 IMeshCompacter* beginCompact(IItemFamily* family)
override
1248 ARCANE_UNUSED(family);
1250 return m_mesh_compacter.get();
1253 void endCompact()
override { _info(); };
1255 IMeshCompacter* compacter()
override
1258 return m_mesh_compacter.get();
1263 PolyhedralMesh* m_mesh =
nullptr;
1264 ITraceMng* m_trace_mng =
nullptr;
1265 std::unique_ptr<IMeshCompacter> m_mesh_compacter =
nullptr;
1267 void _info()
const { m_trace_mng->info() << A_FUNCINFO <<
"No compacting in PolyhedralMesh"; }
1273mesh::PolyhedralMesh::
1276 m_mesh_handle._setMesh(
nullptr);
1282ITraceMng* mesh::PolyhedralMesh::
1285 return m_subdomain->traceMng();
1291MeshHandle mesh::PolyhedralMesh::
1294 return m_mesh_handle;
1299mesh::PolyhedralMesh::
1300PolyhedralMesh(ISubDomain* subdomain,
const MeshBuildInfo& mbi)
1301: EmptyMesh{ subdomain->traceMng() }
1302, m_name{ mbi.name() }
1303, m_subdomain{ subdomain }
1304, m_mesh_handle{ m_subdomain->defaultMeshHandle() }
1305, m_properties(std::make_unique<Properties>(subdomain->propertyMng(), String(
"ArcaneMeshProperties_") + m_name))
1306, m_mesh{ std::make_unique<mesh::PolyhedralMeshImpl>(m_subdomain) }
1307, m_parallel_mng{ mbi.parallelMngRef().get() }
1308, m_mesh_part_info{ makeMeshPartInfoFromParallelMng(m_parallel_mng) }
1309, m_item_type_mng(ItemTypeMng::_singleton())
1310, m_mesh_kind(mbi.meshKind())
1311, m_polyhedral_family_serializer_mng{ std::make_unique<PolyhedralFamilySerializerMng>(this) }
1312, m_initial_allocator(*this)
1313, m_variable_mng{ subdomain->variableMng() }
1314, m_mesh_checker{ this }
1315, m_internal_api{ std::make_unique<InternalApi>(this) }
1316, m_compact_mng{ std::make_unique<NoCompactionMeshCompactMng>(this) }
1317, m_mesh_utilities{ std::make_unique<UnstructuredMeshUtilities>(this) }
1318, m_mesh_exchange_mng{ std::make_unique<MeshExchangeMng>(this) }
1319, m_item_family_network{ std::make_unique<ItemFamilyNetwork>(m_trace_mng) }
1320, m_ghost_layer_mng{ std::make_unique<GhostLayerMng>(m_trace_mng) }
1321, m_connectivity(VariableBuildInfo{subdomain,mbi.name()+
"MeshConnectivity"})
1323 m_mesh_handle._setMesh(
this);
1324 m_mesh_item_internal_list.mesh =
this;
1325 m_default_arcane_families.fill(
nullptr);
1331void Arcane::mesh::PolyhedralMesh::
1334 _allocateItems(item_allocation_info, ArrayView<Int32UniqueArray>{});
1339void Arcane::mesh::PolyhedralMesh::
1340allocateItems(
const Arcane::ItemAllocationInfo& item_allocation_info, ArrayView<Int32UniqueArray> family_lids)
1342 _allocateItems(item_allocation_info, family_lids);
1347void Arcane::mesh::PolyhedralMesh::
1348_allocateItems(
const Arcane::ItemAllocationInfo& item_allocation_info, ArrayView<Int32UniqueArray> family_lids)
1351 m_subdomain->traceMng()->info() <<
"--PolyhedralMesh: allocate items --";
1352 UniqueArray<PolyhedralTools::ItemLocalIds> item_local_ids(item_allocation_info.family_infos.size());
1353 auto family_index = 0;
1355 for (
auto& family_info : item_allocation_info.family_infos) {
1356 bool create_if_needed =
true;
1357 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name, create_if_needed);
1358 m_trace_mng->debug(
Trace::High) <<
"- Create items " << family_info.name;
1359 m_mesh->scheduleAddItems(item_family, family_info.item_uids, family_info.item_owners.constSmallSpan(), item_local_ids[family_index++]);
1363 for (
auto& family_info : item_allocation_info.family_infos) {
1364 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
1365 m_trace_mng->debug(
Trace::High) <<
"- Current family " << family_info.name;
1366 for (
auto& current_connected_family_info : family_info.connected_family_infos) {
1367 auto connected_family = _findItemFamily(current_connected_family_info.item_kind, current_connected_family_info.name);
1368 m_trace_mng->debug(
Trace::High) <<
"- Create connectivity " << current_connected_family_info.connectivity_name;
1370 if (!connected_family) {
1371 ARCANE_WARNING((String::format(
"Cannot find family {0} with kind {1} "
1372 "The connectivity between {1} and this family is skipped",
1373 current_connected_family_info.name,
1374 current_connected_family_info.item_kind,
1375 item_family->name())
1379 m_mesh->scheduleAddConnectivity(item_family,
1380 item_local_ids[family_index],
1381 current_connected_family_info.nb_connected_items_per_item,
1383 current_connected_family_info.connected_items_uids,
1384 current_connected_family_info.connectivity_name);
1385 Connectivity connectivity{m_connectivity};
1391 m_mesh->applyScheduledOperations();
1393 for (
auto& family_info : item_allocation_info.family_infos) {
1394 if (family_info.item_kind !=
IK_Node && family_info.item_coordinates.empty()) {
1397 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
1398 if (item_family == itemFamily(
IK_Node)) {
1399 if (!m_arcane_node_coords.get()) {
1400 m_arcane_node_coords = std::make_unique<VariableNodeReal3>(VariableBuildInfo(
this, family_info.item_coordinates_variable_name));
1401 m_arcane_node_coords->setUsed(
true);
1405 auto arcane_item_coords_var_ptr = std::make_unique<VariableItemReal3>(VariableBuildInfo(
this, family_info.item_coordinates_variable_name),
1406 item_family->itemKind());
1407 arcane_item_coords_var_ptr->setUsed(
true);
1408 m_arcane_item_coords.push_back(std::move(arcane_item_coords_var_ptr));
1412 for (
auto& family : m_arcane_families) {
1413 family->endUpdate();
1419 for (
auto& family_info : item_allocation_info.family_infos) {
1420 if (family_info.item_coordinates.empty()) {
1424 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
1425 if (item_family == itemFamily(
IK_Node)) {
1426 m_mesh->scheduleSetItemCoordinates(item_family, item_local_ids[family_index], family_info.item_coordinates, *m_arcane_node_coords);
1429 m_mesh->scheduleSetItemCoordinates(item_family, item_local_ids[family_index], family_info.item_coordinates, *m_arcane_item_coords[index++].get());
1431 auto mesh_state = m_mesh->applyScheduledOperations();
1432 m_is_allocated =
true;
1434 itemTypeMng()->setMeshWithGeneralCells(
this);
1436 if (!family_lids.empty()) {
1438 ARCANE_ASSERT((family_lids.size() == item_local_ids.size()),(
"Incoherence in item number"));
1439 for (
auto& lid_array : item_local_ids) {
1440 family_lids[index].resize(lid_array.size());
1441 lid_array.fillArrayView(family_lids[index].view(), mesh_state);
1449void Arcane::mesh::PolyhedralMesh::
1450scheduleAllocateItems(
const Arcane::ItemAllocationInfo::FamilyInfo& family_info, mesh::PolyhedralTools::ItemLocalIds& item_local_ids)
1453 m_subdomain->traceMng()->info() <<
"--PolyhedralMesh: schedule allocate items --";
1455 bool create_if_needed =
true;
1456 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name, create_if_needed);
1457 m_trace_mng->debug(
Trace::High) <<
"- Current family " << family_info.name;
1458 m_trace_mng->debug(
Trace::High) <<
"- Create items ";
1459 m_mesh->scheduleAddItems(item_family, family_info.item_uids, family_info.item_owners.
constSmallSpan(), item_local_ids);
1461 for (
auto& current_connected_family_info : family_info.connected_family_infos) {
1462 auto connected_family = _findItemFamily(current_connected_family_info.item_kind, current_connected_family_info.name);
1463 m_trace_mng->debug(
Trace::High) <<
"- Create connectivity " << current_connected_family_info.connectivity_name;
1465 if (!connected_family) {
1466 ARCANE_WARNING((String::format(
"Cannot find family {0} with kind {1} "
1467 "The connectivity between {1} and this family is skipped",
1468 current_connected_family_info.name,
1469 current_connected_family_info.item_kind,
1470 item_family->name())
1474 m_mesh->scheduleUpdateConnectivity(item_family,
1476 current_connected_family_info.nb_connected_items_per_item,
1478 current_connected_family_info.connected_items_uids,
1479 current_connected_family_info.connectivity_name);
1485void Arcane::mesh::PolyhedralMesh::
1486applyScheduledAllocateItems(UniqueArray<std::shared_ptr<PolyhedralTools::ItemLocalIds>> item_lids)
1489 auto mesh_state = m_mesh->applyScheduledOperations();
1491 for (
auto item_local_ids : item_lids) {
1492 item_local_ids->m_mesh_state = std::make_shared<Neo::EndOfMeshUpdate>(mesh_state);
1496 for (
auto& family : m_arcane_families) {
1497 family->endUpdate();
1500 m_is_allocated =
true;
1502 itemTypeMng()->setMeshWithGeneralCells(
this);
1507void mesh::PolyhedralMesh::removeNeedRemoveMarkedItems()
1510 for (
auto family_index = 0 ; family_index < m_arcane_families.size(); ++family_index) {
1512 auto* family = m_arcane_families[family_index].get();
1514 items_to_remove.
reserve(family->nbItem());
1515 auto& items_map = family->itemsMap();
1516 if (items_map.count() == 0)
continue;
1517 items_map.eachItem([&](ItemBase item) {
1519 auto f = item.flags();
1522 item.toMutable().setFlags(f);
1523 items_to_remove.add(item.localId());
1526 if (!items_to_remove.empty()) {
1527 removeItems(items_to_remove,family);
1534Arcane::mesh::PolyhedralFamilySerializerMng* mesh::PolyhedralMesh::
1535polyhedralFamilySerializerMng()
1537 return m_polyhedral_family_serializer_mng.get();
1543void Arcane::mesh::PolyhedralMesh::
1546 for (
auto& family : m_arcane_families) {
1547 family->endUpdate();
1554void Arcane::mesh::PolyhedralMesh::
1555_computeFamilySynchronizeInfos()
1557 m_subdomain->traceMng()->info() <<
"Computing family synchronization information for " << name();
1558 for(
auto& family : m_arcane_families ){
1559 family->computeSynchronizeInfos();
1564 auto* var_syncer = cellFamily()->allItemsSynchronizer();
1565 Int32 iteration = m_subdomain->commonVariables().globalIteration();
1566 String file_name = String::format(
"{0}_sync_topology_iter{1}.json",name(),iteration);
1567 mesh_utils::dumpSynchronizerTopologyJSON(var_syncer,file_name);
1574void Arcane::mesh::PolyhedralMesh::
1575_notifyEndUpdateForFamilies()
1577 for(
auto& family : m_arcane_families )
1578 family->_internalApi()->notifyEndUpdateFromMesh();
1584void Arcane::mesh::PolyhedralMesh::
1585_computeGroupSynchronizeInfos()
1587 auto action = [](ItemGroup& group) {
1588 if (group.hasSynchronizer())
1589 group.synchronizer()->compute();
1592 m_trace_mng->info() <<
"Computing group synchronization information for " << name();
1593 meshvisitor::visitGroups(
this, action);
1612 return m_mesh->dimension();
1621 return m_mesh->nbNode();
1630 return m_mesh->nbEdge();
1639 return m_mesh->nbFace();
1648 return m_mesh->nbCell();
1657 return m_mesh->nbItem(ik);
1666 if (m_default_arcane_families[
IK_Node])
1667 return m_default_arcane_families[
IK_Node]->allItems();
1678 if (m_default_arcane_families[
IK_Edge])
1679 return m_default_arcane_families[
IK_Edge]->allItems();
1690 if (m_default_arcane_families[
IK_Face])
1691 return m_default_arcane_families[
IK_Face]->allItems();
1702 if (m_default_arcane_families[
IK_Cell])
1703 return m_default_arcane_families[
IK_Cell]->allItems();
1714 if (m_default_arcane_families[
IK_Node])
1715 return m_default_arcane_families[
IK_Node]->allItems().own();
1726 if (m_default_arcane_families[
IK_Edge])
1727 return m_default_arcane_families[
IK_Edge]->allItems().own();
1738 if (m_default_arcane_families[
IK_Face])
1739 return m_default_arcane_families[
IK_Face]->allItems().own();
1750 if (m_default_arcane_families[
IK_Cell])
1751 return m_default_arcane_families[
IK_Cell]->allItems().own();
1762 if (m_default_arcane_families[
IK_Cell])
1771mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1772_createItemFamily(
eItemKind ik,
const String& name)
1774 m_mesh->addFamily(ik, name);
1775 m_arcane_families.push_back(std::make_unique<PolyhedralFamily>(
this, ik, name));
1776 auto current_family = m_arcane_families.back().get();
1777 if (m_default_arcane_families[ik] ==
nullptr) {
1778 m_default_arcane_families[ik] = current_family;
1779 _updateMeshInternalList(ik);
1781 m_item_family_collection.add(current_family);
1782 current_family->build();
1783 return current_family;
1792 return _createItemFamily(ik, name);
1798void mesh::PolyhedralMesh::
1801 createItemFamily(
IK_Cell,
"CellFamily");
1802 createItemFamily(
IK_Node,
"NodeFamily");
1803 auto cell_family = m_default_arcane_families[
IK_Cell];
1804 auto node_family = m_default_arcane_families[
IK_Node];
1807 PolyhedralTools::ItemLocalIds cell_lids, node_lids;
1808 m_mesh->scheduleAddItems(cell_family, cell_uids.constView(), cell_lids);
1809 m_mesh->scheduleAddItems(node_family, node_uids.constView(), node_lids);
1812 m_mesh->scheduleAddConnectivity(cell_family, cell_lids, nb_node, node_family, node_uids, String{
"CellToNodes" });
1813 m_mesh->scheduleAddConnectivity(node_family, node_lids, 1, cell_family,
1814 node_cells_uids, String{
"NodeToCells" });
1815 m_mesh->applyScheduledOperations();
1816 cell_family->endUpdate();
1817 node_family->endUpdate();
1830 for (
auto ik = 0; ik < NB_ITEM_KIND; ++ik) {
1833 m_empty_arcane_families[ik] = std::make_unique<mesh::PolyhedralFamily>(
this, (
eItemKind)ik, name);
1834 m_default_arcane_families[ik] = m_empty_arcane_families[ik].get();
1845 return m_default_arcane_families[
IK_Node];
1854 return m_default_arcane_families[
IK_Edge];
1863 return m_default_arcane_families[
IK_Face];
1872 return m_default_arcane_families[
IK_Cell];
1875void mesh::PolyhedralMesh::
1880 m_mesh_item_internal_list.cells = m_default_arcane_families[kind]->itemsInternal();
1881 m_mesh_item_internal_list._internalSetCellSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1884 m_mesh_item_internal_list.faces = m_default_arcane_families[kind]->itemsInternal();
1885 m_mesh_item_internal_list._internalSetFaceSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1888 m_mesh_item_internal_list.edges = m_default_arcane_families[kind]->itemsInternal();
1889 m_mesh_item_internal_list._internalSetEdgeSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1892 m_mesh_item_internal_list.nodes = m_default_arcane_families[kind]->itemsInternal();
1893 m_mesh_item_internal_list._internalSetNodeSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1905mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1908 return m_default_arcane_families[ik];
1917 return _itemFamily(ik);
1926 return m_item_type_mng;
1932mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1933_findItemFamily(
eItemKind ik,
const String& name,
bool create_if_needed)
1936 auto found_family = _itemFamily(ik);
1938 if (found_family->name() == name)
1939 return found_family;
1941 for (
auto& family : m_arcane_families) {
1942 if (family->itemKind() == ik && family->name() == name)
1943 return family.get();
1945 if (!create_if_needed)
1947 return _createItemFamily(ik, name);
1956 ARCANE_UNUSED(register_modifier_if_created);
1957 return _findItemFamily(ik, name, create_if_needed);
1963mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1966 return m_default_arcane_families[ik];
1975 ARCANE_ASSERT(m_arcane_node_coords, (
"Node coordinates not yet loaded."));
1976 return *m_arcane_node_coords;
1986 for (
auto& family : m_arcane_families) {
1987 group = family->findGroup(name);
2000 m_all_groups.
clear();
2001 for (
auto& family : m_arcane_families) {
2003 m_all_groups.add(*i_group);
2005 return m_all_groups;
2014 for (
auto& family : m_arcane_families) {
2015 family->destroyGroups();
2025 return m_item_family_collection;
2034 return m_internal_api.get();
2043 return m_compact_mng.get();
2049void mesh::PolyhedralMesh::
2052 ARCANE_ASSERT((unique_ids.size() == local_ids.size()),(
"local and unique ids arrays must have same size"))
2053 auto* item_family = _findItemFamily(ik, family_name, false);
2054 PolyhedralTools::ItemLocalIds item_local_ids;
2055 m_mesh->scheduleAddItems(item_family, unique_ids, item_local_ids);
2056 auto mesh_state = m_mesh->applyScheduledOperations();
2057 item_local_ids.fillArrayView(local_ids, mesh_state);
2066 ARCANE_ASSERT((unique_ids.size() == local_ids.size() && (unique_ids.size()== owners.size())),(
"local/unique ids and owners arrays must have same size"))
2067 auto* item_family = _findItemFamily(ik, family_name, false);
2068 PolyhedralTools::ItemLocalIds item_local_ids;
2069 m_mesh->scheduleAddItems(item_family, unique_ids, owners,item_local_ids);
2070 auto mesh_state = m_mesh->applyScheduledOperations();
2071 item_local_ids.fillArrayView(local_ids, mesh_state);
2080 auto* item_family = _findItemFamily(ik, family_name,
false);
2082 ARCANE_FATAL(
"ItemFamily with name {0} and kind {1} does not exist in the mesh.", family_name,ik);
2084 m_mesh->scheduleRemoveItems(item_family, local_ids);
2085 m_mesh->applyScheduledOperations();
2091void mesh::PolyhedralMesh::
2094 if (local_ids.empty())
return;
2096 ARCANE_FATAL(
"Invalid IItemFamily passed to removeItems.");
2098 removeItems(local_ids, family->itemKind(), family->name());
2107 addItems(nodes_uid, nodes_lid,
IK_Node, nodeFamily()->name());
2116 m_trace_mng->info() <<
"PolyhedralMesh::_exchangeItems() do_compact?=" <<
"false"
2117 <<
" nb_exchange=" << 0 <<
" version=" << 0;
2120 if (!check_exchange.null()) {
2121 m_mesh_checker.checkGhostCells();
2122 m_trace_mng->pwarning() <<
"CHECKING SYNCHRONISATION !";
2123 m_mesh_checker.checkVariablesSynchronization();
2124 m_mesh_checker.checkItemGroupsSynchronization();
2126 if (checkLevel() >= 2)
2127 m_mesh_checker.checkValidMesh();
2128 else if (checkLevel() >= 1)
2129 m_mesh_checker.checkValidConnectivity();
2135void mesh::PolyhedralMesh::
2140 Trace::Setter mci(traceMng(), _className());
2145 if (arcane_debug_load_balancing) {
2146 for (
auto& family : m_arcane_families) {
2147 family->itemsNewOwner().checkIfSync();
2151 IMeshExchanger* iexchanger = m_mesh_exchange_mng->beginExchange();
2154 if (iexchanger->computeExchangeInfos()) {
2155 m_trace_mng->pwarning() <<
"No load balance is performed";
2156 m_mesh_exchange_mng->endExchange();
2161 iexchanger->processExchange();
2164 iexchanger->removeNeededItems();
2169 auto action = [](ItemGroup& group) {
2170 if (group.internal()->hasComputeFunctor() || group.isLocalToSubDomain())
2173 group.internal()->removeSuppressedItems();
2175 meshvisitor::visitGroups(
this, action);
2178 iexchanger->allocateReceivedItems();
2181 _endUpdateFamilies();
2182 _computeFamilySynchronizeInfos();
2185 iexchanger->updateItemGroups();
2187 _computeGroupSynchronizeInfos();
2189 iexchanger->updateVariables();
2193 m_mesh_checker.checkMeshFromReferenceFile();
2194 _notifyEndUpdateForFamilies();
2196 iexchanger->finalizeExchange();
2198 m_mesh_exchange_mng->endExchange();
2214 auto want_dump =
false;
2215 auto need_compact =
false;
2216 m_trace_mng->info(4) <<
"DynamicMesh::prepareForDump() name=" << name()
2217 <<
" need_compact?=" << need_compact
2218 <<
" want_dump?=" << want_dump
2219 <<
" timestamp=" << 0;
2223 m_mesh_events.eventObservable(t).notify(MeshEventArgs(
this, t));
2228 for (
auto& family : m_arcane_families) {
2229 family->prepareForDump();
2235 m_mesh_events.eventObservable(t).notify(MeshEventArgs(
this, t));
2316 return m_mesh_utilities.get();
2325 IItemFamily* item_family = _itemFamily(ik);
2327 return item_family->itemsNewOwner();
2336 return m_mesh_checker.checkLevel();
2345 return m_item_family_network.get();
2354 return m_ghost_layer_mng.get();
2363 return m_internal_api.get();
2369mesh::PolyhedralMeshImpl* mesh::PolyhedralMesh::_impl()
2371 return m_mesh.get();
2387namespace Arcane::mesh
2396Arcane::mesh::PolyhedralMesh::
2397~PolyhedralMesh() =
default;
2402Arcane::mesh::PolyhedralMesh::
2404: EmptyMesh{ subdomain->traceMng() }
2405, m_subdomain{ subdomain }
2407, m_mesh_kind(mbi.meshKind())
2414void Arcane::mesh::PolyhedralMesh::
2415read([[maybe_unused]]
const String& filename)
2423void Arcane::mesh::PolyhedralMesh::
2424allocateItems(
const Arcane::ItemAllocationInfo& item_allocation_info)
2426 ARCANE_UNUSED(item_allocation_info);
2441class ARCANE_MESH_EXPORT PolyhedralMeshFactory
2460 static String name() {
return "ArcanePolyhedralMeshFactory"; }
2470#if ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
2478 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
static Integer kindsToConnectivity(eItemKind kindA, eItemKind kindB)
Conversion de type en connectivité
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.