Arcane  v4.1.1.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ItemTypeInfoBuilder.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/* ItemTypeInfoBuilder.cc (C) 2000-2025 */
9/* */
10/* Constructeur de type d'entité de maillage. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/FatalErrorException.h"
15#include "arcane/utils/TraceInfo.h"
16
18#include "arcane/core/ItemTypeInfoBuilder.h"
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23namespace Arcane
24{
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29void ItemTypeInfoBuilder::
30_checkDimension(Int16 dim)
31{
32 if (dim < 0)
33 return;
34 if (m_dimension < 0)
35 m_dimension = dim;
36 if (m_dimension != dim)
37 ARCANE_FATAL("Incoherent dimension for ItemType: current='{0}' new='{1}'",
38 m_dimension, dim);
39}
40
41/*---------------------------------------------------------------------------*/
42/*---------------------------------------------------------------------------*/
43
44void ItemTypeInfoBuilder::
45setInfos(ItemTypeMng* mng, ItemTypeId type_id, String type_name,
46 Dimension dimension, Int32 nb_node, Int32 nb_edge, Int32 nb_face)
47{
48 m_mng = mng;
49 m_type_id = type_id;
50 m_linear_type_id = type_id;
51 m_dimension = static_cast<Int16>(dimension);
52 m_nb_node = nb_node;
53 m_type_name = type_name;
54 _setNbEdgeAndFace(nb_edge, nb_face);
55}
56
57/*---------------------------------------------------------------------------*/
58/*---------------------------------------------------------------------------*/
59
60void ItemTypeInfoBuilder::
61setInfos(ItemTypeMng* mng, ItemTypeId type_id, String type_name,
62 Int32 nb_node, Int32 nb_edge, Int32 nb_face)
63{
64 setInfos(mng, type_id, type_name, Dimension::DimUnknown, nb_node, nb_edge, nb_face);
65}
66
67/*---------------------------------------------------------------------------*/
68/*---------------------------------------------------------------------------*/
69
70void ItemTypeInfoBuilder::
71setInfos(ItemTypeMng* mng, Int16 type_id, String type_name,
72 Int32 nb_node, Int32 nb_edge, Int32 nb_face)
73{
74 setInfos(mng, ItemTypeId::fromInteger(type_id), type_name, nb_node, nb_edge, nb_face);
75}
76
77/*---------------------------------------------------------------------------*/
78/*---------------------------------------------------------------------------*/
79
80void ItemTypeInfoBuilder::
81setInfos(ItemTypeMng* mng, Int16 type_id, String type_name, Dimension dimension,
82 Int32 nb_node, Int32 nb_edge, Int32 nb_face)
83{
84 setInfos(mng, ItemTypeId(type_id), type_name, dimension, nb_node, nb_edge, nb_face);
85}
86
87/*---------------------------------------------------------------------------*/
88/*---------------------------------------------------------------------------*/
89
91setOrder(Int16 order, ItemTypeId linear_type_id)
92{
93 m_order = order;
94 m_linear_type_id = linear_type_id;
95}
96
97/*---------------------------------------------------------------------------*/
98/*---------------------------------------------------------------------------*/
99
101addEdge(Int32 edge_index, Int32 n0, Int32 n1, Int32 f_left, Int32 f_right)
102{
103 Array<Integer>& buf = m_mng->m_ids_buffer;
104 buf[m_first_item_index + edge_index] = buf.size();
105 buf.add(n0);
106 buf.add(n1);
107 buf.add(f_left);
108 buf.add(f_right);
109}
110
111/*---------------------------------------------------------------------------*/
112/*---------------------------------------------------------------------------*/
113
115addEdge2D(Integer edge_index, Integer n0, Integer n1)
116{
117 Array<Integer>& buf = m_mng->m_ids_buffer;
118 buf[m_first_item_index + edge_index] = buf.size();
119 buf.add(n0);
120 buf.add(n1);
121 buf.add(-1);
122 buf.add(-1);
123}
124
125/*---------------------------------------------------------------------------*/
126/*---------------------------------------------------------------------------*/
127
129addFaceVertex(Integer face_index, Integer n0)
130{
131 _checkDimension(1);
132 Array<Integer>& buf = m_mng->m_ids_buffer;
133 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
134 buf.add(IT_FaceVertex);
135 buf.add(1);
136 buf.add(n0);
137 buf.add(0); // no edge
138}
139
140/*---------------------------------------------------------------------------*/
141/*---------------------------------------------------------------------------*/
142
144addFaceLine(Integer face_index, Integer n0, Integer n1)
145{
146 _checkDimension(2);
147 Array<Integer>& buf = m_mng->m_ids_buffer;
148 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
149 buf.add(IT_Line2);
150 buf.add(2);
151 buf.add(n0);
152 buf.add(n1);
153 buf.add(0); // no edge
154}
155
156/*---------------------------------------------------------------------------*/
157/*---------------------------------------------------------------------------*/
158
160addEdgeAndFaceLine(Int32 edge_face_index,
161 std::array<Int16, 2> begin_end_node,
162 std::array<Int16, 2> left_and_right_face)
163{
164 Int16 n0 = begin_end_node[0];
165 Int16 n1 = begin_end_node[1];
166 addFaceLine(edge_face_index, n0, n1);
167 addEdge(edge_face_index, n0, n1, left_and_right_face[0], left_and_right_face[1]);
168}
169
170/*---------------------------------------------------------------------------*/
171/*---------------------------------------------------------------------------*/
172
173//! Ajoute une ligne quadratique à la liste des faces (pour les elements 2D)
175addFaceLine3(Integer face_index, Integer n0, Integer n1, Integer n2)
176{
177 _checkDimension(2);
178 Array<Integer>& buf = m_mng->m_ids_buffer;
179 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
180 buf.add(IT_Line3);
181 buf.add(3);
182 buf.add(n0);
183 buf.add(n1);
184 buf.add(n2);
185 buf.add(0); // no edge
186}
187
188/*---------------------------------------------------------------------------*/
189/*---------------------------------------------------------------------------*/
190
191//! Ajoute une ligne quadratique à la liste des faces (pour les elements 2D)
193addFaceLine4(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3)
194{
195 _checkDimension(2);
196 Array<Integer>& buf = m_mng->m_ids_buffer;
197 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
198 buf.add(IT_Line4);
199 buf.add(4);
200 buf.add(n0);
201 buf.add(n1);
202 buf.add(n2);
203 buf.add(n3);
204 buf.add(0); // no edge
205}
206
207/*---------------------------------------------------------------------------*/
208/*---------------------------------------------------------------------------*/
209
211addFaceTriangle(Integer face_index, Integer n0, Integer n1, Integer n2)
212{
213 _checkDimension(3);
214 Array<Integer>& buf = m_mng->m_ids_buffer;
215 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
216 buf.add(IT_Triangle3);
217 buf.add(3);
218 buf.add(n0);
219 buf.add(n1);
220 buf.add(n2);
221 buf.add(3);
222 for (Integer i = 0; i < 3; ++i)
223 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
224}
225
226/*---------------------------------------------------------------------------*/
227/*---------------------------------------------------------------------------*/
228
230addFaceTriangle6(Integer face_index, Integer n0, Integer n1, Integer n2,
231 Integer n3, Integer n4, Integer n5)
232{
233 _checkDimension(3);
234 Array<Integer>& buf = m_mng->m_ids_buffer;
235 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
236 buf.add(IT_Triangle6);
237 buf.add(6);
238 buf.add(n0);
239 buf.add(n1);
240 buf.add(n2);
241 buf.add(n3);
242 buf.add(n4);
243 buf.add(n5);
244 buf.add(3);
245 for (Integer i = 0; i < 3; ++i)
246 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
247}
248
249/*---------------------------------------------------------------------------*/
250/*---------------------------------------------------------------------------*/
251
253addFaceQuad(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3)
254{
255 _checkDimension(3);
256 Array<Integer>& buf = m_mng->m_ids_buffer;
257 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
258 buf.add(IT_Quad4);
259 buf.add(4);
260 buf.add(n0);
261 buf.add(n1);
262 buf.add(n2);
263 buf.add(n3);
264 buf.add(4);
265 for (Integer i = 0; i < 4; ++i)
266 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
267}
268
269/*---------------------------------------------------------------------------*/
270/*---------------------------------------------------------------------------*/
271
273addFaceQuad8(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3,
274 Integer n4, Integer n5, Integer n6, Integer n7)
275{
276 _checkDimension(3);
277 Array<Integer>& buf = m_mng->m_ids_buffer;
278 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
279 buf.add(IT_Quad8);
280 buf.add(8);
281 buf.add(n0);
282 buf.add(n1);
283 buf.add(n2);
284 buf.add(n3);
285 buf.add(n4);
286 buf.add(n5);
287 buf.add(n6);
288 buf.add(n7);
289 buf.add(4);
290 for (Integer i = 0; i < 4; ++i)
291 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
292}
293
294/*---------------------------------------------------------------------------*/
295/*---------------------------------------------------------------------------*/
296
298addFaceQuad9(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3,
299 Integer n4, Integer n5, Integer n6, Integer n7, Integer n8)
300{
301 _checkDimension(3);
302 Array<Integer>& buf = m_mng->m_ids_buffer;
303 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
304 buf.add(IT_Quad9);
305 buf.add(9);
306 buf.add(n0);
307 buf.add(n1);
308 buf.add(n2);
309 buf.add(n3);
310 buf.add(n4);
311 buf.add(n5);
312 buf.add(n6);
313 buf.add(n7);
314 buf.add(n8);
315 buf.add(4);
316 for (Integer i = 0; i < 4; ++i)
317 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
318}
319
320/*---------------------------------------------------------------------------*/
321/*---------------------------------------------------------------------------*/
322
324addFacePentagon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4)
325{
326 _checkDimension(3);
327 Array<Integer>& buf = m_mng->m_ids_buffer;
328 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
329 buf.add(IT_Pentagon5);
330 buf.add(5);
331 buf.add(n0);
332 buf.add(n1);
333 buf.add(n2);
334 buf.add(n3);
335 buf.add(n4);
336 buf.add(5);
337 for (Integer i = 0; i < 5; ++i)
338 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
339}
340
341/*---------------------------------------------------------------------------*/
342/*---------------------------------------------------------------------------*/
343
345addFaceHexagon(Integer face_index, Integer n0, Integer n1, Integer n2,
346 Integer n3, Integer n4, Integer n5)
347{
348 _checkDimension(3);
349 Array<Integer>& buf = m_mng->m_ids_buffer;
350 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
351 buf.add(IT_Hexagon6);
352 buf.add(6);
353 buf.add(n0);
354 buf.add(n1);
355 buf.add(n2);
356 buf.add(n3);
357 buf.add(n4);
358 buf.add(n5);
359 buf.add(6);
360 for (Integer i = 0; i < 6; ++i)
361 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
362}
363
364/*---------------------------------------------------------------------------*/
365/*---------------------------------------------------------------------------*/
366
368addFaceHeptagon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3,
369 Integer n4, Integer n5, Integer n6)
370{
371 _checkDimension(3);
372 Array<Integer>& buf = m_mng->m_ids_buffer;
373 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
374 buf.add(IT_Heptagon7);
375 buf.add(7);
376 buf.add(n0);
377 buf.add(n1);
378 buf.add(n2);
379 buf.add(n3);
380 buf.add(n4);
381 buf.add(n5);
382 buf.add(n6);
383 buf.add(7);
384 for (Integer i = 0; i < 7; ++i)
385 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
386}
387
388/*---------------------------------------------------------------------------*/
389/*---------------------------------------------------------------------------*/
390
392addFaceOctogon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3,
393 Integer n4, Integer n5, Integer n6, Integer n7)
394{
395 _checkDimension(3);
396 Array<Integer>& buf = m_mng->m_ids_buffer;
397 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
398 buf.add(IT_Octogon8);
399 buf.add(8);
400 buf.add(n0);
401 buf.add(n1);
402 buf.add(n2);
403 buf.add(n3);
404 buf.add(n4);
405 buf.add(n5);
406 buf.add(n6);
407 buf.add(n7);
408 buf.add(8);
409 for (Integer i = 0; i < 8; ++i)
410 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
411}
412
413/*---------------------------------------------------------------------------*/
414/*---------------------------------------------------------------------------*/
415
418{
419 // Actuellement cette méthode est uniquement appelée pour les faces 2D donc
420 // l'élément actuel doit être de dimension 3.
421 _checkDimension(3);
422 Array<Integer>& buf = m_mng->m_ids_buffer;
423 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
424 buf.add(type_id);
425 Integer face_nb_node = n.size();
426 buf.add(face_nb_node);
427 for (Integer i = 0; i < face_nb_node; ++i)
428 buf.add(n[i]);
429 buf.add(face_nb_node); // nb edge; ne traite pas de cas particulier pour n==2
430 for (Integer i = 0; i < face_nb_node; ++i)
431 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
432}
433
434/*---------------------------------------------------------------------------*/
435/*---------------------------------------------------------------------------*/
436
439{
440 Integer cell_nb_edge = nbLocalEdge();
441 for (Integer i_face = 0; i_face < nbLocalFace(); ++i_face) {
442 Array<Integer>& buf = m_mng->m_ids_buffer;
443 Integer fi = buf[m_first_item_index + m_nb_edge + i_face];
444 Integer* index = &buf[fi];
445 LocalFace local_face(index);
446 Integer face_nb_node = local_face.nbNode();
447 Integer face_nb_edge = local_face.nbEdge();
448 for (Integer i_edge = 0; i_edge < face_nb_edge; ++i_edge) {
449 // L'objectif est de trouver l'arête de sommet [i_edge, i_edge+1] dans l'élément
450 Integer beginNode = local_face.node(i_edge);
451 Integer endNode = local_face.node((i_edge + 1) % face_nb_edge);
452 Integer face_edge = -1;
453 for (Integer i = 0; i < cell_nb_edge; ++i) {
454 LocalEdge local_edge = localEdge(i);
455 if ((local_edge.beginNode() == beginNode && local_edge.endNode() == endNode) ||
456 (local_edge.beginNode() == endNode && local_edge.endNode() == beginNode)) {
457 if (face_edge != -1)
458 ARCANE_FATAL("Conflicting item definition : duplicated edge [{0}:{1}] found as edge {2} and {3} of item {4}({5})",
459 beginNode, endNode, face_edge, i, typeName(), typeId());
460 face_edge = i;
461 }
462 }
463 if (face_edge == -1)
464 ARCANE_FATAL("Undefined edge [{0}:{1}] found as edge of item {2}({3})",
465 beginNode, endNode, typeName(), typeId());
466 index[3 + face_nb_node + i_edge] = face_edge;
467 ARCANE_ASSERT((face_edge == local_face.edge(i_edge)), ("Inconsitent face-edge allocation"));
468 }
469 }
470}
471
472/*---------------------------------------------------------------------------*/
473/*---------------------------------------------------------------------------*/
474
475void ItemTypeInfoBuilder::
476_setNbEdgeAndFace(Integer nb_edge, Integer nb_face)
477{
478 m_nb_face = nb_face;
479 m_nb_edge = nb_edge;
480 Integer total = m_nb_face + m_nb_edge;
481 if (total != 0) {
482 Array<Integer>& buf = m_mng->m_ids_buffer;
483 m_first_item_index = buf.size();
484 buf.resize(m_first_item_index + total);
485 }
486}
487
488/*---------------------------------------------------------------------------*/
489/*---------------------------------------------------------------------------*/
490
491} // End namespace Arcane
492
493/*---------------------------------------------------------------------------*/
494/*---------------------------------------------------------------------------*/
495
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Déclarations des types généraux de Arcane.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Type d'une entité (Item).
Definition ItemTypeId.h:32
static ItemTypeId fromInteger(Int64 v)
Créé une instance à partir d'un entier.
void setOrder(Int16 order, ItemTypeId linear_type)
Positionne l'ordre du type.
void addFaceHexagon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4, Integer n5)
Ajoute un hexagone à la liste des faces.
void addEdge(Integer edge_index, Integer n0, Integer n1, Integer f_left, Integer f_right)
Ajoute une arête à la liste des arêtes.
void addFacePentagon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4)
Ajoute un pentagone à la liste des faces.
void addFaceHeptagon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4, Integer n5, Integer n6)
Ajoute un heptagone à la liste des faces.
void addFaceLine4(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3)
Ajoute une ligne d'ordre 3 à la liste des faces (pour les elements 2D)
void addFaceQuad8(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4, Integer n5, Integer n6, Integer n7)
Ajoute un quadrilatère quadratique à la liste des faces.
void addFaceLine3(Integer face_index, Integer n0, Integer n1, Integer n2)
Ajoute une ligne quadratique à la liste des faces (pour les elements 2D)
void addFaceOctogon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4, Integer n5, Integer n6, Integer n7)
Ajoute un heptagone à la liste des faces.
void addFaceGeneric(Integer face_index, Integer type_id, ConstArrayView< Integer > n)
Ajoute une face générique à la liste des faces.
void addEdge2D(Integer edge_index, Integer n0, Integer n1)
Ajoute une arête pour une maille 2D d'un maillage en 3D.
void addFaceVertex(Integer face_index, Integer n0)
Ajoute un sommet à la liste des faces (pour les elements 1D)
void addFaceTriangle(Integer face_index, Integer n0, Integer n1, Integer n2)
Ajoute un triangle à la liste des faces.
void computeFaceEdgeInfos()
Calcule les relations face->arêtes.
void addFaceQuad(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3)
Ajoute un quadrilatère à la liste des faces.
void addFaceQuad9(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4, Integer n5, Integer n6, Integer n7, Integer n8)
Ajoute un quadrilatère quadratique à la liste des faces.
void addEdgeAndFaceLine(Int32 edge_face_index, std::array< Int16, 2 > begin_end_node, std::array< Int16, 2 > left_and_right_face)
Ajoute une arête et une face.
void addFaceLine(Integer face_index, Integer n0, Integer n1)
Ajoute une ligne à la liste des faces (pour les elements 2D)
void addFaceTriangle6(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4, Integer n5)
Ajoute un triangle quadratique à la liste des faces.
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.
Informations locales sur une face d'une maille.
Integer node(Integer i) const
Indice locale dans la maille du i-ème noeud de la face.
Integer nbEdge() const
Nombre d'arête de la face.
Integer edge(Integer i) const
Arête de la face.
Integer nbNode() const
Nombre de noeuds de la face.
LocalEdge localEdge(Integer id) const
Connectivité locale de la i-ème arête de la maille.
Int32 order() const
Ordre du type.
Int16 m_dimension
Dimension (-1) si pas initialisé.
Integer nbLocalEdge() const
Nombre d'arêtes de l'entité
Int16 dimension() const
Dimension de l'élément (<0 si inconnu)
String typeName() const
Nom du type.
Integer m_first_item_index
Indice de ce type dans la liste des index de m_mng.
Integer nbLocalFace() const
Nombre de faces de l'entité
Int16 typeId() const
Numéro du type.
Gestionnaire des types d'entités d'un maillage.
Definition ItemTypeMng.h:65
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
std::int16_t Int16
Type entier signé sur 16 bits.
std::int32_t Int32
Type entier signé sur 32 bits.