14#include "arcane/mesh/OneMeshItemAdder.h"
16#include "arcane/utils/NotSupportedException.h"
17#include "arcane/utils/ValueConvert.h"
18#include "arcane/utils/FixedArray.h"
21#include "arcane/core/MeshToMeshTransposer.h"
22#include "arcane/core/IParallelMng.h"
23#include "arcane/core/ItemPrinter.h"
25#include "arcane/mesh/DynamicMesh.h"
26#include "arcane/mesh/DynamicMeshIncrementalBuilder.h"
27#include "arcane/mesh/ItemTools.h"
28#include "arcane/mesh/ConnectivityNewWithDependenciesTypes.h"
29#include "arcane/mesh/GraphDoFs.h"
48 bool allow_build_face =
false)
49 : m_type_info(type_info)
50 , m_cell_uid(cell_uid)
52 , m_owner(sub_domain_id)
53 , m_allow_build_face(allow_build_face) {}
55 Int64 uniqueId()
const {
return m_cell_uid; }
57 Int32 owner()
const {
return m_owner; }
58 Integer nbNode()
const {
return m_info.size(); }
59 Integer nbFace()
const {
return m_type_info->nbLocalFace(); }
60 Integer nbEdge()
const {
return m_type_info->nbLocalEdge(); }
61 Int64 nodeUniqueId(
Integer i_node)
const {
return m_info[i_node]; }
66 bool allowBuildFace()
const {
return m_allow_build_face; }
67 bool allowBuildEdge()
const {
return m_allow_build_face; }
72 Int64 m_cell_uid = NULL_ITEM_UNIQUE_ID;
74 Int32 m_owner = A_NULL_RANK;
75 bool m_allow_build_face =
false;
84, m_mesh(mesh_builder->
mesh())
85, m_mesh_builder(mesh_builder)
86, m_cell_family(m_mesh->trueCellFamily())
87, m_node_family(m_mesh->trueNodeFamily())
88, m_face_family(m_mesh->trueFaceFamily())
89, m_edge_family(m_mesh->trueEdgeFamily())
90, m_item_type_mng(m_mesh->itemTypeMng())
95 m_work_face_orig_nodes_uid.reserve(100);
105 ItemInternal* node = m_node_family.findOrAllocOne(node_uid,is_add);
127 if (item.
nbNode()!=nb_node)
128 ARCANE_FATAL(
"Trying to add existing item (kind='{0}', uid={1}) with different number of node (existing={2} new={3})",
132 for(
Int32 i=0; i<nb_node; ++i ){
133 Int64 new_uid = nodes_uid[i];
135 if (new_uid != current_uid){
136 std::ostringstream ostr;
137 for(
Int32 k=0; k<nb_node; ++k )
139 ARCANE_FATAL(
"Trying to add existing item (kind='{0}', uid={1}) with different nodes (index={2} existing='{3}' new='{4}')",
140 item.
kind(), item.
uniqueId(), i, ostr.str(), nodes_uid);
155 if (uid!=NULL_ITEM_UNIQUE_ID)
194 bool is_add_face =
false;
195 Face face = m_face_family.findOrAllocOne(face_uid,type_id,is_add_face);
200 for(
Integer i_node=0; i_node<face_nb_node; ++i_node ){
202 m_face_family.replaceNode(face,i_node,node);
203 m_node_family.addFaceToNode(node, face);
211 return ItemCompatibility::_itemInternal(face);
220 m_work_edge_sorted_nodes.
resize(2);
221 m_work_edge_orig_nodes_uid.
resize(2);
224 m_work_edge_orig_nodes_uid[z] = nodes_uid[z];
228 bool is_add_edge =
false;
235 for(
Integer i_node=0; i_node<2; ++i_node ){
238 m_node_family.addEdgeToNode(current_node_internal, edge);
248Face OneMeshItemAdder::
249_findInternalFace(
Integer i_face,
const FullCellInfo& cell_info,
bool& is_add)
251 const Int64 face_unique_id = cell_info.faceUniqueId(i_face);
252 ItemTypeInfo* cell_type_info = cell_info.
typeInfo();
253 const ItemTypeInfo::LocalFace& lf = cell_type_info->
localFace(i_face);
254 ItemTypeInfo* face_type_info = m_item_type_mng->typeFromId(lf.typeId());
255 return m_face_family.findOrAllocOne(face_unique_id,face_type_info,is_add);
262Face OneMeshItemAdder::
265 const ItemInternalMap& nodes_map = m_mesh->nodesMap();
266 ItemTypeInfo* cell_type_info = cell_info.typeInfo();
267 const ItemTypeInfo::LocalFace& lf = cell_type_info->localFace(i_face);
271 Node nbi = nodes_map.findItem(face_sorted_nodes[0]);
273 if (face_internal.null()) {
277 info() <<
"BadCell uid=" << cell_info.uniqueId();
278 for(
Int32 i=0; i<cell_info.nbNode(); ++i )
279 info() <<
"Cell node I=" << i <<
" uid=" << cell_info.nodeUniqueId(i);
280 ARCANE_FATAL(
"On the fly face allocation is not allowed here.\n"
281 " You need to add faces with IMeshModifier::addFaces().\n"
282 " CellUid={0} LocalFace={1} FaceNodes={2}",
283 cell_info.uniqueId(),i_face,face_sorted_nodes);
285 ItemTypeInfo* face_type = m_item_type_mng->typeFromId(lf.typeId());
288 return m_face_family.allocOne(face_unique_id,face_type);
292 return face_internal;
300Edge OneMeshItemAdder::
301_findInternalEdge(
Integer i_edge,
const FullCellInfo& cell_info,
302 Int64 first_node,
Int64 second_node,
bool& is_add)
304 ARCANE_UNUSED(first_node);
305 ARCANE_UNUSED(second_node);
307 const Int64 edge_unique_id = cell_info.edgeUniqueId(i_edge);
308 return m_edge_family.findOrAllocOne(edge_unique_id,is_add);
315Edge OneMeshItemAdder::
318 ARCANE_UNUSED(i_edge);
320 const ItemInternalMap& nodes_map = m_mesh->nodesMap();
321 Node nbi = nodes_map.findItem(first_node);
323 if (edge_internal.null()){
325 ARCANE_FATAL(
"On the fly edge allocation is not allowed here."
326 " You need to add edges before with IMeshModifier::addEdges()");
329 FixedArray<Int64,2> nodes;
330 nodes[0] = first_node;
331 nodes[1] = second_node;
332 edge_unique_id = MeshUtils::generateHashUniqueId(nodes.view());
335 return m_edge_family.allocOne(edge_unique_id);
339 return edge_internal;
366 bool allow_build_face)
368 CellInfoProxy cell_info_proxy(m_item_type_mng->typeFromId(type_id),cell_uid,sub_domain_id,nodes_uid,allow_build_face);
399 ARCANE_ASSERT(m_mesh->
itemFamilyNetwork(),(
"ItemFamilyNetwork is required to call OneMeshItemAdder::addOneItem"));
400 bool is_alloc =
true;
401 Item item = family_modifier->findOrAllocOne(item_uid,type_id,
m_mesh_info,is_alloc);
405 for (
Integer family_index = 0; family_index < nb_connected_family; ++family_index){
411 String connectivity_name = mesh::connectivityName(family,connected_family);
412 String reverse_connectivity_name = mesh::connectivityName(connected_family,family);
413 bool is_dependency =
false;
418 if(!is_dependency) _clearConnectivity(
ItemLocalId(item), family_to_connected_family);
419 if (connected_family_to_family) _clearReverseConnectivity(
ItemLocalId(item),family_to_connected_family,connected_family_to_family);
424 for (
Integer connected_item_index = 0; connected_item_index < nb_connected_item; ++connected_item_index){
425 if (family_to_connected_family) {
430 if (connected_family_to_family)
431 connected_family_to_family->
addConnectedItem(ItemLocalId(connected_item_lids[connected_item_index]),ItemLocalId(item));
433 info_index+= nb_connected_item;
437 return ItemCompatibility::_itemInternal(item);
442ItemInternal* OneMeshItemAdder::
443addOneItem2(IItemFamily* family,
444 IItemFamilyModifier* family_modifier,
452 ARCANE_ASSERT(m_mesh->itemFamilyNetwork(),(
"ItemFamilyNetwork is required to call OneMeshItemAdder::addOneItem"));
453 bool is_alloc =
true;
454 Item item = family_modifier->findOrAllocOne(item_uid,type_id,
m_mesh_info,is_alloc);
458 for (
Integer family_index = 0; family_index < nb_connected_family; ++family_index) {
463 if (nb_connected_item == 0)
continue;
464 IItemFamily* connected_family = nullptr ;
467 connected_family = m_mesh->findItemFamily(family_kind, ParticleFamily::defaultFamilyName(),
false,
false);
470 if(family->name()==GraphDoFs::dualNodeFamilyName())
471 connected_family = m_mesh->findItemFamily(family_kind, GraphDoFs::linkFamilyName(),
false,
false);
473 connected_family = m_mesh->findItemFamily(family_kind, GraphDoFs::dualNodeFamilyName(),
false,
false);
476 connected_family = m_mesh->itemFamily(family_kind);
480 String connectivity_name = mesh::connectivityName(family,connected_family);
481 bool is_dependency =
false;
482 IIncrementalItemConnectivity* family_to_connected_family = m_mesh->itemFamilyNetwork()->getConnectivity(family,connected_family,connectivity_name,is_dependency);
483 if (!family_to_connected_family)
484 ARCANE_FATAL(
"Cannot find connectivity name={0}",connectivity_name);
485 bool is_deep_connectivity = m_mesh->itemFamilyNetwork()->isDeep(family_to_connected_family) ;
486 bool is_relation = !(is_dependency && is_deep_connectivity);
490 bool do_fatal = is_relation ? false :
true;
491 connected_family->itemsUniqueIdToLocalId(connected_item_lids,connectivity_info.subView(info_index,nb_connected_item),do_fatal);
493 Integer nb_connected_item_found = nb_connected_item;
496 for (
Integer index = 0; index < connected_item_lids.size(); )
498 if (connected_item_lids[index] == NULL_ITEM_LOCAL_ID) {
499 connected_item_lids.remove(index);
500 --nb_connected_item_found;
505 for (
Integer connected_item_index = 0; connected_item_index < nb_connected_item_found; ++connected_item_index)
507 if (family_to_connected_family)
510 auto connected_item_lid = ItemLocalId{connected_item_lids[connected_item_index]};
513 if (!family_to_connected_family->hasConnectedItem(ItemLocalId(item),connected_item_lid))
515 family_to_connected_family->addConnectedItem(ItemLocalId(item),connected_item_lid);
520 family_to_connected_family->replaceConnectedItem(ItemLocalId(item),connected_item_index,connected_item_lid);
524 info_index+= nb_connected_item;
527 debug(
Trace::Highest) <<
"[addItems] ADD_ITEM " << ItemPrinter(item) <<
" in " << family->name();
530 return ItemCompatibility::_itemInternal(item);
535void OneMeshItemAdder::
536_printRelations(ItemInternal* item)
538 debug(
Trace::Highest) <<
"[addItems] RELATIONS for " << ItemPrinter(item) <<
" in " << item->family()->name();
539 for (
const auto& relation : m_mesh->itemFamilyNetwork()->getChildRelations(item->family())) {
542 ConnectivityItemVector connected_items(relation);
543 for (
const auto& connected_item : connected_items.connectedItems(ItemLocalId(item))) {
552void OneMeshItemAdder::
553_clearConnectivity(ItemLocalId item, IIncrementalItemConnectivity* connectivity)
556 ConnectivityItemVector accessor(connectivity);
558 connectivity->removeConnectedItem(item,connected_item);
565void OneMeshItemAdder::
566_clearReverseConnectivity(ItemLocalId item, IIncrementalItemConnectivity* connectivity, IIncrementalItemConnectivity* reverse_connectivity)
568 ConnectivityItemVector accessor(connectivity);
570 reverse_connectivity->removeConnectedItem(connected_item,item);
577template<>
void OneMeshItemAdder::
581 if(m_mesh->isAmrActivated()){
584 if(cell_info.
level() != 0){
585 Integer child_rank = cell_info.whichChildAmI();
586 Int64 hParent_uid = cell_info.hParentCellUniqueId();
589 Cell hParent_cell= m_cell_family.findOrAllocOne(hParent_uid,cell_type,is_add);
590 m_cell_family._addParentCellToCell(new_cell,hParent_cell);
591 m_cell_family._addChildCellToCell(hParent_cell,child_rank,new_cell);
596template<>
void OneMeshItemAdder::
597_AMR_Patch(
Cell cell,
const CellInfoProxy& cell_info)
600 ARCANE_UNUSED(cell_info);
610template<
typename CellInfo>
622 inew_cell = m_cell_family.findOrAllocOne(cell_info.uniqueId(),cell_type_id,is_add);
625 Cell cell2(inew_cell);
627 for(
Integer i=0, is=cell_info.nbNode(); i<is; ++i )
628 if (cell_info.nodeUniqueId(i)!=cell2.
node(i).
uniqueId())
629 ARCANE_FATAL(
"trying to add existing cell (uid={0}) with different nodes",
630 cell_info.uniqueId());
632 return ItemCompatibility::_itemInternal(inew_cell);
636 const bool is_verbose =
false;
638 Cell new_cell(inew_cell);
642 const bool allow_multi_dim_cell = m_mesh->meshKind().isNonManifold();
643 const Int32 cell_nb_face = cell_info.nbFace();
648 if (cell_info.nbNode()!=inew_cell.
nbNode())
649 ARCANE_FATAL(
"Incoherent number of nodes v={0} expected={1}",inew_cell.
nbNode(),cell_info.nbNode());
650 if (cell_nb_face!=inew_cell.
nbFace())
651 ARCANE_FATAL(
"Incoherent number of faces v={0} expected={1}",inew_cell.
nbFace(),cell_nb_face);
653 ARCANE_FATAL(
"Type '{0}' is not allowed for 'Cell' (cell_uid={1})",
654 cell_type_info->
typeName(),cell_info.uniqueId());
655 if (!allow_multi_dim_cell){
657 Int32 mesh_dimension = m_mesh->dimension();
658 if (cell_dimension>=0 && cell_dimension!=mesh_dimension)
659 ARCANE_FATAL(
"Incoherent dimension for cell uid={0} cell_dim={1} mesh_dim={2} type={3}",
660 cell_info.uniqueId(),cell_dimension,mesh_dimension,cell_type_info->
typeName());
669 if (m_mesh_builder->hasEdge()) {
670 const Int32 cell_nb_edge = cell_info.nbEdge();
672 for(
Integer i_edge=0; i_edge<cell_nb_edge; ++i_edge ){
675 Int64 second_node = cell_info.nodeUniqueId( le.
endNode() );
676 if (first_node > second_node)
677 std::swap(first_node,second_node);
680 Edge edge_internal = _findInternalEdge(i_edge, cell_info, first_node, second_node, is_add);
688 m_edge_family.replaceNode(
ItemLocalId(edge_internal), 0, current_node);
689 m_node_family.addEdgeToNode(current_node, edge_internal);
693 m_edge_family.replaceNode(
ItemLocalId(edge_internal), 1, current_node);
694 m_node_family.addEdgeToNode(current_node, edge_internal);
700 m_edge_family.addCellToEdge(edge_internal,inew_cell);
705 for(
Integer i_face=0; i_face<cell_nb_face; ++i_face ){
709 const bool is_reorder = _isReorder(i_face, lf, cell_info);
713 Face face = _findInternalFace(i_face, cell_info, is_add);
717 info() <<
"AddCell (uid=" << new_cell.
uniqueId() <<
": Create face (index=" << i_face
723 for(
Integer i_node=0; i_node<face_nb_node; ++i_node ){
724 Node current_node = nodes_map.
findItem(face_sorted_nodes[i_node]);
725 m_face_family.replaceNode(face, i_node, current_node);
726 m_node_family.addFaceToNode(current_node, face);
729 if (m_mesh_builder->hasEdge()) {
731 for(
Integer i_edge=0; i_edge<face_nb_edge; ++i_edge ){
733 m_face_family.addEdgeToFace(face,current_edge);
734 m_edge_family.addFaceToEdge(current_edge,face);
739 m_cell_family.replaceFace(new_cell,i_face,face);
742 if(m_mesh->isAmrActivated()){
745 m_face_family.replaceFrontCellToFace(face,new_cell);
747 m_face_family.addFrontCellToFace(face,inew_cell);
750 m_face_family.replaceBackCellToFace(face,new_cell);
752 m_face_family.addBackCellToFace(face,inew_cell);
756 m_face_family.addFrontCellToFace(face,inew_cell);
758 m_face_family.addBackCellToFace(face,inew_cell);
763 _AMR_Patch(inew_cell, cell_info);
764 return ItemCompatibility::_itemInternal(inew_cell);
793 if (item.
type() == IT_Line2 && submesh_kind ==
IK_Cell)
795 if (item.
type() == IT_Vertex && submesh_kind ==
IK_Face)
806 switch (submesh_kind) {
808 new_item = m_node_family.findOrAllocOne(item.
uniqueId(),is_add);
812 new_item = m_edge_family.findOrAllocOne(item.
uniqueId(),is_add);
816 new_item = m_face_family.findOrAllocOne(item.
uniqueId(),
type,is_add);
822 new_item = m_cell_family.findOrAllocOne(item.
uniqueId(),type_id,is_add);
830 if (fatal_on_existing_item)
831 ARCANE_FATAL(
"Cannot add already existing parent item in submesh");
833 return ItemCompatibility::_itemInternal(new_item);
845 switch (submesh_kind) {
847 item_nb_face =
type->nbLocalFace();
848 item_nb_edge =
type->nbLocalEdge();
849 item_nb_node =
type->nbLocalNode();
852 item_nb_edge =
type->nbLocalEdge();
853 item_nb_node =
type->nbLocalNode();
856 item_nb_node =
type->nbLocalNode();
862 if (!m_mesh_builder->hasEdge())
868 for(
Integer z=0; z<item_nb_face; ++z )
869 new_item->_setFace(z,NULL_ITEM_ID);
870 for(
Integer z=0; z<item_nb_edge; ++z )
871 new_item->_setEdge(z,NULL_ITEM_ID);
872 for(
Integer z=0; z<item_nb_node; ++z )
873 new_item->_setNode(z,NULL_ITEM_ID);
878 DynamicMeshKindInfos::ItemInternalMap& nodes_map = m_mesh->nodesMap();
880 DynamicMeshKindInfos::ItemInternalMap& parent_nodes_map = parent_mesh->nodesMap();
885 const bool direct_node_order =
888 && !(item.
toFace().isSubDomainBoundaryOutside()));
891 for(
Integer i_node=0; i_node<item_nb_node; ++i_node ){
893 if (
type->typeId() == IT_FaceVertex)
896 Int32 idx = ((direct_node_order) ? i_node : (item_nb_node-1-i_node));
899 Int64 new_node_uid = nodes_uid[i_node] = parent_item.
uniqueId();
900 ItemInternal* node_internal = m_node_family.findOrAllocOne(new_node_uid,is_add);
902#ifdef ARCANE_DEBUG_DYNAMIC_MESH
903 info() <<
"Création node " << new_node_uid <<
' '
914 switch (submesh_kind) {
916 m_cell_family.replaceNode(new_item_lid,i_node, node_lid);
917 m_node_family.addCellToNode(node_internal, new_item.
toCell());
920 m_face_family.replaceNode(new_item_lid,i_node, node_lid);
921 m_node_family.addFaceToNode(node_internal, new_item.
toFace());
924 m_edge_family.replaceNode(new_item_lid,i_node, node_lid);
925 m_node_family.addEdgeToNode(node_internal, new_item.
toEdge());
933 for(
Integer i_edge=0; i_edge<item_nb_edge; ++i_edge ) {
938 if (first_node > second_node)
939 std::swap(first_node,second_node);
942 if (parent_item.
null())
947 ItemInternal* edge_internal = m_edge_family.findOrAllocOne(new_edge_uid,is_add);
949#ifdef ARCANE_DEBUG_DYNAMIC_MESH
950 info() <<
"Création edge " << new_edge_uid <<
' '
958 m_edge_family.replaceNode(
ItemLocalId(edge_internal), 0, current_node);
959 m_node_family.addEdgeToNode(current_node, edge_internal);
963 m_edge_family.replaceNode(
ItemLocalId(edge_internal), 1, current_node);
964 m_node_family.addEdgeToNode(current_node, edge_internal);
971 switch (submesh_kind) {
974 m_edge_family.addCellToEdge(edge_internal, new_item.
toCell());
978 m_edge_family.addFaceToEdge(edge_internal, new_item.
toFace());
987 for(
Integer i_face=0; i_face<item_nb_face; ++i_face ) {
991 m_work_face_orig_nodes_uid.resize(face_nb_node);
992 for(
Integer z=0; z<face_nb_node; ++z )
993 m_work_face_orig_nodes_uid[z] = nodes_uid[ lf.
node(z) ];
994 bool is_reorder =
false;
995 if (m_mesh->dimension() == 1) {
996 is_reorder =
m_face_reorderer.reorder1D(i_face, m_work_face_orig_nodes_uid[0]);
1008 if (m_mesh->dimension() == 1) {
1009 parent_item = parent_nodes_map.
findItem(face_sorted_nodes[0]);
1012 Int64 first_node = face_sorted_nodes[0];
1013 Int64 second_node = face_sorted_nodes[1];
1014 if (first_node > second_node)
1015 std::swap(first_node,second_node);
1021 if (parent_item.
null())
1026 ItemInternal* face_internal = m_face_family.findOrAllocOne(new_face_uid,face_type,is_add);
1028#ifdef ARCANE_DEBUG_DYNAMIC_MESH
1029 info() <<
"Création face " << new_face_uid <<
' '
1035 for(
Integer i_node=0; i_node<face_nb_node; ++i_node ){
1036 Node current_node = nodes_map.
findItem(face_sorted_nodes[i_node]);
1037 m_face_family.replaceNode(
ItemLocalId(face_internal), i_node, current_node);
1038 m_node_family.addFaceToNode(current_node, face_internal);
1041 if (m_mesh_builder->hasEdge()) {
1043 for(
Integer i_edge=0; i_edge<face_nb_edge; ++i_edge ){
1045 Edge current_edge = new_item.
itemBase().edgeBase(edge_idx);
1046 m_face_family.addEdgeToFace(face_internal,current_edge);
1047 m_edge_family.addFaceToEdge(current_edge,face_internal);
1054 m_face_family.addFrontCellToFace(face_internal,new_item.
toCell());
1056 m_face_family.addBackCellToFace(face_internal,new_item.
toCell());
1060 return ItemCompatibility::_itemInternal(new_item);
1068template<
typename CellInfo>
1072 Integer cell_nb_node = cell_info.nbNode();
1075 for(
Integer i_node=0; i_node<cell_nb_node; ++i_node ){
1076 Int64 node_unique_id = cell_info.nodeUniqueId(i_node);
1077 bool is_add =
false;
1078 ItemInternal* node_internal = m_node_family.findOrAllocOne(node_unique_id,is_add);
1083 m_node_family.addCellToNode(node_internal,cell);
1084 m_cell_family.replaceNode(cell,i_node,
ItemLocalId(node_internal));
1091template<
typename CellInfo>
1092bool OneMeshItemAdder::
1096 m_work_face_orig_nodes_uid.
resize(face_nb_node);
1097 for(
Integer i_node=0; i_node < face_nb_node; ++i_node)
1098 m_work_face_orig_nodes_uid[i_node] = cell_info.nodeUniqueId(lf.
node(i_node));
1099 bool is_reorder =
false;
1101 is_reorder =
m_face_reorderer.reorder1D(i_face, m_work_face_orig_nodes_uid[0]);
1129 ARCANE_FATAL(
"Can not call this method when edge or face are already created");
#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.
Fonctions utilitaires sur le maillage.
bool reorderNodesOfFace(Int64ConstArrayView before_ids, Int64ArrayView after_ids)
Réordonne les noeuds d'une face.
Int64 generateHashUniqueId(SmallSpan< const Int64 > nodes_unique_id)
Génère un identifiant unique à partir d'une liste d'identifiants de noeuds.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
Face face(Int32 i) const
i-ème face de la maille
Int32 nbFace() const
Nombre de faces de la maille.
Edge edge(Int32 i) const
i-ème arête de la maille
Vue constante d'un tableau de type T.
constexpr ConstArrayView< T > subView(Integer abegin, Integer asize) const noexcept
Sous-vue (constante) à partir de l'élément abegin et contenant asize éléments.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Int32 nbCell() const
Nombre de mailles de la face (1 ou 2)
bool isSubDomainBoundary() const
Indique si la face est au bord du sous-domaine (i.e nbCell()==1)
Interface pour gérer une connectivité incrémentale.
virtual void replaceConnectedItem(ItemLocalId source_item, Integer index, ItemLocalId target_local_id)=0
Remplace l'entité d'index index de source_item par l'entité de localId() target_local_id.
virtual void addConnectedItem(ItemLocalId source_item, ItemLocalId target_local_id)=0
Ajoute l'entité de localId() target_local_id à la connectivité de source_item.
Interface de modification d'une famille.
virtual IIncrementalItemConnectivity * getStoredConnectivity(IItemFamily *source_family, IItemFamily *target_family, const String &name)=0
Retourne, si elle est associée à un stockage, la connectivité entre les familles source_family et tar...
Interface d'une famille d'entités.
virtual String name() const =0
Nom de la famille.
virtual void itemsUniqueIdToLocalId(Int32ArrayView local_ids, Int64ConstArrayView unique_ids, bool do_fatal=true) const =0
Converti un tableau de numéros uniques en numéros locaux.
ItemUniqueId uniqueId() const
Numéro unique de l'entité
ItemTypeInfo * typeInfo() const
Type de l'entité.
Int32 localId() const
Numéro local (au sous-domaine) de l'entité
Structure interne d'une entité de maillage.
Index d'un Item dans une variable.
Type d'une entité (Item).
static ItemTypeId fromInteger(Int64 v)
Créé une instance à partir d'un entier.
Informations locales sur une arête d'une maille.
Integer endNode() const
Indice local à la maille du sommet extrémité de l'arête.
Integer beginNode() const
Indice local à la maille du sommet origine de l'arête.
Informations locales sur une face d'une maille.
Integer node(Integer i) const
Indice locale dans la maille du i-ème noeud de la face.
Integer nbEdge() const
Nombre d'arête de la face.
Integer typeId() const
Type de l'entité face.
Integer edge(Integer i) const
Arête de la face.
Integer nbNode() const
Nombre de noeuds de la face.
Infos sur un type d'entité du maillage.
LocalEdge localEdge(Integer id) const
Connectivité locale de la i-ème arête de la maille.
LocalFace localFace(Integer id) const
Connectivité locale de la i-ème face de la maille.
Int16 dimension() const
Dimension de l'élément (<0 si inconnu)
String typeName() const
Nom du type.
bool isValidForCell() const
Indique si le type est valide pour créér une maille (Cell)
ItemTypeId itemTypeId() const
Numéro du type.
Gestionnaire des types d'entités de maillage.
ItemTypeInfo * typeFromId(Integer id) const
Type correspondant au numéro id.
Elément de maillage s'appuyant sur des noeuds (Edge,Face,Cell).
Node node(Int32 i) const
i-ème noeud de l'entité
Int32 nbNode() const
Nombre de noeuds de l'entité
Classe de base d'un élément de maillage.
impl::MutableItemBase mutableItemBase() const
Partie interne modifiable de l'entité.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Edge toEdge() const
Converti l'entité en le genre Edge.
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
ItemWithNodes toItemWithNodes() const
Converti l'entité en le genre ItemWithNodes.
Cell toCell() const
Converti l'entité en le genre Cell.
eItemKind kind() const
Genre de l'entité
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
constexpr bool null() const
true si l'entité est nul (i.e. non connecté au maillage)
Face toFace() const
Converti l'entité en le genre Edge.
impl::ItemBase itemBase() const
Partie interne de l'entité.
Int16 type() const
Type de l'entité
static eItemKind kindTranspose(eItemKind kindA, IMesh *meshA, IMesh *meshB)
Transpose le genre kindA du maillage meshA en le genre associé dans meshB.
void setOwner(Integer suid, Int32 current_sub_domain)
Positionne le numéro du sous-domaine propriétaire de l'entité.
void setParent(Int32 aindex, Int32 parent_local_id)
Positionne le i-ème parent (actuellement aindex doit valoir 0)
Exception lorsqu'une opération n'est pas supportée.
Chaîne de caractères unicode.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage info() const
Flot pour un message d'information.
ITraceMng * traceMng() const
Gestionnaire de trace.
Construction d'un maillage de manière incrémentale.
Implémentation d'un maillage.
IItemFamily * itemFamily(eItemKind ik) override
Retourne la famille d'entité de type ik.
Integer dimension() override
Dimension du maillage (1D, 2D ou 3D).
IItemFamilyNetwork * itemFamilyNetwork() override
Interface du réseau de familles (familles connectées)
Item findOrAllocOne(Int64 uid, ItemTypeId type_id, MeshInfos &mesh_info, bool &is_alloc) override
Récupère ou alloue une arête de numéro unique uid et de type type.Ajout générique d'item.
void replaceNode(ItemLocalId edge, Integer index, ItemLocalId node)
Remplace le noeud d'index index de l'arête edge avec celui de localId() node_lid.
Infos pour créer/sérialiser une maille connaissant les uniqueId() et owner() de toutes ces sous-entit...
Integer level() const
AMR.
Tableau associatif de ItemInternal.
impl::ItemBase findItem(Int64 uid) const
Retourne l'entité de numéro unique uid.
Int32 rank() const
Numéro de ce sous-domaine.
Integer & nbEdge()
Nombre d'arêtes dans le maillage.
Integer & nbNode()
Nombre de noeuds dans le maillage.
void _checkSameItemCoherency(ItemWithNodes item, ConstArrayView< Int64 > nodes_uid)
Vérifie la cohérence des noeuds d'une entité ajouté déjà présente.
void _addNodesToCell(Cell cell, const CellInfo &cell_info)
Ajoute les noeuds nodes_uid à la maille cell.
NodesOfItemReorderer m_face_reorderer
Tableaux de travail.
ItemInternal * _addOneCell(const CellInfo &cell_info)
Ajoute une maille.
ItemInternal * addOneCell(ItemTypeId type_id, Int64 cell_uid, Int32 sub_domain_id, Int64ConstArrayView nodes_uid, bool allow_build_face)
Ajoute une maille.
MeshInfos m_mesh_info
Info générale sur le maillage (numéro de sous-domaine, nombre d'items...)
Int64 _checkGenerateFaceUniqueId(Int64 uid, ConstArrayView< Int64 > nodes_uid)
Génère un uniqueId() pour la face si uid est nul.
Int64 m_next_edge_uid
Numéro du uniqueId() suivant utilisé pour générer les arêtes.
void setUseNodeUniqueIdToGenerateEdgeAndFaceUniqueId(bool v)
Positionne le mécanisme de numérotation des uniqueId().
void resetAfterDeallocate()
Remise à zéro des structures pour pouvoir faire à nouveau une allocation.
bool m_use_hash_for_edge_and_face_unique_id
Si vrai, génère les uniqueId() des faces à partir de ceux des noeuds.
Int64 m_next_face_uid
Numéro du uniqueId() suivant utilisé pour générer les faces.
ItemInternal * addOneParentItem(const Item &item, const eItemKind submesh_kind, const bool fatal_on_existing_item=true)
Ajoute d'un item parent.
ItemInternal * addOneFace(ItemTypeId type_id, Int64 face_uid, Int32 owner_rank, Int64ConstArrayView nodes_uid)
Ajoute une face.
Int32 toInt32(Int64 v)
Converti un Int64 en un Int32.
@ Highest
Niveau le plus élevé
bool arcaneIsCheck()
Vrai si on est en mode vérification.
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
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_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.
std::int32_t Int32
Type entier signé sur 32 bits.