Arcane  v3.16.2.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
MeshUtils2.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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/* MeshUtils2.cc (C) 2000-2025 */
9/* */
10/* Fonctions utilitaires diverses sur le maillage. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
15
16#include "arcane/utils/SmallArray.h"
17#include "arcane/utils/HashTableMap2.h"
18#include "arcane/utils/CheckedConvert.h"
19
20#include "arcane/core/IMesh.h"
21#include "arcane/core/IItemFamily.h"
22#include "arcane/core/Item.h"
24#include "arcane/core/ItemGroup.h"
25#include "arcane/core/IIndexedIncrementalItemConnectivityMng.h"
26#include "arcane/core/IIndexedIncrementalItemConnectivity.h"
27#include "arcane/core/IIncrementalItemConnectivity.h"
28#include "arcane/core/IParallelMng.h"
29
30#include <set>
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34
35namespace Arcane
36{
37
38namespace
39{
40 class NodeNodeConnectivityHelper
41 {
42 public:
43
44 NodeNodeConnectivityHelper(IMesh* mesh, const String& connectivity_name)
45 : node_family(mesh->nodeFamily())
46 {
47 auto connectivity_mng = mesh->indexedConnectivityMng();
48 connectivity_ref = connectivity_mng->findOrCreateConnectivity(node_family, node_family, connectivity_name);
49 item_connectivity = connectivity_ref->connectivity();
50 }
51
52 public:
53
54 void addCurrentNodeSetToNode(NodeLocalId node_lid)
55 {
56 // Ajoute les entités au nœud.
57 {
58 Int32 nb_node = CheckedConvert::toInt32(node_set.size());
59 if (nb_node == 0)
60 return;
61 connected_items_ids.resize(nb_node);
62 Int32 index = 0;
63 for (auto x : node_set) {
64 connected_items_ids[index] = x;
65 ++index;
66 }
67 item_connectivity->setConnectedItems(node_lid, connected_items_ids);
68 }
69 node_set.clear();
70 }
71
72 public:
73
74 IItemFamily* node_family = nullptr;
75 Ref<IIndexedIncrementalItemConnectivity> connectivity_ref;
76
77 // Ensemble des nœuds connectés à un nœud
78 // On utilise un 'std::set' car on veut trier par localId() croissant
79 // pour avoir toujours le même ordre.
80 std::set<Int32> node_set;
81
82 private:
83
85 SmallArray<Int32> connected_items_ids;
86
87 IIncrementalItemConnectivity* item_connectivity = nullptr;
88 };
89} // namespace
90
91/*---------------------------------------------------------------------------*/
92/*---------------------------------------------------------------------------*/
93
95computeNodeNodeViaEdgeConnectivity(IMesh* mesh, const String& connectivity_name)
96{
98 NodeNodeConnectivityHelper helper(mesh, connectivity_name);
99
100 // Pour créer la connectivité, parcours l'ensemble des mailles connectées
101 // nœud et ensuite l'ensemble des arêtes de cette maille.
102 // Si un des deux nœuds de l'arête est mon nœud, l'ajoute
103 // à la connectivité.
104 ENUMERATE_ (Node, inode, helper.node_family->allItems()) {
105 Node node = *inode;
106 NodeLocalId node_lid(node.localId());
107 for (Cell cell : node.cells()) {
108 const ItemTypeInfo* t = cell.typeInfo();
109 for (Int32 i = 0, n = t->nbLocalEdge(); i < n; ++i) {
111 NodeLocalId node0_lid = cell.nodeId(e.beginNode());
112 NodeLocalId node1_lid = cell.nodeId(e.endNode());
113 if (node0_lid == node_lid)
114 helper.node_set.insert(node1_lid);
115 if (node1_lid == node_lid)
116 helper.node_set.insert(node0_lid);
117 }
118 }
119 // Ajoute les entités au nœud.
120 helper.addCurrentNodeSetToNode(node_lid);
121 }
122
123 return helper.connectivity_ref;
124}
125
126/*---------------------------------------------------------------------------*/
127/*---------------------------------------------------------------------------*/
128
130computeBoundaryNodeNodeViaEdgeConnectivity(IMesh* mesh, const String& connectivity_name)
131{
134 NodeNodeConnectivityHelper helper(mesh, connectivity_name);
135
137 Int32 my_rank = mesh->parallelMng()->commRank();
138 // D'abord, ajoute dans \a boundary_node_map la liste des noeuds
139 // situés sur les faces au de bord.
140 ENUMERATE_ (Face, iface, mesh->allFaces()) {
141 Face face = *iface;
142 Int32 nb_cell = face.nbCell();
143 if (nb_cell == 2) {
144 Int32 nb_own = 0;
145 // Si deux mailles connectées, il faut que l'un seulement des propriétaires
146 // de ces deux mailles soit le mien (sinon c'est une face interne et donc on
147 // ne la traite pas).
148 if (face.cell(0).owner() == my_rank)
149 ++nb_own;
150 if (face.cell(1).owner() == my_rank)
151 ++nb_own;
152 if (nb_own != 1)
153 continue;
154 }
155 // Si une seule maille, il faut que la face m'appartienne.
156 if (!face.isOwn())
157 continue;
158 for (NodeLocalId node_id : face.nodeIds())
159 boundary_node_map.add(node_id, true);
160 }
161 // Maintenant, parcours les noeuds du bord.
162 // Pour chacun parcours les arêtes des mailles connectées à ce nœud
163 // et ajoute le nœud correspondant s'il est aussi sur la frontière
164 // (dans ce cas, il est aussi dans boundary_node_map).
165 NodeLocalIdToNodeConverter nodes(helper.node_family);
166 for (auto [node_lid, _] : boundary_node_map) {
167 Node node = nodes[node_lid];
168 for (Cell cell : node.cells()) {
169 const ItemTypeInfo* t = cell.typeInfo();
170 for (Int32 i = 0, n = t->nbLocalEdge(); i < n; ++i) {
172 NodeLocalId node0_lid = cell.nodeId(e.beginNode());
173 NodeLocalId node1_lid = cell.nodeId(e.endNode());
174 Int32 other_node_lid = NULL_ITEM_LOCAL_ID;
175 if (node0_lid == node_lid)
176 other_node_lid = node1_lid;
177 if (node1_lid == node_lid)
178 other_node_lid = node0_lid;
179 if (other_node_lid != NULL_ITEM_LOCAL_ID && boundary_node_map.contains(other_node_lid))
180 helper.node_set.insert(other_node_lid);
181 }
182 }
183 helper.addCurrentNodeSetToNode(NodeLocalId(node_lid));
184 }
185 return helper.connectivity_ref;
186}
187
188/*---------------------------------------------------------------------------*/
189/*---------------------------------------------------------------------------*/
190
191} // namespace Arcane
192
193/*---------------------------------------------------------------------------*/
194/*---------------------------------------------------------------------------*/
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
Types et macros pour itérer sur les entités du maillage.
#define ENUMERATE_(type, name, group)
Enumérateur générique d'un groupe d'entité
Fonctions utilitaires sur le maillage.
Maille d'un maillage.
Definition Item.h:1199
Face d'une maille.
Definition Item.h:952
Cell cell(Int32 i) const
i-ème maille de la face
Definition Item.h:1641
Int32 nbCell() const
Nombre de mailles de la face (1 ou 2)
Definition Item.h:1027
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.
Infos sur un type d'entité du maillage.
LocalEdge localEdge(Integer id) const
Connectivité locale de la i-ème arête de la maille.
Integer nbLocalEdge() const
Nombre d'arêtes de l'entité
NodeLocalIdView nodeIds() const
Liste des noeuds de l'entité
Definition Item.h:788
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Definition Item.h:219
bool isOwn() const
true si l'entité est appartient au sous-domaine
Definition Item.h:253
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
Definition Item.h:238
Classe pour convertir un NodeLocalId vers une arête.
Noeud d'un maillage.
Definition Item.h:576
CellConnectedListViewType cells() const
Liste des mailles du noeud.
Definition Item.h:683
Référence à une instance.
Chaîne de caractères unicode.
Implementation of std::unordered_map.
Int32 toInt32(Int64 v)
Converti un Int64 en un Int32.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int32_t Int32
Type entier signé sur 32 bits.