Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
FaceReorienter.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* FaceReorienter.cc (C) 2000-2024 */
9/* */
10/* Verifie la bonne orientation d'une face et la réoriente le cas échéant. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ITraceMng.h"
15#include "arcane/utils/OStringStream.h"
16#include "arcane/utils/Array.h"
17
18#include "arcane/mesh/FaceReorienter.h"
19#include "arcane/mesh/FaceFamily.h"
20
21#include "arcane/MeshUtils.h"
22#include "arcane/ItemPrinter.h"
23
24#include "arcane/ItemInternal.h"
25#include "arcane/IMesh.h"
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30ARCANE_BEGIN_NAMESPACE
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34
35ARCANE_MESH_BEGIN_NAMESPACE
36
37/*---------------------------------------------------------------------------*/
38/*---------------------------------------------------------------------------*/
39
40FaceReorienter::
41FaceReorienter(ITraceMng* tm)
42: m_trace_mng(tm)
43, m_face_family(nullptr)
44{
45}
46
47/*---------------------------------------------------------------------------*/
48/*---------------------------------------------------------------------------*/
49
52: m_trace_mng(mesh->traceMng())
53, m_face_family(nullptr)
54{
55 m_face_family = ARCANE_CHECK_POINTER(dynamic_cast<FaceFamily*>(mesh->faceFamily()));
56}
57
58/*---------------------------------------------------------------------------*/
59/*---------------------------------------------------------------------------*/
60
65
66/*---------------------------------------------------------------------------*/
67/*---------------------------------------------------------------------------*/
68
74
75/*---------------------------------------------------------------------------*/
76/*---------------------------------------------------------------------------*/
77
83
84/*---------------------------------------------------------------------------*/
85/*---------------------------------------------------------------------------*/
86
89{
90 if (!m_face_family)
91 m_face_family = ARCANE_CHECK_POINTER(dynamic_cast<FaceFamily*>(face.itemFamily()));
92 Integer face_nb_node = face.nbNode();
93
94 m_nodes_unique_id.resize(face_nb_node);
95 m_nodes_local_id.resize(face_nb_node);
96
97 for (Integer i_node=0; i_node<face_nb_node; ++i_node) {
98 m_nodes_unique_id[i_node] = face.node(i_node).uniqueId();
99 m_nodes_local_id[i_node] = face.node(i_node).localId();
100 }
101
102 m_face_nodes_index.resize(face_nb_node);
103 mesh_utils::reorderNodesOfFace2(m_nodes_unique_id,m_face_nodes_index);
104
105 for (Integer i_node=0; i_node<face_nb_node; ++i_node) {
106 ItemLocalId node_lid(m_nodes_local_id[m_face_nodes_index[i_node]]);
107 m_face_family->replaceNode(face,i_node, node_lid);
108 }
109
110 // On cherche le plus petit uid de la face
111 std::pair<Int64,Int64> face_smallest_node_uids = std::make_pair(face.node(0).uniqueId(),
112 face.node(1).uniqueId());
113 if(face.node(0).uniqueId()==face.node(1).uniqueId())
114 face_smallest_node_uids = std::make_pair(face.node(0).uniqueId(),
115 face.node(2).uniqueId());
116 Cell cell = face.cell(0);
117 Int32 cell0_lid = cell.localId();
118 Integer local_face_number = -1;
119 for (Integer i_face=0; i_face<cell.nbFace(); ++i_face) {
120 if (cell.face(i_face) == face) {
121 // On a trouvé la bonne face
123 break;
124 }
125 }
126
127 if (local_face_number==(-1))
128 ARCANE_FATAL("Incoherent connectivity: Face {0} not connected to cell {1}",
129 face.uniqueId(),cell.uniqueId());
130
132 bool cell0_is_back_cell = false;
133
134 if (face_nb_node == 2) {
136 }
137 else {
138 for (Integer i_node=0; i_node<local_face.nbNode(); ++i_node) {
139 if (cell.node(local_face.node(i_node)).uniqueId() == face_smallest_node_uids.first) {
140 if(cell.node(local_face.node((i_node+1)%local_face.nbNode())).uniqueId()==cell.node(local_face.node(i_node)).uniqueId())
141 {
142 if (cell.node(local_face.node((i_node+2)%local_face.nbNode())).uniqueId() == face_smallest_node_uids.second) {
143 cell0_is_back_cell = true;
144 break;
145 }
146 else {
147 cell0_is_back_cell = false;
148 break;
149 }
150 }
151 else
152 {
153 if (cell.node(local_face.node((i_node+1)%local_face.nbNode())).uniqueId() == face_smallest_node_uids.second) {
154 cell0_is_back_cell = true;
155 break;
156 }
157 else {
158 cell0_is_back_cell = false;
159 break;
160 }
161 }
162 }
163 }
164 }
165
166 Int32 cell1_lid = (face.nbCell()==2) ? face.cell(1).localId() : NULL_ITEM_LOCAL_ID;
167 // Paire contenant la back_cell et front_cell de la face.
168 std::pair<Int32,Int32> face_cells(cell1_lid, cell0_lid);
169 if (cell0_is_back_cell) {
170 // Si on arrive ici c'est que la maille 0 est la back_cell
171 std::swap(face_cells.first,face_cells.second);
172 }
173 m_face_family->setBackAndFrontCells(face,face_cells.first,face_cells.second);
174
175}
176
177/*---------------------------------------------------------------------------*/
178/*---------------------------------------------------------------------------*/
182{
183 if (!m_face_family)
184 m_face_family = ARCANE_CHECK_POINTER(dynamic_cast<FaceFamily*>(face.itemFamily()));
185
186 m_nodes_unique_id.resize(face.nbNode());
187 m_nodes_local_id.resize(face.nbNode());
188
189 for (Integer i_node=0; i_node<face.nbNode(); ++i_node) {
190 m_nodes_unique_id[i_node] = face.node(i_node).uniqueId();
191 m_nodes_local_id[i_node] = face.node(i_node).localId();
192 }
193
194 m_face_nodes_index.resize(face.nbNode());
195 mesh_utils::reorderNodesOfFace2(m_nodes_unique_id,m_face_nodes_index);
196
197 for (Integer i_node=0; i_node<face.nbNode(); ++i_node) {
198 ItemLocalId node_lid(m_nodes_local_id[m_face_nodes_index[i_node]]);
199 m_face_family->replaceNode(face,i_node, node_lid);
200 }
201
202 // On cherche le plus petit uid de la face
203 std::pair<Int64,Int64> face_smallest_node_uids = std::make_pair(face.node(0).uniqueId(),
204 face.node(1).uniqueId());
205
206 if(face.node(0).uniqueId()==face.node(1).uniqueId())
207 face_smallest_node_uids = std::make_pair(face.node(0).uniqueId(),
208 face.node(2).uniqueId());
209
210 //ItemInternal* cell = face->cell(0);
211 bool cell_0 = false;
212 bool cell_1 = false;
213 Cell cell;
214
215 if(face.nbCell() == 2){
216 if(face.cell(0).level() >= face.cell(1).level()){
217 cell = face.cell(0);
218 cell_0 = true;
219 }
220 else {
221 cell = face.cell(1);
222 cell_1 = true;
223 }
224 }
225 else {
226 cell = face.cell(0);
227 cell_0 = true;
228 if (cell.null()) {
229 ARCANE_FATAL("Face without cells cannot be possible -- Face uid: {0}", face.uniqueId());
230 }
231 }
232 Integer local_face_number = -1;
233 for (Integer i_face=0; i_face<cell.nbFace(); ++i_face) {
234 if (cell.face(i_face) == face) {
235 // On a trouvé la bonne face
237 break;
238 }
239 }
240
241 if (local_face_number == (-1)) {
242 ARCANE_FATAL("Incoherent connectivity: Face {0} not connected to cell {1}",
243 face.uniqueId(),cell.uniqueId());
244 }
245
247
248 bool cell_is_back_cell = false;
249
250 if (face.nbNode() == 2) {
252 }
253 else {
254 for (Integer i_node=0; i_node<local_face.nbNode(); ++i_node) {
255 if (cell.node(local_face.node(i_node)).uniqueId() == face_smallest_node_uids.first) {
256 if(cell.node(local_face.node((i_node+1)%local_face.nbNode())).uniqueId()==cell.node(local_face.node(i_node)).uniqueId())
257 {
258 if (cell.node(local_face.node((i_node+2)%local_face.nbNode())).uniqueId() == face_smallest_node_uids.second) {
259 cell_is_back_cell = true;
260 break;
261 }
262 else {
263 cell_is_back_cell = false;
264 break;
265 }
266 }
267 else
268 {
269 if (cell.node(local_face.node((i_node+1)%local_face.nbNode())).uniqueId() == face_smallest_node_uids.second) {
270 cell_is_back_cell = true;
271 break;
272 }
273 else {
274 cell_is_back_cell = false;
275 break;
276 }
277 }
278 }
279 }
280 }
281
282 // Paire contenant la back_cell et front_cell de la face.
283 std::pair<Int32,Int32> face_cells(NULL_ITEM_LOCAL_ID,NULL_ITEM_LOCAL_ID);
284 bool face_has_two_cell = (face.nbCell()==2);
285
286 if(cell_0){
287 Int32 cell1_lid = (face_has_two_cell) ? face.cell(1).localId() : NULL_ITEM_LOCAL_ID;
288 if (cell_is_back_cell) {
289 // Si on arrive ici c'est que la maille 0 est la back_cell
290 // La front cell est toujours cell1_lid (qui peut être nulle).
291 face_cells = { face.cell(0).localId(), cell1_lid };
292 }
293 else {
294 // Si on arrive ici c'est que la maille 0 est la front_cell
295 // La back cell est toujours cell1_lid (qui peut être nulle)
296 face_cells.first = cell1_lid;
297 face_cells.second = (face_has_two_cell) ? cell.localId() : face.cell(0).localId();
298 }
299 }
300 else if(cell_1){
301 if (cell_is_back_cell) {
302 // Si on arrive ici c'est que la maille 0 est la front_cell
303 // On met à jour les infos d'orientation
304 face_cells.second = face.cell(0).localId();
305 // GG Attention, si ici, cela signifie qu'il faut échanger la front cell
306 // et la back cell car la back cell doit toujours être la première
307 face_cells.first = (face_has_two_cell) ? cell.localId() : NULL_ITEM_LOCAL_ID;
308 }
309 else {
310 // Si on arrive ici c'est que la maille 0 est la back_cell
311 // On met à jour les infos d'orientation
312 face_cells.first = face.cell(0).localId();
313 face_cells.second = (face_has_two_cell) ? face.cell(1).localId() : NULL_ITEM_LOCAL_ID;
314 }
315 }
316 m_face_family->setBackAndFrontCells(face,face_cells.first,face_cells.second);
317}
318
319/*---------------------------------------------------------------------------*/
320/*---------------------------------------------------------------------------*/
321
322ARCANE_MESH_END_NAMESPACE
323
324/*---------------------------------------------------------------------------*/
325/*---------------------------------------------------------------------------*/
326
327ARCANE_END_NAMESPACE
#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.
Maille d'un maillage.
Definition Item.h:1178
Face face(Int32 i) const
i-ème face de la maille
Definition Item.h:1255
Int32 nbFace() const
Nombre de faces de la maille.
Definition Item.h:1252
Int32 level() const
Definition Item.h:1328
ARCANE_DEPRECATED_260 void checkAndChangeOrientation(ItemInternal *face)
ARCANE_DEPRECATED_260 void checkAndChangeOrientationAMR(ItemInternal *face)
ARCANE_DEPRECATED_260 FaceReorienter(ITraceMng *tm)
~FaceReorienter()
Destructeur.
Face d'une maille.
Definition Item.h:932
Cell cell(Int32 i) const
i-ème maille de la face
Definition Item.h:1617
Int32 nbCell() const
Nombre de mailles de la face (1 ou 2)
Definition Item.h:1006
virtual IItemFamily * faceFamily()=0
Retourne la famille des faces.
Structure interne d'une entité de maillage.
Index d'un Item dans une variable.
Definition ItemLocalId.h:40
Informations locales sur une face d'une maille.
LocalFace localFace(Integer id) const
Connectivité locale de la i-ème face de la maille.
Node node(Int32 i) const
i-ème noeud de l'entité
Definition Item.h:768
Int32 nbNode() const
Nombre de noeuds de l'entité
Definition Item.h:765
const ItemTypeInfo * typeInfo() const
Infos sur le type de l'entité.
Definition Item.h:377
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Definition Item.h:210
IItemFamily * itemFamily() const
Famille dont est issue l'entité
Definition Item.h:238
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Definition Item.h:216
constexpr bool null() const
true si l'entité est nul (i.e. non connecté au maillage)
Definition Item.h:207
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
Interface du gestionnaire de traces.