14#include "arcane/mesh/PolyhedralMesh.h"
16#include "ItemFamilyNetwork.h"
17#include "ItemFamilyPolicyMng.h"
18#include "arcane/mesh/MeshExchangeMng.h"
19#include "arcane/core/ISubDomain.h"
20#include "arcane/core/ItemSharedInfo.h"
21#include "arcane/core/ItemTypeInfo.h"
22#include "arcane/core/ItemTypeMng.h"
23#include "arcane/core/VariableBuildInfo.h"
24#include "arcane/core/MeshBuildInfo.h"
26#include "arcane/core/AbstractService.h"
27#include "arcane/core/IMeshFactory.h"
28#include "arcane/core/ItemInternal.h"
29#include "arcane/core/IDoFFamily.h"
30#include "arcane/core/IMeshCompactMng.h"
31#include "arcane/core/IMeshCompacter.h"
32#include "arcane/core/IMeshExchanger.h"
33#include "arcane/core/IGhostLayerMng.h"
34#include "arcane/core/MeshVisitor.h"
35#include "arcane/core/internal/IVariableMngInternal.h"
36#include "arcane/core/internal/IPolyhedralMeshModifier.h"
37#include "arcane/core/internal/IMeshModifierInternal.h"
39#include "arcane/mesh/ItemFamily.h"
40#include "arcane/mesh/DynamicMeshKindInfos.h"
41#include "arcane/mesh/UnstructuredMeshUtilities.h"
42#include "arcane/mesh/GhostLayerMng.h"
43#include "arcane/utils/ITraceMng.h"
44#include "arcane/utils/FatalErrorException.h"
46#ifdef ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
48#include "arcane/core/IMeshMng.h"
49#include "arcane/core/MeshHandle.h"
50#include "arcane/core/IItemFamily.h"
51#include "arcane/core/internal/IMeshInternal.h"
52#include "arcane/core/IVariableSynchronizer.h"
53#include "arcane/mesh/ItemFamilyPolicyMng.h"
54#include "arcane/mesh/ItemFamilySerializer.h"
55#include "arcane/utils/Collection.h"
56#include "arcane/utils/List.h"
57#include "arcane/utils/PlatformUtils.h"
60#include "ItemConnectivityMng.h"
65 #define ARCANE_DEBUG_LOAD_BALANCING
67#ifdef ARCANE_DEBUG_LOAD_BALANCING
68static bool arcane_debug_load_balancing =
true;
70static bool arcane_debug_load_balancing =
false;
76void Arcane::mesh::PolyhedralMesh::
77_errorEmptyMesh()
const
79 ARCANE_FATAL(
"Cannot use PolyhedralMesh if Arcane is not linked with lib Neo");
97 class PolyhedralFamilyPolicyMng
98 :
public ItemFamilyPolicyMng
102 : ItemFamilyPolicyMng(family)
116 class PolyhedralFamily
127 inline static const String m_arcane_item_lids_property_name{
"Arcane_Item_Lids" };
128 inline static const String m_arcane_remove_item_property_name{
"Arcane_Remove_Items" };
138 void preAllocate(
Integer nb_item)
140 Integer nb_hash = itemsMap().nbBucket();
142 if (nb_hash < wanted_size)
143 itemsMap().resize(wanted_size,
true);
144 m_empty_connectivity_indexes.resize(nb_item +
nbItem(), 0);
145 m_empty_connectivity_nb_item.resize(nb_item +
nbItem(), 0);
146 _updateEmptyConnectivity();
152 ItemInternal* item_internal = ItemFamily::_allocOne(uid, need_alloc);
154 item_internal->setUniqueId(uid);
156 _allocateInfos(item_internal, uid, m_shared_info);
158 item_internal->
setOwner(m_sub_domain_id, m_sub_domain_id);
159 return item_internal;
166 ARCANE_ASSERT((uids.
size() == items.
size()), (
"one must have items.size==uids.size()"));
167 m_mesh->traceMng()->debug(Arccore::Trace::Highest) <<
" PolyhedralFamily::addItems ";
168 preAllocate(uids.
size());
170 for (
auto uid : uids) {
172 items[index++] = ii->
localId();
174 m_need_prepare_dump =
true;
175 _updateItemInternalList();
180 _removeMany(local_ids);
183 void _updateItemInternalList()
187 m_item_internal_list->cells = _itemsInternal();
190 m_item_internal_list->faces = _itemsInternal();
193 m_item_internal_list->edges = _itemsInternal();
196 m_item_internal_list->nodes = _itemsInternal();
205 void _updateEmptyConnectivity()
208 for (
auto item_kind = 0; item_kind < ItemInternalConnectivityList::MAX_ITEM_KIND; ++item_kind) {
209 item_internal_connectivity_list->_setConnectivityList(item_kind, m_empty_connectivity);
210 item_internal_connectivity_list->_setConnectivityIndex(item_kind, m_empty_connectivity_indexes);
211 item_internal_connectivity_list->_setConnectivityNbItem(item_kind, m_empty_connectivity_nb_item);
221 void build()
override {
226 m_shared_info = _findSharedInfo(dof_type_info);
227 _updateEmptyConnectivity();
238 IItemFamily* itemFamily()
override {
return this; }
242 auto* polyhedral_mesh_modifier = m_mesh->_internalApi()->polyhedralMeshModifier();
251 ARCANE_NOT_YET_IMPLEMENTED(
"");
252 ARCANE_UNUSED(dof_uids);
253 ARCANE_UNUSED(owners);
272#ifdef ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
289 class PolyhedralMeshImpl
291 ISubDomain* m_subdomain;
292 Neo::Mesh m_mesh{
"Test" };
294 template <eItemKind IK>
297 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_None;
300 static Neo::ItemKind itemKindArcaneToNeo(eItemKind ik)
304 return Neo::ItemKind::IK_Cell;
306 return Neo::ItemKind::IK_Face;
308 return Neo::ItemKind::IK_Edge;
310 return Neo::ItemKind::IK_Node;
312 return Neo::ItemKind::IK_Dof;
315 return Neo::ItemKind::IK_None;
317 return Neo::ItemKind::IK_Node;
324 Neo::FutureItemRange m_future_items;
327 void fillArrayView(Int32ArrayView local_ids, Neo::EndOfMeshUpdate mesh_state)
329 auto lids = m_future_items.get(mesh_state);
330 std::copy(lids.begin(),lids.end(),local_ids.begin());
332 friend class PolyhedralMeshImpl;
337 explicit PolyhedralMeshImpl(ISubDomain* subDomain)
338 : m_subdomain(subDomain)
343 String name()
const {
return m_mesh.name(); }
345 Integer dimension()
const {
return m_mesh.dimension(); }
347 Integer nbNode()
const {
return m_mesh.nbNodes(); }
348 Integer nbEdge()
const {
return m_mesh.nbEdges(); }
349 Integer nbFace()
const {
return m_mesh.nbFaces(); }
350 Integer nbCell()
const {
return m_mesh.nbCells(); }
351 Integer nbItem(eItemKind ik)
const {
return m_mesh.nbItems(itemKindArcaneToNeo(ik)); }
353 static void _setFaceInfos(Int32 mod_flags, Face& face)
355 Int32 face_flags = face.itemBase().flags();
356 face_flags &= ~ItemFlags::II_InterfaceFlags;
357 face_flags |= mod_flags;
358 face.mutableItemBase().setFlags(face_flags);
363 void addFamily(eItemKind ik,
const String& name)
365 m_mesh.addFamily(itemKindArcaneToNeo(ik), name.localstr());
370 void scheduleAddItems(PolyhedralFamily* arcane_item_family,
371 Int64ConstSmallSpan uids,
372 ItemLocalIds& item_local_ids)
374 auto& added_items = item_local_ids.m_future_items;
375 auto& item_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_item_family->itemKind()),
376 arcane_item_family->name().localstr());
377 m_mesh.scheduleAddItems(item_family, std::vector<Int64>{ uids.begin(), uids.end() }, added_items);
379 auto& mesh_graph = m_mesh.internalMeshGraph();
380 item_family.addMeshScalarProperty<Neo::utils::Int32>(PolyhedralFamily::m_arcane_item_lids_property_name.localstr());
381 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ item_family, item_family.lidPropName() },
382 Neo::MeshKernel::OutProperty{ item_family, PolyhedralFamily::m_arcane_item_lids_property_name.localstr() },
383 [arcane_item_family, uids,added_items](Neo::ItemLidsProperty
const& lids_property,
384 Neo::MeshScalarPropertyT<Neo::utils::Int32>&) {
386 arcane_item_family->addItems(uids, arcane_items);
387 arcane_item_family->traceMng()->debug(Trace::Highest) << arcane_items;
389 auto neo_lids = lids_property.values();
390 if (!std::equal(neo_lids.begin(), neo_lids.end(), arcane_items.begin()))
391 if (!std::equal(added_items.new_items.begin(), added_items.new_items.end(), arcane_items.begin()))
392 arcane_item_family->traceMng()->fatal() <<
"Inconsistent item lids generation between Arcane and Neo.";
398 void scheduleRemoveItems(PolyhedralFamily* arcane_item_family,
399 Int32ConstArrayView local_ids)
401 auto& item_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_item_family->itemKind()),
402 arcane_item_family->name().localstr());
403 Neo::ItemRange removed_items{Neo::ItemLocalIds{{local_ids.begin(),local_ids.end()},0,0}};
404 m_mesh.scheduleRemoveItems(item_family, removed_items);
406 auto& mesh_graph = m_mesh.internalMeshGraph();
407 item_family.addMeshScalarProperty<Neo::utils::Int32>(PolyhedralFamily::m_arcane_remove_item_property_name.localstr());
408 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ item_family, m_mesh._removeItemPropertyName(item_family) },
409 Neo::MeshKernel::OutProperty{ item_family, PolyhedralFamily::m_arcane_remove_item_property_name.localstr() },
410 [arcane_item_family,local_ids](Neo::MeshScalarPropertyT<Neo::utils::Int32>
const&,
411 Neo::MeshScalarPropertyT<Neo::utils::Int32>&) {
413 arcane_item_family->removeItems(local_ids);
419 void scheduleAddConnectivity(PolyhedralFamily* arcane_source_item_family,
420 ItemLocalIds& source_items,
421 Integer nb_connected_items_per_item,
422 PolyhedralFamily* arcane_target_item_family,
423 Int64ConstArrayView target_items_uids,
427 _scheduleAddConnectivity(arcane_source_item_family,
429 nb_connected_items_per_item,
430 arcane_target_item_family,
437 void scheduleAddConnectivity(PolyhedralFamily* arcane_source_item_family,
438 ItemLocalIds& source_items,
439 Int32ConstSmallSpan nb_connected_items_per_item,
440 PolyhedralFamily* arcane_target_item_family,
441 Int64ConstSmallSpan target_items_uids,
442 String
const& connectivity_name)
444 _scheduleAddConnectivity(arcane_source_item_family,
446 std::vector<Int32>{ nb_connected_items_per_item.begin(), nb_connected_items_per_item.end() },
447 arcane_target_item_family,
455 template <
typename ConnectivitySizeType>
456 void _scheduleAddConnectivity(PolyhedralFamily* arcane_source_item_family,
457 ItemLocalIds& source_items,
458 ConnectivitySizeType&& nb_connected_items_per_item,
459 PolyhedralFamily* arcane_target_item_family,
460 Int64ConstSmallSpan target_item_uids,
461 String
const& connectivity_name)
464 auto& source_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_source_item_family->itemKind()),
465 arcane_source_item_family->name().localstr());
466 auto& target_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_target_item_family->itemKind()),
467 arcane_target_item_family->name().localstr());
469 std::vector<Int64> target_item_uids_filtered;
470 target_item_uids_filtered.reserve(target_item_uids.size());
471 std::copy_if(target_item_uids.begin(),
472 target_item_uids.end(),
473 std::back_inserter(target_item_uids_filtered),
474 [](
auto uid) { return uid != NULL_ITEM_UNIQUE_ID; });
476 m_mesh.scheduleAddConnectivity(source_family, source_items.m_future_items, target_family,
477 std::forward<ConnectivitySizeType>(nb_connected_items_per_item),
478 std::move(target_item_uids_filtered),
479 connectivity_name.localstr());
481 auto& mesh_graph = m_mesh.internalMeshGraph();
482 std::string connectivity_add_output_property_name = std::string{
"EndOf" } + connectivity_name.localstr() +
"Add";
483 source_family.addScalarProperty<Neo::utils::Int32>(connectivity_add_output_property_name);
484 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, connectivity_name.localstr() },
485 Neo::MeshKernel::OutProperty{ source_family, connectivity_add_output_property_name },
486 [arcane_source_item_family, arcane_target_item_family, &source_family, &target_family,
this, connectivity_name](Neo::Mesh::ConnectivityPropertyType
const&,
487 Neo::ScalarPropertyT<Neo::utils::Int32>&) {
488 auto item_internal_connectivity_list = arcane_source_item_family->itemInternalConnectivityList();
490 auto connectivity = m_mesh.getConnectivity(source_family, target_family, connectivity_name.localstr());
492 auto& connectivity_values = source_family.getConcreteProperty<Neo::Mesh::ConnectivityPropertyType>(connectivity_name.localstr());
493 Neo::MeshArrayPropertyProxyT<Neo::Mesh::ConnectivityPropertyType::PropertyDataType> connectivity_proxy{connectivity_values};
494 auto nb_item_data = connectivity_proxy.arrayPropertyOffsets();
495 auto nb_item_size = connectivity_proxy.arrayPropertyOffsetsSize();
496 item_internal_connectivity_list->_setConnectivityNbItem(arcane_target_item_family->itemKind(),
497 Int32ArrayView{ Integer(nb_item_size), nb_item_data });
498 auto max_nb_connected_items = connectivity.maxNbConnectedItems();
499 item_internal_connectivity_list->_setMaxNbConnectedItem(arcane_target_item_family->itemKind(), max_nb_connected_items);
500 auto connectivity_values_data = connectivity_proxy.arrayPropertyData();
501 auto connectivity_values_size = connectivity_proxy.arrayPropertyDataSize();
502 item_internal_connectivity_list->_setConnectivityList(arcane_target_item_family->itemKind(),
503 Int32ArrayView{ Integer(connectivity_values_size), connectivity_values_data });
504 auto connectivity_index_data = connectivity_proxy.arrayPropertyIndex();
505 auto connectivity_index_size = connectivity_proxy.arrayPropertyIndexSize();
506 item_internal_connectivity_list->_setConnectivityIndex(arcane_target_item_family->itemKind(),
507 Int32ArrayView{ Integer(connectivity_index_size), connectivity_index_data });
510 if (arcane_source_item_family->itemKind() == IK_Face && arcane_target_item_family->itemKind() == IK_Cell) {
511 std::string flag_definition_output_property_name{
"EndOfFlagDefinition" };
512 source_family.addScalarProperty<Neo::utils::Int32>(flag_definition_output_property_name);
513 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, connectivity_add_output_property_name }, Neo::MeshKernel::OutProperty{ source_family, flag_definition_output_property_name },
514 [arcane_source_item_family,
this, target_item_uids, &source_items](Neo::ScalarPropertyT<Neo::utils::Int32>
const&, Neo::ScalarPropertyT<Neo::utils::Int32>
const&) {
515 auto current_face_index = 0;
516 auto arcane_faces = arcane_source_item_family->itemInfoListView();
517 for (
auto face_lid : source_items.m_future_items.new_items) {
518 Face current_face = arcane_faces[face_lid].toFace();
519 if (target_item_uids[2 * current_face_index + 1] == NULL_ITEM_LOCAL_ID) {
522 Int32 mod_flags = (target_item_uids[2 * current_face_index] != NULL_ITEM_LOCAL_ID) ? (ItemFlags::II_Boundary | ItemFlags::II_HasBackCell | ItemFlags::II_BackCellIsFirst) : 0;
523 _setFaceInfos(mod_flags, current_face);
525 else if (target_item_uids[2 * current_face_index] == NULL_ITEM_LOCAL_ID) {
527 _setFaceInfos(ItemFlags::II_Boundary | ItemFlags::II_HasFrontCell | ItemFlags::II_FrontCellIsFirst, current_face);
531 _setFaceInfos(ItemFlags::II_HasFrontCell | ItemFlags::II_HasBackCell | ItemFlags::II_BackCellIsFirst, current_face);
533 ++current_face_index;
541 void scheduleSetItemCoordinates(PolyhedralFamily* item_family, ItemLocalIds& local_ids, Real3ConstSmallSpan item_coords, VariableItemReal3& arcane_coords)
543 auto& _item_family = m_mesh.findFamily(itemKindArcaneToNeo(item_family->itemKind()), item_family->name().localstr());
544 std::vector<Neo::utils::Real3> _node_coords(item_coords.size());
546 for (
auto&& node_coord : item_coords) {
547 _node_coords[node_index++] = Neo::utils::Real3{ node_coord.x, node_coord.y, node_coord.z };
549 m_mesh.scheduleSetItemCoords(_item_family, local_ids.m_future_items, _node_coords);
551 auto& mesh_graph = m_mesh.internalMeshGraph();
552 _item_family.addScalarProperty<Int32>(
"NoOutProperty42");
553 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ _item_family, m_mesh._itemCoordPropertyName(_item_family) },
554 Neo::MeshKernel::OutProperty{ _item_family,
"NoOutProperty42" },
555 [
this, item_family, &_item_family, &arcane_coords](Neo::Mesh::CoordPropertyType
const& item_coords_property,
556 Neo::ScalarPropertyT<Neo::utils::Int32>&) {
558 auto& all_items = _item_family.all();
559 VariableNodeReal3 node_coords{ VariableBuildInfo{ item_family->mesh(),
"NodeCoord" } };
560 for (
auto item : all_items) {
561 arcane_coords[ItemLocalId{ item }] = { item_coords_property[item].x,
562 item_coords_property[item].y,
563 item_coords_property[item].z };
573 Neo::EndOfMeshUpdate applyScheduledOperations() noexcept
575 return m_mesh.applyScheduledOperations();
580 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Cell>
582 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Cell;
584 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Face>
586 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Face;
588 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Edge>
590 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Edge;
592 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_Node>
594 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Node;
596 template <>
class PolyhedralMeshImpl::ItemKindTraits<
IK_DoF>
598 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Dof;
606class mesh::PolyhedralMesh::PolyhedralMeshModifier
607:
public IPolyhedralMeshModifier
611 explicit PolyhedralMeshModifier(PolyhedralMesh* mesh)
615 void addItems(Int64ConstArrayView unique_ids, Int32ArrayView local_ids, eItemKind ik,
const String& family_name)
override
617 m_mesh->addItems(unique_ids,local_ids,ik,family_name);
620 void removeItems(Int32ConstArrayView local_ids, eItemKind ik,
const String& family_name)
override
622 m_mesh->removeItems(local_ids, ik, family_name);
626 PolyhedralMesh* m_mesh;
632class mesh::PolyhedralMesh::InternalApi
633:
public IMeshInternal
634,
public IMeshModifierInternal
638 explicit InternalApi(PolyhedralMesh* mesh)
640 , m_connectivity_mng(std::make_unique<ItemConnectivityMng>(mesh->traceMng()))
641 , m_polyhedral_mesh_modifier(std::make_unique<PolyhedralMeshModifier>(mesh))
646 void setMeshKind(
const MeshKind& v)
override
648 if (v.meshStructure() != eMeshStructure::Polyhedral && v.meshAMRKind() != eMeshAMRKind::None) {
649 ARCANE_FATAL(
"Incompatible mesh structure ({0}) and amr kind ({1}) for Polyhedral mesh {2}. Must be (Polyhedral,None). ",
650 v.meshStructure(),v.meshAMRKind(), m_mesh->name());
652 m_mesh->m_mesh_kind = v;
655 IItemConnectivityMng* dofConnectivityMng() const noexcept
override
657 return m_connectivity_mng.get();
660 IPolyhedralMeshModifier* polyhedralMeshModifier() const noexcept
override
662 return m_polyhedral_mesh_modifier.get();
665 void removeNeedRemoveMarkedItems()
override
667 m_mesh->traceMng()->warning() <<
"PolyhedralMesh::removeNeedRemoveMarkedItems() not yet implemented in PolyhedralMesh";
669 NodeLocalId addNode([[maybe_unused]] ItemUniqueId unique_id)
override
673 FaceLocalId addFace([[maybe_unused]] ItemUniqueId unique_id,
674 [[maybe_unused]] ItemTypeId type_id,
675 [[maybe_unused]] ConstArrayView<Int64> nodes_uid)
override
679 CellLocalId addCell([[maybe_unused]] ItemUniqueId unique_id,
680 [[maybe_unused]] ItemTypeId type_id,
681 [[maybe_unused]] ConstArrayView<Int64> nodes_uid)
override
688 PolyhedralMesh* m_mesh =
nullptr;
689 std::unique_ptr<IItemConnectivityMng> m_connectivity_mng =
nullptr;
690 std::unique_ptr<IPolyhedralMeshModifier> m_polyhedral_mesh_modifier =
nullptr;
696class mesh::PolyhedralMesh::NoCompactionMeshCompacter
697:
public IMeshCompacter
700 explicit NoCompactionMeshCompacter(PolyhedralMesh* mesh)
702 , m_trace_mng(mesh->traceMng()){}
704 void doAllActions()
override {_info();};
706 void beginCompact()
override {_info();};
707 void compactVariablesAndGroups()
override {_info();};
708 void updateInternalReferences()
override {_info();};
709 void endCompact()
override {_info();};
710 void finalizeCompact()
override {_info();};
712 IMesh* mesh()
const override {
return m_mesh;};
714 const ItemFamilyCompactInfos* findCompactInfos(IItemFamily* family)
const override {_info();
return nullptr;}
716 ePhase phase()
const override {_info();
return ePhase::Ended;}
718 void setSorted(
bool v)
override {_info();};
720 bool isSorted()
const override {_info();
return false;};
724 void _setCompactVariablesAndGroups(
bool v)
override {_info();};
727 PolyhedralMesh* m_mesh =
nullptr;
728 ITraceMng* m_trace_mng =
nullptr;
730 void _info()
const {m_trace_mng->info() << A_FUNCINFO <<
"No compacting in PolyhedralMesh";}
736class mesh::PolyhedralMesh::NoCompactionMeshCompactMng
737:
public IMeshCompactMng
740 explicit NoCompactionMeshCompactMng(PolyhedralMesh* mesh)
742 , m_trace_mng(mesh->traceMng())
743 , m_mesh_compacter{std::make_unique<NoCompactionMeshCompacter>(m_mesh)}
746 IMesh* mesh()
const override {
return m_mesh;}
747 IMeshCompacter* beginCompact()
override
750 return m_mesh_compacter.get();
753 IMeshCompacter* beginCompact(IItemFamily* family)
override
755 ARCANE_UNUSED(family);
757 return m_mesh_compacter.get();
760 void endCompact()
override {_info();};
762 IMeshCompacter* compacter()
override
765 return m_mesh_compacter.get();
770 PolyhedralMesh* m_mesh =
nullptr;
771 ITraceMng* m_trace_mng =
nullptr;
772 std::unique_ptr<IMeshCompacter> m_mesh_compacter =
nullptr;
774 void _info()
const {m_trace_mng->info() << A_FUNCINFO <<
"No compacting in PolyhedralMesh";}
780mesh::PolyhedralMesh::
783 m_mesh_handle._setMesh(
nullptr);
789ITraceMng* mesh::PolyhedralMesh::
792 return m_subdomain->traceMng();
798MeshHandle mesh::PolyhedralMesh::
801 return m_mesh_handle;
807mesh::PolyhedralMesh::
808PolyhedralMesh(ISubDomain* subdomain,
const MeshBuildInfo& mbi)
809: EmptyMesh{ subdomain->traceMng() }
810, m_name{ mbi.name() }
811, m_subdomain{ subdomain }
812, m_mesh_handle{ m_subdomain->defaultMeshHandle() }
813, m_properties(std::make_unique<Properties>(subdomain->propertyMng(), String(
"ArcaneMeshProperties_") + m_name))
814, m_mesh{ std::make_unique<mesh::PolyhedralMeshImpl>(m_subdomain) }
815, m_parallel_mng{ mbi.parallelMngRef().get() }
816, m_mesh_part_info{ makeMeshPartInfoFromParallelMng(m_parallel_mng) }
817, m_item_type_mng(ItemTypeMng::_singleton())
818, m_mesh_kind(mbi.meshKind())
819, m_initial_allocator(*this)
820, m_variable_mng{ subdomain->variableMng() }
821, m_mesh_checker{ this }
822, m_internal_api{std::make_unique<InternalApi>(this)}
823, m_compact_mng{std::make_unique<NoCompactionMeshCompactMng>(this)}
824, m_mesh_utilities{std::make_unique<UnstructuredMeshUtilities>(this)}
825, m_mesh_exchange_mng{std::make_unique<MeshExchangeMng>(this)}
826, m_item_family_network{std::make_unique<ItemFamilyNetwork>(m_trace_mng)}
827, m_ghost_layer_mng{std::make_unique<GhostLayerMng>(m_trace_mng)}
829 m_mesh_handle._setMesh(
this);
830 m_mesh_item_internal_list.mesh =
this;
831 m_default_arcane_families.fill(
nullptr);
837void Arcane::mesh::PolyhedralMesh::
838allocateItems(
const Arcane::ItemAllocationInfo& item_allocation_info)
841 m_subdomain->traceMng()->info() <<
"--PolyhedralMesh : allocate items --";
842 UniqueArray<PolyhedralMeshImpl::ItemLocalIds> item_local_ids(item_allocation_info.family_infos.size());
843 auto family_index = 0;
845 for (
auto& family_info : item_allocation_info.family_infos) {
846 bool create_if_needed =
true;
847 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name,create_if_needed);
848 m_trace_mng->debug() <<
" Create items " << family_info.name;
849 m_mesh->scheduleAddItems(item_family, family_info.item_uids, item_local_ids[family_index++]);
853 for (
auto& family_info : item_allocation_info.family_infos) {
854 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
855 m_trace_mng->debug(
Trace::High) <<
"Current family " << family_info.name;
856 for (
auto& current_connected_family_info : family_info.connected_family_info) {
857 auto connected_family = _findItemFamily(current_connected_family_info.item_kind, current_connected_family_info.name);
858 m_trace_mng->debug(
Trace::High) <<
" Create connectivity " << current_connected_family_info.connectivity_name;
860 if (!connected_family) {
861 ARCANE_WARNING((String::format(
"Cannot find family {0} with kind {1} "
862 "The connectivity between {1} and this family is skipped",
863 current_connected_family_info.name,
864 current_connected_family_info.item_kind,
869 m_mesh->scheduleAddConnectivity(item_family,
870 item_local_ids[family_index],
871 current_connected_family_info.nb_connected_items_per_item,
873 current_connected_family_info.connected_items_uids,
874 current_connected_family_info.connectivity_name);
879 m_mesh->applyScheduledOperations();
881 for (
auto& family_info : item_allocation_info.family_infos) {
882 if (family_info.item_kind !=
IK_Node && family_info.item_coordinates.empty()) {
885 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
886 if (item_family == itemFamily(
IK_Node)) {
887 m_arcane_node_coords = std::make_unique<VariableNodeReal3>(VariableBuildInfo(
this, family_info.item_coordinates_variable_name));
888 m_arcane_node_coords->setUsed(
true);
891 auto arcane_item_coords_var_ptr = std::make_unique<VariableItemReal3>(VariableBuildInfo(
this, family_info.item_coordinates_variable_name),
892 item_family->itemKind());
893 arcane_item_coords_var_ptr->setUsed(
true);
894 m_arcane_item_coords.push_back(std::move(arcane_item_coords_var_ptr));
898 for (
auto& family : m_arcane_families) {
905 for (
auto& family_info : item_allocation_info.family_infos) {
906 if (family_info.item_coordinates.empty()) {
910 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
911 if (item_family == itemFamily(
IK_Node)) {
912 m_mesh->scheduleSetItemCoordinates(item_family, item_local_ids[family_index], family_info.item_coordinates, *m_arcane_node_coords);
915 m_mesh->scheduleSetItemCoordinates(item_family, item_local_ids[family_index], family_info.item_coordinates, *m_arcane_item_coords[index++].get());
917 m_mesh->applyScheduledOperations();
918 m_is_allocated =
true;
920 itemTypeMng()->setMeshWithGeneralCells(
this);
938 return m_mesh->dimension();
947 return m_mesh->nbNode();
956 return m_mesh->nbEdge();
965 return m_mesh->nbFace();
974 return m_mesh->nbCell();
983 return m_mesh->nbItem(ik);
992 if (m_default_arcane_families[
IK_Node])
993 return m_default_arcane_families[
IK_Node]->allItems();
1004 if (m_default_arcane_families[
IK_Edge])
1005 return m_default_arcane_families[
IK_Edge]->allItems();
1016 if (m_default_arcane_families[
IK_Face])
1017 return m_default_arcane_families[
IK_Face]->allItems();
1028 if (m_default_arcane_families[
IK_Cell])
1029 return m_default_arcane_families[
IK_Cell]->allItems();
1040 if (m_default_arcane_families[
IK_Node])
1041 return m_default_arcane_families[
IK_Node]->allItems().own();
1052 if (m_default_arcane_families[
IK_Edge])
1053 return m_default_arcane_families[
IK_Edge]->allItems().own();
1064 if (m_default_arcane_families[
IK_Face])
1065 return m_default_arcane_families[
IK_Face]->allItems().own();
1076 if (m_default_arcane_families[
IK_Cell])
1077 return m_default_arcane_families[
IK_Cell]->allItems().own();
1088 if (m_default_arcane_families[
IK_Cell])
1097mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1098_createItemFamily(
eItemKind ik,
const String& name)
1100 m_mesh->addFamily(ik, name);
1101 m_arcane_families.push_back(std::make_unique<PolyhedralFamily>(
this, ik, name));
1102 auto current_family = m_arcane_families.back().get();
1103 if (m_default_arcane_families[ik] ==
nullptr) {
1104 m_default_arcane_families[ik] = current_family;
1105 _updateMeshInternalList(ik);
1107 m_item_family_collection.add(current_family);
1108 current_family->build();
1109 return current_family;
1118 return _createItemFamily(ik, name);
1124void mesh::PolyhedralMesh::
1127 createItemFamily(
IK_Cell,
"CellFamily");
1128 createItemFamily(
IK_Node,
"NodeFamily");
1129 auto cell_family = m_default_arcane_families[
IK_Cell];
1130 auto node_family = m_default_arcane_families[
IK_Node];
1133 PolyhedralMeshImpl::ItemLocalIds cell_lids, node_lids;
1134 m_mesh->scheduleAddItems(cell_family, cell_uids.constView(), cell_lids);
1135 m_mesh->scheduleAddItems(node_family, node_uids.constView(), node_lids);
1137 m_mesh->scheduleAddConnectivity(cell_family, cell_lids, nb_node, node_family, node_uids, String{
"CellToNodes" });
1138 m_mesh->scheduleAddConnectivity(node_family, node_lids, 1, cell_family,
1140 m_mesh->applyScheduledOperations();
1141 cell_family->endUpdate();
1142 node_family->endUpdate();
1155 for (
auto ik = 0; ik < NB_ITEM_KIND; ++ik) {
1158 m_empty_arcane_families[ik] = std::make_unique<mesh::PolyhedralFamily>(
this, (
eItemKind)ik, name);
1159 m_default_arcane_families[ik] = m_empty_arcane_families[ik].get();
1163 m_item_family_network->addDependency(itemFamily(
IK_Cell), itemFamily(
IK_Node),
nullptr);
1164 m_item_family_network->addDependency(itemFamily(
IK_Cell), itemFamily(
IK_Face),
nullptr);
1165 m_item_family_network->addDependency(itemFamily(
IK_Cell), itemFamily(
IK_Edge),
nullptr);
1166 m_item_family_network->addDependency(itemFamily(
IK_Face), itemFamily(
IK_Node),
nullptr);
1167 m_item_family_network->addDependency(itemFamily(
IK_Edge), itemFamily(
IK_Node),
nullptr);
1168 m_item_family_network->addRelation(itemFamily(
IK_Face), itemFamily(
IK_Edge),
nullptr);
1169 m_item_family_network->addRelation(itemFamily(
IK_Face), itemFamily(
IK_Face),
nullptr);
1170 m_item_family_network->addRelation(itemFamily(
IK_Face), itemFamily(
IK_Cell),
nullptr);
1171 m_item_family_network->addRelation(itemFamily(
IK_Edge), itemFamily(
IK_Cell),
nullptr);
1172 m_item_family_network->addRelation(itemFamily(
IK_Node), itemFamily(
IK_Cell),
nullptr);
1173 m_item_family_network->addRelation(itemFamily(
IK_Node), itemFamily(
IK_Face),
nullptr);
1174 m_item_family_network->addRelation(itemFamily(
IK_Node), itemFamily(
IK_Edge),
nullptr);
1175 m_item_family_network->addRelation(itemFamily(
IK_Edge), itemFamily(
IK_Face),
nullptr);
1185 return m_default_arcane_families[
IK_Node];
1194 return m_default_arcane_families[
IK_Edge];
1203 return m_default_arcane_families[
IK_Face];
1212 return m_default_arcane_families[
IK_Cell];
1215void mesh::PolyhedralMesh::
1220 m_mesh_item_internal_list.cells = m_default_arcane_families[kind]->itemsInternal();
1221 m_mesh_item_internal_list._internalSetCellSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1224 m_mesh_item_internal_list.faces = m_default_arcane_families[kind]->itemsInternal();
1225 m_mesh_item_internal_list._internalSetFaceSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1228 m_mesh_item_internal_list.edges = m_default_arcane_families[kind]->itemsInternal();
1229 m_mesh_item_internal_list._internalSetEdgeSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1232 m_mesh_item_internal_list.nodes = m_default_arcane_families[kind]->itemsInternal();
1233 m_mesh_item_internal_list._internalSetNodeSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1245mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1248 return m_default_arcane_families[ik];
1257 return _itemFamily(ik);
1266 return m_item_type_mng;
1272mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1273_findItemFamily(
eItemKind ik,
const String& name,
bool create_if_needed)
1276 auto found_family = _itemFamily(ik);
1278 if (found_family->name() == name)
1279 return found_family;
1281 for (
auto& family : m_arcane_families) {
1282 if (family->itemKind() == ik && family->name() == name)
1283 return family.get();
1285 if (!create_if_needed)
1287 return _createItemFamily(ik, name);
1296 ARCANE_UNUSED(register_modifier_if_created);
1297 return _findItemFamily(ik, name, create_if_needed);
1303mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1306 return m_default_arcane_families[ik];
1315 ARCANE_ASSERT(m_arcane_node_coords, (
"Node coordinates not yet loaded."));
1316 return *m_arcane_node_coords;
1326 for (
auto& family : m_arcane_families) {
1327 group = family->findGroup(name);
1340 m_all_groups.
clear();
1341 for (
auto& family : m_arcane_families) {
1343 m_all_groups.add(*i_group);
1345 return m_all_groups;
1354 for (
auto& family : m_arcane_families) {
1355 family->destroyGroups();
1365 return m_item_family_collection;
1374 return m_internal_api.get();
1383 return m_compact_mng.get();
1389void mesh::PolyhedralMesh::
1392 auto* item_family = _findItemFamily(ik, family_name,
false);
1393 PolyhedralMeshImpl::ItemLocalIds item_local_ids;
1394 m_mesh->scheduleAddItems(item_family,unique_ids,item_local_ids);
1395 auto mesh_state = m_mesh->applyScheduledOperations();
1396 item_local_ids.fillArrayView(local_ids,mesh_state);
1402void mesh::PolyhedralMesh::
1405 auto* item_family = _findItemFamily(ik, family_name,
false);
1406 m_mesh->scheduleRemoveItems(item_family,local_ids);
1407 m_mesh->applyScheduledOperations();
1416 addItems(nodes_uid, nodes_lid,
IK_Node, nodeFamily()->name());
1425 m_trace_mng->info() <<
"PolyhedralMesh::_exchangeItems() do_compact?=" <<
"false"
1426 <<
" nb_exchange=" << 0 <<
" version=" << 0;
1429 if (!check_exchange.null()){
1430 m_mesh_checker.checkGhostCells();
1431 m_trace_mng->pwarning() <<
"CHECKING SYNCHRONISATION !";
1432 m_mesh_checker.checkVariablesSynchronization();
1433 m_mesh_checker.checkItemGroupsSynchronization();
1435 if (checkLevel()>=2)
1436 m_mesh_checker.checkValidMesh();
1437 else if (checkLevel()>=1)
1438 m_mesh_checker.checkValidConnectivity();
1445void mesh::PolyhedralMesh::
1450 Trace::Setter mci(traceMng(),_className());
1455 if (arcane_debug_load_balancing){
1457 for (
auto& family : m_arcane_families) {
1458 family->itemsNewOwner().checkIfSync();
1462 IMeshExchanger* iexchanger = m_mesh_exchange_mng->beginExchange();
1465 if (iexchanger->computeExchangeInfos()){
1466 m_trace_mng->pwarning() <<
"No load balance is performed";
1467 m_mesh_exchange_mng->endExchange();
1472 iexchanger->processExchange();
1475 iexchanger->removeNeededItems();
1480 auto action = [](ItemGroup& group)
1482 if (group.internal()->hasComputeFunctor() || group.isLocalToSubDomain())
1485 group.internal()->removeSuppressedItems();
1488 meshvisitor::visitGroups(
this, action);
1491 iexchanger->allocateReceivedItems();
1496 iexchanger->updateItemGroups();
1498 auto action = [](ItemGroup& group)
1500 if (group.hasSynchronizer())
1501 group.synchronizer()->compute();
1504 m_trace_mng->info() <<
"Computing group synchronization information for " << name();
1505 meshvisitor::visitGroups(
this,action);
1507 iexchanger->updateVariables();
1511 iexchanger->finalizeExchange();
1514 m_mesh_exchange_mng->endExchange();
1531 auto want_dump =
false;
1532 auto need_compact =
false;
1533 m_trace_mng->info(4) <<
"DynamicMesh::prepareForDump() name=" << name()
1534 <<
" need_compact?=" << need_compact
1535 <<
" want_dump?=" << want_dump
1536 <<
" timestamp=" << 0;
1540 m_mesh_events.eventObservable(t).notify(MeshEventArgs(
this,t));
1545 for (
auto& family : m_arcane_families) {
1546 family->prepareForDump();
1552 m_mesh_events.eventObservable(t).notify(MeshEventArgs(
this,t));
1633 return m_mesh_utilities.get();
1642 IItemFamily* item_family = _itemFamily(ik);
1644 return item_family->itemsNewOwner();
1653 return m_mesh_checker.checkLevel();
1662 return m_item_family_network.get();
1671 return m_ghost_layer_mng.get();
1680 return m_internal_api.get();
1706Arcane::mesh::PolyhedralMesh::
1707~PolyhedralMesh() =
default;
1712Arcane::mesh::PolyhedralMesh::
1714: EmptyMesh{ subdomain->traceMng() }
1715, m_subdomain{ subdomain }
1717, m_mesh_kind(mbi.meshKind())
1724void Arcane::mesh::PolyhedralMesh::
1725read([[maybe_unused]]
const String& filename)
1733void Arcane::mesh::PolyhedralMesh::
1734allocateItems(
const Arcane::ItemAllocationInfo& item_allocation_info)
1736 ARCANE_UNUSED(item_allocation_info);
1751class ARCANE_MESH_EXPORT PolyhedralMeshFactory
1770 static String name() {
return "ArcanePolyhedralMeshFactory"; }
1780#if ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
1788 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_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 clear()
Supprime tous les éléments de la collection.
EnumeratorT< ItemGroup > Enumerator
Interface d'une famille de DoF.
Gère la sérialisation/désérialisation des entités d'une famille.
Interface d'une famille d'entités.
virtual NodeGroup ownNodes()=0
Groupe de tous les noeuds propres au domaine.
virtual IItemFamily * nodeFamily()=0
Retourne la famille des noeuds.
virtual String name() const =0
Nom du maillage.
virtual Integer nbCell()=0
Nombre de mailles du maillage.
virtual CellGroup ownCells()=0
Groupe de toutes les mailles propres au domaine.
virtual FaceGroup ownFaces()=0
Groupe de toutes les faces propres au domaine.
virtual FaceGroup allFaces()=0
Groupe de toutes les faces.
virtual Integer nbEdge()=0
Nombre d'arêtes du maillage.
virtual IItemFamily * itemFamily(eItemKind ik)=0
Retourne la famille d'entité de type ik.
virtual IItemFamily * edgeFamily()=0
Retourne la famille des arêtes.
virtual Integer nbNode()=0
Nombre de noeuds du maillage.
virtual FaceGroup outerFaces()=0
Groupe de toutes les faces sur la frontière.
virtual IItemFamily * findItemFamily(eItemKind ik, const String &name, bool create_if_needed=false, bool register_modifier_if_created=false)=0
Retourne la famille de nom name.
virtual Integer nbItem(eItemKind ik)=0
Nombre d'éléments du genre ik.
virtual Integer dimension()=0
Dimension du maillage (1D, 2D ou 3D).
virtual IItemFamily * faceFamily()=0
Retourne la famille des faces.
virtual EdgeGroup ownEdges()=0
Groupe de toutes les arêtes propres au domaine.
virtual NodeGroup allNodes()=0
Groupe de tous les noeuds.
virtual CellGroup allCells()=0
Groupe de toutes les mailles.
virtual Integer nbFace()=0
Nombre de faces du maillage.
virtual IItemFamily * cellFamily()=0
Retourne la famille des mailles.
virtual IItemFamily * createItemFamily(eItemKind ik, const String &name)=0
Créé une famille de particule de nom name.
virtual EdgeGroup allEdges()=0
Groupe de toutes les arêtes.
Interface du service gérant la lecture d'un maillage.
virtual IPolyhedralMeshModifier * polyhedralMeshModifier() const noexcept=0
Interface du gestionnaire des maillages.
virtual IVariableMng * variableMng() const =0
Gestionnaire de variables associé à ce gestionnaire.
virtual void addNodes(Int64ConstArrayView nodes_uid, Int32ArrayView nodes_lid=Int32ArrayView())=0
Ajoute des noeuds.
virtual IMeshModifierInternal * _modifierInternalApi()=0
API interne à Arcane.
virtual VariableNodeReal3 & nodesCoordinates()=0
Coordonnées des noeuds.
virtual FaceGroup outerActiveFaces()=0
Groupe de toutes les faces actives sur la frontière.
virtual void destroyGroups()=0
Détruit tous les groupes de toutes les familles.
virtual IMeshUtilities * utilities()=0
Interface des fonctions utilitaires associée.
virtual CellGroup allLevelCells(const Integer &level)=0
Groupe de toutes les mailles de niveau level.
virtual FaceGroup innerActiveFaces()=0
Groupe de toutes les faces actives.
virtual ItemGroupCollection groups()=0
Liste des groupes.
virtual ItemGroup findGroup(const String &name)=0
Retourne le groupe de nom name ou le groupe nul s'il n'y en a pas.
virtual String factoryName() const =0
Nom de la fabrique utilisée pour créer le maillage.
virtual IMeshInternal * _internalApi()=0
API interne à Arcane.
virtual CellGroup allActiveCells()=0
virtual FaceGroup allActiveFaces()=0
Groupe de toutes les faces actives.
virtual ItemTypeMng * itemTypeMng() const =0
Gestionnaire de types d'entités associé
virtual void prepareForDump()=0
Prépare l'instance en vue d'une protection.
virtual CellGroup ownActiveCells()=0
Groupe de toutes les mailles actives et propres au domaine.
virtual CellGroup ownLevelCells(const Integer &level)=0
Groupe de toutes les mailles propres de niveau level.
virtual IGhostLayerMng * ghostLayerMng() const =0
Gestionnare de couche fantômes associé
virtual FaceGroup ownActiveFaces()=0
Groupe de toutes les faces actives propres au domaine.
virtual IItemFamilyNetwork * itemFamilyNetwork()=0
Interface du réseau de familles (familles connectées)
virtual IMeshCompactMng * _compactMng()=0
virtual Integer checkLevel() const =0
Niveau actuel de vérification.
virtual void exchangeItems()=0
Change les sous-domaines propriétaires des entités.
virtual VariableItemInt32 & itemsNewOwner(eItemKind kind)=0
Variable contenant l'identifiant du sous-domaine propriétaire.
Interface du gestionnaire d'un sous-domaine.
virtual Int32 subDomainId() const =0
Numéro du sous-domaine associé à ce gestionnaire.
virtual ISubDomain * internalSubDomain() const =0
Fonction interne temporaire pour récupérer le sous-domaine.
virtual IVariableMngInternal * _internalApi()=0
API interne à Arcane.
Int32 localId() const
Numéro local (au sous-domaine) de l'entité
Sérialisation/Désérialisation des familles d'entités.
Groupe d'entités de maillage.
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.
Structure interne d'une entité de maillage.
Infos sur un type d'entité du maillage.
Gestionnaire des types d'entités d'un maillage.
ItemTypeInfo * typeFromId(Integer id) const
Type correspondant au numéro id.
Paramètres nécessaires à la construction d'un maillage.
void setOwner(Integer suid, Int32 current_sub_domain)
Positionne le numéro du sous-domaine propriétaire de l'entité.
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.
constexpr __host__ __device__ bool empty() const noexcept
Retourne true si le tableau est vide (dimension nulle)
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Chaîne de caractères unicode.
TraceMessage info() const
Flot pour un message d'information.
IMesh * mesh() const override
Maillage associé
String fullName() const override
Nom complet de la famille (avec celui du maillage)
void endUpdate() override
Notifie la fin de modification de la liste des entités.
eItemKind itemKind() const override
Genre des entités.
ItemInternalConnectivityList * itemInternalConnectivityList()
Accesseur pour les connectivités via Item et ItemInternal.
ItemGroup allItems() const override
Groupe de toutes les entités.
Integer nbItem() const override
Nombre d'entités.
ItemVectorView view() override
Vue sur toutes les entités de la famille.
ISubDomain * subDomain() const override
Sous-domaine associé
String name() const override
Nom de la famille.
Classe temporaire pour conserver un ItemSharedInfo et un type d'entité.
IItemFamilySerializer * createSerializer(bool use_flags) override
Créé une instance pour la sérialisation des entités. L'instance retournée doit être détruite par l'op...
IDoFFamily * toDoFFamily() override
Retourne l'interface de la famille de particule de cette famille.
DoFVectorView addGhostDoFs(Int64ConstArrayView dof_uids, Int32ArrayView dof_lids, Int32ConstArrayView owners)
L'ajout de fantomes doit etre suivi d'un appel de computeSynchronizeInfos.
void endUpdate() override
Notifie la fin de modification de la liste des entités.
Integer nbItem() const override
Nombre d'entités.
String name() const override
Nom de la famille.
DoFVectorView addDoFs(Int64ConstArrayView dof_uids, Int32ArrayView dof_lids)
En entree les uids des dofs et on recupere leurs lids.
String fullName() const override
Nom complet de la famille (avec celui du maillage)
ItemGroup allItems() const override
Groupe de toutes les entités.
void endUpdate()
Notifie l'instance de la fin de la modification du maillage.
ItemVectorViewT< DoF > DoFVectorView
Vue sur un vecteur de degre de liberte.
ItemGroupT< Cell > CellGroup
Groupe de mailles.
ItemGroupT< Face > FaceGroup
Groupe de faces.
ItemGroupT< Edge > EdgeGroup
Groupe d'arêtes.
ItemGroupT< Node > NodeGroup
Groupe de noeuds.
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro pour enregistrer un service.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
ItemVariableScalarRefT< Int32 > VariableItemInt32
Grandeur de type entier 32 bits.
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
Collection< ItemGroup > ItemGroupCollection
Collection de groupes d'éléments du maillage.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Collection< IItemFamily * > ItemFamilyCollection
Collection de familles d'entités.
Collection< IItemFamily * > IItemFamilyCollection
Collection de familles d'entités.
@ ST_Application
Le service s'utilise au niveau de l'application.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
eMeshEventType
Evènements générés par IMesh.
@ EndPrepareDump
Evènement envoyé à la fin de prepareForDump()
@ BeginPrepareDump
Evènement envoyé au début de prepareForDump()
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
eItemKind
Genre d'entité de maillage.
@ IK_Particle
Entité de maillage de genre particule.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Unknown
Entité de maillage de genre inconnu ou non initialisé
@ IK_Face
Entité de maillage de genre face.
@ IK_DoF
Entité de maillage de genre degre de liberte.
@ IK_Edge
Entité de maillage de genre arête.
SmallSpan< const Int64 > Int64ConstSmallSpan
Vue en lecture seule d'un tableau à une dimension d'entiers 64 bits.
const char * itemKindName(eItemKind kind)
Nom du genre d'entité.