14#include "arcane/mesh/CellFamily.h"
16#include "arcane/utils/FatalErrorException.h"
18#include "arcane/core/IMesh.h"
19#include "arcane/core/ISubDomain.h"
20#include "arcane/core/ItemInternalEnumerator.h"
21#include "arcane/core/Connectivity.h"
23#include "arcane/mesh/NodeFamily.h"
24#include "arcane/mesh/EdgeFamily.h"
25#include "arcane/mesh/FaceFamily.h"
26#include "arcane/mesh/CellMerger.h"
27#include "arcane/mesh/IncrementalItemConnectivity.h"
28#include "arcane/mesh/CompactIncrementalItemConnectivity.h"
29#include "arcane/mesh/ItemConnectivitySelector.h"
30#include "arcane/mesh/AbstractItemFamilyTopologyModifier.h"
31#include "arcane/mesh/NewWithLegacyConnectivity.h"
43:
public AbstractItemFamilyTopologyModifier
46 TopologyModifier(CellFamily* f)
47 : AbstractItemFamilyTopologyModifier(f), m_true_family(f){}
51 m_true_family->replaceNode(item_lid,index,new_lid);
55 m_true_family->replaceEdge(item_lid,index,new_lid);
59 m_true_family->replaceFace(item_lid,index,new_lid);
63 m_true_family->replaceHParent(item_lid,index,new_lid);
67 m_true_family->replaceHChild(item_lid,index,new_lid);
70 CellFamily* m_true_family;
82, m_mesh_connectivity(0)
83, m_node_family(nullptr)
84, m_edge_family(nullptr)
85, m_face_family(nullptr)
86, m_node_connectivity(nullptr)
87, m_edge_connectivity(nullptr)
88, m_face_connectivity(nullptr)
89, m_hparent_connectivity(nullptr)
91 _setTopologyModifier(
new TopologyModifier(
this));
116 auto* nc = network->getConnectivity(
this,m_node_family,connectivityName(
this,m_node_family));
117 using NodeNetwork = NewWithLegacyConnectivityType<CellFamily,NodeFamily>::type;
119 using EdgeNetwork = NewWithLegacyConnectivityType<CellFamily,EdgeFamily>::type;
120 auto* ec = network->getConnectivity(
this,m_edge_family,connectivityName(
this,m_edge_family));
122 using FaceNetwork = NewWithLegacyConnectivityType<CellFamily,FaceFamily>::type;
123 auto* fc = network->getConnectivity(
this,m_face_family,connectivityName(
this,m_face_family));
127 m_node_connectivity =
new NodeConnectivity(
this,m_node_family,
"CellNode");
128 m_edge_connectivity =
new EdgeConnectivity(
this,m_edge_family,
"CellEdge");
129 m_face_connectivity =
new FaceConnectivity(
this,m_face_family,
"CellFace");
131 m_hparent_connectivity =
new HParentConnectivity(
this,
this,
"HParentCell");
132 m_hchild_connectivity =
new HChildConnectivity(
this,
this,
"HChildCell");
134 _addConnectivitySelector(m_node_connectivity);
135 _addConnectivitySelector(m_edge_connectivity);
136 _addConnectivitySelector(m_face_connectivity);
137 _addConnectivitySelector(m_hparent_connectivity);
138 _addConnectivitySelector(m_hchild_connectivity);
140 _buildConnectivitySelectors();
146inline void CellFamily::
147_createOne(ItemInternal* item,
Int64 uid,ItemTypeInfo* type)
149 ItemLocalId item_lid(item);
150 m_item_internal_list->cells = _itemsInternal();
151 _allocateInfos(item,uid,type);
152 auto nc = m_node_connectivity->trueCustomConnectivity();
153 nc->addConnectedItems(item_lid,type->nbLocalNode());
154 if (m_edge_prealloc!=0){
155 auto ec = m_edge_connectivity->trueCustomConnectivity();
156 ec->addConnectedItems(item_lid,type->nbLocalEdge());
158 auto fc = m_face_connectivity->trueCustomConnectivity();
159 fc->addConnectedItems(item_lid,type->nbLocalFace());
165inline void CellFamily::
166_createOne(ItemInternal* item,
Int64 uid,ItemTypeId type_id)
168 _createOne(item,uid,_itemTypeMng()->typeFromId(type_id));
187 auto cell = findOrAllocOne(uid,type_id,is_alloc);
200 _createOne(item,uid,type_id);
208findOrAllocOne(Int64 uid,ItemTypeId type_id,
bool& is_alloc)
210 return findOrAllocOne(uid,_itemTypeMng()->typeFromId(type_id),is_alloc);
219 ItemInternal* item = _allocOne(uid);
220 _createOne(item,uid,type);
227ItemInternal* CellFamily::
228findOrAllocOne(
Int64 uid,ItemTypeInfo* type,
bool& is_alloc)
231 ItemInternal* item = _findOrAllocOne(uid,is_alloc);
233 _createOne(item,uid,type);
243 this->_preAllocate(nb_item,
true);
252 debug() <<
"Creating the list of ghosts cells";
270 m_face_family->removeCellFromFace(face,cell_lid);
272 m_edge_family->removeCellFromEdge(edge,cell_lid);
274 m_node_family->removeCellFromNode(node,cell_lid);
284 _checkValidItem(icell);
292 if (icell.
level() >0){
293 _removeParentCellToCell(icell);
295 _removeChildCellToCell(parent_cell,icell);
307 for (
Int32 lid : cells_local_id)
318 _checkValidItem(icell);
325 if (icell.
level() >0){
326 _removeParentCellToCell(icell);
328 _removeChildCellToCell(parent_cell,icell);
341 _detachCells2(cells_local_id);
358 m_face_family->removeFaceIfNotConnected(face);
362 m_edge_family->removeEdgeIfNotConnected(edge);
366 m_node_family->removeNodeIfNotConnected(node);
378 _removeDetachedOne(cell);
387 ARCANE_UNUSED(keep_ghost);
388 for(
Integer i=0, is=local_ids.
size(); i<is; ++i ){
389 removeCell(m_item_internal_list->cells[local_ids[i]]);
402 m_node_connectivity->replaceItem(cell,index,node);
414 m_edge_connectivity->replaceItem(cell,index,edge);
426 m_face_connectivity->replaceItem(cell,index,face);
435 m_hchild_connectivity->replaceItem(cell,index,child_cell);
444 m_hparent_connectivity->replaceItem(cell,index,parent_cell);
453 m_mesh_connectivity = c;
454 m_node_prealloc = Connectivity::getPrealloc(m_mesh_connectivity,
IK_Cell,
IK_Node);
455 m_node_connectivity->setPreAllocatedSize(m_node_prealloc);
457 if (
mesh()->dimension()==3){
459 m_edge_connectivity->setPreAllocatedSize(edge_prealloc);
460 if (Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_HasEdge))
461 m_edge_prealloc = edge_prealloc;
463 m_face_prealloc = Connectivity::getPrealloc(m_mesh_connectivity,
IK_Cell,
IK_Face);
464 m_face_connectivity->setPreAllocatedSize(m_face_prealloc);
465 debug() <<
"Family " <<
name() <<
" prealloc "
466 << m_node_prealloc <<
" by node, "
467 << m_edge_prealloc <<
" by edge, "
468 << m_face_prealloc <<
" by face.";
484_addChildCellToCell2(
Cell iparent_cell,
Cell child_cell)
495 Cell parent_cell(iparent_cell);
500 Int32 nb_connected = m_hchild_connectivity->trueCustomConnectivity()->
nbConnectedItem(parent_cell);
501 for(
Int32 i=nb_connected; i<(position+1); ++i )
502 m_hchild_connectivity->addConnectedItem(parent_cell,
ItemLocalId(NULL_ITEM_LOCAL_ID));
504 x->replaceHChild(
ItemLocalId(iparent_cell),position,child_cell);
514 Integer nb_children = children_cells_lid.size();
515 auto c = m_hchild_connectivity->trueCustomConnectivity();
517 ItemLocalId item_lid(parent_cell);
518 c->addConnectedItems(item_lid,nb_children);
523 for(
Integer i=0; i<nb_children; ++i )
524 x->replaceHChild(ItemLocalId(parent_cell),i,ItemLocalId(children_cells_lid[i]));
533_removeParentCellToCell(Cell cell)
535 m_hparent_connectivity->removeConnectedItems(ItemLocalId(cell));
542_removeChildCellToCell(Cell parent_cell,Cell cell)
544 m_hchild_connectivity->removeConnectedItem(ItemLocalId(parent_cell),ItemLocalId(cell));
552_removeChildrenCellsToCell(Cell parent_cell)
554 m_hchild_connectivity->removeConnectedItems(ItemLocalId(parent_cell));
#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.
Classe pour convertir un CellLocalId vers une maille.
FaceConnectedListViewType faces() const
Liste des faces de la maille.
EdgeConnectedListViewType edges() const
Liste des arêtes de la maille.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
virtual IItemFamily * nodeFamily()=0
Retourne la famille des noeuds.
virtual IItemFamily * edgeFamily()=0
Retourne la famille des arêtes.
virtual IItemFamily * faceFamily()=0
Retourne la famille des faces.
virtual bool useMeshItemFamilyDependencies() const =0
check if the network itemFamily dependencies is activated
virtual IItemFamilyNetwork * itemFamilyNetwork()=0
Interface du réseau de familles (familles connectées)
bool isSuppressed() const
Vrai si l'entité est supprimée.
@ II_Inactive
L'entité est inactive //COARSEN_INACTIVE,.
Structure interne d'une entité de maillage.
Index d'un Item dans une variable.
Type d'une entité (Item).
NodeConnectedListViewType nodes() const
Liste des noeuds de l'entité
Classe de base d'un élément de maillage.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
impl::ItemBase itemBase() const
Partie interne de l'entité.
Chaîne de caractères unicode.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
void replaceFace(ItemLocalId item_lid, Integer index, ItemLocalId new_lid) override
Remplace une face d'une entité.
void replaceNode(ItemLocalId item_lid, Integer index, ItemLocalId new_lid) override
Remplace un noeud d'une entité.
void replaceHParent(ItemLocalId item_lid, Integer index, ItemLocalId new_lid) override
Remplace une entité parente d'une entité.
void replaceEdge(ItemLocalId item_lid, Integer index, ItemLocalId new_lid) override
Remplace une arête d'une entité.
void replaceHChild(ItemLocalId item_lid, Integer index, ItemLocalId new_lid) override
Remplace une entité enfant d'une entité.
void _removeSubItems(Cell cell)
Item allocOne(Int64 uid, ItemTypeId type_id, MeshInfos &mesh_info) override
Alloue un élément dans la famille et met à jour le mesh_info correspondant.
void detachCells2(Int32ConstArrayView cell_local_ids)
virtual void internalRemoveItems(Int32ConstArrayView local_ids, bool keep_ghost=false) override
void replaceNode(ItemLocalId cell, Integer index, ItemLocalId node)
Remplace le noeud d'index index de la maille cell avec celui de localId() node.
void removeCell(Cell cell)
void removeCells(ConstArrayView< Int32 > cells_local_id)
Supprime les mailles dont les numéros locaux sont cells_local_id.
void removeDetachedCell(Cell cell)
virtual void computeSynchronizeInfos() override
Construit les structures nécessaires à la synchronisation.
void _removeNotConnectedSubItems(Cell cell)
Supprime les sous-entités de la maille qui ne sont connectées à aucune maille.
void _addParentCellToCell(Cell cell, Cell parent_cell)
AMR.
void replaceFace(ItemLocalId cell, Integer index, ItemLocalId face)
Remplace la face d'index index de la maille cell avec celle de localId() face.
void detachCell(Cell cell)
void replaceEdge(ItemLocalId cell, Integer index, ItemLocalId edge)
Remplace l'arête d'index index de la maille cell avec celle de localId() edge.
void setConnectivity(const Integer c)
Définit la connectivité active pour le maillage associé
Integer nbConnectedItem(ItemLocalId lid) const final
Nombre d'entité connectées à l'entité source de numéro local lid.
IMesh * mesh() const override
Maillage associé
IItemFamilyTopologyModifier * _topologyModifier() override
Interface du modificateur de topologie.
void computeSynchronizeInfos() override
Construit les structures nécessaires à la synchronisation.
String name() const override
Nom de la famille.
Classe factorisant des informations sur le maillage.
Integer & nbCell()
Nombre de mailles dans le 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.
@ 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_Edge
Entité de maillage de genre arête.
std::int32_t Int32
Type entier signé sur 32 bits.