Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
EdgeFamily.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* EdgeFamily.cc (C) 2000-2022 */
9/* */
10/* Famille d'arêtes. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/mesh/EdgeFamily.h"
15
16#include "arcane/utils/FatalErrorException.h"
17
18#include "arcane/IMesh.h"
19
20#include "arcane/MeshUtils.h"
21#include "arcane/ItemPrinter.h"
22#include "arcane/Connectivity.h"
23
24#include "arcane/mesh/NodeFamily.h"
25#include "arcane/mesh/CompactIncrementalItemConnectivity.h"
26#include "arcane/mesh/ItemConnectivitySelector.h"
27#include "arcane/mesh/AbstractItemFamilyTopologyModifier.h"
28#include "arcane/mesh/NewWithLegacyConnectivity.h"
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
33namespace Arcane::mesh
34{
35
36/*---------------------------------------------------------------------------*/
37/*---------------------------------------------------------------------------*/
38
41{
42 public:
44 : AbstractItemFamilyTopologyModifier(f), m_true_family(f){}
45 public:
46 void replaceNode(ItemLocalId item_lid,Integer index,ItemLocalId new_lid) override
47 {
48 m_true_family->replaceNode(item_lid,index,new_lid);
49 }
50 private:
51 EdgeFamily* m_true_family;
52};
53
54/*---------------------------------------------------------------------------*/
55/*---------------------------------------------------------------------------*/
56
57EdgeFamily::
58EdgeFamily(IMesh* mesh,const String& name)
59: ItemFamily(mesh,IK_Edge,name)
60{
61 _setTopologyModifier(new TopologyModifier(this));
62}
63
64/*---------------------------------------------------------------------------*/
65/*---------------------------------------------------------------------------*/
66
67EdgeFamily::
68~EdgeFamily()
69{
70}
71
72/*---------------------------------------------------------------------------*/
73/*---------------------------------------------------------------------------*/
74
75void EdgeFamily::
76build()
77{
78 ItemFamily::build();
79 ItemTypeMng* itm = m_mesh->itemTypeMng();
80 m_edge_type = itm->typeFromId(IT_Line2);
81
82 m_node_family = ARCANE_CHECK_POINTER(dynamic_cast<NodeFamily*>(m_mesh->nodeFamily()));
83
84 if (m_mesh->useMeshItemFamilyDependencies()) // temporary to fill legacy, even with family dependencies
85 {
86 m_node_connectivity = dynamic_cast<NewWithLegacyConnectivityType<EdgeFamily,NodeFamily>::type*>(m_mesh->itemFamilyNetwork()->getConnectivity(this,mesh()->nodeFamily(),connectivityName(this,mesh()->nodeFamily())));
87 m_face_connectivity = dynamic_cast<NewWithLegacyConnectivityType<EdgeFamily,FaceFamily>::type*>(m_mesh->itemFamilyNetwork()->getConnectivity(this,mesh()->faceFamily(),connectivityName(this,mesh()->faceFamily())));
88 m_cell_connectivity = dynamic_cast<NewWithLegacyConnectivityType<EdgeFamily,CellFamily>::type*>(m_mesh->itemFamilyNetwork()->getConnectivity(this,mesh()->cellFamily(),connectivityName(this,mesh()->cellFamily())));
89 }
90 else
91 {
92 m_node_connectivity = new NodeConnectivity(this,mesh()->nodeFamily(),"EdgeNode");
93 m_face_connectivity = new FaceConnectivity(this,mesh()->faceFamily(),"EdgeFace");
94 m_cell_connectivity = new CellConnectivity(this,mesh()->cellFamily(),"EdgeCell");
95 }
96
97 _addConnectivitySelector(m_node_connectivity);
98 _addConnectivitySelector(m_face_connectivity);
99 _addConnectivitySelector(m_cell_connectivity);
100
101 _buildConnectivitySelectors();
102}
103
104/*---------------------------------------------------------------------------*/
105/*---------------------------------------------------------------------------*/
106
107inline void EdgeFamily::
108_createOne(ItemInternal* item,Int64 uid)
109{
110 m_item_internal_list->edges = _itemsInternal();
111 _allocateInfos(item,uid,m_edge_type);
112 auto nc = m_node_connectivity->trueCustomConnectivity();
113 if (nc)
114 nc->addConnectedItems(ItemLocalId(item),2);
115}
116
117/*---------------------------------------------------------------------------*/
118/*---------------------------------------------------------------------------*/
127{
128 ARCANE_ASSERT((type_id == IT_Line2),(""));
129 ARCANE_UNUSED(type_id);
130 ++mesh_info.nbEdge();
131 return allocOne(uid);
132}
133
134/*---------------------------------------------------------------------------*/
135/*---------------------------------------------------------------------------*/
140allocOne(Int64 uid)
141{
142 ItemInternal* item = _allocOne(uid);
143 _createOne(item,uid);
144 return item;
145}
146
147/*---------------------------------------------------------------------------*/
148/*---------------------------------------------------------------------------*/
161{
162 ARCANE_ASSERT((type_id == IT_Line2),(""));
163 ARCANE_UNUSED(type_id);
164 auto edge = findOrAllocOne(uid,is_alloc);
165 if (is_alloc)
166 ++mesh_info.nbEdge();
167 return edge;
168}
169
170/*---------------------------------------------------------------------------*/
171/*---------------------------------------------------------------------------*/
179findOrAllocOne(Int64 uid,bool& is_alloc)
180{
181 ItemInternal* item = _findOrAllocOne(uid,is_alloc);
182 if (is_alloc)
183 _createOne(item,uid);
184 return item;
185}
186
187/*---------------------------------------------------------------------------*/
188/*---------------------------------------------------------------------------*/
189
190void EdgeFamily::
191preAllocate(Integer nb_item)
192{
193 if (m_has_edge) {
194 this->_preAllocate(nb_item,true);
195 }
196}
197
198/*---------------------------------------------------------------------------*/
199/*---------------------------------------------------------------------------*/
200
203{
204 debug() << "Creating the list of ghosts edges";
206}
207
208/*---------------------------------------------------------------------------*/
209/*---------------------------------------------------------------------------*/
215replaceNode(ItemLocalId edge,Integer index,ItemLocalId node)
216{
217 if (!Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_EdgeToNode))
218 return;
219 m_node_connectivity->replaceItem(edge,index,node);
220}
221
222/*---------------------------------------------------------------------------*/
223/*---------------------------------------------------------------------------*/
224
227{
228 if (!Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_EdgeToCell))
229 return;
230 _checkValidSourceTargetItems(edge,new_cell);
231 m_cell_connectivity->addConnectedItem(ItemLocalId(edge),ItemLocalId(new_cell));
232}
233
234/*---------------------------------------------------------------------------*/
235/*---------------------------------------------------------------------------*/
236
239{
240 if (!Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_EdgeToFace))
241 return;
242 _checkValidSourceTargetItems(edge,new_face);
243 m_face_connectivity->addConnectedItem(ItemLocalId(edge),ItemLocalId(new_face));
244}
245
246/*---------------------------------------------------------------------------*/
247/*---------------------------------------------------------------------------*/
248
249inline void EdgeFamily::
250_removeEdge(Edge edge)
251{
252 for( Node node : edge.nodes() )
253 m_node_family->removeEdgeFromNode(node,edge);
254 _removeOne(edge);
255 // On ne supprime pas ici les autres relations (face->edge,cell->edge)
256 // Car l'ordre de suppression doit toujours être cell, face, edge, node
257 // donc node est en dernier et tout est déjà fait
258 // Par ailleurs, cela évite des problèmes de récursivité
259}
260
261/*---------------------------------------------------------------------------*/
262/*---------------------------------------------------------------------------*/
263
266{
267 if (!Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_EdgeToCell))
268 return;
269 _checkValidItem(edge);
270 m_cell_connectivity->removeConnectedItem(ItemLocalId(edge),cell_to_remove_lid);
271}
272
273/*---------------------------------------------------------------------------*/
274/*---------------------------------------------------------------------------*/
275
278{
279 if (!Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_EdgeToFace))
280 return;
281 m_face_connectivity->removeConnectedItem(edge,face_to_remove);
282}
283
284/*---------------------------------------------------------------------------*/
285/*---------------------------------------------------------------------------*/
286
289{
290 _checkValidItem(edge);
291 if (!edge.itemBase().isSuppressed() && edge.nbCell()==0){
292 _removeEdge(edge);
293 }
294}
295
296/*---------------------------------------------------------------------------*/
297/*---------------------------------------------------------------------------*/
298
300setConnectivity(const Integer c)
301{
302 m_mesh_connectivity = c;
303 m_has_edge = Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_HasEdge);
304 if (m_has_edge) {
305 m_node_prealloc = Connectivity::getPrealloc(m_mesh_connectivity,IK_Edge,IK_Node);
306 m_face_prealloc = Connectivity::getPrealloc(m_mesh_connectivity,IK_Edge,IK_Face);
307 m_cell_prealloc = Connectivity::getPrealloc(m_mesh_connectivity,IK_Edge,IK_Cell);
308 }
309 debug() << "Family " << name() << " prealloc "
310 << m_node_prealloc << " by node, "
311 << m_face_prealloc << " by face, "
312 << m_cell_prealloc << " by cell.";
313}
314
315/*---------------------------------------------------------------------------*/
316/*---------------------------------------------------------------------------*/
317
318} // End namespace Arcane::mesh
319
320/*---------------------------------------------------------------------------*/
321/*---------------------------------------------------------------------------*/
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
Maille d'un maillage.
Definition Item.h:1178
Arête d'une maille.
Definition Item.h:798
Int32 nbCell() const
Nombre de mailles connectées à l'arête.
Definition Item.h:878
Face d'une maille.
Definition Item.h:932
virtual IItemFamily * nodeFamily()=0
Retourne la famille des noeuds.
virtual IItemFamily * faceFamily()=0
Retourne la famille des faces.
virtual bool useMeshItemFamilyDependencies() const =0
check if the network itemFamily dependencies is activated
virtual ItemTypeMng * itemTypeMng() const =0
Gestionnaire de types d'entités associé
virtual IItemFamilyNetwork * itemFamilyNetwork()=0
Interface du réseau de familles (familles connectées)
bool isSuppressed() const
Vrai si l'entité est supprimée.
Structure interne d'une entité de maillage.
Index d'un Item dans une variable.
Definition ItemLocalId.h:40
Type d'une entité (Item).
Definition ItemTypeId.h:32
Classe de base d'un élément de maillage.
Definition Item.h:83
impl::ItemBase itemBase() const
Partie interne de l'entité.
Definition Item.h:354
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Noeud d'un maillage.
Definition Dom.h:204
Modification de la topologie des entités d'une famille.
void replaceNode(ItemLocalId item_lid, Integer index, ItemLocalId new_lid) override
Remplace un noeud d'une entité.
Definition EdgeFamily.cc:46
Famille d'arêtes.
Definition EdgeFamily.h:35
void removeCellFromEdge(Edge edge, ItemLocalId cell_to_remove_lid)
Supprime une maille d'une arête.
virtual void computeSynchronizeInfos() override
Construit les structures nécessaires à la synchronisation.
void removeFaceFromEdge(ItemLocalId edge, ItemLocalId face_to_remove)
Supprime une maille d'une arête.
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 setConnectivity(const Integer c)
Définit la connectivité active pour le maillage associé
NodeFamily * m_node_family
Famille des noeuds associée à cette famille.
Definition EdgeFamily.h:95
void removeEdgeIfNotConnected(Edge edge)
Supprime l'arête si elle n'est plus connectée.
void addFaceToEdge(Edge edge, Face new_face)
Ajoute une maille voisine à une arête.
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.
Item allocOne(Int64 uid, ItemTypeId type_id, MeshInfos &mesh_info) override
Version appelées dans l'ajout générique d'item.
void addCellToEdge(Edge edge, Cell new_cell)
Ajoute une maille voisine à une arête.
Famille d'entités.
Definition ItemFamily.h:76
IMesh * mesh() const override
Maillage associé
void computeSynchronizeInfos() override
Construit les structures nécessaires à la synchronisation.
String name() const override
Nom de la famille.
Definition ItemFamily.h:125
Classe factorisant des informations sur le maillage.
Definition MeshInfos.h:36
Chaîne de caractères unicode.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
@ 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.