14#include "arcane/mesh/NodeFamily.h"
16#include "arcane/utils/FatalErrorException.h"
17#include "arcane/utils/PlatformUtils.h"
18#include "arcane/utils/ITraceMng.h"
19#include "arcane/utils/ValueConvert.h"
21#include "arcane/core/ISubDomain.h"
22#include "arcane/core/ItemPrinter.h"
23#include "arcane/core/VariableTypes.h"
24#include "arcane/core/IMesh.h"
26#include "arcane/core/Connectivity.h"
27#include "arcane/core/ConnectivityItemVector.h"
28#include "arcane/core/Properties.h"
30#include "arcane/mesh/IncrementalItemConnectivity.h"
31#include "arcane/mesh/CompactIncrementalItemConnectivity.h"
32#include "arcane/mesh/ItemConnectivitySelector.h"
33#include "arcane/mesh/AbstractItemFamilyTopologyModifier.h"
34#include "arcane/mesh/NewWithLegacyConnectivity.h"
35#include "arcane/mesh/FaceFamily.h"
36#include "arcane/mesh/EdgeFamily.h"
48:
public AbstractItemFamilyTopologyModifier
51 TopologyModifier(NodeFamily* f)
52 : AbstractItemFamilyTopologyModifier(f), m_true_family(f){}
56 m_true_family->replaceEdge(item_lid,index,new_lid);
60 m_true_family->replaceFace(item_lid,index,new_lid);
64 m_true_family->replaceCell(item_lid,index,new_lid);
67 NodeFamily* m_true_family;
81 _setTopologyModifier(
new TopologyModifier(
this));
90 delete m_nodes_coords;
101 ItemTypeMng* itm = m_mesh->itemTypeMng();
104 m_nodes_coords =
nullptr;
111 if (m_mesh->useMeshItemFamilyDependencies())
113 m_edge_connectivity =
dynamic_cast<NewWithLegacyConnectivityType<NodeFamily,EdgeFamily>::type*
>(m_mesh->itemFamilyNetwork()->getConnectivity(
this,
mesh()->edgeFamily(),connectivityName(
this,
mesh()->edgeFamily())));
114 m_face_connectivity =
dynamic_cast<NewWithLegacyConnectivityType<NodeFamily,FaceFamily>::type*
>(m_mesh->itemFamilyNetwork()->getConnectivity(
this,m_face_family,connectivityName(
this,
mesh()->faceFamily())));
115 m_cell_connectivity =
dynamic_cast<NewWithLegacyConnectivityType<NodeFamily,CellFamily>::type*
>(m_mesh->itemFamilyNetwork()->getConnectivity(
this,
mesh()->cellFamily(),connectivityName(
this,
mesh()->cellFamily())));
119 m_edge_connectivity =
new EdgeConnectivity(
this,
mesh()->edgeFamily(),
"NodeEdge");
120 m_face_connectivity =
new FaceConnectivity(
this,m_face_family,
"NodeFace");
121 m_cell_connectivity =
new CellConnectivity(
this,
mesh()->cellFamily(),
"NodeCell");
123 m_hparent_connectivity =
new HParentConnectivity(
this,
this,
"HParentNode");
124 m_hchild_connectivity =
new HChildConnectivity(
this,
this,
"HChildNode");
126 _addConnectivitySelector(m_edge_connectivity);
127 _addConnectivitySelector(m_face_connectivity);
128 _addConnectivitySelector(m_cell_connectivity);
129 _addConnectivitySelector(m_hparent_connectivity);
130 _addConnectivitySelector(m_hchild_connectivity);
132 _buildConnectivitySelectors();
141 this->_preAllocate(nb_item,
true);
151 m_nodes_coords->setUsed(
true);
152 ItemFamily::_endAllocate();
159addCellToNode(Node node,
Cell new_cell)
161 _checkValidSourceTargetItems(node,new_cell);
162 Int32 cell_lid = new_cell.localId();
163 m_cell_connectivity->addConnectedItem(ItemLocalId(node),ItemLocalId(cell_lid));
170addFaceToNode(Node node,Face new_face)
172 if (m_no_face_connectivity)
175 _checkValidSourceTargetItems(node,new_face);
176 m_face_connectivity->addConnectedItem(ItemLocalId(node),ItemLocalId(new_face));
183addEdgeToNode(Node node,Edge new_edge)
185 if (!Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_NodeToEdge))
188 _checkValidSourceTargetItems(node,new_edge);
189 m_edge_connectivity->addConnectedItem(ItemLocalId(node),ItemLocalId(new_edge));
196removeEdgeFromNode(ItemLocalId node,ItemLocalId edge_to_remove)
198 if (!Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_NodeToEdge))
200 m_edge_connectivity->removeConnectedItem(node,edge_to_remove);
207removeFaceFromNode(ItemLocalId node,ItemLocalId face_to_remove)
209 if (m_no_face_connectivity)
212 m_face_connectivity->removeConnectedItem(node,face_to_remove);
219removeCellFromNode(Node node,ItemLocalId cell_to_remove_lid)
221 _checkValidItem(node);
222 m_cell_connectivity->removeConnectedItem(ItemLocalId(node),cell_to_remove_lid);
231 _checkValidItem(node);
245 debug() <<
"Creating the ghosts nodes list";
252inline void NodeFamily::
253_removeNode(
Node node)
271 m_cell_connectivity->replaceItem(node,index,cell);
283 m_edge_connectivity->replaceItem(node,index,edge);
295 m_face_connectivity->replaceItem(node,index,face);
304 m_mesh_connectivity = c;
305 if (Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_HasEdge))
306 m_edge_prealloc = Connectivity::getPrealloc(m_mesh_connectivity,
IK_Node,
IK_Edge);
307 m_face_prealloc = Connectivity::getPrealloc(m_mesh_connectivity,
IK_Node,
IK_Face);
308 m_cell_prealloc = Connectivity::getPrealloc(m_mesh_connectivity,
IK_Node,
IK_Cell);
309 m_face_connectivity->setPreAllocatedSize(m_face_prealloc);
310 m_cell_connectivity->setPreAllocatedSize(m_cell_prealloc);
311 debug() <<
"Family " <<
name() <<
" prealloc "
312 << m_edge_prealloc <<
" by edge, "
313 << m_face_prealloc <<
" by face, "
314 << m_cell_prealloc <<
" by cell.";
315 m_no_face_connectivity = !Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_NodeToFace);
332 bool operator()(
Int32 item1,
Int32 item2)
const
334 return m_items.uniqueId(item1) < m_items.uniqueId(item2);
348 explicit ItemCompare3(
ITraceMng* msg) : m_msg(msg) {}
351 ItemInternalArrayView m_items;
355 m_msg->
info() <<
"** Compare ptr=" << m_items.data()
356 <<
" i1=" << item1 <<
" i2=" << item2
357 <<
" i1=" << m_items[item1] <<
" i2=" << m_items[item2]
358 <<
" uid1=" << m_items[item1]->uniqueId()
359 <<
" uid2=" << m_items[item2]->uniqueId();
360 return m_items[item1]->uniqueId() < m_items[item2]->uniqueId();
381 Int32ArrayView conn_lids = connectivity->_connectedItemsLocalId(lid);
382 std::sort(std::begin(conn_lids),std::end(conn_lids),ic_items);
390sortInternalReferences()
393 _sortConnectedItems(
mesh()->cellFamily(),m_cell_connectivity->trueCustomConnectivity());
399 info(4) <<
"Sorting connected faces and edges family=" <<
fullName();
400 _sortConnectedItems(m_face_family,m_face_connectivity->trueCustomConnectivity());
401 if (Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_NodeToEdge))
402 _sortConnectedItems(
mesh()->edgeFamily(),m_edge_connectivity->trueCustomConnectivity());
415 m_face_family->reorientFacesIfNeeded();
416 m_edge_family->reorientEdgesIfNeeded();
423_addParentNodeToNode(
Node parent_node,
Node child_node)
432_addChildNodeToNode(
Node parent_node,
Node child_node)
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
Fonctions utilitaires sur le maillage.
Classe template pour convertir un type.
Interface d'une famille d'entités.
Interface du gestionnaire de traces.
virtual TraceMessage info()=0
Flot pour un message d'information.
bool isSuppressed() const
Vrai si l'entité est supprimée.
Vue sur une liste pour obtenir des informations sur les entités.
Index d'un Item dans une variable.
impl::ItemBase itemBase() const
Partie interne de l'entité.
Int32 nbCell() const
Nombre de mailles connectées au noeud.
bool getBoolWithDefault(const String &name, bool default_value) const
Valeur de la propriété de nom name.
Chaîne de caractères unicode.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage info() const
Flot pour un message d'information.
Connectivité incrémentale item->item[].
IMesh * mesh() const override
Maillage associé
String fullName() const override
Nom complet de la famille (avec celui du maillage)
ItemGroup allItems() const override
Groupe de toutes les entités.
void notifyItemsUniqueIdChanged() override
Notifie que les numéros uniques des entités ont été modifiées.
void computeSynchronizeInfos() override
Construit les structures nécessaires à la synchronisation.
Properties * properties() override
Propriétés associées à cette famille.
String name() const override
Nom de la famille.
void replaceCell(ItemLocalId item_lid, Integer index, ItemLocalId new_lid) override
Remplace une maille d'une entité.
void replaceFace(ItemLocalId item_lid, Integer index, ItemLocalId new_lid) override
Remplace une face d'une entité.
void replaceEdge(ItemLocalId item_lid, Integer index, ItemLocalId new_lid) override
Remplace une arête d'une entité.
void computeSynchronizeInfos() override
Construit les structures nécessaires à la synchronisation.
void replaceCell(ItemLocalId node, Integer index, ItemLocalId cell)
Remplace la maille d'index index du noeud node avec celle de localId() node_lid.
void removeNodeIfNotConnected(Node node)
Supprime le noeud siln'est plus connecté
void replaceFace(ItemLocalId node, Integer index, ItemLocalId face)
Remplace la face d'index index du noeud node avec celle de localId() face_lid.
void notifyItemsUniqueIdChanged() override
Notifie que les numéros uniques des entités ont été modifiées.
void setConnectivity(const Integer c)
Définit la connectivité active pour le maillage associé
void replaceEdge(ItemLocalId node, Integer index, ItemLocalId edge)
Remplace l'arête d'index index du noeud node avec celle de localId() face_lid.
ItemTypeInfo * m_node_type
Instance contenant le type des noeuds.
bool m_is_sort_connected_faces_and_edges
Indique si on trie les faces et arêtes connectées aux noeuds.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
Int32 Integer
Type représentant un entier.
ArrayView< Int32 > Int32ArrayView
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.
@ Cell
Le maillage est AMR par maille.
std::int32_t Int32
Type entier signé sur 32 bits.