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"
47:
public AbstractItemFamilyTopologyModifier
50 TopologyModifier(NodeFamily* f)
51 : AbstractItemFamilyTopologyModifier(f), m_true_family(f){}
55 m_true_family->replaceEdge(item_lid,index,new_lid);
59 m_true_family->replaceFace(item_lid,index,new_lid);
63 m_true_family->replaceCell(item_lid,index,new_lid);
66 NodeFamily* m_true_family;
80 _setTopologyModifier(
new TopologyModifier(
this));
89 delete m_nodes_coords;
100 ItemTypeMng* itm = m_mesh->itemTypeMng();
103 m_nodes_coords =
nullptr;
109 if (m_mesh->useMeshItemFamilyDependencies())
111 m_edge_connectivity =
dynamic_cast<NewWithLegacyConnectivityType<NodeFamily,EdgeFamily>::type*
>(m_mesh->itemFamilyNetwork()->getConnectivity(
this,
mesh()->edgeFamily(),connectivityName(
this,
mesh()->edgeFamily())));
112 m_face_connectivity =
dynamic_cast<NewWithLegacyConnectivityType<NodeFamily,FaceFamily>::type*
>(m_mesh->itemFamilyNetwork()->getConnectivity(
this,m_face_family,connectivityName(
this,
mesh()->faceFamily())));
113 m_cell_connectivity =
dynamic_cast<NewWithLegacyConnectivityType<NodeFamily,CellFamily>::type*
>(m_mesh->itemFamilyNetwork()->getConnectivity(
this,
mesh()->cellFamily(),connectivityName(
this,
mesh()->cellFamily())));
117 m_edge_connectivity =
new EdgeConnectivity(
this,
mesh()->edgeFamily(),
"NodeEdge");
118 m_face_connectivity =
new FaceConnectivity(
this,m_face_family,
"NodeFace");
119 m_cell_connectivity =
new CellConnectivity(
this,
mesh()->cellFamily(),
"NodeCell");
121 m_hparent_connectivity =
new HParentConnectivity(
this,
this,
"HParentNode");
122 m_hchild_connectivity =
new HChildConnectivity(
this,
this,
"HChildNode");
124 _addConnectivitySelector(m_edge_connectivity);
125 _addConnectivitySelector(m_face_connectivity);
126 _addConnectivitySelector(m_cell_connectivity);
127 _addConnectivitySelector(m_hparent_connectivity);
128 _addConnectivitySelector(m_hchild_connectivity);
130 _buildConnectivitySelectors();
139 this->_preAllocate(nb_item,
true);
149 m_nodes_coords->setUsed(
true);
150 ItemFamily::_endAllocate();
157addCellToNode(Node node,Cell new_cell)
159 _checkValidSourceTargetItems(node,new_cell);
160 Int32 cell_lid = new_cell.localId();
161 m_cell_connectivity->addConnectedItem(ItemLocalId(node),ItemLocalId(cell_lid));
168addFaceToNode(Node node,Face new_face)
170 if (m_no_face_connectivity)
173 _checkValidSourceTargetItems(node,new_face);
174 m_face_connectivity->addConnectedItem(ItemLocalId(node),ItemLocalId(new_face));
181addEdgeToNode(Node node,Edge new_edge)
183 if (!Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_NodeToEdge))
186 _checkValidSourceTargetItems(node,new_edge);
187 m_edge_connectivity->addConnectedItem(ItemLocalId(node),ItemLocalId(new_edge));
194removeEdgeFromNode(ItemLocalId node,ItemLocalId edge_to_remove)
196 if (!Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_NodeToEdge))
198 m_edge_connectivity->removeConnectedItem(node,edge_to_remove);
205removeFaceFromNode(ItemLocalId node,ItemLocalId face_to_remove)
207 if (m_no_face_connectivity)
210 m_face_connectivity->removeConnectedItem(node,face_to_remove);
217removeCellFromNode(Node node,ItemLocalId cell_to_remove_lid)
219 _checkValidItem(node);
220 m_cell_connectivity->removeConnectedItem(ItemLocalId(node),cell_to_remove_lid);
229 _checkValidItem(node);
243 debug() <<
"Creating the ghosts nodes list";
250inline void NodeFamily::
251_removeNode(
Node node)
269 m_cell_connectivity->replaceItem(node,index,cell);
281 m_edge_connectivity->replaceItem(node,index,edge);
293 m_face_connectivity->replaceItem(node,index,face);
302 m_mesh_connectivity = c;
303 if (Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_HasEdge))
304 m_edge_prealloc = Connectivity::getPrealloc(m_mesh_connectivity,
IK_Node,
IK_Edge);
305 m_face_prealloc = Connectivity::getPrealloc(m_mesh_connectivity,
IK_Node,
IK_Face);
306 m_cell_prealloc = Connectivity::getPrealloc(m_mesh_connectivity,
IK_Node,
IK_Cell);
307 m_face_connectivity->setPreAllocatedSize(m_face_prealloc);
308 m_cell_connectivity->setPreAllocatedSize(m_cell_prealloc);
309 debug() <<
"Family " <<
name() <<
" prealloc "
310 << m_edge_prealloc <<
" by edge, "
311 << m_face_prealloc <<
" by face, "
312 << m_cell_prealloc <<
" by cell.";
313 m_no_face_connectivity = !Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_NodeToFace);
330 bool operator()(
Int32 item1,
Int32 item2)
const
332 return m_items.uniqueId(item1) < m_items.uniqueId(item2);
346 explicit ItemCompare3(
ITraceMng* msg) : m_msg(msg) {}
349 ItemInternalArrayView m_items;
353 m_msg->
info() <<
"** Compare ptr=" << m_items.data()
354 <<
" i1=" << item1 <<
" i2=" << item2
355 <<
" i1=" << m_items[item1] <<
" i2=" << m_items[item2]
356 <<
" uid1=" << m_items[item1]->uniqueId()
357 <<
" uid2=" << m_items[item2]->uniqueId();
358 return m_items[item1]->uniqueId() < m_items[item2]->uniqueId();
379 Int32ArrayView conn_lids = connectivity->_connectedItemsLocalId(lid);
380 std::sort(std::begin(conn_lids),std::end(conn_lids),ic_items);
388sortInternalReferences()
391 _sortConnectedItems(
mesh()->cellFamily(),m_cell_connectivity->trueCustomConnectivity());
397 info(4) <<
"Sorting connected faces and edges family=" <<
fullName();
398 _sortConnectedItems(m_face_family,m_face_connectivity->trueCustomConnectivity());
399 if (Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_NodeToEdge))
400 _sortConnectedItems(
mesh()->edgeFamily(),m_edge_connectivity->trueCustomConnectivity());
414 m_face_family->reorientFacesIfNeeded();
421_addParentNodeToNode(
Node parent_node,
Node child_node)
430_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.
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.
std::int32_t Int32
Type entier signé sur 32 bits.