17#include "arcane/mesh/PolyhedralMesh.h"
19#include "ItemFamilyNetwork.h"
20#include "ItemFamilyPolicyMng.h"
21#include "arcane/mesh/MeshExchangeMng.h"
22#include "arcane/core/ISubDomain.h"
23#include "arcane/core/ItemSharedInfo.h"
24#include "arcane/core/ItemTypeInfo.h"
25#include "arcane/core/ItemTypeMng.h"
26#include "arcane/core/VariableBuildInfo.h"
27#include "arcane/core/MeshBuildInfo.h"
29#include "arcane/core/AbstractService.h"
30#include "arcane/core/CommonVariables.h"
31#include "arcane/core/IMeshFactory.h"
32#include "arcane/core/ItemInternal.h"
33#include "arcane/core/IDoFFamily.h"
34#include "arcane/core/IMeshCompactMng.h"
35#include "arcane/core/IMeshCompacter.h"
36#include "arcane/core/IMeshExchanger.h"
37#include "arcane/core/IGhostLayerMng.h"
38#include "arcane/core/MeshVisitor.h"
39#include "arcane/core/internal/IItemFamilyInternal.h"
40#include "arcane/core/internal/IItemFamilySerializerMngInternal.h"
41#include "arcane/core/internal/IVariableMngInternal.h"
42#include "arcane/core/internal/IPolyhedralMeshModifier.h"
43#include "arcane/core/internal/IMeshModifierInternal.h"
44#include "arcane/core/Connectivity.h"
46#include "arcane/mesh/ItemFamily.h"
47#include "arcane/mesh/DynamicMeshKindInfos.h"
48#include "arcane/mesh/UnstructuredMeshUtilities.h"
49#include "arcane/mesh/GhostLayerMng.h"
50#include "arcane/utils/ITraceMng.h"
51#include "arcane/utils/FatalErrorException.h"
52#include "arccore/base/StringBuilder.h"
54#ifdef ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
56#include "arcane/core/IMeshMng.h"
57#include "arcane/core/MeshHandle.h"
58#include "arcane/core/IItemFamily.h"
59#include "arcane/core/internal/IMeshInternal.h"
60#include "arcane/core/IVariableSynchronizer.h"
61#include "arcane/mesh/ItemFamilyPolicyMng.h"
62#include "arcane/mesh/ItemFamilySerializer.h"
63#include "arcane/utils/Collection.h"
64#include "arcane/utils/List.h"
65#include "arcane/utils/PlatformUtils.h"
69#include "ItemConnectivityMng.h"
71#include "arcane/core/ItemPrinter.h"
76#define ARCANE_DEBUG_LOAD_BALANCING
78#ifdef ARCANE_DEBUG_LOAD_BALANCING
79static bool arcane_debug_load_balancing =
true;
81static bool arcane_debug_load_balancing =
false;
87void Arcane::mesh::PolyhedralMesh::
88_errorEmptyMesh()
const
90 ARCANE_FATAL(
"Impossible d'utiliser PolyhedralMesh si Arcane n'est pas lié à lib Neo");
96#ifdef ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
101namespace Arcane::mesh
103namespace PolyhedralTools
107 Neo::FutureItemRange m_future_items;
108 std::shared_ptr<Neo::EndOfMeshUpdate> m_mesh_state =
nullptr;
112 void fillArrayView(Int32ArrayView local_ids, Neo::EndOfMeshUpdate mesh_state)
114 auto lids = m_future_items.get(mesh_state);
115 if (local_ids.size() != lids.size())
116 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());
117 std::copy(lids.begin(), lids.end(), local_ids.begin());
120 void fillArrayView(Int32ArrayView local_ids)
122 ARCANE_CHECK_POINTER2(m_mesh_state.get(),
"PolyhedralTools::ItemLocalIds doit avoir un état de maillage de fin valide");
123 fillArrayView(local_ids, *m_mesh_state);
126 Integer size() const noexcept {
return m_future_items.size(); }
127 bool isFilled() const noexcept {
return m_mesh_state.get() !=
nullptr; };
128 void checkIsFilled(String error_message)
const noexcept
131 ARCANE_FATAL(
"Les IDs locaux des éléments ne sont pas remplis." + error_message);
133 friend class mesh::PolyhedralMeshImpl;
134 friend class mesh::PolyhedralMesh;
141class PolyhedralFamilySerializer;
142class PolyhedralFamilySerializerMng :
public IItemFamilySerializerMngInternal
144 PolyhedralMesh* m_mesh =
nullptr;
146 UniqueArray<PolyhedralFamilySerializer*> m_serializers;
150 explicit PolyhedralFamilySerializerMng(PolyhedralMesh* mesh)
156 void addSerializer(PolyhedralFamilySerializer* serializer)
158 m_serializers.push_back(serializer);
162 void finalizeItemAllocation()
override;
168class PolyhedralFamilySerializer :
public IItemFamilySerializer
172 PolyhedralMesh* m_mesh =
nullptr;
173 IItemFamily* m_family =
nullptr;
174 PolyhedralFamilySerializerMng* m_mng =
nullptr;
175 ItemData m_item_data;
176 UniqueArray<Int32Array*> m_deserialized_lids_array;
177 UniqueArray<std::shared_ptr<PolyhedralTools::ItemLocalIds>> m_future_item_lids_array;
178 ItemAllocationInfo::FamilyInfo m_family_info;
182 explicit PolyhedralFamilySerializer(PolyhedralMesh* mesh, IItemFamily* family, PolyhedralFamilySerializerMng* mng)
188 PolyhedralFamilySerializer(
const PolyhedralFamilySerializer&) =
delete;
189 PolyhedralFamilySerializer& operator=(
const PolyhedralFamilySerializer&) =
delete;
191 ArrayView<std::shared_ptr<PolyhedralTools::ItemLocalIds>> itemLidsArray() {
return m_future_item_lids_array.view(); }
195 void serializeItems(ISerializer* buf, Int32ConstArrayView items_local_ids)
override;
196 void deserializeItems(ISerializer* buf, Int32Array* items_local_ids)
override;
201 m_deserialized_lids_array.clear();
202 m_future_item_lids_array.clear();
203 m_family_info.clear();
206 void fillDeserializedLocalIds()
209 for (
auto item_lids_array : m_deserialized_lids_array) {
210 auto& future_item_lids = m_future_item_lids_array[index];
211 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.");
212 item_lids_array->resize(future_item_lids->size());
213 future_item_lids->fillArrayView(item_lids_array->view());
219 IItemFamilySerializerMngInternal* mng()
225 void serializeItemRelations(ISerializer*, Int32ConstArrayView)
override {}
226 void deserializeItemRelations(ISerializer*, Int32Array*)
override {}
230 void _fillItemData(Int32ConstArrayView items_local_ids);
231 void _fillItemFamilyInfo(
const ItemData& item_data,
232 StringConstArrayView connected_family_names,
233 StringConstArrayView connectivity_names)
236 m_family_info.clear();
238 if (m_family != item_data.itemFamily())
239 ARCANE_FATAL(
"PolyhedralFamilySerializer: Incompatibilité de famille. La famille synchronisée est {0} et la famille sérialisée est {1}",
240 m_family->name(), item_data.itemFamily()->name());
241 m_family_info.name = item_data.itemFamily()->name();
242 m_family_info.item_kind = item_data.itemFamily()->itemKind();
243 auto& connected_family_infos = m_family_info.connected_family_infos;
244 auto nb_connected_family = item_data.itemInfos()[0];
245 connected_family_infos.resize(nb_connected_family);
246 auto& item_uids = m_family_info._item_uids_data;
247 item_uids.reserve(item_data.nbItems());
248 auto item_infos = item_data.itemInfos();
249 for (
auto connected_family_info : connected_family_infos) {
250 connected_family_info._connected_items_uids_data.reserve(4 * item_uids.size());
251 connected_family_info._nb_connected_items_per_item_data.reserve(item_uids.size());
253 for (
auto index = 1; index < item_infos.size();) {
254 item_uids.push_back(item_infos[index + 1]);
256 for (
auto connected_family_index = 0; connected_family_index < nb_connected_family; ++connected_family_index) {
258 auto* connected_family = m_mesh->findItemFamily(family_kind, connected_family_names[connected_family_index],
false,
false);
260 auto& current_connected_family_infos = connected_family_infos[connected_family_index];
261 current_connected_family_infos.item_kind = family_kind;
262 current_connected_family_infos.name = connected_family->name();
263 current_connected_family_infos.connectivity_name = connectivity_names[connected_family_index];
265 auto nb_connected_items =
static_cast<Int32
>(item_infos[index]);
267 current_connected_family_infos._nb_connected_items_per_item_data.push_back(nb_connected_items);
268 auto real_nb_connected_items = nb_connected_items;
269 if (m_family->itemKind() == IK_Face && connected_family->itemKind() == IK_Cell)
270 real_nb_connected_items = 2;
271 current_connected_family_infos._connected_items_uids_data.addRange(item_infos.subView(index, real_nb_connected_items));
272 index += real_nb_connected_items;
276 m_family_info.updateViewsFromInternalData();
278 m_family_info.item_owners = item_data.itemOwners();
281 IItemFamily* family()
const override
290void PolyhedralFamilySerializerMng::
291finalizeItemAllocation()
293 UniqueArray<std::shared_ptr<PolyhedralTools::ItemLocalIds>> future_item_lids;
294 for (
auto family_serializer : m_serializers) {
295 for (
auto& item_lids : family_serializer->itemLidsArray()) {
296 future_item_lids.push_back(item_lids);
299 m_mesh->applyScheduledAllocateItems(future_item_lids);
300 for (
auto family_serializer : m_serializers) {
301 family_serializer->fillDeserializedLocalIds();
303 m_serializers.clear();
309class PolyhedralFamilyPolicyMng
310:
public ItemFamilyPolicyMng
314 PolyhedralFamilyPolicyMng(PolyhedralMesh* mesh, ItemFamily* family)
315 : ItemFamilyPolicyMng(family)
324 return new PolyhedralFamilySerializer(m_mesh, m_family, m_mesh->polyhedralFamilySerializerMng());
329 PolyhedralMesh* m_mesh =
nullptr;
330 ItemFamily* m_family =
nullptr;
336class PolyhedralFamily
340 ItemSharedInfoWithType* m_shared_info =
nullptr;
344 PolyhedralMesh* m_mesh =
nullptr;
348 inline static const String m_arcane_item_lids_property_name{
"Arcane_Item_Lids" };
349 inline static const String m_arcane_remove_item_property_name{
"Arcane_Remove_Items" };
353 PolyhedralFamily(PolyhedralMesh* mesh, eItemKind ik, String name)
354 : ItemFamily(mesh, ik, name)
360 void preAllocate(Integer nb_item)
362 Integer nb_hash = itemsMap().nbBucket();
363 Integer wanted_size = 2 * (nb_item + nbItem());
364 if (nb_hash < wanted_size)
365 itemsMap().resize(wanted_size,
true);
366 m_empty_connectivity_indexes.resize(nb_item + nbItem(), 0);
367 m_empty_connectivity_nb_item.resize(nb_item + nbItem(), 0);
368 _updateEmptyConnectivity();
371 ItemInternal* _allocItem(
const Int64 uid,
const Int32 owner)
374 ItemInternal* item_internal = ItemFamily::_findOrAllocOne(uid, need_alloc);
376 item_internal->setUniqueId(uid);
378 _allocateInfos(item_internal, uid, m_shared_info);
380 item_internal->setOwner(owner, m_sub_domain_id);
381 return item_internal;
384 void addItems(Int64ConstSmallSpan uids, Int32ArrayView items)
387 addItems(uids, items, owners);
390 void addItems(Int64ConstSmallSpan uids, Int32ArrayView items, Int32ConstArrayView owners)
394 ARCANE_ASSERT((uids.size() == items.size()), (
"one must have items.size==uids.size()"));
395 preAllocate(uids.size());
397 for (
auto uid : uids) {
398 ItemInternal* ii = _allocItem(uid, owners[index]);
399 items[index] = ii->localId();
402 m_need_prepare_dump =
true;
403 _updateItemInternalList();
406 void removeItems(Int32ConstArrayView local_ids)
408 _removeMany(local_ids);
411 void _updateItemInternalList()
413 switch (itemKind()) {
415 m_item_internal_list->cells = _itemsInternal();
418 m_item_internal_list->faces = _itemsInternal();
421 m_item_internal_list->edges = _itemsInternal();
424 m_item_internal_list->nodes = _itemsInternal();
433 void _updateEmptyConnectivity()
435 auto item_internal_connectivity_list = itemInternalConnectivityList();
436 for (
auto item_kind = 0; item_kind < ItemInternalConnectivityList::MAX_ITEM_KIND; ++item_kind) {
437 item_internal_connectivity_list->_setConnectivityList(item_kind, m_empty_connectivity);
438 item_internal_connectivity_list->_setConnectivityIndex(item_kind, m_empty_connectivity_indexes);
439 item_internal_connectivity_list->_setConnectivityNbItem(item_kind, m_empty_connectivity_nb_item);
444 IDoFFamily* toDoFFamily()
override
450 void build()
override
453 m_sub_domain_id = subDomain()->subDomainId();
454 ItemTypeMng* itm = m_mesh->itemTypeMng();
455 ItemTypeInfo* dof_type_info = itm->typeFromId(IT_NullType);
456 m_shared_info = _findSharedInfo(dof_type_info);
457 _updateEmptyConnectivity();
458 ItemFamily::setPolicyMng(
new PolyhedralFamilyPolicyMng{ m_mesh,
this });
461 void addGhostItems(Int64ConstArrayView unique_ids, Int32ArrayView items, Int32ConstArrayView owners)
override
463 auto* polyhedral_mesh_modifier = m_mesh->_internalApi()->polyhedralMeshModifier();
465 polyhedral_mesh_modifier->addItems(unique_ids, items, owners, ItemFamily::itemKind(), name());
469 String name()
const override {
return ItemFamily::name(); }
470 String fullName()
const override {
return ItemFamily::fullName(); }
471 Integer nbItem()
const override {
return ItemFamily::nbItem(); }
472 ItemGroup allItems()
const override {
return ItemFamily::allItems(); }
473 void endUpdate()
override
475 return ItemFamily::endUpdate();
477 IItemFamily* itemFamily()
override {
return this; }
479 DoFVectorView addDoFs(Int64ConstArrayView dof_uids, Int32ArrayView dof_lids)
override
481 auto* polyhedral_mesh_modifier = m_mesh->_internalApi()->polyhedralMeshModifier();
483 polyhedral_mesh_modifier->addItems(dof_uids, dof_lids, ItemFamily::itemKind(), name());
484 return ItemFamily::view(dof_lids);
487 DoFVectorView addGhostDoFs(Int64ConstArrayView dof_uids, Int32ArrayView dof_lids,
488 Int32ConstArrayView owners)
override
490 addGhostItems(dof_uids, dof_lids, owners);
491 return ItemFamily::view(dof_lids);
494 void removeDoFs(Int32ConstArrayView items_local_id)
override
496 auto* mesh_modifier = m_mesh->_internalApi()->polyhedralMeshModifier();
497 mesh_modifier->removeItems(items_local_id, ItemFamily::itemKind(), m_name);
522 ISubDomain* m_subdomain;
523 Neo::Mesh m_mesh{
"Test" };
525 template <eItemKind IK>
528 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_None;
533 static Neo::ItemKind itemKindArcaneToNeo(
eItemKind ik)
537 return Neo::ItemKind::IK_Cell;
539 return Neo::ItemKind::IK_Face;
541 return Neo::ItemKind::IK_Edge;
543 return Neo::ItemKind::IK_Node;
545 return Neo::ItemKind::IK_Dof;
548 return Neo::ItemKind::IK_None;
550 return Neo::ItemKind::IK_Node;
553 static eItemKind itemKindNeoToArcane(Neo::ItemKind ik)
556 case Neo::ItemKind::IK_Cell:
558 case Neo::ItemKind::IK_Face:
560 case Neo::ItemKind::IK_Edge:
562 case Neo::ItemKind::IK_Node:
564 case Neo::ItemKind::IK_Dof:
566 case Neo::ItemKind::IK_None:
574 explicit PolyhedralMeshImpl(ISubDomain* subDomain)
575 : m_subdomain(subDomain)
576 , m_mesh(String::format(subDomain->defaultMeshHandle().meshName(),
"Polyhedral").localstr(), subDomain->parallelMng()->commRank())
581 String name()
const {
return m_mesh.name(); }
583 Integer dimension()
const {
return m_mesh.dimension(); }
585 Integer nbNode()
const {
return m_mesh.nbNodes(); }
586 Integer nbEdge()
const {
return m_mesh.nbEdges(); }
587 Integer nbFace()
const {
return m_mesh.nbFaces(); }
588 Integer nbCell()
const {
return m_mesh.nbCells(); }
589 Integer nbItem(
eItemKind ik)
const {
return m_mesh.nbItems(itemKindArcaneToNeo(ik)); }
591 SmallSpan<const Neo::Mesh::Connectivity> connectivities(IItemFamily* source_family)
593 auto& neo_source_family = m_mesh.findFamily(itemKindArcaneToNeo(source_family->itemKind()), source_family->name().localstr());
594 auto connectivities = m_mesh.getConnectivities(neo_source_family);
595 return { connectivities.begin(), connectivities.size() };
598 static void _setFaceInfos(
Int32 mod_flags, Face& face)
600 Int32 face_flags = face.itemBase().flags();
601 face_flags &= ~ItemFlags::II_InterfaceFlags;
602 face_flags |= mod_flags;
603 face.mutableItemBase().setFlags(face_flags);
608 void addFamily(
eItemKind ik,
const String& name)
610 m_mesh.addFamily(itemKindArcaneToNeo(ik), name.localstr());
615 void scheduleAddItems(PolyhedralFamily* arcane_item_family,
617 PolyhedralTools::ItemLocalIds& item_local_ids)
624 void scheduleAddItems(PolyhedralFamily* arcane_item_family,
627 PolyhedralTools::ItemLocalIds& item_local_ids)
629 auto& added_items = item_local_ids.m_future_items;
630 auto& item_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_item_family->itemKind()),
631 arcane_item_family->name().localstr());
632 m_mesh.scheduleAddItems(item_family, std::vector<Int64>{ uids.begin(), uids.end() }, added_items);
634 auto& mesh_graph = m_mesh.internalMeshGraph();
635 item_family.addMeshScalarProperty<Neo::utils::Int32>(PolyhedralFamily::m_arcane_item_lids_property_name.localstr());
637 UniqueArray<Int64> uids_copy(uids);
638 UniqueArray<Int32> owners_copy(owners);
639 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ item_family, item_family.lidPropName() },
640 Neo::MeshKernel::OutProperty{ item_family, PolyhedralFamily::m_arcane_item_lids_property_name.localstr() },
641 "AddArcaneItems"+std::string{arcane_item_family->name().localstr()},
642 [arcane_item_family, uids_local=std::move(uids_copy), &added_items, owners_local=std::move(owners_copy)]
643 ([[maybe_unused]] Neo::ItemLidsProperty
const& lids_property,
644 Neo::MeshScalarPropertyT<Neo::utils::Int32>&) {
645 auto new_items_lids{added_items.new_items.localIds()};
646 Int32ConstSpan neo_items{ new_items_lids.data(),
static_cast<Int32>(new_items_lids.size()) };
647 UniqueArray<Int32> arcane_items(added_items.new_items.size());
648 if (owners_local.empty())
649 arcane_item_family->addItems(uids_local, arcane_items);
651 arcane_item_family->addItems(uids_local, arcane_items,
Int32ConstArrayView{ owners_local.size(), owners_local.data() });
653 if (!arcane_items.size() == added_items.new_items.size())
654 arcane_item_family->traceMng()->fatal() <<
"Inconsistent item lids generation between Arcane and Neo, nb items Neo "
655 << added_items.new_items.size() <<
" nb items Arcane " << arcane_items.size();
656 if (!std::equal(added_items.new_items.begin(), added_items.new_items.end(), arcane_items.begin())) {
657 arcane_item_family->traceMng()->info() <<
"Arcane Items " << arcane_items;
658 std::cout <<
"Neo Items ";
659 std::ranges::copy(neo_items,std::ostream_iterator<int>(std::cout,
" "));
661 arcane_item_family->traceMng()->fatal() <<
"Inconsistent item lids generation between Arcane and Neo in ItemFamily " << arcane_item_family->name();
668 void scheduleRemoveItems(PolyhedralFamily* arcane_item_family,
671 auto& item_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_item_family->itemKind()),
672 arcane_item_family->name().localstr());
673 Neo::ItemRange removed_items{ Neo::ItemLocalIds{ { local_ids.begin(), local_ids.end() }, 0, 0 } };
674 m_mesh.scheduleRemoveItems(item_family, removed_items);
676 auto& mesh_graph = m_mesh.internalMeshGraph();
677 item_family.addMeshScalarProperty<Neo::utils::Int32>(PolyhedralFamily::m_arcane_remove_item_property_name.localstr());
678 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ item_family, m_mesh._removeItemPropertyName(item_family) },
679 Neo::MeshKernel::OutProperty{ item_family, PolyhedralFamily::m_arcane_remove_item_property_name.localstr() },
680 "RemoveArcaneFamily"+std::string{arcane_item_family->name().localstr()},
681 [arcane_item_family, local_ids](Neo::MeshScalarPropertyT<Neo::utils::Int32>
const&,
682 Neo::MeshScalarPropertyT<Neo::utils::Int32>&) {
683 arcane_item_family->removeItems(local_ids);
689 void scheduleAddConnectivity(PolyhedralFamily* arcane_source_item_family,
690 PolyhedralTools::ItemLocalIds& source_items,
691 Integer nb_connected_items_per_item,
692 PolyhedralFamily* arcane_target_item_family,
697 _scheduleAddConnectivity(arcane_source_item_family,
699 nb_connected_items_per_item,
700 arcane_target_item_family,
707 void scheduleAddConnectivity(PolyhedralFamily* arcane_source_item_family,
708 PolyhedralTools::ItemLocalIds& source_items,
710 PolyhedralFamily* arcane_target_item_family,
712 String
const& connectivity_name)
715 _scheduleAddConnectivity(arcane_source_item_family,
717 std::vector<Int32>{ nb_connected_items_per_item.begin(), nb_connected_items_per_item.end() },
718 arcane_target_item_family,
726 void scheduleUpdateConnectivity(PolyhedralFamily* arcane_source_item_family,
727 PolyhedralTools::ItemLocalIds& source_items,
728 Integer nb_connected_items_per_item,
729 PolyhedralFamily* arcane_target_item_family,
734 _scheduleAddConnectivity(arcane_source_item_family,
736 nb_connected_items_per_item,
737 arcane_target_item_family,
740 Neo::Mesh::ConnectivityOperation::Modify);
745 void scheduleUpdateConnectivity(PolyhedralFamily* arcane_source_item_family,
746 PolyhedralTools::ItemLocalIds& source_items,
748 PolyhedralFamily* arcane_target_item_family,
750 String
const& connectivity_name)
752 _scheduleAddConnectivity(arcane_source_item_family,
754 std::vector<Int32>{ nb_connected_items_per_item.begin(), nb_connected_items_per_item.end() },
755 arcane_target_item_family,
758 Neo::Mesh::ConnectivityOperation::Modify);
764 template <
typename ConnectivitySizeType>
765 void _scheduleAddConnectivity(PolyhedralFamily* arcane_source_item_family,
766 PolyhedralTools::ItemLocalIds& source_items,
767 ConnectivitySizeType&& nb_connected_items_per_item,
768 PolyhedralFamily* arcane_target_item_family,
770 String
const& connectivity_name,
771 Neo::Mesh::ConnectivityOperation operation = Neo::Mesh::ConnectivityOperation::Add)
774 auto& source_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_source_item_family->itemKind()),
775 arcane_source_item_family->name().localstr());
776 auto& target_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_target_item_family->itemKind()),
777 arcane_target_item_family->name().localstr());
779 UniqueArray<Int64> target_item_uids_copy(target_item_uids);
781 std::vector<Int64> target_item_uids_filtered;
782 target_item_uids_filtered.reserve(target_item_uids.size());
783 std::copy_if(target_item_uids.begin(),
784 target_item_uids.end(),
785 std::back_inserter(target_item_uids_filtered),
786 [](
auto uid) { return uid != NULL_ITEM_UNIQUE_ID; });
788 m_mesh.scheduleAddConnectivity(source_family, source_items.m_future_items, target_family,
789 std::forward<ConnectivitySizeType>(nb_connected_items_per_item),
790 std::move(target_item_uids_filtered),
791 connectivity_name.localstr(),
794 auto& mesh_graph = m_mesh.internalMeshGraph();
795 std::string connectivity_add_output_property_name = std::string{
"EndOf" } + connectivity_name.localstr() +
"Add";
796 source_family.addScalarProperty<Neo::utils::Int32>(connectivity_add_output_property_name);
798 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, connectivity_name.localstr() },
799 Neo::MeshKernel::OutProperty{ source_family, connectivity_add_output_property_name },
800 "UpdateArcaneConnectivity"+std::string{connectivity_name.localstr()},
801 [arcane_source_item_family, arcane_target_item_family, &source_family, &target_family,
this]
802 (Neo::Mesh::ConnectivityPropertyType
const& neo_connectivity,
803 Neo::ScalarPropertyT<Neo::utils::Int32>&) {
804 auto rank = arcane_source_item_family->mesh()->parallelMng()->commRank();
805 Neo::printer(rank) <<
"==Algorithm update Arcane connectivity: "<< neo_connectivity.name() << Neo::endline;
806 auto item_internal_connectivity_list = arcane_source_item_family->itemInternalConnectivityList();
808 auto connectivity = m_mesh.getConnectivity(source_family, target_family, neo_connectivity.name());
810 auto& connectivity_values = source_family.getConcreteProperty<Neo::Mesh::ConnectivityPropertyType>(neo_connectivity.name());
811 Neo::MeshArrayPropertyProxyT<Neo::Mesh::ConnectivityPropertyType::PropertyDataType> connectivity_proxy{ connectivity_values };
812 auto nb_item_data = connectivity_proxy.arrayPropertySizes();
813 auto nb_item_size = connectivity_proxy.arrayPropertySizesSize();
814 item_internal_connectivity_list->_setConnectivityNbItem(arcane_target_item_family->itemKind(),
816 auto max_nb_connected_items = connectivity.maxNbConnectedItems();
817 item_internal_connectivity_list->_setMaxNbConnectedItem(arcane_target_item_family->itemKind(), max_nb_connected_items);
818 auto connectivity_values_data = connectivity_proxy.arrayPropertyData();
819 auto connectivity_values_size = connectivity_proxy.arrayPropertyDataSize();
820 item_internal_connectivity_list->_setConnectivityList(arcane_target_item_family->itemKind(),
821 Int32ArrayView{ Integer(connectivity_values_size), connectivity_values_data });
822 auto connectivity_index_data = connectivity_proxy.arrayPropertyIndex();
823 auto connectivity_index_size = connectivity_proxy.arrayPropertyIndexSize();
824 item_internal_connectivity_list->_setConnectivityIndex(arcane_target_item_family->itemKind(),
825 Int32ArrayView{ Integer(connectivity_index_size), connectivity_index_data }); }, Neo::MeshKernel::AlgorithmPropertyGraph::AlgorithmPersistence::KeepAfterExecution);
827 if (arcane_source_item_family->itemKind() ==
IK_Face && arcane_target_item_family->itemKind() ==
IK_Cell) {
828 std::string flag_definition_output_property_name{
"EndOfFlagDefinition" };
829 source_family.addScalarProperty<Neo::utils::Int32>(flag_definition_output_property_name);
831 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, connectivity_add_output_property_name }, Neo::MeshKernel::OutProperty{ source_family, flag_definition_output_property_name },
832 "UpdateFaceFlagsAfterConnectivityDefinition",
833 [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&) {
834 auto current_face_index = 0;
835 auto arcane_faces = arcane_source_item_family->itemInfoListView();
837 arcane_target_item_family->itemsUniqueIdToLocalId(target_item_lids, target_item_uids_local,
false);
838 for (
auto face_lid : source_items.m_future_items.new_items) {
839 Face current_face = arcane_faces[face_lid].toFace();
840 if (target_item_lids[2 * current_face_index + 1] == NULL_ITEM_LOCAL_ID) {
843 _setFaceInfos(mod_flags, current_face);
845 else if (target_item_lids[2 * current_face_index] == NULL_ITEM_LOCAL_ID) {
853 ++current_face_index;
857 auto const isolated_items_property_name = m_mesh._isolatedItemLidsPropertyName(source_family,target_family);
858 std::string
const flag_update_output_property_name{
"EndOfFlagUpdate" };
859 source_family.addScalarProperty<Neo::utils::Int32>(flag_update_output_property_name);
861 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, isolated_items_property_name },
862 Neo::MeshKernel::OutProperty{ source_family, flag_update_output_property_name },
863 "UpdateFaceFlagsAfterCellRemoval",
864 [arcane_source_item_family,&source_family,connectivity_name](Neo::MeshScalarPropertyT<Neo::utils::Int32>
const&, Neo::ScalarPropertyT<Neo::utils::Int32>
const&) {
865 auto const rank = arcane_source_item_family->mesh()->parallelMng()->commRank();
866 Neo::printer(rank) <<
"==Algorithm update Face flags after cell removal" << Neo::endline;
868 auto const removed_target_item_index_prop_name = Neo::Mesh::removedTargetItemIndexfilteredItemPropertyName(connectivity_name.localstr());
869 auto& null_item_connected = source_family.getConcreteProperty<Neo::MeshArrayPropertyT<Neo::utils::Int32>>(removed_target_item_index_prop_name);
870 null_item_connected.debugPrint(rank);
871 ENUMERATE_(Face,iface,arcane_source_item_family->allItems())
873 Face current_face = *iface;
874 auto null_items_connected_to_face = null_item_connected[iface.localId()];
875 if (null_items_connected_to_face.size() > 2)
877 ARCANE_FATAL(
"More than one null item connected to face {0}",iface.localId());
880 if (null_items_connected_to_face.size() == 0)
884 if (null_items_connected_to_face[0] == 0)
889 else if (null_items_connected_to_face[0] == 1)
897 Neo::MeshKernel::AlgorithmPropertyGraph::AlgorithmPersistence::KeepAfterExecution
901 if (operation == Neo::Mesh::ConnectivityOperation::Modify)
903 auto isolated_item_property_name = m_mesh._isolatedItemLidsPropertyName(source_family, target_family);
904 auto end_of_isolated_removal_property_name = std::string{
"EndOf" } + isolated_item_property_name;
905 source_family.addScalarProperty<Neo::utils::Int32>(end_of_isolated_removal_property_name);
906 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, isolated_item_property_name },
907 Neo::MeshKernel::OutProperty{ source_family, end_of_isolated_removal_property_name },
908 "RemoveIsolatedArcaneItemsIn"+std::string{ arcane_source_item_family->name().localstr() },
909 [arcane_source_item_family](Neo::MeshScalarPropertyT<Neo::utils::Int32>
const& isolated_items_lids_property,
910 Neo::ScalarPropertyT<Neo::utils::Int32>& end_of_isolated_removal_property) {
911 end_of_isolated_removal_property.set(1);
914 isolated_item_lids.
reserve(isolated_items_lids_property.size());
915 ENUMERATE_(Item,iitem,arcane_source_item_family->allItems()) {
916 if (isolated_items_lids_property[iitem->localId()] == 1) {
917 isolated_item_lids.push_back(iitem->localId());
920 std::sort(isolated_item_lids.begin(), isolated_item_lids.end());
921 arcane_source_item_family->traceMng()->info() <<
"Remove isolated in Arcane for family "
922 << arcane_source_item_family->name() <<
" lids : " << isolated_item_lids;
923 isolated_items_lids_property.debugPrint();
924 arcane_source_item_family->removeItems(isolated_item_lids);
925 }, Neo::MeshKernel::AlgorithmPropertyGraph::AlgorithmPersistence::KeepAfterExecution);
932 auto& _item_family = m_mesh.findFamily(itemKindArcaneToNeo(item_family->itemKind()), item_family->name().localstr());
933 std::vector<Neo::utils::Real3> _node_coords(item_coords.size());
935 for (
auto&& node_coord : item_coords) {
936 _node_coords[node_index++] = Neo::utils::Real3{ node_coord.x, node_coord.y, node_coord.z };
938 m_mesh.scheduleSetItemCoords(_item_family, local_ids.m_future_items, _node_coords);
940 auto& mesh_graph = m_mesh.internalMeshGraph();
941 _item_family.addScalarProperty<
Int32>(
"NoOutProperty42");
942 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ _item_family, m_mesh._itemCoordPropertyName(_item_family) },
943 Neo::MeshKernel::OutProperty{ _item_family,
"NoOutProperty42" },
944 "UpdateArcaneCoordsIn"+std::string{item_family->name().localstr()},
945 [
this, item_family, &_item_family, &arcane_coords](Neo::Mesh::CoordPropertyType
const& item_coords_property,
946 Neo::ScalarPropertyT<Neo::utils::Int32>&) {
948 auto& all_items = _item_family.all();
949 VariableNodeReal3 node_coords{ VariableBuildInfo{ item_family->mesh(),
"NodeCoord" } };
950 for (
auto item : all_items) {
951 arcane_coords[ItemLocalId{ item }] = { item_coords_property[item].x,
952 item_coords_property[item].y,
953 item_coords_property[item].z };
960 Neo::EndOfMeshUpdate applyScheduledOperations() noexcept
962 return m_mesh.applyScheduledOperations();
966 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Cell>
968 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Cell;
970 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Face>
972 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Face;
974 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Edge>
976 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Edge;
978 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Node>
980 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Node;
982 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_DoF>
984 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Dof;
989 void PolyhedralFamilySerializer::serializeItems(ISerializer* buf,
Int32ConstArrayView items_local_ids)
994 switch (buf->mode()) {
995 case ISerializer::ModeReserve: {
996 _fillItemData(items_local_ids);
997 m_item_data.serialize(buf);
998 auto connectivities = m_mesh->_impl()->connectivities(m_family);
999 for (
auto out_connectivity : connectivities) {
1000 buf->reserve(out_connectivity.target_family.name());
1001 buf->reserve(out_connectivity.name);
1006 m_item_data.serialize(buf);
1007 auto connectivities = m_mesh->_impl()->connectivities(m_family);
1008 for (
auto out_connectivity : connectivities) {
1009 buf->put(out_connectivity.target_family.name());
1010 buf->put(out_connectivity.name);
1016 deserializeItems(buf,
nullptr);
1024 void PolyhedralFamilySerializer::deserializeItems(ISerializer* buf,
Int32Array* items_local_ids)
1027 (
"Impossible to deserialize a buffer not in ModeGet. In ItemData::deserialize.Exiting"))
1032 if (items_local_ids)
1033 item_data.deserialize(buf, m_mesh, *items_local_ids);
1035 item_data.deserialize(buf, m_mesh);
1036 auto connectivities = m_mesh->_impl()->connectivities(m_family);
1037 auto nb_connectivities = connectivities.size();
1041 for (auto out_connectivity : connectivities) {
1042 buf->get(connected_family_names[index]);
1043 buf->get(connectivity_names[index]);
1046 _fillItemFamilyInfo(item_data, connected_family_names, connectivity_names);
1048 if (items_local_ids) {
1049 m_deserialized_lids_array.push_back(items_local_ids);
1052 m_future_item_lids_array.push_back(std::make_shared<PolyhedralTools::ItemLocalIds>());
1053 m_mesh->scheduleAllocateItems(m_family_info, *m_future_item_lids_array.back().get());
1056 m_mng->addSerializer(
this);
1062 m_item_data = ItemData{ items_local_ids.size(), 0, m_family,
nullptr, m_family->parallelMng()->commRank() };
1063 Int64Array& item_infos = m_item_data.itemInfos();
1067 item_infos.reserve(1 + nb_item * 32);
1070 auto connectivities = mesh_impl->connectivities(m_family);
1071 item_infos.add(connectivities.size());
1072 bool is_face_family = m_family->itemKind() ==
IK_Face;
1075 item_infos.add(item->uniqueId().asInt64());
1076 item_owners[item.index()] = item->owner();
1077 for (
auto out_connectivity : connectivities) {
1078 auto target_family = m_mesh->findItemFamily(PolyhedralMeshImpl::itemKindNeoToArcane(out_connectivity.target_family.itemKind()),
1079 out_connectivity.target_family.name(),
false,
false);
1081 auto arcane_connected_items = target_family->itemInfoListView();
1082 bool is_face_cell_connection = is_face_family && target_family->itemKind() ==
IK_Cell;
1083 item_infos.add(PolyhedralMeshImpl::itemKindNeoToArcane(out_connectivity.target_family.itemKind()));
1084 auto connected_items = out_connectivity[item.localId()];
1085 auto nb_connected_items = connected_items.size();
1086 item_infos.add(nb_connected_items);
1087 if (is_face_cell_connection && item->itemBase().isBoundary() && item->itemBase().backCell().isNull()) {
1088 item_infos.add(NULL_ITEM_UNIQUE_ID);
1090 for (
auto connected_item_lid : connected_items) {
1091 item_infos.add(arcane_connected_items[connected_item_lid].uniqueId().asInt64());
1093 if (is_face_cell_connection && item->itemBase().isBoundary() && !item->itemBase().backCell().isNull()) {
1094 item_infos.add(NULL_ITEM_UNIQUE_ID);
1105class mesh::PolyhedralMesh::PolyhedralMeshModifier
1110 explicit PolyhedralMeshModifier(PolyhedralMesh* mesh)
1114 void addItems(Int64ConstArrayView unique_ids, Int32ArrayView local_ids, eItemKind ik,
const String& family_name)
override
1116 m_mesh->addItems(unique_ids, local_ids, ik, family_name);
1119 void addItems(Int64ConstArrayView unique_ids, Int32ArrayView local_ids, Int32ConstArrayView owners, eItemKind ik,
const String& family_name)
override
1121 m_mesh->addItems(unique_ids, local_ids, owners, ik, family_name);
1124 void removeItems(Int32ConstArrayView local_ids, eItemKind ik,
const String& family_name)
override
1126 m_mesh->removeItems(local_ids, ik, family_name);
1131 PolyhedralMesh* m_mesh;
1137class mesh::PolyhedralMesh::InternalApi
1143 explicit InternalApi(PolyhedralMesh* mesh)
1145 , m_connectivity_mng(std::make_unique<ItemConnectivityMng>(mesh->traceMng()))
1146 , m_polyhedral_mesh_modifier(std::make_unique<PolyhedralMeshModifier>(mesh))
1151 void setMeshKind(
const MeshKind& v)
override
1153 if (v.meshStructure() != eMeshStructure::Polyhedral && v.meshAMRKind() != eMeshAMRKind::None) {
1154 ARCANE_FATAL(
"Incompatible mesh structure ({0}) and amr kind ({1}) for Polyhedral mesh {2}. Must be (Polyhedral,None). ",
1155 v.meshStructure(), v.meshAMRKind(), m_mesh->name());
1157 m_mesh->m_mesh_kind = v;
1160 IItemConnectivityMng* dofConnectivityMng() const noexcept
override
1162 return m_connectivity_mng.get();
1165 IPolyhedralMeshModifier* polyhedralMeshModifier() const noexcept
override
1167 return m_polyhedral_mesh_modifier.get();
1170 void removeNeedRemoveMarkedItems()
override
1172 m_mesh->removeNeedRemoveMarkedItems();
1174 NodeLocalId addNode([[maybe_unused]] ItemUniqueId unique_id)
override
1178 FaceLocalId addFace([[maybe_unused]] ItemUniqueId unique_id,
1179 [[maybe_unused]] ItemTypeId type_id,
1180 [[maybe_unused]] ConstArrayView<Int64> nodes_uid)
override
1184 CellLocalId addCell([[maybe_unused]] ItemUniqueId unique_id,
1185 [[maybe_unused]] ItemTypeId type_id,
1186 [[maybe_unused]] ConstArrayView<Int64> nodes_uid)
override
1191 IItemFamilySerializerMngInternal* familySerializerMng() const noexcept
override
1193 return m_mesh->polyhedralFamilySerializerMng();
1198 PolyhedralMesh* m_mesh =
nullptr;
1199 std::unique_ptr<IItemConnectivityMng> m_connectivity_mng =
nullptr;
1200 std::unique_ptr<IPolyhedralMeshModifier> m_polyhedral_mesh_modifier =
nullptr;
1206class mesh::PolyhedralMesh::NoCompactionMeshCompacter
1211 explicit NoCompactionMeshCompacter(PolyhedralMesh* mesh)
1213 , m_trace_mng(mesh->traceMng())
1216 void doAllActions()
override { _info(); };
1218 void beginCompact()
override { _info(); };
1219 void compactVariablesAndGroups()
override { _info(); };
1220 void updateInternalReferences()
override { _info(); };
1221 void endCompact()
override { _info(); };
1222 void finalizeCompact()
override { _info(); };
1224 IMesh* mesh()
const override {
return m_mesh; };
1226 const ItemFamilyCompactInfos* findCompactInfos(IItemFamily*)
const override
1232 ePhase phase()
const override
1235 return ePhase::Ended;
1238 void setSorted(
bool)
override { _info(); };
1240 bool isSorted()
const override
1252 void _setCompactVariablesAndGroups(
bool)
override { _info(); };
1256 PolyhedralMesh* m_mesh =
nullptr;
1257 ITraceMng* m_trace_mng =
nullptr;
1259 void _info()
const { m_trace_mng->info() << A_FUNCINFO <<
"No compacting in PolyhedralMesh"; }
1265class mesh::PolyhedralMesh::NoCompactionMeshCompactMng
1270 explicit NoCompactionMeshCompactMng(PolyhedralMesh* mesh)
1272 , m_trace_mng(mesh->traceMng())
1273 , m_mesh_compacter{ std::make_unique<NoCompactionMeshCompacter>(m_mesh) }
1276 IMesh* mesh()
const override {
return m_mesh; }
1277 IMeshCompacter* beginCompact()
override
1280 return m_mesh_compacter.get();
1283 IMeshCompacter* beginCompact(IItemFamily* family)
override
1285 ARCANE_UNUSED(family);
1287 return m_mesh_compacter.get();
1290 void endCompact()
override { _info(); };
1292 IMeshCompacter* compacter()
override
1295 return m_mesh_compacter.get();
1300 PolyhedralMesh* m_mesh =
nullptr;
1301 ITraceMng* m_trace_mng =
nullptr;
1302 std::unique_ptr<IMeshCompacter> m_mesh_compacter =
nullptr;
1304 void _info()
const { m_trace_mng->info() << A_FUNCINFO <<
"No compacting in PolyhedralMesh"; }
1310mesh::PolyhedralMesh::
1313 m_mesh_handle._setMesh(
nullptr);
1322 return m_subdomain->traceMng();
1331 return m_mesh_handle;
1336mesh::PolyhedralMesh::
1337PolyhedralMesh(ISubDomain* subdomain,
const MeshBuildInfo& mbi)
1339, m_name{ mbi.name() }
1340, m_subdomain{ subdomain }
1341, m_mesh_handle{ m_subdomain->defaultMeshHandle() }
1342, m_properties(std::make_unique<Properties>(subdomain->propertyMng(), String(
"ArcaneMeshProperties_") + m_name))
1344, m_parallel_mng{ mbi.parallelMngRef().get() }
1345, m_mesh_part_info{ makeMeshPartInfoFromParallelMng(m_parallel_mng) }
1346, m_item_type_mng(ItemTypeMng::_singleton())
1347, m_mesh_kind(mbi.meshKind())
1348, m_polyhedral_family_serializer_mng{ std::make_unique<PolyhedralFamilySerializerMng>(this) }
1349, m_initial_allocator(*this)
1350, m_variable_mng{ subdomain->variableMng() }
1351, m_mesh_checker{ this }
1352, m_internal_api{ std::make_unique<InternalApi>(this) }
1353, m_compact_mng{ std::make_unique<NoCompactionMeshCompactMng>(this) }
1354, m_mesh_utilities{ std::make_unique<UnstructuredMeshUtilities>(this) }
1355, m_mesh_exchange_mng{ std::make_unique<MeshExchangeMng>(this) }
1357, m_ghost_layer_mng{ std::make_unique<GhostLayerMng>(m_trace_mng) }
1358, m_connectivity(VariableBuildInfo{ subdomain, mbi.name() +
"MeshConnectivity" })
1360 m_mesh_handle._setMesh(
this);
1361 m_mesh_item_internal_list.mesh =
this;
1362 m_default_arcane_families.fill(
nullptr);
1368void Arcane::mesh::PolyhedralMesh::
1371 _allocateItems(item_allocation_info, ArrayView<Int32UniqueArray>{});
1376void Arcane::mesh::PolyhedralMesh::
1377allocateItems(
const Arcane::ItemAllocationInfo& item_allocation_info, ArrayView<Int32UniqueArray> family_lids)
1379 _allocateItems(item_allocation_info, family_lids);
1384void Arcane::mesh::PolyhedralMesh::
1385_allocateItems(
const Arcane::ItemAllocationInfo& item_allocation_info, ArrayView<Int32UniqueArray> family_lids)
1388 m_subdomain->traceMng()->info() <<
"--PolyhedralMesh: allocate items --";
1389 UniqueArray<PolyhedralTools::ItemLocalIds> item_local_ids(item_allocation_info.family_infos.size());
1390 auto family_index = 0;
1392 for (
auto& family_info : item_allocation_info.family_infos) {
1393 bool create_if_needed =
true;
1394 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name, create_if_needed);
1395 m_trace_mng->debug(
Trace::High) <<
"- Création des éléments " << family_info.name;
1396 m_mesh->scheduleAddItems(item_family, family_info.item_uids, family_info.item_owners.constSmallSpan(), item_local_ids[family_index++]);
1400 for (
auto& family_info : item_allocation_info.family_infos) {
1401 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
1402 m_trace_mng->debug(
Trace::High) <<
"- Famille actuelle " << family_info.name;
1403 for (
auto& current_connected_family_info : family_info.connected_family_infos) {
1404 auto connected_family = _findItemFamily(current_connected_family_info.item_kind, current_connected_family_info.name);
1405 m_trace_mng->debug(
Trace::High) <<
"- Création de la connectivité " << current_connected_family_info.connectivity_name;
1407 if (!connected_family) {
1408 ARCANE_WARNING((String::format(
"Impossible de trouver la famille {0} avec le type {1} "
1409 "La connectivité entre {1} et cette famille est ignorée",
1410 current_connected_family_info.name,
1411 current_connected_family_info.item_kind,
1412 item_family->name())
1416 m_mesh->scheduleAddConnectivity(item_family,
1417 item_local_ids[family_index],
1418 current_connected_family_info.nb_connected_items_per_item,
1420 current_connected_family_info.connected_items_uids,
1421 current_connected_family_info.connectivity_name);
1422 Connectivity connectivity{ m_connectivity };
1428 m_mesh->applyScheduledOperations();
1430 for (
auto& family_info : item_allocation_info.family_infos) {
1431 if (family_info.item_kind !=
IK_Node && family_info.item_coordinates.empty()) {
1434 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
1435 if (item_family == itemFamily(
IK_Node)) {
1436 if (!m_arcane_node_coords.get()) {
1437 m_arcane_node_coords = std::make_unique<VariableNodeReal3>(VariableBuildInfo(
this, family_info.item_coordinates_variable_name));
1438 m_arcane_node_coords->setUsed(
true);
1442 auto arcane_item_coords_var_ptr = std::make_unique<VariableItemReal3>(VariableBuildInfo(
this, family_info.item_coordinates_variable_name),
1443 item_family->itemKind());
1444 arcane_item_coords_var_ptr->setUsed(
true);
1445 m_arcane_item_coords.push_back(std::move(arcane_item_coords_var_ptr));
1449 for (
auto& family : m_arcane_families) {
1450 family->endUpdate();
1456 for (
auto& family_info : item_allocation_info.family_infos) {
1457 if (family_info.item_coordinates.empty()) {
1461 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
1462 if (item_family == itemFamily(
IK_Node)) {
1463 m_mesh->scheduleSetItemCoordinates(item_family, item_local_ids[family_index], family_info.item_coordinates, *m_arcane_node_coords);
1466 m_mesh->scheduleSetItemCoordinates(item_family, item_local_ids[family_index], family_info.item_coordinates, *m_arcane_item_coords[index++].get());
1468 auto mesh_state = m_mesh->applyScheduledOperations();
1469 m_is_allocated =
true;
1471 itemTypeMng()->setMeshWithGeneralCells(
this);
1473 if (!family_lids.empty()) {
1475 ARCANE_ASSERT((family_lids.size() == item_local_ids.size()), (
"Incoherence in item number"));
1476 for (
auto& lid_array : item_local_ids) {
1477 family_lids[index].resize(lid_array.size());
1478 lid_array.fillArrayView(family_lids[index].view(), mesh_state);
1486void Arcane::mesh::PolyhedralMesh::
1487scheduleAllocateItems(
const Arcane::ItemAllocationInfo::FamilyInfo& family_info, mesh::PolyhedralTools::ItemLocalIds& item_local_ids)
1490 m_subdomain->traceMng()->info() <<
"--PolyhedralMesh: schedule allocate items --";
1492 bool create_if_needed =
true;
1493 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name, create_if_needed);
1494 m_trace_mng->debug(
Trace::High) <<
"- Famille actuelle " << family_info.name;
1495 m_trace_mng->debug(
Trace::High) <<
"- Création des éléments ";
1496 m_mesh->scheduleAddItems(item_family, family_info.item_uids, family_info.item_owners.
constSmallSpan(), item_local_ids);
1498 for (
auto& current_connected_family_info : family_info.connected_family_infos) {
1499 auto connected_family = _findItemFamily(current_connected_family_info.item_kind, current_connected_family_info.name);
1500 m_trace_mng->debug(
Trace::High) <<
"- Création de la connectivité " << current_connected_family_info.connectivity_name;
1502 if (!connected_family) {
1503 ARCANE_WARNING((String::format(
"Impossible de trouver la famille {0} avec le type {1} "
1504 "La connectivité entre {1} et cette famille est ignorée",
1505 current_connected_family_info.name,
1506 current_connected_family_info.item_kind,
1507 item_family->name())
1511 m_mesh->scheduleUpdateConnectivity(item_family,
1513 current_connected_family_info.nb_connected_items_per_item,
1515 current_connected_family_info.connected_items_uids,
1516 current_connected_family_info.connectivity_name);
1522void Arcane::mesh::PolyhedralMesh::
1523applyScheduledAllocateItems(UniqueArray<std::shared_ptr<PolyhedralTools::ItemLocalIds>> item_lids)
1526 auto mesh_state = m_mesh->applyScheduledOperations();
1528 for (
auto item_local_ids : item_lids) {
1529 item_local_ids->m_mesh_state = std::make_shared<Neo::EndOfMeshUpdate>(mesh_state);
1533 for (
auto& family : m_arcane_families) {
1534 family->endUpdate();
1537 m_is_allocated =
true;
1539 itemTypeMng()->setMeshWithGeneralCells(
this);
1544void mesh::PolyhedralMesh::removeNeedRemoveMarkedItems()
1547 for (
auto family_index = 0; family_index < m_arcane_families.size(); ++family_index) {
1549 auto* family = m_arcane_families[family_index].get();
1551 items_to_remove.
reserve(family->nbItem());
1552 auto& items_map = family->itemsMap();
1553 if (items_map.count() == 0)
1555 items_map.eachItem([&](ItemBase item) {
1557 auto f = item.flags();
1560 item.toMutable().setFlags(f);
1561 items_to_remove.add(item.localId());
1564 if (!items_to_remove.empty()) {
1565 removeItems(items_to_remove, family);
1572Arcane::mesh::PolyhedralFamilySerializerMng* mesh::PolyhedralMesh::
1573polyhedralFamilySerializerMng()
1575 return m_polyhedral_family_serializer_mng.get();
1581void Arcane::mesh::PolyhedralMesh::
1584 for (
auto& family : m_arcane_families) {
1585 family->endUpdate();
1592void Arcane::mesh::PolyhedralMesh::
1593_computeFamilySynchronizeInfos()
1595 m_subdomain->traceMng()->info() <<
"Computing family synchronization information for " << name();
1596 for (
auto& family : m_arcane_families) {
1597 family->computeSynchronizeInfos();
1602 auto* var_syncer = cellFamily()->allItemsSynchronizer();
1603 Int32 iteration = m_subdomain->commonVariables().globalIteration();
1604 String file_name = String::format(
"{0}_sync_topology_iter{1}.json", name(), iteration);
1605 mesh_utils::dumpSynchronizerTopologyJSON(var_syncer, file_name);
1612void Arcane::mesh::PolyhedralMesh::
1613_notifyEndUpdateForFamilies()
1615 for (
auto& family : m_arcane_families)
1616 family->_internalApi()->notifyEndUpdateFromMesh();
1622void Arcane::mesh::PolyhedralMesh::
1623_computeGroupSynchronizeInfos()
1625 auto action = [](ItemGroup& group) {
1626 if (group.hasSynchronizer())
1627 group.synchronizer()->compute();
1630 m_trace_mng->info() <<
"Computing group synchronization information for " << name();
1631 meshvisitor::visitGroups(
this, action);
1649 return m_mesh->dimension();
1658 return m_mesh->nbNode();
1667 return m_mesh->nbEdge();
1676 return m_mesh->nbFace();
1685 return m_mesh->nbCell();
1694 return m_mesh->nbItem(ik);
1703 if (m_default_arcane_families[
IK_Node])
1704 return m_default_arcane_families[
IK_Node]->allItems();
1715 if (m_default_arcane_families[
IK_Edge])
1716 return m_default_arcane_families[
IK_Edge]->allItems();
1727 if (m_default_arcane_families[
IK_Face])
1728 return m_default_arcane_families[
IK_Face]->allItems();
1739 if (m_default_arcane_families[
IK_Cell])
1740 return m_default_arcane_families[
IK_Cell]->allItems();
1751 if (m_default_arcane_families[
IK_Node])
1752 return m_default_arcane_families[
IK_Node]->allItems().own();
1763 if (m_default_arcane_families[
IK_Edge])
1764 return m_default_arcane_families[
IK_Edge]->allItems().own();
1775 if (m_default_arcane_families[
IK_Face])
1776 return m_default_arcane_families[
IK_Face]->allItems().own();
1787 if (m_default_arcane_families[
IK_Cell])
1788 return m_default_arcane_families[
IK_Cell]->allItems().own();
1799 if (m_default_arcane_families[
IK_Cell])
1808mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1809_createItemFamily(
eItemKind ik,
const String& name)
1811 m_mesh->addFamily(ik, name);
1812 m_arcane_families.push_back(std::make_unique<PolyhedralFamily>(
this, ik, name));
1813 auto current_family = m_arcane_families.back().get();
1814 if (m_default_arcane_families[ik] ==
nullptr) {
1815 m_default_arcane_families[ik] = current_family;
1816 _updateMeshInternalList(ik);
1818 m_item_family_collection.add(current_family);
1819 current_family->build();
1820 return current_family;
1829 return _createItemFamily(ik, name);
1835void mesh::PolyhedralMesh::
1838 createItemFamily(
IK_Cell,
"CellFamily");
1839 createItemFamily(
IK_Node,
"NodeFamily");
1840 auto cell_family = m_default_arcane_families[
IK_Cell];
1841 auto node_family = m_default_arcane_families[
IK_Node];
1844 PolyhedralTools::ItemLocalIds cell_lids, node_lids;
1845 m_mesh->scheduleAddItems(cell_family, cell_uids.constView(), cell_lids);
1846 m_mesh->scheduleAddItems(node_family, node_uids.constView(), node_lids);
1849 m_mesh->scheduleAddConnectivity(cell_family, cell_lids, nb_node, node_family, node_uids, String{
"CellToNodes" });
1850 m_mesh->scheduleAddConnectivity(node_family, node_lids, 1, cell_family,
1851 node_cells_uids, String{
"NodeToCells" });
1852 m_mesh->applyScheduledOperations();
1853 cell_family->endUpdate();
1854 node_family->endUpdate();
1867 for (
auto ik = 0; ik < NB_ITEM_KIND; ++ik) {
1870 m_empty_arcane_families[ik] = std::make_unique<mesh::PolyhedralFamily>(
this, (
eItemKind)ik, name);
1871 m_default_arcane_families[ik] = m_empty_arcane_families[ik].get();
1882 return m_default_arcane_families[
IK_Node];
1891 return m_default_arcane_families[
IK_Edge];
1900 return m_default_arcane_families[
IK_Face];
1909 return m_default_arcane_families[
IK_Cell];
1912void mesh::PolyhedralMesh::
1917 m_mesh_item_internal_list.cells = m_default_arcane_families[kind]->itemsInternal();
1918 m_mesh_item_internal_list._internalSetCellSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1921 m_mesh_item_internal_list.faces = m_default_arcane_families[kind]->itemsInternal();
1922 m_mesh_item_internal_list._internalSetFaceSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1925 m_mesh_item_internal_list.edges = m_default_arcane_families[kind]->itemsInternal();
1926 m_mesh_item_internal_list._internalSetEdgeSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1929 m_mesh_item_internal_list.nodes = m_default_arcane_families[kind]->itemsInternal();
1930 m_mesh_item_internal_list._internalSetNodeSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1942mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1945 return m_default_arcane_families[ik];
1954 return _itemFamily(ik);
1963 return m_item_type_mng;
1969mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1970_findItemFamily(
eItemKind ik,
const String& name,
bool create_if_needed)
1973 auto found_family = _itemFamily(ik);
1975 if (found_family->name() == name)
1976 return found_family;
1978 for (
auto& family : m_arcane_families) {
1979 if (family->itemKind() == ik && family->name() == name)
1980 return family.get();
1982 if (!create_if_needed)
1984 return _createItemFamily(ik, name);
1993 ARCANE_UNUSED(register_modifier_if_created);
1994 return _findItemFamily(ik, name, create_if_needed);
2000mesh::PolyhedralFamily* mesh::PolyhedralMesh::
2003 return m_default_arcane_families[ik];
2012 ARCANE_ASSERT(m_arcane_node_coords, (
"Node coordinates not yet loaded."));
2013 return *m_arcane_node_coords;
2023 for (
auto& family : m_arcane_families) {
2024 group = family->findGroup(name);
2037 m_all_groups.
clear();
2038 for (
auto& family : m_arcane_families) {
2040 m_all_groups.add(*i_group);
2042 return m_all_groups;
2051 for (
auto& family : m_arcane_families) {
2052 family->destroyGroups();
2062 return m_item_family_collection;
2071 return m_internal_api.get();
2080 return m_compact_mng.get();
2086void mesh::PolyhedralMesh::
2089 ARCANE_ASSERT((unique_ids.size() == local_ids.size()), (
"local and unique ids arrays must have same size"))
2090 auto* item_family = _findItemFamily(ik, family_name, false);
2091 PolyhedralTools::ItemLocalIds item_local_ids;
2092 m_mesh->scheduleAddItems(item_family, unique_ids, item_local_ids);
2093 auto mesh_state = m_mesh->applyScheduledOperations();
2094 item_local_ids.fillArrayView(local_ids, mesh_state);
2103 ARCANE_ASSERT((unique_ids.size() == local_ids.size() && (unique_ids.size() == owners.size())), (
"local/unique ids and owners arrays must have same size"))
2104 auto* item_family = _findItemFamily(ik, family_name, false);
2105 PolyhedralTools::ItemLocalIds item_local_ids;
2106 m_mesh->scheduleAddItems(item_family, unique_ids, owners, item_local_ids);
2107 auto mesh_state = m_mesh->applyScheduledOperations();
2108 item_local_ids.fillArrayView(local_ids, mesh_state);
2117 auto* item_family = _findItemFamily(ik, family_name,
false);
2119 ARCANE_FATAL(
"ItemFamily with name {0} and kind {1} does not exist in the mesh.", family_name, ik);
2121 m_mesh->scheduleRemoveItems(item_family, local_ids);
2122 m_mesh->applyScheduledOperations();
2128void mesh::PolyhedralMesh::
2131 if (local_ids.empty())
2134 ARCANE_FATAL(
"Invalid IItemFamily passed to removeItems.");
2136 removeItems(local_ids, family->itemKind(), family->name());
2145 addItems(nodes_uid, nodes_lid,
IK_Node, nodeFamily()->name());
2154 m_trace_mng->info() <<
"PolyhedralMesh::_exchangeItems() do_compact?=" <<
"false"
2155 <<
" nb_exchange=" << 0 <<
" version=" << 0;
2158 if (!check_exchange.null()) {
2159 m_mesh_checker.checkGhostCells();
2160 m_trace_mng->pwarning() <<
"CHECKING SYNCHRONISATION !";
2161 m_mesh_checker.checkVariablesSynchronization();
2162 m_mesh_checker.checkItemGroupsSynchronization();
2164 if (checkLevel() >= 2)
2165 m_mesh_checker.checkValidMesh();
2166 else if (checkLevel() >= 1)
2167 m_mesh_checker.checkValidConnectivity();
2173void mesh::PolyhedralMesh::
2178 Trace::Setter mci(traceMng(), _className());
2183 if (arcane_debug_load_balancing) {
2184 for (
auto& family : m_arcane_families) {
2185 family->itemsNewOwner().checkIfSync();
2189 IMeshExchanger* iexchanger = m_mesh_exchange_mng->beginExchange();
2192 if (iexchanger->computeExchangeInfos()) {
2193 m_trace_mng->pwarning() <<
"No load balance is performed";
2194 m_mesh_exchange_mng->endExchange();
2199 iexchanger->processExchange();
2202 iexchanger->removeNeededItems();
2207 auto action = [](ItemGroup& group) {
2208 if (group.internal()->hasComputeFunctor() || group.isLocalToSubDomain())
2211 group.internal()->removeSuppressedItems();
2213 meshvisitor::visitGroups(
this, action);
2216 iexchanger->allocateReceivedItems();
2219 _endUpdateFamilies();
2220 _computeFamilySynchronizeInfos();
2223 iexchanger->updateItemGroups();
2225 _computeGroupSynchronizeInfos();
2227 iexchanger->updateVariables();
2231 m_mesh_checker.checkMeshFromReferenceFile();
2232 _notifyEndUpdateForFamilies();
2234 iexchanger->finalizeExchange();
2236 m_mesh_exchange_mng->endExchange();
2252 auto want_dump =
false;
2253 auto need_compact =
false;
2254 m_trace_mng->info(4) <<
"DynamicMesh::prepareForDump() name=" << name()
2255 <<
" need_compact?=" << need_compact
2256 <<
" want_dump?=" << want_dump
2257 <<
" timestamp=" << 0;
2261 m_mesh_events.eventObservable(t).notify(MeshEventArgs(
this, t));
2266 for (
auto& family : m_arcane_families) {
2267 family->prepareForDump();
2273 m_mesh_events.eventObservable(t).notify(MeshEventArgs(
this, t));
2354 return m_mesh_utilities.get();
2363 IItemFamily* item_family = _itemFamily(ik);
2365 return item_family->itemsNewOwner();
2374 return m_mesh_checker.checkLevel();
2383 return m_item_family_network.get();
2392 return m_ghost_layer_mng.get();
2401 return m_internal_api.get();
2407mesh::PolyhedralMeshImpl* mesh::PolyhedralMesh::_impl()
2409 return m_mesh.get();
2425namespace Arcane::mesh
2434Arcane::mesh::PolyhedralMesh::
2435~PolyhedralMesh() =
default;
2440Arcane::mesh::PolyhedralMesh::
2442: EmptyMesh{ subdomain->traceMng() }
2443, m_subdomain{ subdomain }
2445, m_mesh_kind(mbi.meshKind())
2452void Arcane::mesh::PolyhedralMesh::
2453read([[maybe_unused]]
const String& filename)
2461void Arcane::mesh::PolyhedralMesh::
2462allocateItems(
const Arcane::ItemAllocationInfo& item_allocation_info)
2464 ARCANE_UNUSED(item_allocation_info);
2479class ARCANE_MESH_EXPORT PolyhedralMeshFactory
2498 static String name() {
return "ArcanePolyhedralMeshFactory"; }
2508#if ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
2516 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 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.
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.