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");
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();
146 _updateEmptyConnectivity();
166 ARCANE_ASSERT((uids.
size() == items.
size()), (
"one must have items.size==uids.size()"));
168 preAllocate(uids.
size());
170 for (
auto uid : uids) {
172 items[index++] =
ii->localId();
174 m_need_prepare_dump =
true;
175 _updateItemInternalList();
183 void _updateItemInternalList()
185 switch (itemKind()) {
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) {
221 void build()
override {
223 m_sub_domain_id = subDomain()->subDomainId();
227 _updateEmptyConnectivity();
235 Integer
nbItem()
const override {
return ItemFamily::nbItem(); }
237 void endUpdate()
override { info() <<
"END UPDATE "<< m_name ;
return ItemFamily::endUpdate(); }
238 IItemFamily* itemFamily()
override {
return this; }
251 ARCANE_NOT_YET_IMPLEMENTED(
"");
258 auto*
mesh_modifier = m_mesh->_internalApi()->polyhedralMeshModifier();
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(),
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(),
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(),
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";
672 PolyhedralMesh* m_mesh =
nullptr;
673 std::unique_ptr<IItemConnectivityMng> m_connectivity_mng =
nullptr;
674 std::unique_ptr<IPolyhedralMeshModifier> m_polyhedral_mesh_modifier =
nullptr;
680class mesh::PolyhedralMesh::NoCompactionMeshCompacter
681:
public IMeshCompacter
684 explicit NoCompactionMeshCompacter(PolyhedralMesh* mesh)
686 , m_trace_mng(mesh->traceMng()){}
688 void doAllActions()
override {_info();};
690 void beginCompact()
override {_info();};
691 void compactVariablesAndGroups()
override {_info();};
692 void updateInternalReferences()
override {_info();};
693 void endCompact()
override {_info();};
694 void finalizeCompact()
override {_info();};
696 IMesh* mesh()
const override {
return m_mesh;};
698 const ItemFamilyCompactInfos* findCompactInfos(IItemFamily* family)
const override {_info();
return nullptr;}
700 ePhase phase()
const override {_info();
return ePhase::Ended;}
702 void setSorted(
bool v)
override {_info();};
704 bool isSorted()
const override {_info();
return false;};
708 void _setCompactVariablesAndGroups(
bool v)
override {_info();};
711 PolyhedralMesh* m_mesh =
nullptr;
712 ITraceMng* m_trace_mng =
nullptr;
714 void _info()
const {m_trace_mng->info() << A_FUNCINFO <<
"No compacting in PolyhedralMesh";}
720class mesh::PolyhedralMesh::NoCompactionMeshCompactMng
721:
public IMeshCompactMng
724 explicit NoCompactionMeshCompactMng(PolyhedralMesh* mesh)
726 , m_trace_mng(mesh->traceMng())
727 , m_mesh_compacter{std::make_unique<NoCompactionMeshCompacter>(m_mesh)}
730 IMesh* mesh()
const override {
return m_mesh;}
731 IMeshCompacter* beginCompact()
override
734 return m_mesh_compacter.get();
737 IMeshCompacter* beginCompact(IItemFamily* family)
override
739 ARCANE_UNUSED(family);
741 return m_mesh_compacter.get();
744 void endCompact()
override {_info();};
746 IMeshCompacter* compacter()
override
749 return m_mesh_compacter.get();
754 PolyhedralMesh* m_mesh =
nullptr;
755 ITraceMng* m_trace_mng =
nullptr;
756 std::unique_ptr<IMeshCompacter> m_mesh_compacter =
nullptr;
758 void _info()
const {m_trace_mng->info() << A_FUNCINFO <<
"No compacting in PolyhedralMesh";}
764mesh::PolyhedralMesh::
767 m_mesh_handle._setMesh(
nullptr);
773ITraceMng* mesh::PolyhedralMesh::
776 return m_subdomain->traceMng();
782MeshHandle mesh::PolyhedralMesh::
785 return m_mesh_handle;
791mesh::PolyhedralMesh::
792PolyhedralMesh(ISubDomain* subdomain,
const MeshBuildInfo& mbi)
793: EmptyMesh{ subdomain->traceMng() }
794, m_name{ mbi.name() }
795, m_subdomain{ subdomain }
796, m_mesh_handle{ m_subdomain->defaultMeshHandle() }
797, m_properties(std::make_unique<Properties>(subdomain->propertyMng(), String(
"ArcaneMeshProperties_") + m_name))
798, m_mesh{ std::make_unique<mesh::PolyhedralMeshImpl>(m_subdomain) }
799, m_parallel_mng{ mbi.parallelMngRef().get() }
800, m_mesh_part_info{ makeMeshPartInfoFromParallelMng(m_parallel_mng) }
801, m_item_type_mng(ItemTypeMng::_singleton())
802, m_mesh_kind(mbi.meshKind())
803, m_initial_allocator(*this)
804, m_variable_mng{ subdomain->variableMng() }
805, m_mesh_checker{ this }
806, m_internal_api{std::make_unique<InternalApi>(this)}
807, m_compact_mng{std::make_unique<NoCompactionMeshCompactMng>(this)}
808, m_mesh_utilities{std::make_unique<UnstructuredMeshUtilities>(this)}
809, m_mesh_exchange_mng{std::make_unique<MeshExchangeMng>(this)}
810, m_item_family_network{std::make_unique<ItemFamilyNetwork>(m_trace_mng)}
811, m_ghost_layer_mng{std::make_unique<GhostLayerMng>(m_trace_mng)}
813 m_mesh_handle._setMesh(
this);
814 m_mesh_item_internal_list.mesh =
this;
815 m_default_arcane_families.fill(
nullptr);
821void Arcane::mesh::PolyhedralMesh::
825 m_subdomain->traceMng()->info() <<
"--PolyhedralMesh : allocate items --";
826 UniqueArray<PolyhedralMeshImpl::ItemLocalIds> item_local_ids(item_allocation_info.family_infos.size());
827 auto family_index = 0;
829 for (
auto& family_info : item_allocation_info.family_infos) {
830 bool create_if_needed =
true;
831 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name,create_if_needed);
832 m_trace_mng->debug() <<
" Create items " << family_info.name;
833 m_mesh->scheduleAddItems(item_family, family_info.item_uids, item_local_ids[family_index++]);
837 for (
auto& family_info : item_allocation_info.family_infos) {
838 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
839 m_trace_mng->debug(
Trace::High) <<
"Current family " << family_info.name;
840 for (
auto& current_connected_family_info : family_info.connected_family_info) {
841 auto connected_family = _findItemFamily(current_connected_family_info.item_kind, current_connected_family_info.name);
842 m_trace_mng->debug(
Trace::High) <<
" Create connectivity " << current_connected_family_info.connectivity_name;
844 if (!connected_family) {
845 ARCANE_WARNING((String::format(
"Cannot find family {0} with kind {1} "
846 "The connectivity between {1} and this family is skipped",
847 current_connected_family_info.name,
848 current_connected_family_info.item_kind,
853 m_mesh->scheduleAddConnectivity(item_family,
854 item_local_ids[family_index],
855 current_connected_family_info.nb_connected_items_per_item,
857 current_connected_family_info.connected_items_uids,
858 current_connected_family_info.connectivity_name);
863 m_mesh->applyScheduledOperations();
865 for (
auto& family_info : item_allocation_info.family_infos) {
866 if (family_info.item_kind !=
IK_Node && family_info.item_coordinates.empty()) {
869 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
870 if (item_family == itemFamily(
IK_Node)) {
871 m_arcane_node_coords = std::make_unique<VariableNodeReal3>(VariableBuildInfo(
this, family_info.item_coordinates_variable_name));
872 m_arcane_node_coords->setUsed(
true);
875 auto arcane_item_coords_var_ptr = std::make_unique<VariableItemReal3>(VariableBuildInfo(
this, family_info.item_coordinates_variable_name),
876 item_family->itemKind());
877 arcane_item_coords_var_ptr->setUsed(
true);
878 m_arcane_item_coords.push_back(std::move(arcane_item_coords_var_ptr));
882 for (
auto& family : m_arcane_families) {
889 for (
auto& family_info : item_allocation_info.family_infos) {
890 if (family_info.item_coordinates.empty()) {
894 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
895 if (item_family == itemFamily(
IK_Node)) {
896 m_mesh->scheduleSetItemCoordinates(item_family, item_local_ids[family_index], family_info.item_coordinates, *m_arcane_node_coords);
899 m_mesh->scheduleSetItemCoordinates(item_family, item_local_ids[family_index], family_info.item_coordinates, *m_arcane_item_coords[index++].get());
901 m_mesh->applyScheduledOperations();
902 m_is_allocated =
true;
904 itemTypeMng()->setMeshWithGeneralCells(
this);
967 return m_mesh->
nbItem(ik);
976 if (m_default_arcane_families[
IK_Node])
977 return m_default_arcane_families[
IK_Node]->allItems();
988 if (m_default_arcane_families[
IK_Edge])
989 return m_default_arcane_families[
IK_Edge]->allItems();
1000 if (m_default_arcane_families[
IK_Face])
1001 return m_default_arcane_families[
IK_Face]->allItems();
1012 if (m_default_arcane_families[
IK_Cell])
1013 return m_default_arcane_families[
IK_Cell]->allItems();
1024 if (m_default_arcane_families[
IK_Node])
1025 return m_default_arcane_families[
IK_Node]->allItems().own();
1036 if (m_default_arcane_families[
IK_Edge])
1037 return m_default_arcane_families[
IK_Edge]->allItems().own();
1048 if (m_default_arcane_families[
IK_Face])
1049 return m_default_arcane_families[
IK_Face]->allItems().own();
1060 if (m_default_arcane_families[
IK_Cell])
1061 return m_default_arcane_families[
IK_Cell]->allItems().own();
1072 if (m_default_arcane_families[
IK_Cell])
1073 return m_default_arcane_families[
IK_Cell]->allItems().outerFaceGroup();
1081mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1082_createItemFamily(
eItemKind ik,
const String& name)
1084 m_mesh->addFamily(ik, name);
1085 m_arcane_families.push_back(std::make_unique<PolyhedralFamily>(
this, ik, name));
1086 auto current_family = m_arcane_families.back().get();
1087 if (m_default_arcane_families[ik] ==
nullptr) {
1088 m_default_arcane_families[ik] = current_family;
1089 _updateMeshInternalList(ik);
1091 m_item_family_collection.add(current_family);
1092 current_family->build();
1093 return current_family;
1102 return _createItemFamily(ik, name);
1108void mesh::PolyhedralMesh::
1111 createItemFamily(
IK_Cell,
"CellFamily");
1112 createItemFamily(
IK_Node,
"NodeFamily");
1113 auto cell_family = m_default_arcane_families[
IK_Cell];
1114 auto node_family = m_default_arcane_families[
IK_Node];
1117 PolyhedralMeshImpl::ItemLocalIds cell_lids, node_lids;
1118 m_mesh->scheduleAddItems(cell_family, cell_uids.constView(), cell_lids);
1119 m_mesh->scheduleAddItems(node_family, node_uids.constView(), node_lids);
1121 m_mesh->scheduleAddConnectivity(cell_family, cell_lids, nb_node, node_family, node_uids, String{
"CellToNodes" });
1122 m_mesh->scheduleAddConnectivity(node_family, node_lids, 1, cell_family,
1124 m_mesh->applyScheduledOperations();
1126 node_family->endUpdate();
1139 for (
auto ik = 0; ik < NB_ITEM_KIND; ++ik) {
1142 m_empty_arcane_families[ik] = std::make_unique<mesh::PolyhedralFamily>(
this, (
eItemKind)ik, name);
1143 m_default_arcane_families[ik] = m_empty_arcane_families[ik].get();
1147 m_item_family_network->addDependency(itemFamily(
IK_Cell), itemFamily(
IK_Node),
nullptr);
1148 m_item_family_network->addDependency(itemFamily(
IK_Cell), itemFamily(
IK_Face),
nullptr);
1149 m_item_family_network->addDependency(itemFamily(
IK_Cell), itemFamily(
IK_Edge),
nullptr);
1150 m_item_family_network->addDependency(itemFamily(
IK_Face), itemFamily(
IK_Node),
nullptr);
1151 m_item_family_network->addDependency(itemFamily(
IK_Edge), itemFamily(
IK_Node),
nullptr);
1152 m_item_family_network->addRelation(itemFamily(
IK_Face), itemFamily(
IK_Edge),
nullptr);
1153 m_item_family_network->addRelation(itemFamily(
IK_Face), itemFamily(
IK_Face),
nullptr);
1154 m_item_family_network->addRelation(itemFamily(
IK_Face), itemFamily(
IK_Cell),
nullptr);
1155 m_item_family_network->addRelation(itemFamily(
IK_Edge), itemFamily(
IK_Cell),
nullptr);
1156 m_item_family_network->addRelation(itemFamily(
IK_Node), itemFamily(
IK_Cell),
nullptr);
1157 m_item_family_network->addRelation(itemFamily(
IK_Node), itemFamily(
IK_Face),
nullptr);
1158 m_item_family_network->addRelation(itemFamily(
IK_Node), itemFamily(
IK_Edge),
nullptr);
1159 m_item_family_network->addRelation(itemFamily(
IK_Edge), itemFamily(
IK_Face),
nullptr);
1169 return m_default_arcane_families[
IK_Node];
1178 return m_default_arcane_families[
IK_Edge];
1187 return m_default_arcane_families[
IK_Face];
1196 return m_default_arcane_families[
IK_Cell];
1199void mesh::PolyhedralMesh::
1204 m_mesh_item_internal_list.cells = m_default_arcane_families[kind]->itemsInternal();
1205 m_mesh_item_internal_list._internalSetCellSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1208 m_mesh_item_internal_list.faces = m_default_arcane_families[kind]->itemsInternal();
1209 m_mesh_item_internal_list._internalSetFaceSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1212 m_mesh_item_internal_list.edges = m_default_arcane_families[kind]->itemsInternal();
1213 m_mesh_item_internal_list._internalSetEdgeSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1216 m_mesh_item_internal_list.nodes = m_default_arcane_families[kind]->itemsInternal();
1217 m_mesh_item_internal_list._internalSetNodeSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1229mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1232 return m_default_arcane_families[ik];
1241 return _itemFamily(ik);
1250 return m_item_type_mng;
1256mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1257_findItemFamily(
eItemKind ik,
const String& name,
bool create_if_needed)
1260 auto found_family = _itemFamily(ik);
1262 if (found_family->name() == name)
1263 return found_family;
1265 for (
auto& family : m_arcane_families) {
1266 if (family->itemKind() == ik && family->name() == name)
1267 return family.get();
1269 if (!create_if_needed)
1271 return _createItemFamily(ik, name);
1280 ARCANE_UNUSED(register_modifier_if_created);
1281 return _findItemFamily(ik, name, create_if_needed);
1287mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1290 return m_default_arcane_families[ik];
1299 ARCANE_ASSERT(m_arcane_node_coords, (
"Node coordinates not yet loaded."));
1300 return *m_arcane_node_coords;
1310 for (
auto& family : m_arcane_families) {
1311 group = family->findGroup(name);
1324 m_all_groups.clear();
1325 for (
auto& family : m_arcane_families) {
1327 m_all_groups.add(*i_group);
1329 return m_all_groups;
1338 for (
auto& family : m_arcane_families) {
1339 family->destroyGroups();
1349 return m_item_family_collection;
1358 return m_internal_api.get();
1367 return m_compact_mng.get();
1373void mesh::PolyhedralMesh::
1376 auto* item_family = _findItemFamily(ik, family_name,
false);
1377 PolyhedralMeshImpl::ItemLocalIds item_local_ids;
1378 m_mesh->scheduleAddItems(item_family,unique_ids,item_local_ids);
1379 auto mesh_state = m_mesh->applyScheduledOperations();
1380 item_local_ids.fillArrayView(local_ids,mesh_state);
1386void mesh::PolyhedralMesh::
1389 auto* item_family = _findItemFamily(ik, family_name,
false);
1390 m_mesh->scheduleRemoveItems(item_family,local_ids);
1391 m_mesh->applyScheduledOperations();
1400 addItems(nodes_uid, nodes_lid,
IK_Node, nodeFamily()->name());
1409 m_trace_mng->info() <<
"PolyhedralMesh::_exchangeItems() do_compact?=" <<
"false"
1410 <<
" nb_exchange=" << 0 <<
" version=" << 0;
1412 String check_exchange = platform::getEnvironmentVariable(
"ARCANE_CHECK_EXCHANGE");
1413 if (!check_exchange.null()){
1414 m_mesh_checker.checkGhostCells();
1415 m_trace_mng->pwarning() <<
"CHECKING SYNCHRONISATION !";
1416 m_mesh_checker.checkVariablesSynchronization();
1417 m_mesh_checker.checkItemGroupsSynchronization();
1419 if (checkLevel()>=2)
1420 m_mesh_checker.checkValidMesh();
1421 else if (checkLevel()>=1)
1422 m_mesh_checker.checkValidConnectivity();
1429void mesh::PolyhedralMesh::
1439 if (arcane_debug_load_balancing){
1441 for (
auto& family : m_arcane_families) {
1442 family->itemsNewOwner().checkIfSync();
1446 IMeshExchanger* iexchanger = m_mesh_exchange_mng->beginExchange();
1449 if (iexchanger->computeExchangeInfos()){
1450 m_trace_mng->pwarning() <<
"No load balance is performed";
1451 m_mesh_exchange_mng->endExchange();
1456 iexchanger->processExchange();
1459 iexchanger->removeNeededItems();
1464 auto action = [](ItemGroup& group)
1466 if (group.internal()->hasComputeFunctor() || group.isLocalToSubDomain())
1469 group.internal()->removeSuppressedItems();
1472 meshvisitor::visitGroups(
this, action);
1475 iexchanger->allocateReceivedItems();
1480 iexchanger->updateItemGroups();
1482 auto action = [](ItemGroup& group)
1484 if (group.hasSynchronizer())
1485 group.synchronizer()->compute();
1488 m_trace_mng->info() <<
"Computing group synchronization information for " << name();
1489 meshvisitor::visitGroups(
this,action);
1491 iexchanger->updateVariables();
1495 iexchanger->finalizeExchange();
1498 m_mesh_exchange_mng->endExchange();
1515 auto want_dump =
false;
1516 auto need_compact =
false;
1517 m_trace_mng->info(4) <<
"DynamicMesh::prepareForDump() name=" << name()
1518 <<
" need_compact?=" << need_compact
1519 <<
" want_dump?=" << want_dump
1520 <<
" timestamp=" << 0;
1524 m_mesh_events.eventObservable(t).notify(MeshEventArgs(
this,t));
1529 for (
auto& family : m_arcane_families) {
1530 family->prepareForDump();
1536 m_mesh_events.eventObservable(t).notify(MeshEventArgs(
this,t));
1546 return allCells().activeCellGroup();
1554 return allCells().ownActiveCellGroup();
1563 return allCells().levelCellGroup(level);
1572 return allCells().ownLevelCellGroup(level);
1581 return allCells().activeFaceGroup();
1590 return allCells().ownActiveFaceGroup();
1599 return allCells().innerActiveFaceGroup();
1608 return allCells().outerActiveFaceGroup();
1617 return m_mesh_utilities.get();
1626 IItemFamily* item_family = _itemFamily(ik);
1628 return item_family->itemsNewOwner();
1637 return m_mesh_checker.checkLevel();
1646 return m_item_family_network.get();
1655 return m_ghost_layer_mng.get();
1664 return m_internal_api.get();
1690Arcane::mesh::PolyhedralMesh::
1691~PolyhedralMesh() =
default;
1696Arcane::mesh::PolyhedralMesh::
1701, m_mesh_kind(
mbi.meshKind())
1708void Arcane::mesh::PolyhedralMesh::
1709read([[maybe_unused]]
const String& filename)
1717void Arcane::mesh::PolyhedralMesh::
1720 ARCANE_UNUSED(item_allocation_info);
1750 ISubDomain*
sd =
mm->variableMng()->_internalApi()->internalSubDomain();
1754 static String name() {
return "ArcanePolyhedralMeshFactory"; }
1758 ServiceProperty(PolyhedralMeshFactory::name().localstr(), ST_Application),
1764#if ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
1769String mesh::PolyhedralMesh::
1772 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_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.
Classe de base d'un service.
EnumeratorT< ItemGroup > Enumerator
Type d'un itérateur sur toute la collection.
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.
Interface du gestionnaire des maillages.
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 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.
Gestionnaire des politiques d'une famille d'entités.
Sérialisation/Désérialisation des familles d'entités.
Groupe d'entités de maillage.
Structure interne d'une entité de maillage.
Infos sur un type d'entité du maillage.
Gestionnaire des types d'entités de maillage.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
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.
Integer nbCell() override
Nombre de mailles du maillage.
Integer dimension() override
Dimension du maillage (1D, 2D ou 3D).
Integer nbNode() override
Nombre de noeuds du maillage.
void endUpdate() override
Notifie l'instance de la fin de la modification du maillage.
Integer nbEdge() override
Nombre d'arêtes du maillage.
Integer nbItem(eItemKind ik) override
Nombre d'éléments du genre ik.
Integer nbFace() override
Nombre de faces du maillage.
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.
Vue modifiable d'un tableau d'un type T.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
Vue constante d'un tableau de type T.
Vue d'un tableau d'éléments de type T.
constexpr ARCCORE_HOST_DEVICE bool empty() const noexcept
Retourne true si le tableau est vide (dimension nulle)
constexpr ARCCORE_HOST_DEVICE SizeType size() const noexcept
Retourne la taille du tableau.
Chaîne de caractères unicode.
Positionne une classe de message.
Vecteur 1D de données avec sémantique par valeur (style STL).
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.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
Collection< ItemGroup > ItemGroupCollection
Collection de groupes d'éléments du maillage.
Collection< IItemFamily * > ItemFamilyCollection
Collection de familles d'entités.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Collection< IItemFamily * > IItemFamilyCollection
Collection de familles d'entités.
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.
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.
const char * itemKindName(eItemKind kind)
Nom du genre d'entité.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
@ Highest
Niveau le plus élevé
Int32 Integer
Type représentant un entier.