17#include "arcane/mesh/PolyhedralMesh.h"
19#include "ItemFamilyNetwork.h"
20#include "ItemFamilyPolicyMng.h"
21#include "ItemGroupsSynchronize.h"
22#include "arcane/mesh/MeshExchangeMng.h"
23#include "arcane/core/ISubDomain.h"
24#include "arcane/core/ItemSharedInfo.h"
25#include "arcane/core/ItemTypeInfo.h"
26#include "arcane/core/ItemTypeMng.h"
27#include "arcane/core/VariableBuildInfo.h"
28#include "arcane/core/MeshBuildInfo.h"
30#include "arcane/core/AbstractService.h"
31#include "arcane/core/CommonVariables.h"
32#include "arcane/core/IMeshFactory.h"
33#include "arcane/core/ItemInternal.h"
34#include "arcane/core/IDoFFamily.h"
35#include "arcane/core/IMeshCompactMng.h"
36#include "arcane/core/IMeshCompacter.h"
37#include "arcane/core/IMeshExchanger.h"
38#include "arcane/core/IGhostLayerMng.h"
39#include "arcane/core/MeshVisitor.h"
40#include "arcane/core/internal/IItemFamilyInternal.h"
41#include "arcane/core/internal/IItemFamilySerializerMngInternal.h"
42#include "arcane/core/internal/IVariableMngInternal.h"
43#include "arcane/core/internal/IPolyhedralMeshModifier.h"
44#include "arcane/core/internal/IMeshModifierInternal.h"
45#include "arcane/core/Connectivity.h"
46#include "arcane/core/MeshStats.h"
48#include "arcane/mesh/ItemFamily.h"
49#include "arcane/mesh/DynamicMeshKindInfos.h"
50#include "arcane/mesh/UnstructuredMeshUtilities.h"
51#include "arcane/mesh/GhostLayerMng.h"
52#include "arcane/utils/ITraceMng.h"
53#include "arcane/utils/FatalErrorException.h"
54#include "arccore/base/StringBuilder.h"
56#ifdef ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
58#include "arcane/core/IMeshMng.h"
59#include "arcane/core/MeshHandle.h"
60#include "arcane/core/IItemFamily.h"
61#include "arcane/core/internal/IMeshInternal.h"
62#include "arcane/core/IVariableSynchronizer.h"
63#include "arcane/mesh/ItemFamilyPolicyMng.h"
64#include "arcane/mesh/ItemFamilySerializer.h"
65#include "arcane/utils/Collection.h"
66#include "arcane/utils/List.h"
67#include "arcane/utils/PlatformUtils.h"
72#include "arcane/mesh/ItemConnectivityMng.h"
73#include "arcane/core/ItemPrinter.h"
74#include "arcane/mesh/FaceFamily.h"
75#include "arcane/mesh/GhostLayerBuilder.h"
80#define ARCANE_DEBUG_LOAD_BALANCING
82#ifdef ARCANE_DEBUG_LOAD_BALANCING
83static bool arcane_debug_load_balancing =
true;
85static bool arcane_debug_load_balancing =
false;
91void Arcane::mesh::PolyhedralMesh::
92_errorEmptyMesh()
const
94 ARCANE_FATAL(
"Impossible d'utiliser PolyhedralMesh si Arcane n'est pas lié à lib Neo");
100#ifdef ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
105namespace Arcane::mesh
107namespace PolyhedralTools
111 Neo::FutureItemRange m_future_items;
112 std::shared_ptr<Neo::EndOfMeshUpdate> m_mesh_state =
nullptr;
116 void fillArrayView(Int32ArrayView local_ids, Neo::EndOfMeshUpdate mesh_state)
118 auto lids = m_future_items.get(mesh_state);
119 if (local_ids.size() != lids.size())
120 ARCANE_FATAL(
"Impossible de remplir local_ids view, sa taille {0} != {1} (taille de l'élément ajouté)", local_ids.size(), m_future_items.size());
121 std::copy(lids.begin(), lids.end(), local_ids.begin());
124 void fillArrayView(Int32ArrayView local_ids)
126 ARCANE_CHECK_POINTER2(m_mesh_state.get(),
"PolyhedralTools::ItemLocalIds doit avoir un état de maillage de fin valide");
127 fillArrayView(local_ids, *m_mesh_state);
130 Integer size() const noexcept {
return m_future_items.size(); }
131 bool isFilled() const noexcept {
return m_mesh_state.get() !=
nullptr; };
132 void checkIsFilled(String error_message)
const noexcept
135 ARCANE_FATAL(
"Les IDs locaux des éléments ne sont pas remplis." + error_message);
137 friend class mesh::PolyhedralMeshImpl;
138 friend class mesh::PolyhedralMesh;
145class PolyhedralFamilySerializer;
146class PolyhedralFamilySerializerMng :
public IItemFamilySerializerMngInternal
148 PolyhedralMesh* m_mesh =
nullptr;
150 UniqueArray<PolyhedralFamilySerializer*> m_serializers;
154 explicit PolyhedralFamilySerializerMng(PolyhedralMesh* mesh)
160 void addSerializer(PolyhedralFamilySerializer* serializer)
162 m_serializers.push_back(serializer);
166 void finalizeItemAllocation()
override;
172class PolyhedralFamilySerializer :
public IItemFamilySerializer
176 PolyhedralMesh* m_mesh =
nullptr;
177 IItemFamily* m_family =
nullptr;
178 PolyhedralFamilySerializerMng* m_mng =
nullptr;
179 ItemData m_item_data;
180 UniqueArray<Int32Array*> m_deserialized_lids_array;
181 UniqueArray<std::shared_ptr<PolyhedralTools::ItemLocalIds>> m_future_item_lids_array;
182 ItemAllocationInfo::FamilyInfo m_family_info;
186 explicit PolyhedralFamilySerializer(PolyhedralMesh* mesh, IItemFamily* family, PolyhedralFamilySerializerMng* mng)
192 PolyhedralFamilySerializer(
const PolyhedralFamilySerializer&) =
delete;
193 PolyhedralFamilySerializer& operator=(
const PolyhedralFamilySerializer&) =
delete;
195 ArrayView<std::shared_ptr<PolyhedralTools::ItemLocalIds>> itemLidsArray() {
return m_future_item_lids_array.view(); }
199 void serializeItems(ISerializer* buf, Int32ConstArrayView items_local_ids)
override;
200 void deserializeItems(ISerializer* buf, Int32Array* items_local_ids)
override;
205 m_deserialized_lids_array.clear();
206 m_future_item_lids_array.clear();
207 m_family_info.clear();
210 void fillDeserializedLocalIds()
213 for (
auto item_lids_array : m_deserialized_lids_array) {
214 auto& future_item_lids = m_future_item_lids_array[index];
215 future_item_lids->checkIsFilled(
"Impossible de remplir les IDs locaux désérialisés, les IDs locaux des éléments futurs ne sont pas remplis.");
216 item_lids_array->resize(future_item_lids->size());
217 future_item_lids->fillArrayView(item_lids_array->view());
223 IItemFamilySerializerMngInternal* mng()
229 void serializeItemRelations(ISerializer*, Int32ConstArrayView)
override {}
230 void deserializeItemRelations(ISerializer*, Int32Array*)
override {}
234 void _fillItemData(Int32ConstArrayView items_local_ids);
235 void _fillItemFamilyInfo(
const ItemData& item_data,
236 StringConstArrayView connected_family_names,
237 StringConstArrayView connectivity_names)
240 m_family_info.clear();
242 if (m_family != item_data.itemFamily())
243 ARCANE_FATAL(
"PolyhedralFamilySerializer: Incompatibilité de famille. La famille synchronisée est {0} et la famille sérialisée est {1}",
244 m_family->name(), item_data.itemFamily()->name());
245 m_family_info.name = item_data.itemFamily()->name();
246 m_family_info.item_kind = item_data.itemFamily()->itemKind();
247 auto& connected_family_infos = m_family_info.connected_family_infos;
248 auto nb_connected_family = item_data.itemInfos()[0];
249 connected_family_infos.resize(nb_connected_family);
250 auto& item_uids = m_family_info._item_uids_data;
251 item_uids.reserve(item_data.nbItems());
252 auto item_infos = item_data.itemInfos();
253 for (
auto connected_family_info : connected_family_infos) {
254 connected_family_info._connected_items_uids_data.reserve(4 * item_uids.size());
255 connected_family_info._nb_connected_items_per_item_data.reserve(item_uids.size());
257 for (
auto index = 1; index < item_infos.size();) {
258 item_uids.push_back(item_infos[index + 1]);
260 for (
auto connected_family_index = 0; connected_family_index < nb_connected_family; ++connected_family_index) {
262 auto* connected_family = m_mesh->findItemFamily(family_kind, connected_family_names[connected_family_index],
false,
false);
264 auto& current_connected_family_infos = connected_family_infos[connected_family_index];
265 current_connected_family_infos.item_kind = family_kind;
266 current_connected_family_infos.name = connected_family->name();
267 current_connected_family_infos.connectivity_name = connectivity_names[connected_family_index];
269 auto nb_connected_items =
static_cast<Int32
>(item_infos[index]);
271 current_connected_family_infos._nb_connected_items_per_item_data.push_back(nb_connected_items);
272 auto real_nb_connected_items = nb_connected_items;
273 if (m_family->itemKind() == IK_Face && connected_family->itemKind() == IK_Cell)
274 real_nb_connected_items = 2;
275 current_connected_family_infos._connected_items_uids_data.addRange(item_infos.subView(index, real_nb_connected_items));
276 index += real_nb_connected_items;
280 m_family_info.updateViewsFromInternalData();
282 m_family_info.item_owners = item_data.itemOwners();
285 IItemFamily* family()
const override
294void PolyhedralFamilySerializerMng::
295finalizeItemAllocation()
297 UniqueArray<std::shared_ptr<PolyhedralTools::ItemLocalIds>> future_item_lids;
298 for (
auto family_serializer : m_serializers) {
299 for (
auto& item_lids : family_serializer->itemLidsArray()) {
300 future_item_lids.push_back(item_lids);
303 m_mesh->applyScheduledAllocateItems(future_item_lids);
304 for (
auto family_serializer : m_serializers) {
305 family_serializer->fillDeserializedLocalIds();
307 m_serializers.clear();
313class PolyhedralFamilyPolicyMng
314:
public ItemFamilyPolicyMng
318 PolyhedralFamilyPolicyMng(PolyhedralMesh* mesh, ItemFamily* family)
319 : ItemFamilyPolicyMng(family)
328 return new PolyhedralFamilySerializer(m_mesh, m_family, m_mesh->polyhedralFamilySerializerMng());
333 PolyhedralMesh* m_mesh =
nullptr;
334 ItemFamily* m_family =
nullptr;
340class PolyhedralFamily
344 ItemSharedInfoWithType* m_shared_info =
nullptr;
348 PolyhedralMesh* m_mesh =
nullptr;
352 inline static const String m_arcane_item_lids_property_name{
"Arcane_Item_Lids" };
353 inline static const String m_arcane_remove_item_property_name{
"Arcane_Remove_Items" };
357 PolyhedralFamily(PolyhedralMesh* mesh, eItemKind ik, String name)
358 : ItemFamily(mesh, ik, name)
364 void preAllocate(Integer nb_item)
366 Integer nb_hash = itemsMap().nbBucket();
367 Integer wanted_size = 2 * (nb_item + nbItem());
368 if (nb_hash < wanted_size)
369 itemsMap().resize(wanted_size,
true);
370 m_empty_connectivity_indexes.resize(nb_item + nbItem(), 0);
371 m_empty_connectivity_nb_item.resize(nb_item + nbItem(), 0);
372 _updateEmptyConnectivity();
375 ItemInternal* _allocItem(
const Int64 uid,
const Int32 owner)
378 ItemInternal* item_internal = ItemFamily::_findOrAllocOne(uid, need_alloc);
380 item_internal->setUniqueId(uid);
382 _allocateInfos(item_internal, uid, m_shared_info);
384 item_internal->setOwner(owner, m_sub_domain_id);
385 return item_internal;
388 void addItems(Int64ConstSmallSpan uids, Int32ArrayView items)
391 addItems(uids, items, owners);
394 void addItems(Int64ConstSmallSpan uids, Int32ArrayView items, Int32ConstArrayView owners)
398 ARCANE_ASSERT((uids.size() == items.size()), (
"one must have items.size==uids.size()"));
399 preAllocate(uids.size());
401 for (
auto uid : uids) {
402 ItemInternal* ii = _allocItem(uid, owners[index]);
403 items[index] = ii->localId();
406 m_need_prepare_dump =
true;
407 _updateItemInternalList();
410 void removeItems(Int32ConstArrayView local_ids)
412 _removeMany(local_ids);
415 void _updateItemInternalList()
417 switch (itemKind()) {
419 m_item_internal_list->cells = _itemsInternal();
422 m_item_internal_list->faces = _itemsInternal();
425 m_item_internal_list->edges = _itemsInternal();
428 m_item_internal_list->nodes = _itemsInternal();
437 void _updateEmptyConnectivity()
439 auto item_internal_connectivity_list = itemInternalConnectivityList();
440 for (
auto item_kind = 0; item_kind < ItemInternalConnectivityList::MAX_ITEM_KIND; ++item_kind) {
441 item_internal_connectivity_list->_setConnectivityList(item_kind, m_empty_connectivity);
442 item_internal_connectivity_list->_setConnectivityIndex(item_kind, m_empty_connectivity_indexes);
443 item_internal_connectivity_list->_setConnectivityNbItem(item_kind, m_empty_connectivity_nb_item);
448 IDoFFamily* toDoFFamily()
override
454 void build()
override
457 m_sub_domain_id = subDomain()->subDomainId();
458 ItemTypeMng* itm = m_mesh->itemTypeMng();
459 ItemTypeInfo* dof_type_info = itm->typeFromId(IT_NullType);
460 m_shared_info = _findSharedInfo(dof_type_info);
461 _updateEmptyConnectivity();
462 ItemFamily::setPolicyMng(
new PolyhedralFamilyPolicyMng{ m_mesh,
this });
465 void addGhostItems(Int64ConstArrayView unique_ids, Int32ArrayView items, Int32ConstArrayView owners)
override
467 auto* polyhedral_mesh_modifier = m_mesh->_internalApi()->polyhedralMeshModifier();
469 polyhedral_mesh_modifier->addItems(unique_ids, items, owners, ItemFamily::itemKind(), name());
473 String name()
const override {
return ItemFamily::name(); }
474 String fullName()
const override {
return ItemFamily::fullName(); }
475 Integer nbItem()
const override {
return ItemFamily::nbItem(); }
476 ItemGroup allItems()
const override {
return ItemFamily::allItems(); }
477 void endUpdate()
override
479 return ItemFamily::endUpdate();
481 IItemFamily* itemFamily()
override {
return this; }
483 DoFVectorView addDoFs(Int64ConstArrayView dof_uids, Int32ArrayView dof_lids)
override
485 auto* polyhedral_mesh_modifier = m_mesh->_internalApi()->polyhedralMeshModifier();
487 polyhedral_mesh_modifier->addItems(dof_uids, dof_lids, ItemFamily::itemKind(), name());
488 return ItemFamily::view(dof_lids);
491 DoFVectorView addGhostDoFs(Int64ConstArrayView dof_uids, Int32ArrayView dof_lids,
492 Int32ConstArrayView owners)
override
494 addGhostItems(dof_uids, dof_lids, owners);
495 return ItemFamily::view(dof_lids);
498 void removeDoFs(Int32ConstArrayView items_local_id)
override
500 auto* mesh_modifier = m_mesh->_internalApi()->polyhedralMeshModifier();
501 mesh_modifier->removeItems(items_local_id, ItemFamily::itemKind(), m_name);
526 ISubDomain* m_subdomain;
527 Neo::Mesh m_mesh{
"Test" };
529 template <eItemKind IK>
532 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_None;
537 static Neo::ItemKind itemKindArcaneToNeo(
eItemKind ik)
541 return Neo::ItemKind::IK_Cell;
543 return Neo::ItemKind::IK_Face;
545 return Neo::ItemKind::IK_Edge;
547 return Neo::ItemKind::IK_Node;
549 return Neo::ItemKind::IK_Dof;
552 return Neo::ItemKind::IK_None;
554 return Neo::ItemKind::IK_Node;
557 static eItemKind itemKindNeoToArcane(Neo::ItemKind ik)
560 case Neo::ItemKind::IK_Cell:
562 case Neo::ItemKind::IK_Face:
564 case Neo::ItemKind::IK_Edge:
566 case Neo::ItemKind::IK_Node:
568 case Neo::ItemKind::IK_Dof:
570 case Neo::ItemKind::IK_None:
578 explicit PolyhedralMeshImpl(ISubDomain* subDomain)
579 : m_subdomain(subDomain)
580 , m_mesh(String::format(subDomain->defaultMeshHandle().meshName(),
"Polyhedral").localstr(), subDomain->parallelMng()->commRank())
585 String name()
const {
return m_mesh.name(); }
587 Integer dimension()
const {
return m_mesh.dimension(); }
589 Integer nbNode()
const {
return m_mesh.nbNodes(); }
590 Integer nbEdge()
const {
return m_mesh.nbEdges(); }
591 Integer nbFace()
const {
return m_mesh.nbFaces(); }
592 Integer nbCell()
const {
return m_mesh.nbCells(); }
593 Integer nbItem(
eItemKind ik)
const {
return m_mesh.nbItems(itemKindArcaneToNeo(ik)); }
595 SmallSpan<const Neo::Mesh::Connectivity> connectivities(IItemFamily* source_family)
597 auto& neo_source_family = m_mesh.findFamily(itemKindArcaneToNeo(source_family->itemKind()), source_family->name().localstr());
598 auto connectivities = m_mesh.getConnectivities(neo_source_family);
599 return { connectivities.begin(), connectivities.size() };
602 static void _setFaceInfos(
Int32 mod_flags, Face& face)
604 Int32 face_flags = face.itemBase().flags();
605 face_flags &= ~ItemFlags::II_InterfaceFlags;
606 face_flags |= mod_flags;
607 face.mutableItemBase().setFlags(face_flags);
612 void addFamily(
eItemKind ik,
const String& name)
614 m_mesh.addFamily(itemKindArcaneToNeo(ik), name.localstr());
619 void scheduleAddItems(PolyhedralFamily* arcane_item_family,
621 PolyhedralTools::ItemLocalIds& item_local_ids)
628 void scheduleAddItems(PolyhedralFamily* arcane_item_family,
631 PolyhedralTools::ItemLocalIds& item_local_ids)
633 auto& added_items = item_local_ids.m_future_items;
634 auto& item_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_item_family->itemKind()),
635 arcane_item_family->name().localstr());
636 m_mesh.scheduleAddItems(item_family, std::vector<Int64>{ uids.begin(), uids.end() }, added_items);
638 auto& mesh_graph = m_mesh.internalMeshGraph();
639 item_family.addMeshScalarProperty<Neo::utils::Int32>(PolyhedralFamily::m_arcane_item_lids_property_name.localstr());
641 UniqueArray<Int64> uids_copy(uids);
642 UniqueArray<Int32> owners_copy(owners);
643 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ item_family, item_family.lidPropName() },
644 Neo::MeshKernel::OutProperty{ item_family, PolyhedralFamily::m_arcane_item_lids_property_name.localstr() },
645 "AddArcaneItems"+std::string{arcane_item_family->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()->info() <<
"Arcane Items " << arcane_items;
662 std::cout <<
"Neo Items ";
663 std::ranges::copy(neo_items,std::ostream_iterator<int>(std::cout,
" "));
665 arcane_item_family->traceMng()->fatal() <<
"Inconsistent item lids generation between Arcane and Neo in ItemFamily " << arcane_item_family->name();
672 void scheduleRemoveItems(PolyhedralFamily* arcane_item_family,
675 auto& item_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_item_family->itemKind()),
676 arcane_item_family->name().localstr());
677 Neo::ItemRange removed_items{ Neo::ItemLocalIds{ { local_ids.begin(), local_ids.end() }, 0, 0 } };
678 m_mesh.scheduleRemoveItems(item_family, removed_items);
680 auto& mesh_graph = m_mesh.internalMeshGraph();
681 item_family.addMeshScalarProperty<Neo::utils::Int32>(PolyhedralFamily::m_arcane_remove_item_property_name.localstr());
682 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ item_family, m_mesh._removeItemPropertyName(item_family) },
683 Neo::MeshKernel::OutProperty{ item_family, PolyhedralFamily::m_arcane_remove_item_property_name.localstr() },
684 "RemoveArcaneFamily"+std::string{arcane_item_family->name().localstr()},
685 [arcane_item_family, local_ids](Neo::MeshScalarPropertyT<Neo::utils::Int32>
const&,
686 Neo::MeshScalarPropertyT<Neo::utils::Int32>&) {
687 arcane_item_family->removeItems(local_ids);
693 void scheduleAddConnectivity(PolyhedralFamily* arcane_source_item_family,
694 PolyhedralTools::ItemLocalIds& source_items,
695 Integer nb_connected_items_per_item,
696 PolyhedralFamily* arcane_target_item_family,
701 _scheduleAddConnectivity(arcane_source_item_family,
703 nb_connected_items_per_item,
704 arcane_target_item_family,
711 void scheduleAddConnectivity(PolyhedralFamily* arcane_source_item_family,
712 PolyhedralTools::ItemLocalIds& source_items,
714 PolyhedralFamily* arcane_target_item_family,
716 String
const& connectivity_name)
719 _scheduleAddConnectivity(arcane_source_item_family,
721 std::vector<Int32>{ nb_connected_items_per_item.begin(), nb_connected_items_per_item.end() },
722 arcane_target_item_family,
730 void scheduleUpdateConnectivity(PolyhedralFamily* arcane_source_item_family,
731 PolyhedralTools::ItemLocalIds& source_items,
732 Integer nb_connected_items_per_item,
733 PolyhedralFamily* arcane_target_item_family,
738 _scheduleAddConnectivity(arcane_source_item_family,
740 nb_connected_items_per_item,
741 arcane_target_item_family,
744 Neo::Mesh::ConnectivityOperation::Modify);
749 void scheduleUpdateConnectivity(PolyhedralFamily* arcane_source_item_family,
750 PolyhedralTools::ItemLocalIds& source_items,
752 PolyhedralFamily* arcane_target_item_family,
754 String
const& connectivity_name)
756 _scheduleAddConnectivity(arcane_source_item_family,
758 std::vector<Int32>{ nb_connected_items_per_item.begin(), nb_connected_items_per_item.end() },
759 arcane_target_item_family,
762 Neo::Mesh::ConnectivityOperation::Modify);
768 template <
typename ConnectivitySizeType>
769 void _scheduleAddConnectivity(PolyhedralFamily* arcane_source_item_family,
770 PolyhedralTools::ItemLocalIds& source_items,
771 ConnectivitySizeType&& nb_connected_items_per_item,
772 PolyhedralFamily* arcane_target_item_family,
774 String
const& connectivity_name,
775 Neo::Mesh::ConnectivityOperation operation = Neo::Mesh::ConnectivityOperation::Add)
778 auto& source_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_source_item_family->itemKind()),
779 arcane_source_item_family->name().localstr());
780 auto& target_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_target_item_family->itemKind()),
781 arcane_target_item_family->name().localstr());
783 UniqueArray<Int64> target_item_uids_copy(target_item_uids);
785 std::vector<Int64> target_item_uids_filtered;
786 target_item_uids_filtered.reserve(target_item_uids.size());
787 std::copy_if(target_item_uids.begin(),
788 target_item_uids.end(),
789 std::back_inserter(target_item_uids_filtered),
790 [](
auto uid) { return uid != NULL_ITEM_UNIQUE_ID; });
792 m_mesh.scheduleAddConnectivity(source_family, source_items.m_future_items, target_family,
793 std::forward<ConnectivitySizeType>(nb_connected_items_per_item),
794 std::move(target_item_uids_filtered),
795 connectivity_name.localstr(),
798 auto& mesh_graph = m_mesh.internalMeshGraph();
799 std::string connectivity_add_output_property_name = std::string{
"EndOf" } + connectivity_name.localstr() +
"Add";
800 source_family.addScalarProperty<Neo::utils::Int32>(connectivity_add_output_property_name);
802 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, connectivity_name.localstr() },
803 Neo::MeshKernel::OutProperty{ source_family, connectivity_add_output_property_name },
804 "UpdateArcaneConnectivity"+std::string{connectivity_name.localstr()},
805 [arcane_source_item_family, arcane_target_item_family, &source_family, &target_family,
this]
806 (Neo::Mesh::ConnectivityPropertyType
const& neo_connectivity,
807 Neo::ScalarPropertyT<Neo::utils::Int32>&) {
808 auto rank = arcane_source_item_family->mesh()->parallelMng()->commRank();
809 Neo::printer(rank) <<
"==Algorithm update Arcane connectivity: "<< neo_connectivity.name() << Neo::endline;
810 auto item_internal_connectivity_list = arcane_source_item_family->itemInternalConnectivityList();
812 auto connectivity = m_mesh.getConnectivity(source_family, target_family, neo_connectivity.name());
814 auto& connectivity_values = source_family.getConcreteProperty<Neo::Mesh::ConnectivityPropertyType>(neo_connectivity.name());
815 Neo::MeshArrayPropertyProxyT<Neo::Mesh::ConnectivityPropertyType::PropertyDataType> connectivity_proxy{ connectivity_values };
816 auto nb_item_data = connectivity_proxy.arrayPropertySizes();
817 auto nb_item_size = connectivity_proxy.arrayPropertySizesSize();
818 item_internal_connectivity_list->_setConnectivityNbItem(arcane_target_item_family->itemKind(),
820 auto max_nb_connected_items = connectivity.maxNbConnectedItems();
821 item_internal_connectivity_list->_setMaxNbConnectedItem(arcane_target_item_family->itemKind(), max_nb_connected_items);
822 auto connectivity_values_data = connectivity_proxy.arrayPropertyData();
823 auto connectivity_values_size = connectivity_proxy.arrayPropertyDataSize();
824 item_internal_connectivity_list->_setConnectivityList(arcane_target_item_family->itemKind(),
825 Int32ArrayView{ Integer(connectivity_values_size), connectivity_values_data });
826 auto connectivity_index_data = connectivity_proxy.arrayPropertyIndex();
827 auto connectivity_index_size = connectivity_proxy.arrayPropertyIndexSize();
828 item_internal_connectivity_list->_setConnectivityIndex(arcane_target_item_family->itemKind(),
829 Int32ArrayView{ Integer(connectivity_index_size), connectivity_index_data }); }, Neo::MeshKernel::AlgorithmPropertyGraph::AlgorithmPersistence::KeepAfterExecution);
831 if (arcane_source_item_family->itemKind() ==
IK_Face && arcane_target_item_family->itemKind() ==
IK_Cell) {
832 std::string flag_definition_output_property_name{
"EndOfFlagDefinition" };
833 source_family.addScalarProperty<Neo::utils::Int32>(flag_definition_output_property_name);
835 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, connectivity_add_output_property_name }, Neo::MeshKernel::OutProperty{ source_family, flag_definition_output_property_name },
836 "UpdateFaceFlagsAfterConnectivityDefinition",
837 [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&) {
838 auto current_face_index = 0;
839 auto arcane_faces = arcane_source_item_family->itemInfoListView();
841 arcane_target_item_family->itemsUniqueIdToLocalId(target_item_lids, target_item_uids_local,
false);
842 for (
auto face_lid : source_items.m_future_items.new_items) {
843 Face current_face = arcane_faces[face_lid].toFace();
844 if (target_item_lids[2 * current_face_index + 1] == NULL_ITEM_LOCAL_ID) {
847 _setFaceInfos(mod_flags, current_face);
849 else if (target_item_lids[2 * current_face_index] == NULL_ITEM_LOCAL_ID) {
857 ++current_face_index;
861 auto const isolated_items_property_name = m_mesh._isolatedItemLidsPropertyName(source_family,target_family);
862 std::string
const flag_update_output_property_name{
"EndOfFlagUpdate" };
863 source_family.addScalarProperty<Neo::utils::Int32>(flag_update_output_property_name);
865 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, isolated_items_property_name },
866 Neo::MeshKernel::OutProperty{ source_family, flag_update_output_property_name },
867 "UpdateFaceFlagsAfterCellRemoval",
868 [arcane_source_item_family,&source_family,connectivity_name](Neo::MeshScalarPropertyT<Neo::utils::Int32>
const&, Neo::ScalarPropertyT<Neo::utils::Int32>
const&) {
869 auto const rank = arcane_source_item_family->mesh()->parallelMng()->commRank();
870 Neo::printer(rank) <<
"==Algorithm update Face flags after cell removal" << Neo::endline;
872 auto const removed_target_item_index_prop_name = Neo::Mesh::removedTargetItemIndexfilteredItemPropertyName(connectivity_name.localstr());
873 auto& null_item_connected = source_family.getConcreteProperty<Neo::MeshArrayPropertyT<Neo::utils::Int32>>(removed_target_item_index_prop_name);
874 null_item_connected.debugPrint(rank);
875 ENUMERATE_(Face,iface,arcane_source_item_family->allItems())
877 Face current_face = *iface;
878 auto null_items_connected_to_face = null_item_connected[iface.localId()];
879 if (null_items_connected_to_face.size() > 2)
881 ARCANE_FATAL(
"More than one null item connected to face {0}",iface.localId());
884 if (null_items_connected_to_face.size() == 0)
888 if (null_items_connected_to_face[0] == 0)
893 else if (null_items_connected_to_face[0] == 1)
901 Neo::MeshKernel::AlgorithmPropertyGraph::AlgorithmPersistence::KeepAfterExecution
905 if (operation == Neo::Mesh::ConnectivityOperation::Modify)
907 auto isolated_item_property_name = m_mesh._isolatedItemLidsPropertyName(source_family, target_family);
908 auto end_of_isolated_removal_property_name = std::string{
"EndOf" } + isolated_item_property_name;
909 source_family.addScalarProperty<Neo::utils::Int32>(end_of_isolated_removal_property_name);
910 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, isolated_item_property_name },
911 Neo::MeshKernel::OutProperty{ source_family, end_of_isolated_removal_property_name },
912 "RemoveIsolatedArcaneItemsIn"+std::string{ arcane_source_item_family->name().localstr() },
913 [arcane_source_item_family](Neo::MeshScalarPropertyT<Neo::utils::Int32>
const& isolated_items_lids_property,
914 Neo::ScalarPropertyT<Neo::utils::Int32>& end_of_isolated_removal_property) {
915 end_of_isolated_removal_property.set(1);
918 isolated_item_lids.
reserve(isolated_items_lids_property.size());
919 ENUMERATE_(Item,iitem,arcane_source_item_family->allItems()) {
920 if (isolated_items_lids_property[iitem->localId()] == 1) {
921 isolated_item_lids.push_back(iitem->localId());
924 std::sort(isolated_item_lids.begin(), isolated_item_lids.end());
925 arcane_source_item_family->traceMng()->info() <<
"Remove isolated in Arcane for family "
926 << arcane_source_item_family->name() <<
" lids : " << isolated_item_lids;
927 isolated_items_lids_property.debugPrint();
928 arcane_source_item_family->removeItems(isolated_item_lids);
929 }, Neo::MeshKernel::AlgorithmPropertyGraph::AlgorithmPersistence::KeepAfterExecution);
936 auto& _item_family = m_mesh.findFamily(itemKindArcaneToNeo(item_family->itemKind()), item_family->name().localstr());
937 std::vector<Neo::utils::Real3> _node_coords(item_coords.size());
939 for (
auto&& node_coord : item_coords) {
940 _node_coords[node_index++] = Neo::utils::Real3{ node_coord.x, node_coord.y, node_coord.z };
942 m_mesh.scheduleSetItemCoords(_item_family, local_ids.m_future_items, _node_coords);
944 auto& mesh_graph = m_mesh.internalMeshGraph();
945 _item_family.addScalarProperty<
Int32>(
"NoOutProperty42");
946 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ _item_family, m_mesh._itemCoordPropertyName(_item_family) },
947 Neo::MeshKernel::OutProperty{ _item_family,
"NoOutProperty42" },
948 "UpdateArcaneCoordsIn"+std::string{item_family->name().localstr()},
949 [
this, item_family, &_item_family, &arcane_coords](Neo::Mesh::CoordPropertyType
const& item_coords_property,
950 Neo::ScalarPropertyT<Neo::utils::Int32>&) {
952 auto& all_items = _item_family.all();
953 VariableNodeReal3 node_coords{ VariableBuildInfo{ item_family->mesh(),
"NodeCoord" } };
954 for (
auto item : all_items) {
955 arcane_coords[ItemLocalId{ item }] = { item_coords_property[item].x,
956 item_coords_property[item].y,
957 item_coords_property[item].z };
964 Neo::EndOfMeshUpdate applyScheduledOperations() noexcept
966 return m_mesh.applyScheduledOperations();
970 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Cell>
972 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Cell;
974 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Face>
976 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Face;
978 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Edge>
980 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Edge;
982 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Node>
984 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Node;
986 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_DoF>
988 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Dof;
993 void PolyhedralFamilySerializer::serializeItems(ISerializer* buf,
Int32ConstArrayView items_local_ids)
998 switch (buf->mode()) {
999 case ISerializer::ModeReserve: {
1000 _fillItemData(items_local_ids);
1001 m_item_data.serialize(buf);
1002 auto connectivities = m_mesh->_impl()->connectivities(m_family);
1003 for (
auto out_connectivity : connectivities) {
1004 buf->reserve(out_connectivity.target_family.name());
1005 buf->reserve(out_connectivity.name);
1010 m_item_data.serialize(buf);
1011 auto connectivities = m_mesh->_impl()->connectivities(m_family);
1012 for (
auto out_connectivity : connectivities) {
1013 buf->put(out_connectivity.target_family.name());
1014 buf->put(out_connectivity.name);
1020 deserializeItems(buf,
nullptr);
1028 void PolyhedralFamilySerializer::deserializeItems(ISerializer* buf,
Int32Array* items_local_ids)
1031 (
"Impossible to deserialize a buffer not in ModeGet. In ItemData::deserialize.Exiting"))
1036 if (items_local_ids)
1037 item_data.deserialize(buf, m_mesh, *items_local_ids);
1039 item_data.deserialize(buf, m_mesh);
1040 auto connectivities = m_mesh->_impl()->connectivities(m_family);
1041 auto nb_connectivities = connectivities.size();
1045 for (auto out_connectivity : connectivities) {
1046 buf->get(connected_family_names[index]);
1047 buf->get(connectivity_names[index]);
1050 _fillItemFamilyInfo(item_data, connected_family_names, connectivity_names);
1052 if (items_local_ids) {
1053 m_deserialized_lids_array.push_back(items_local_ids);
1056 m_future_item_lids_array.push_back(std::make_shared<PolyhedralTools::ItemLocalIds>());
1057 m_mesh->scheduleAllocateItems(m_family_info, *m_future_item_lids_array.back().get());
1060 m_mng->addSerializer(
this);
1066 m_item_data = ItemData{ items_local_ids.size(), 0, m_family,
nullptr, m_family->parallelMng()->commRank() };
1067 Int64Array& item_infos = m_item_data.itemInfos();
1071 item_infos.reserve(1 + nb_item * 32);
1074 auto connectivities = mesh_impl->connectivities(m_family);
1075 item_infos.add(connectivities.size());
1076 bool is_face_family = m_family->itemKind() ==
IK_Face;
1079 item_infos.add(item->uniqueId().asInt64());
1080 item_owners[item.index()] = item->owner();
1081 for (
auto out_connectivity : connectivities) {
1082 auto target_family = m_mesh->findItemFamily(PolyhedralMeshImpl::itemKindNeoToArcane(out_connectivity.target_family.itemKind()),
1083 out_connectivity.target_family.name(),
false,
false);
1085 auto arcane_connected_items = target_family->itemInfoListView();
1086 bool is_face_cell_connection = is_face_family && target_family->itemKind() ==
IK_Cell;
1087 item_infos.add(PolyhedralMeshImpl::itemKindNeoToArcane(out_connectivity.target_family.itemKind()));
1088 auto connected_items = out_connectivity[item.localId()];
1089 auto nb_connected_items = connected_items.size();
1090 item_infos.add(nb_connected_items);
1091 if (is_face_cell_connection && item->itemBase().isBoundary() && item->itemBase().backCell().isNull()) {
1092 item_infos.add(NULL_ITEM_UNIQUE_ID);
1094 for (
auto connected_item_lid : connected_items) {
1095 item_infos.add(arcane_connected_items[connected_item_lid].uniqueId().asInt64());
1097 if (is_face_cell_connection && item->itemBase().isBoundary() && !item->itemBase().backCell().isNull()) {
1098 item_infos.add(NULL_ITEM_UNIQUE_ID);
1109class mesh::PolyhedralMesh::PolyhedralMeshModifier
1114 explicit PolyhedralMeshModifier(PolyhedralMesh* mesh)
1118 void addItems(Int64ConstArrayView unique_ids, Int32ArrayView local_ids, eItemKind ik,
const String& family_name)
override
1120 m_mesh->addItems(unique_ids, local_ids, ik, family_name);
1123 void addItems(Int64ConstArrayView unique_ids, Int32ArrayView local_ids, Int32ConstArrayView owners, eItemKind ik,
const String& family_name)
override
1125 m_mesh->addItems(unique_ids, local_ids, owners, ik, family_name);
1128 void removeItems(Int32ConstArrayView local_ids, eItemKind ik,
const String& family_name)
override
1130 m_mesh->removeItems(local_ids, ik, family_name);
1135 PolyhedralMesh* m_mesh;
1141class mesh::PolyhedralMesh::InternalApi
1147 explicit InternalApi(PolyhedralMesh* mesh)
1149 , m_connectivity_mng(std::make_unique<ItemConnectivityMng>(mesh->traceMng()))
1150 , m_polyhedral_mesh_modifier(std::make_unique<PolyhedralMeshModifier>(mesh))
1155 void setMeshKind(
const MeshKind& v)
override
1157 if (v.meshStructure() != eMeshStructure::Polyhedral && v.meshAMRKind() != eMeshAMRKind::None) {
1158 ARCANE_FATAL(
"Incompatible mesh structure ({0}) and amr kind ({1}) for Polyhedral mesh {2}. Must be (Polyhedral,None). ",
1159 v.meshStructure(), v.meshAMRKind(), m_mesh->name());
1161 m_mesh->m_mesh_kind = v;
1164 IItemConnectivityMng* dofConnectivityMng() const noexcept
override
1166 return m_connectivity_mng.get();
1169 IPolyhedralMeshModifier* polyhedralMeshModifier() const noexcept
override
1171 return m_polyhedral_mesh_modifier.get();
1174 void removeNeedRemoveMarkedItems()
override
1176 m_mesh->removeNeedRemoveMarkedItems();
1178 NodeLocalId addNode([[maybe_unused]] ItemUniqueId unique_id)
override
1182 FaceLocalId addFace([[maybe_unused]] ItemUniqueId unique_id,
1183 [[maybe_unused]] ItemTypeId type_id,
1184 [[maybe_unused]] ConstArrayView<Int64> nodes_uid)
override
1188 CellLocalId addCell([[maybe_unused]] ItemUniqueId unique_id,
1189 [[maybe_unused]] ItemTypeId type_id,
1190 [[maybe_unused]] ConstArrayView<Int64> nodes_uid)
override
1195 IItemFamilySerializerMngInternal* familySerializerMng() const noexcept
override
1197 return m_mesh->polyhedralFamilySerializerMng();
1200 ItemInternalMap& nodesMap()
override
1202 return m_mesh->_itemFamily(IK_Node)->itemsMap();
1205 ItemInternalMap& edgesMap()
override
1207 return m_mesh->_itemFamily(IK_Edge)->itemsMap();
1210 ItemInternalMap& facesMap()
override
1212 return m_mesh->_itemFamily(IK_Face)->itemsMap();
1215 ItemInternalMap& cellsMap()
override
1217 return m_mesh->_itemFamily(IK_Cell)->itemsMap();
1220 FaceFamily& trueFaceFamily()
override
1222 ARCANE_FATAL(
"PolyhedralMesh::trueFaceFamily() is not implemented. PolyhedralMesh has no concrete FaceFamily.");
1225 void printStats(Int32 level)
1227 m_mesh->traceMng()->info(level) <<
"-- -- Statistics";
1228 m_mesh->traceMng()->info(level) <<
"Number of nodes after addition &: "
1229 <<
" hashmap=" << m_mesh->_internalApi()->nodesMap().count();
1230 m_mesh->traceMng()->info(level) <<
"Number of edges after addition : "
1231 <<
" hashmap=" << m_mesh->_internalApi()->edgesMap().count();
1232 m_mesh->traceMng()->info(level) <<
"Number of faces after addition : "
1233 <<
" hashmap=" << m_mesh->_internalApi()->facesMap().count();
1234 m_mesh->traceMng()->info(level) <<
"Number of cells after addition : "
1235 <<
" hashmap=" << m_mesh->_internalApi()->cellsMap().count();
1236 m_mesh->traceMng()->info(level) <<
"--";
1241 PolyhedralMesh* m_mesh =
nullptr;
1242 std::unique_ptr<IItemConnectivityMng> m_connectivity_mng =
nullptr;
1243 std::unique_ptr<IPolyhedralMeshModifier> m_polyhedral_mesh_modifier =
nullptr;
1249class mesh::PolyhedralMesh::NoCompactionMeshCompacter
1254 explicit NoCompactionMeshCompacter(PolyhedralMesh* mesh)
1256 , m_trace_mng(mesh->traceMng())
1259 void doAllActions()
override { _info(); };
1261 void beginCompact()
override { _info(); };
1262 void compactVariablesAndGroups()
override { _info(); };
1263 void updateInternalReferences()
override { _info(); };
1264 void endCompact()
override { _info(); };
1265 void finalizeCompact()
override { _info(); };
1267 IMesh* mesh()
const override {
return m_mesh; };
1269 const ItemFamilyCompactInfos* findCompactInfos(IItemFamily*)
const override
1275 ePhase phase()
const override
1278 return ePhase::Ended;
1281 void setSorted(
bool)
override { _info(); };
1283 bool isSorted()
const override
1295 void _setCompactVariablesAndGroups(
bool)
override { _info(); };
1299 PolyhedralMesh* m_mesh =
nullptr;
1300 ITraceMng* m_trace_mng =
nullptr;
1302 void _info()
const { m_trace_mng->info() << A_FUNCINFO <<
"No compacting in PolyhedralMesh"; }
1308class mesh::PolyhedralMesh::NoCompactionMeshCompactMng
1313 explicit NoCompactionMeshCompactMng(PolyhedralMesh* mesh)
1315 , m_trace_mng(mesh->traceMng())
1316 , m_mesh_compacter{ std::make_unique<NoCompactionMeshCompacter>(m_mesh) }
1319 IMesh* mesh()
const override {
return m_mesh; }
1320 IMeshCompacter* beginCompact()
override
1323 return m_mesh_compacter.get();
1326 IMeshCompacter* beginCompact(IItemFamily* family)
override
1328 ARCANE_UNUSED(family);
1330 return m_mesh_compacter.get();
1333 void endCompact()
override { _info(); };
1335 IMeshCompacter* compacter()
override
1338 return m_mesh_compacter.get();
1343 PolyhedralMesh* m_mesh =
nullptr;
1344 ITraceMng* m_trace_mng =
nullptr;
1345 std::unique_ptr<IMeshCompacter> m_mesh_compacter =
nullptr;
1347 void _info()
const { m_trace_mng->info() << A_FUNCINFO <<
"No compacting in PolyhedralMesh"; }
1353mesh::PolyhedralMesh::
1356 m_mesh_handle._setMesh(
nullptr);
1365 return m_subdomain->traceMng();
1374 return m_mesh_handle;
1379mesh::PolyhedralMesh::
1380PolyhedralMesh(ISubDomain* subdomain,
const MeshBuildInfo& mbi)
1382, m_name{ mbi.name() }
1383, m_subdomain{ subdomain }
1384, m_mesh_handle{ m_subdomain->defaultMeshHandle() }
1385, m_properties(std::make_unique<Properties>(subdomain->propertyMng(), String(
"ArcaneMeshProperties_") + m_name))
1387, m_parallel_mng{ mbi.parallelMngRef().get() }
1388, m_mesh_part_info{ makeMeshPartInfoFromParallelMng(m_parallel_mng) }
1389, m_item_type_mng(ItemTypeMng::_singleton())
1390, m_mesh_kind(mbi.meshKind())
1391, m_polyhedral_family_serializer_mng{ std::make_unique<PolyhedralFamilySerializerMng>(this) }
1392, m_initial_allocator(*this)
1393, m_variable_mng{ subdomain->variableMng() }
1394, m_mesh_checker{ this }
1395, m_internal_api{ std::make_unique<InternalApi>(this) }
1396, m_compact_mng{ std::make_unique<NoCompactionMeshCompactMng>(this) }
1397, m_mesh_utilities{ std::make_unique<UnstructuredMeshUtilities>(this) }
1398, m_mesh_exchange_mng{ std::make_unique<MeshExchangeMng>(this) }
1400, m_ghost_layer_mng{ std::make_unique<GhostLayerMng>(m_trace_mng) }
1401, m_connectivity(VariableBuildInfo{ subdomain, mbi.name() +
"MeshConnectivity" })
1404 m_mesh_handle._setMesh(
this);
1405 m_mesh_item_internal_list.mesh =
this;
1406 m_default_arcane_families.fill(
nullptr);
1412void Arcane::mesh::PolyhedralMesh::
1415 _allocateItems(item_allocation_info, ArrayView<Int32UniqueArray>{});
1420void Arcane::mesh::PolyhedralMesh::
1421allocateItems(
const Arcane::ItemAllocationInfo& item_allocation_info, ArrayView<Int32UniqueArray> family_lids)
1423 _allocateItems(item_allocation_info, family_lids);
1428void Arcane::mesh::PolyhedralMesh::
1429_allocateItems(
const Arcane::ItemAllocationInfo& item_allocation_info, ArrayView<Int32UniqueArray> family_lids)
1432 m_subdomain->traceMng()->info() <<
"--PolyhedralMesh: allocate items --";
1433 UniqueArray<PolyhedralTools::ItemLocalIds> item_local_ids(item_allocation_info.family_infos.size());
1434 auto family_index = 0;
1436 for (
auto& family_info : item_allocation_info.family_infos) {
1437 bool create_if_needed =
true;
1438 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name, create_if_needed);
1439 m_trace_mng->debug(
Trace::High) <<
"- Création des éléments " << family_info.name;
1440 m_mesh->scheduleAddItems(item_family, family_info.item_uids, family_info.item_owners.constSmallSpan(), item_local_ids[family_index++]);
1444 for (
auto& family_info : item_allocation_info.family_infos) {
1445 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
1446 m_trace_mng->debug(
Trace::High) <<
"- Famille actuelle " << family_info.name;
1447 for (
auto& current_connected_family_info : family_info.connected_family_infos) {
1448 auto connected_family = _findItemFamily(current_connected_family_info.item_kind, current_connected_family_info.name);
1449 m_trace_mng->debug(
Trace::High) <<
"- Création de la connectivité " << current_connected_family_info.connectivity_name;
1451 if (!connected_family) {
1452 ARCANE_WARNING((String::format(
"Impossible de trouver la famille {0} avec le type {1} "
1453 "La connectivité entre {1} et cette famille est ignorée",
1454 current_connected_family_info.name,
1455 current_connected_family_info.item_kind,
1456 item_family->name())
1460 m_mesh->scheduleAddConnectivity(item_family,
1461 item_local_ids[family_index],
1462 current_connected_family_info.nb_connected_items_per_item,
1464 current_connected_family_info.connected_items_uids,
1465 current_connected_family_info.connectivity_name);
1466 Connectivity connectivity{ m_connectivity };
1472 m_mesh->applyScheduledOperations();
1474 for (
auto& family_info : item_allocation_info.family_infos) {
1475 if (family_info.item_kind !=
IK_Node && family_info.item_coordinates.empty()) {
1478 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
1479 if (item_family == itemFamily(
IK_Node)) {
1480 if (!m_arcane_node_coords.get()) {
1481 m_arcane_node_coords = std::make_unique<VariableNodeReal3>(VariableBuildInfo(
this, family_info.item_coordinates_variable_name));
1482 m_arcane_node_coords->setUsed(
true);
1486 auto arcane_item_coords_var_ptr = std::make_unique<VariableItemReal3>(VariableBuildInfo(
this, family_info.item_coordinates_variable_name),
1487 item_family->itemKind());
1488 arcane_item_coords_var_ptr->setUsed(
true);
1489 m_arcane_item_coords.push_back(std::move(arcane_item_coords_var_ptr));
1493 for (
auto& family : m_arcane_families) {
1494 family->endUpdate();
1500 for (
auto& family_info : item_allocation_info.family_infos) {
1501 if (family_info.item_coordinates.empty()) {
1505 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
1506 if (item_family == itemFamily(
IK_Node)) {
1507 m_mesh->scheduleSetItemCoordinates(item_family, item_local_ids[family_index], family_info.item_coordinates, *m_arcane_node_coords);
1510 m_mesh->scheduleSetItemCoordinates(item_family, item_local_ids[family_index], family_info.item_coordinates, *m_arcane_item_coords[index++].get());
1512 auto mesh_state = m_mesh->applyScheduledOperations();
1513 m_is_allocated =
true;
1515 itemTypeMng()->setMeshWithGeneralCells(
this);
1517 if (!family_lids.empty()) {
1519 ARCANE_ASSERT((family_lids.size() == item_local_ids.size()), (
"Incoherence in item number"));
1520 for (
auto& lid_array : item_local_ids) {
1521 family_lids[index].resize(lid_array.size());
1522 lid_array.fillArrayView(family_lids[index].view(), mesh_state);
1530void Arcane::mesh::PolyhedralMesh::
1531scheduleAllocateItems(
const Arcane::ItemAllocationInfo::FamilyInfo& family_info, mesh::PolyhedralTools::ItemLocalIds& item_local_ids)
1534 m_subdomain->traceMng()->info() <<
"--PolyhedralMesh: schedule allocate items --";
1536 bool create_if_needed =
true;
1537 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name, create_if_needed);
1538 m_trace_mng->debug(
Trace::High) <<
"- Famille actuelle " << family_info.name;
1539 m_trace_mng->debug(
Trace::High) <<
"- Création des éléments ";
1540 m_mesh->scheduleAddItems(item_family, family_info.item_uids, family_info.item_owners.
constSmallSpan(), item_local_ids);
1542 for (
auto& current_connected_family_info : family_info.connected_family_infos) {
1543 auto connected_family = _findItemFamily(current_connected_family_info.item_kind, current_connected_family_info.name);
1544 m_trace_mng->debug(
Trace::High) <<
"- Création de la connectivité " << current_connected_family_info.connectivity_name;
1546 if (!connected_family) {
1547 ARCANE_WARNING((String::format(
"Impossible de trouver la famille {0} avec le type {1} "
1548 "La connectivité entre {1} et cette famille est ignorée",
1549 current_connected_family_info.name,
1550 current_connected_family_info.item_kind,
1551 item_family->name())
1555 m_mesh->scheduleUpdateConnectivity(item_family,
1557 current_connected_family_info.nb_connected_items_per_item,
1559 current_connected_family_info.connected_items_uids,
1560 current_connected_family_info.connectivity_name);
1566void Arcane::mesh::PolyhedralMesh::
1567applyScheduledAllocateItems(UniqueArray<std::shared_ptr<PolyhedralTools::ItemLocalIds>> item_lids)
1570 auto mesh_state = m_mesh->applyScheduledOperations();
1572 for (
auto item_local_ids : item_lids) {
1573 item_local_ids->m_mesh_state = std::make_shared<Neo::EndOfMeshUpdate>(mesh_state);
1577 for (
auto& family : m_arcane_families) {
1578 family->endUpdate();
1581 m_is_allocated =
true;
1583 itemTypeMng()->setMeshWithGeneralCells(
this);
1588void mesh::PolyhedralMesh::removeNeedRemoveMarkedItems()
1591 for (
auto family_index = 0; family_index < m_arcane_families.size(); ++family_index) {
1593 auto* family = m_arcane_families[family_index].get();
1595 items_to_remove.
reserve(family->nbItem());
1596 auto& items_map = family->itemsMap();
1597 if (items_map.count() == 0)
1599 items_map.eachItem([&](ItemBase item) {
1601 auto f = item.flags();
1604 item.toMutable().setFlags(f);
1605 items_to_remove.add(item.localId());
1608 if (!items_to_remove.empty()) {
1609 removeItems(items_to_remove, family);
1616Arcane::mesh::PolyhedralFamilySerializerMng* mesh::PolyhedralMesh::
1617polyhedralFamilySerializerMng()
1619 return m_polyhedral_family_serializer_mng.get();
1625void Arcane::mesh::PolyhedralMesh::
1628 for (
auto& family : m_arcane_families) {
1629 family->endUpdate();
1636void Arcane::mesh::PolyhedralMesh::
1637_computeFamilySynchronizeInfos()
1639 m_subdomain->traceMng()->info() <<
"Computing family synchronization information for " << name();
1640 for (
auto& family : m_arcane_families) {
1641 family->computeSynchronizeInfos();
1646 auto* var_syncer = cellFamily()->allItemsSynchronizer();
1647 Int32 iteration = m_subdomain->commonVariables().globalIteration();
1648 String file_name = String::format(
"{0}_sync_topology_iter{1}.json", name(), iteration);
1649 mesh_utils::dumpSynchronizerTopologyJSON(var_syncer, file_name);
1656void Arcane::mesh::PolyhedralMesh::
1657_notifyEndUpdateForFamilies()
1659 for (
auto& family : m_arcane_families)
1660 family->_internalApi()->notifyEndUpdateFromMesh();
1666void Arcane::mesh::PolyhedralMesh::
1667_computeGroupSynchronizeInfos()
1669 auto action = [](ItemGroup& group) {
1670 if (group.hasSynchronizer())
1671 group.synchronizer()->compute();
1674 m_trace_mng->info() <<
"Computing group synchronization information for " << name();
1675 meshvisitor::visitGroups(
this, action);
1693 return m_mesh->dimension();
1702 return m_mesh->nbNode();
1711 return m_mesh->nbEdge();
1720 return m_mesh->nbFace();
1729 return m_mesh->nbCell();
1738 return m_mesh->nbItem(ik);
1747 if (m_default_arcane_families[
IK_Node])
1748 return m_default_arcane_families[
IK_Node]->allItems();
1759 if (m_default_arcane_families[
IK_Edge])
1760 return m_default_arcane_families[
IK_Edge]->allItems();
1771 if (m_default_arcane_families[
IK_Face])
1772 return m_default_arcane_families[
IK_Face]->allItems();
1783 if (m_default_arcane_families[
IK_Cell])
1784 return m_default_arcane_families[
IK_Cell]->allItems();
1795 if (m_default_arcane_families[
IK_Node])
1796 return m_default_arcane_families[
IK_Node]->allItems().own();
1807 if (m_default_arcane_families[
IK_Edge])
1808 return m_default_arcane_families[
IK_Edge]->allItems().own();
1819 if (m_default_arcane_families[
IK_Face])
1820 return m_default_arcane_families[
IK_Face]->allItems().own();
1831 if (m_default_arcane_families[
IK_Cell])
1832 return m_default_arcane_families[
IK_Cell]->allItems().own();
1843 if (m_default_arcane_families[
IK_Cell])
1852mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1853_createItemFamily(
eItemKind ik,
const String& name)
1855 m_mesh->addFamily(ik, name);
1856 m_arcane_families.push_back(std::make_unique<PolyhedralFamily>(
this, ik, name));
1857 auto current_family = m_arcane_families.back().get();
1858 if (m_default_arcane_families[ik] ==
nullptr) {
1859 m_default_arcane_families[ik] = current_family;
1860 _updateMeshInternalList(ik);
1862 m_item_family_collection.add(current_family);
1863 current_family->build();
1864 return current_family;
1873 return _createItemFamily(ik, name);
1879void mesh::PolyhedralMesh::
1882 createItemFamily(
IK_Cell,
"CellFamily");
1883 createItemFamily(
IK_Node,
"NodeFamily");
1884 auto cell_family = m_default_arcane_families[
IK_Cell];
1885 auto node_family = m_default_arcane_families[
IK_Node];
1888 PolyhedralTools::ItemLocalIds cell_lids, node_lids;
1889 m_mesh->scheduleAddItems(cell_family, cell_uids.constView(), cell_lids);
1890 m_mesh->scheduleAddItems(node_family, node_uids.constView(), node_lids);
1893 m_mesh->scheduleAddConnectivity(cell_family, cell_lids, nb_node, node_family, node_uids, String{
"CellToNodes" });
1894 m_mesh->scheduleAddConnectivity(node_family, node_lids, 1, cell_family,
1895 node_cells_uids, String{
"NodeToCells" });
1896 m_mesh->applyScheduledOperations();
1897 cell_family->endUpdate();
1898 node_family->endUpdate();
1911 for (
auto ik = 0; ik < NB_ITEM_KIND; ++ik) {
1914 m_empty_arcane_families[ik] = std::make_unique<mesh::PolyhedralFamily>(
this, (
eItemKind)ik, name);
1915 m_default_arcane_families[ik] = m_empty_arcane_families[ik].get();
1926 return m_default_arcane_families[
IK_Node];
1935 return m_default_arcane_families[
IK_Edge];
1944 return m_default_arcane_families[
IK_Face];
1953 return m_default_arcane_families[
IK_Cell];
1956void mesh::PolyhedralMesh::
1961 m_mesh_item_internal_list.cells = m_default_arcane_families[kind]->itemsInternal();
1962 m_mesh_item_internal_list._internalSetCellSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1965 m_mesh_item_internal_list.faces = m_default_arcane_families[kind]->itemsInternal();
1966 m_mesh_item_internal_list._internalSetFaceSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1969 m_mesh_item_internal_list.edges = m_default_arcane_families[kind]->itemsInternal();
1970 m_mesh_item_internal_list._internalSetEdgeSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1973 m_mesh_item_internal_list.nodes = m_default_arcane_families[kind]->itemsInternal();
1974 m_mesh_item_internal_list._internalSetNodeSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1986mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1989 return m_default_arcane_families[ik];
1998 return _itemFamily(ik);
2007 return m_item_type_mng;
2013mesh::PolyhedralFamily* mesh::PolyhedralMesh::
2014_findItemFamily(
eItemKind ik,
const String& name,
bool create_if_needed)
2017 auto found_family = _itemFamily(ik);
2019 if (found_family->name() == name)
2020 return found_family;
2022 for (
auto& family : m_arcane_families) {
2023 if (family->itemKind() == ik && family->name() == name)
2024 return family.get();
2026 if (!create_if_needed)
2028 return _createItemFamily(ik, name);
2037 ARCANE_UNUSED(register_modifier_if_created);
2038 return _findItemFamily(ik, name, create_if_needed);
2044mesh::PolyhedralFamily* mesh::PolyhedralMesh::
2047 return m_default_arcane_families[ik];
2056 ARCANE_ASSERT(m_arcane_node_coords, (
"Node coordinates not yet loaded."));
2057 return *m_arcane_node_coords;
2067 for (
auto& family : m_arcane_families) {
2068 group = family->findGroup(name);
2081 m_all_groups.
clear();
2082 for (
auto& family : m_arcane_families) {
2084 m_all_groups.add(*i_group);
2086 return m_all_groups;
2095 for (
auto& family : m_arcane_families) {
2096 family->destroyGroups();
2106 return m_item_family_collection;
2115 return m_internal_api.get();
2124 return m_compact_mng.get();
2130void mesh::PolyhedralMesh::
2133 ARCANE_ASSERT((unique_ids.size() == local_ids.size()), (
"local and unique ids arrays must have same size"))
2134 auto* item_family = _findItemFamily(ik, family_name, false);
2135 PolyhedralTools::ItemLocalIds item_local_ids;
2136 m_mesh->scheduleAddItems(item_family, unique_ids, item_local_ids);
2137 auto mesh_state = m_mesh->applyScheduledOperations();
2138 item_local_ids.fillArrayView(local_ids, mesh_state);
2147 ARCANE_ASSERT((unique_ids.size() == local_ids.size() && (unique_ids.size() == owners.size())), (
"local/unique ids and owners arrays must have same size"))
2148 auto* item_family = _findItemFamily(ik, family_name, false);
2149 PolyhedralTools::ItemLocalIds item_local_ids;
2150 m_mesh->scheduleAddItems(item_family, unique_ids, owners, item_local_ids);
2151 auto mesh_state = m_mesh->applyScheduledOperations();
2152 item_local_ids.fillArrayView(local_ids, mesh_state);
2161 auto* item_family = _findItemFamily(ik, family_name,
false);
2163 ARCANE_FATAL(
"ItemFamily with name {0} and kind {1} does not exist in the mesh.", family_name, ik);
2165 m_mesh->scheduleRemoveItems(item_family, local_ids);
2166 m_mesh->applyScheduledOperations();
2172void mesh::PolyhedralMesh::
2175 if (local_ids.empty())
2178 ARCANE_FATAL(
"Invalid IItemFamily passed to removeItems.");
2180 removeItems(local_ids, family->itemKind(), family->name());
2189 addItems(nodes_uid, nodes_lid,
IK_Node, nodeFamily()->name());
2198 m_trace_mng->info() <<
"PolyhedralMesh::_exchangeItems() do_compact?=" <<
"false"
2199 <<
" nb_exchange=" << 0 <<
" version=" << 0;
2201 if (ghostLayerMng()->nbGhostLayer() > 1)
2202 updateGhostLayers(
true);
2204 if (!check_exchange.null()) {
2205 m_mesh_checker.checkGhostCells();
2206 m_trace_mng->pwarning() <<
"CHECKING SYNCHRONISATION !";
2207 m_mesh_checker.checkVariablesSynchronization();
2208 m_mesh_checker.checkItemGroupsSynchronization();
2210 if (checkLevel() >= 2)
2211 m_mesh_checker.checkValidMesh();
2212 else if (checkLevel() >= 1)
2213 m_mesh_checker.checkValidConnectivity();
2219void mesh::PolyhedralMesh::
2224 Trace::Setter mci(traceMng(), _className());
2229 if (arcane_debug_load_balancing) {
2230 for (
auto& family : m_arcane_families) {
2231 family->itemsNewOwner().checkIfSync();
2235 IMeshExchanger* iexchanger = m_mesh_exchange_mng->beginExchange();
2238 if (iexchanger->computeExchangeInfos()) {
2239 m_trace_mng->pwarning() <<
"No load balance is performed";
2240 m_mesh_exchange_mng->endExchange();
2245 iexchanger->processExchange();
2248 iexchanger->removeNeededItems();
2253 auto action = [](ItemGroup& group) {
2254 if (group.internal()->hasComputeFunctor() || group.isLocalToSubDomain())
2257 group.internal()->removeSuppressedItems();
2259 meshvisitor::visitGroups(
this, action);
2262 iexchanger->allocateReceivedItems();
2265 _endUpdateFamilies();
2266 _computeFamilySynchronizeInfos();
2269 iexchanger->updateItemGroups();
2271 _computeGroupSynchronizeInfos();
2273 iexchanger->updateVariables();
2277 m_mesh_checker.checkMeshFromReferenceFile();
2278 _notifyEndUpdateForFamilies();
2280 iexchanger->finalizeExchange();
2282 m_mesh_exchange_mng->endExchange();
2297 Trace::Setter mci(traceMng(), _className());
2298 traceMng()->info() <<
"PolyhedralMesh::updateGhostLayers() remove_old_ghost=" << remove_old_ghost;
2304 _internalUpdateGhost(
true, remove_old_ghost);
2305 _internalEndUpdateInit(
true);
2306 _synchronizeGroups();
2307 _computeGroupSynchronizeInfos();
2308 _internalEndUpdateResizeVariables();
2309 _synchronizeVariables();
2310 _internalEndUpdateFinal(
true);
2317void mesh::PolyhedralMesh::_internalUpdateGhost(
bool update_ghost_layer,
bool remove_old_ghost)
2319 if (update_ghost_layer) {
2320 if (remove_old_ghost) {
2321 _removeGhostItems();
2325 m_ghost_layer_builder->addGhostLayers(
true);
2335void mesh::PolyhedralMesh::_internalEndUpdateInit(
bool update_ghost_layer)
2342 _finalizeMeshChanged();
2346 if (update_ghost_layer) {
2348 _computeFamilySynchronizeInfos();
2354void mesh::PolyhedralMesh::_synchronizeGroups()
2356 for (
auto& family : m_arcane_families) {
2357 ItemGroupsSynchronize igs(family.get());
2364void mesh::PolyhedralMesh::_internalEndUpdateResizeVariables()
2367 for (
auto& family : m_arcane_families)
2368 family->_internalApi()->resizeVariables(
true);
2373void mesh::PolyhedralMesh::_synchronizeVariables()
2375 typedef UniqueArray<IVariableSynchronizer*> OrderedSyncList;
2376 typedef std::map<IVariableSynchronizer*, VariableCollection> SyncList;
2377 OrderedSyncList ordered_sync_list;
2380 VariableCollection used_vars(subDomain()->variableMng()->usedVariables());
2381 for (VariableCollection::Enumerator i_var(used_vars); ++i_var;) {
2382 IVariable* var = *i_var;
2383 switch (var->itemKind()) {
2389 IVariableSynchronizer* synchronizer = 0;
2390 if (var->isPartial())
2391 synchronizer = var->itemGroup().synchronizer();
2393 synchronizer = var->itemFamily()->allItemsSynchronizer();
2394 IMesh* sync_mesh = synchronizer->itemGroup().mesh();
2395 if (sync_mesh !=
this)
2397 std::pair<SyncList::iterator, bool> inserter = sync_list.insert(std::make_pair(synchronizer, VariableCollection()));
2398 if (inserter.second) {
2399 ordered_sync_list.add(synchronizer);
2401 VariableCollection& collection = inserter.first->second;
2402 collection.add(var);
2410 for (
Integer i_sync = 0; i_sync < ordered_sync_list.size(); ++i_sync) {
2411 IVariableSynchronizer* synchronizer = ordered_sync_list[i_sync];
2412 VariableCollection& collection = sync_list[synchronizer];
2413 synchronizer->synchronize(collection);
2419void mesh::PolyhedralMesh::_internalEndUpdateFinal(
bool print_stat)
2421 _notifyEndUpdateForFamilies();
2424 MeshStats ms(traceMng(),
this, m_parallel_mng);
2431void mesh::PolyhedralMesh::_removeGhostItems()
2434 const Int32 sid = m_parallel_mng->commRank();
2437 UniqueArray<Int32> cells_to_remove;
2438 cells_to_remove.reserve(1000);
2441 cells_map.
eachItem([&](Item cell) {
2442 if (cell.owner() != sid)
2443 cells_to_remove.add(cell.localId());
2445 m_trace_mng->info() <<
"Number of cells to remove: " << cells_to_remove.size();
2446 removeItems(cells_to_remove,
IK_Cell,cellFamily()->name());
2456void mesh::PolyhedralMesh::
2457_finalizeMeshChanged()
2459 for (
auto& family : m_arcane_families) {
2460 m_trace_mng->debug() <<
"_finalizeMeshChanged on " << family->name() <<
" Family on Mesh " << name();
2461 family->endUpdate();
2472 auto want_dump =
false;
2473 auto need_compact =
false;
2474 m_trace_mng->info(4) <<
"DynamicMesh::prepareForDump() name=" << name()
2475 <<
" need_compact?=" << need_compact
2476 <<
" want_dump?=" << want_dump
2477 <<
" timestamp=" << 0;
2481 m_mesh_events.eventObservable(t).notify(MeshEventArgs(
this, t));
2486 for (
auto& family : m_arcane_families) {
2487 family->prepareForDump();
2493 m_mesh_events.eventObservable(t).notify(MeshEventArgs(
this, t));
2574 return m_mesh_utilities.get();
2583 IItemFamily* item_family = _itemFamily(ik);
2585 return item_family->itemsNewOwner();
2594 return m_mesh_checker.checkLevel();
2603 return m_item_family_network.get();
2612 return m_ghost_layer_mng.get();
2621 return m_internal_api.get();
2627mesh::PolyhedralMeshImpl* mesh::PolyhedralMesh::_impl()
2629 return m_mesh.get();
2645namespace Arcane::mesh
2654Arcane::mesh::PolyhedralMesh::
2655~PolyhedralMesh() =
default;
2660Arcane::mesh::PolyhedralMesh::
2662: EmptyMesh{ subdomain->traceMng() }
2663, m_subdomain{ subdomain }
2665, m_mesh_kind(mbi.meshKind())
2672void Arcane::mesh::PolyhedralMesh::
2673read([[maybe_unused]]
const String& filename)
2681void Arcane::mesh::PolyhedralMesh::
2682allocateItems(
const Arcane::ItemAllocationInfo& item_allocation_info)
2684 ARCANE_UNUSED(item_allocation_info);
2699class ARCANE_MESH_EXPORT PolyhedralMeshFactory
2718 static String name() {
return "ArcanePolyhedralMeshFactory"; }
2728#if ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
2736 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.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
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 ITraceMng * traceMng()=0
Gestionnaire de message associé
virtual NodeGroup ownNodes()=0
Groupe de tous les noeuds propres au domaine.
virtual MeshHandle handle() const =0
Handle sur ce maillage.
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 gestionnaire des compactages de familles d'un maillage.
Gestion d'un compactage de familles du maillage.
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.
Partie interne de IMeshModifier.
virtual void updateGhostLayers()=0
Mise à jour de la couche fantôme.
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.
@ ModePut
Le sérialiseur attend des reserve().
@ ModeGet
Le sérialiseur attend des get().
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_FrontCellIsFirst
La première maille de l'entité est la maille devant.
@ II_NeedRemove
L'entité doit être supprimé
@ II_HasBackCell
L'entité a une maille derrière.
@ II_SubDomainBoundary
L'entité est à la frontière de deux sous-domaines.
@ II_Suppressed
L'entité vient d'être supprimée.
@ II_Boundary
L'entité est sur la frontière.
@ II_HasFrontCell
L'entité a une maille devant.
@ II_BackCellIsFirst
La première maille de l'entité est la maille derrière.
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.
Construction des couches fantômes.
Tableau associatif de ItemInternal.
void eachItem(const Lambda &lambda)
Fonction template pour itérer sur les entités de l'instance.
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< Real3 > VariableItemReal3
Grandeur de type coordonn?es 3D.
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.
SmallSpan< const Real3 > Real3ConstSmallSpan
Vue en lecture seule d'un tableau à une dimension de Real3.
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.
SmallSpan< const Int64 > Int64ConstSmallSpan
Vue en lecture seule d'un tableau à une dimension d'entiers 64 bits.
ARCCORE_SERIALIZE_EXPORT Ref< ISerializer > createSerializer()
Créé une instance de ISerializer.
const char * itemKindName(eItemKind kind)
Nom du genre d'entité.
Array< Int32 > Int32Array
Tableau dynamique à une dimension d'entiers 32 bits.
UniqueArray< String > StringUniqueArray
Tableau dynamique à une dimension de chaînes de caractères.
Span< const Int32 > Int32ConstSpan
Vue en lecture seule d'un tableau à une dimension d'entiers 32 bits.
SmallSpan< const Int32 > Int32ConstSmallSpan
Vue en lecture seule d'un tableau à une dimension d'entiers 32 bits.
std::int32_t Int32
Type entier signé sur 32 bits.