Arcane  4.1.11.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ItemTypeInfoBuilder.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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-2026 */
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 _checkSetIsPolygon();
56}
57
58/*---------------------------------------------------------------------------*/
59/*---------------------------------------------------------------------------*/
60
61void ItemTypeInfoBuilder::
62setInfos(ItemTypeMng* mng, ItemTypeId type_id, String type_name,
63 Int32 nb_node, Int32 nb_edge, Int32 nb_face)
64{
65 setInfos(mng, type_id, type_name, Dimension::DimUnknown, nb_node, nb_edge, nb_face);
66}
67
68/*---------------------------------------------------------------------------*/
69/*---------------------------------------------------------------------------*/
70
71void ItemTypeInfoBuilder::
72setInfos(ItemTypeMng* mng, Int16 type_id, String type_name,
73 Int32 nb_node, Int32 nb_edge, Int32 nb_face)
74{
75 setInfos(mng, ItemTypeId::fromInteger(type_id), type_name, nb_node, nb_edge, nb_face);
76}
77
78/*---------------------------------------------------------------------------*/
79/*---------------------------------------------------------------------------*/
80
81void ItemTypeInfoBuilder::
82setInfos(ItemTypeMng* mng, Int16 type_id, String type_name, Dimension dimension,
83 Int32 nb_node, Int32 nb_edge, Int32 nb_face)
84{
85 setInfos(mng, ItemTypeId(type_id), type_name, dimension, nb_node, nb_edge, nb_face);
86}
87
88/*---------------------------------------------------------------------------*/
89/*---------------------------------------------------------------------------*/
90
92setOrder(Int16 order, ItemTypeId linear_type_id)
93{
94 m_order = order;
95 m_linear_type_id = linear_type_id;
96 _checkSetIsPolygon();
97}
98
99/*---------------------------------------------------------------------------*/
100/*---------------------------------------------------------------------------*/
101
103addEdge(Int32 edge_index, Int32 n0, Int32 n1, Int32 f_left, Int32 f_right)
104{
105 Array<Integer>& buf = m_mng->m_ids_buffer;
106 buf[m_first_item_index + edge_index] = buf.size();
107 buf.add(n0);
108 buf.add(n1);
109 buf.add(f_left);
110 buf.add(f_right);
111}
112
113/*---------------------------------------------------------------------------*/
114/*---------------------------------------------------------------------------*/
115
117addEdge2D(Integer edge_index, Integer n0, Integer n1)
118{
119 Array<Integer>& buf = m_mng->m_ids_buffer;
120 buf[m_first_item_index + edge_index] = buf.size();
121 buf.add(n0);
122 buf.add(n1);
123 buf.add(-1);
124 buf.add(-1);
125}
126
127/*---------------------------------------------------------------------------*/
128/*---------------------------------------------------------------------------*/
129
131addFaceVertex(Integer face_index, Integer n0)
132{
133 _checkDimension(1);
134 Array<Integer>& buf = m_mng->m_ids_buffer;
135 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
136 buf.add(IT_FaceVertex);
137 buf.add(1);
138 buf.add(n0);
139 buf.add(0); // no edge
140}
141
142/*---------------------------------------------------------------------------*/
143/*---------------------------------------------------------------------------*/
144
146addFaceLine(Integer face_index, Integer n0, Integer n1)
147{
148 _checkDimension(2);
149 Array<Integer>& buf = m_mng->m_ids_buffer;
150 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
151 buf.add(IT_Line2);
152 buf.add(2);
153 buf.add(n0);
154 buf.add(n1);
155 buf.add(0); // no edge
156}
157
158/*---------------------------------------------------------------------------*/
159/*---------------------------------------------------------------------------*/
160
162addEdgeAndFaceLine(Int32 edge_face_index,
163 std::array<Int16, 2> begin_end_node,
164 std::array<Int16, 2> left_and_right_face)
165{
166 Int16 n0 = begin_end_node[0];
167 Int16 n1 = begin_end_node[1];
168 addFaceLine(edge_face_index, n0, n1);
169 addEdge(edge_face_index, n0, n1, left_and_right_face[0], left_and_right_face[1]);
170}
171
172/*---------------------------------------------------------------------------*/
173/*---------------------------------------------------------------------------*/
174
177addFaceLine3(Integer face_index, Integer n0, Integer n1, Integer n2)
178{
179 _checkDimension(2);
180 Array<Integer>& buf = m_mng->m_ids_buffer;
181 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
182 buf.add(IT_Line3);
183 buf.add(3);
184 buf.add(n0);
185 buf.add(n1);
186 buf.add(n2);
187 buf.add(0); // no edge
188}
189
190/*---------------------------------------------------------------------------*/
191/*---------------------------------------------------------------------------*/
192
195addFaceLine4(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3)
196{
197 _checkDimension(2);
198 Array<Integer>& buf = m_mng->m_ids_buffer;
199 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
200 buf.add(IT_Line4);
201 buf.add(4);
202 buf.add(n0);
203 buf.add(n1);
204 buf.add(n2);
205 buf.add(n3);
206 buf.add(0); // no edge
207}
208
209/*---------------------------------------------------------------------------*/
210/*---------------------------------------------------------------------------*/
211
213addFaceTriangle(Integer face_index, Integer n0, Integer n1, Integer n2)
214{
215 _checkDimension(3);
216 Array<Integer>& buf = m_mng->m_ids_buffer;
217 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
218 buf.add(IT_Triangle3);
219 buf.add(3);
220 buf.add(n0);
221 buf.add(n1);
222 buf.add(n2);
223 buf.add(3);
224 for (Integer i = 0; i < 3; ++i)
225 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
226}
227
228/*---------------------------------------------------------------------------*/
229/*---------------------------------------------------------------------------*/
230
232addFaceTriangle6(Integer face_index, Integer n0, Integer n1, Integer n2,
233 Integer n3, Integer n4, Integer n5)
234{
235 _checkDimension(3);
236 Array<Integer>& buf = m_mng->m_ids_buffer;
237 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
238 buf.add(IT_Triangle6);
239 buf.add(6);
240 buf.add(n0);
241 buf.add(n1);
242 buf.add(n2);
243 buf.add(n3);
244 buf.add(n4);
245 buf.add(n5);
246 buf.add(3);
247 for (Integer i = 0; i < 3; ++i)
248 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
249}
250
251/*---------------------------------------------------------------------------*/
252/*---------------------------------------------------------------------------*/
253
255addFaceQuad(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3)
256{
257 _checkDimension(3);
258 Array<Integer>& buf = m_mng->m_ids_buffer;
259 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
260 buf.add(IT_Quad4);
261 buf.add(4);
262 buf.add(n0);
263 buf.add(n1);
264 buf.add(n2);
265 buf.add(n3);
266 buf.add(4);
267 for (Integer i = 0; i < 4; ++i)
268 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
269}
270
271/*---------------------------------------------------------------------------*/
272/*---------------------------------------------------------------------------*/
273
275addFaceQuad8(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3,
276 Integer n4, Integer n5, Integer n6, Integer n7)
277{
278 _checkDimension(3);
279 Array<Integer>& buf = m_mng->m_ids_buffer;
280 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
281 buf.add(IT_Quad8);
282 buf.add(8);
283 buf.add(n0);
284 buf.add(n1);
285 buf.add(n2);
286 buf.add(n3);
287 buf.add(n4);
288 buf.add(n5);
289 buf.add(n6);
290 buf.add(n7);
291 buf.add(4);
292 for (Integer i = 0; i < 4; ++i)
293 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
294}
295
296/*---------------------------------------------------------------------------*/
297/*---------------------------------------------------------------------------*/
298
300addFaceQuad9(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3,
301 Integer n4, Integer n5, Integer n6, Integer n7, Integer n8)
302{
303 _checkDimension(3);
304 Array<Integer>& buf = m_mng->m_ids_buffer;
305 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
306 buf.add(IT_Quad9);
307 buf.add(9);
308 buf.add(n0);
309 buf.add(n1);
310 buf.add(n2);
311 buf.add(n3);
312 buf.add(n4);
313 buf.add(n5);
314 buf.add(n6);
315 buf.add(n7);
316 buf.add(n8);
317 buf.add(4);
318 for (Integer i = 0; i < 4; ++i)
319 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
320}
321
322/*---------------------------------------------------------------------------*/
323/*---------------------------------------------------------------------------*/
324
326addFacePentagon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4)
327{
328 _checkDimension(3);
329 Array<Integer>& buf = m_mng->m_ids_buffer;
330 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
331 buf.add(IT_Pentagon5);
332 buf.add(5);
333 buf.add(n0);
334 buf.add(n1);
335 buf.add(n2);
336 buf.add(n3);
337 buf.add(n4);
338 buf.add(5);
339 for (Integer i = 0; i < 5; ++i)
340 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
341}
342
343/*---------------------------------------------------------------------------*/
344/*---------------------------------------------------------------------------*/
345
347addFaceHexagon(Integer face_index, Integer n0, Integer n1, Integer n2,
348 Integer n3, Integer n4, Integer n5)
349{
350 _checkDimension(3);
351 Array<Integer>& buf = m_mng->m_ids_buffer;
352 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
353 buf.add(IT_Hexagon6);
354 buf.add(6);
355 buf.add(n0);
356 buf.add(n1);
357 buf.add(n2);
358 buf.add(n3);
359 buf.add(n4);
360 buf.add(n5);
361 buf.add(6);
362 for (Integer i = 0; i < 6; ++i)
363 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
364}
365
366/*---------------------------------------------------------------------------*/
367/*---------------------------------------------------------------------------*/
368
370addFaceHeptagon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3,
371 Integer n4, Integer n5, Integer n6)
372{
373 _checkDimension(3);
374 Array<Integer>& buf = m_mng->m_ids_buffer;
375 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
376 buf.add(IT_Heptagon7);
377 buf.add(7);
378 buf.add(n0);
379 buf.add(n1);
380 buf.add(n2);
381 buf.add(n3);
382 buf.add(n4);
383 buf.add(n5);
384 buf.add(n6);
385 buf.add(7);
386 for (Integer i = 0; i < 7; ++i)
387 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
388}
389
390/*---------------------------------------------------------------------------*/
391/*---------------------------------------------------------------------------*/
392
394addFaceOctogon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3,
395 Integer n4, Integer n5, Integer n6, Integer n7)
396{
397 _checkDimension(3);
398 Array<Integer>& buf = m_mng->m_ids_buffer;
399 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
400 buf.add(IT_Octogon8);
401 buf.add(8);
402 buf.add(n0);
403 buf.add(n1);
404 buf.add(n2);
405 buf.add(n3);
406 buf.add(n4);
407 buf.add(n5);
408 buf.add(n6);
409 buf.add(n7);
410 buf.add(8);
411 for (Integer i = 0; i < 8; ++i)
412 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
413}
414
415/*---------------------------------------------------------------------------*/
416/*---------------------------------------------------------------------------*/
417
420{
421 // Actuellement cette méthode est uniquement appelée pour les faces 2D donc
422 // l'élément actuel doit être de dimension 3.
423 _checkDimension(3);
424 Array<Integer>& buf = m_mng->m_ids_buffer;
425 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
426 buf.add(type_id);
427 Integer face_nb_node = n.size();
428 buf.add(face_nb_node);
429 for (Integer i = 0; i < face_nb_node; ++i)
430 buf.add(n[i]);
431 buf.add(face_nb_node); // nb edge; ne traite pas de cas particulier pour n==2
432 for (Integer i = 0; i < face_nb_node; ++i)
433 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
434}
435
436/*---------------------------------------------------------------------------*/
437/*---------------------------------------------------------------------------*/
438
441{
442 Integer cell_nb_edge = nbLocalEdge();
443 for (Integer i_face = 0; i_face < nbLocalFace(); ++i_face) {
444 Array<Integer>& buf = m_mng->m_ids_buffer;
445 Integer fi = buf[m_first_item_index + m_nb_edge + i_face];
446 Integer* index = &buf[fi];
447 LocalFace local_face(index);
448 Integer face_nb_node = local_face.nbNode();
449 Integer face_nb_edge = local_face.nbEdge();
450 for (Integer i_edge = 0; i_edge < face_nb_edge; ++i_edge) {
451 // L'objectif est de trouver l'arête de sommet [i_edge, i_edge+1] dans l'élément
452 Integer beginNode = local_face.node(i_edge);
453 Integer endNode = local_face.node((i_edge + 1) % face_nb_edge);
454 Integer face_edge = -1;
455 for (Integer i = 0; i < cell_nb_edge; ++i) {
456 LocalEdge local_edge = localEdge(i);
457 if ((local_edge.beginNode() == beginNode && local_edge.endNode() == endNode) ||
458 (local_edge.beginNode() == endNode && local_edge.endNode() == beginNode)) {
459 if (face_edge != -1)
460 ARCANE_FATAL("Conflicting item definition : duplicated edge [{0}:{1}] found as edge {2} and {3} of item {4}({5})",
461 beginNode, endNode, face_edge, i, typeName(), typeId());
462 face_edge = i;
463 }
464 }
465 if (face_edge == -1)
466 ARCANE_FATAL("Undefined edge [{0}:{1}] found as edge of item {2}({3})",
467 beginNode, endNode, typeName(), typeId());
468 index[3 + face_nb_node + i_edge] = face_edge;
469 ARCANE_ASSERT((face_edge == local_face.edge(i_edge)), ("Inconsitent face-edge allocation"));
470 }
471 }
472}
473
474/*---------------------------------------------------------------------------*/
475/*---------------------------------------------------------------------------*/
476
477void ItemTypeInfoBuilder::
478_setNbEdgeAndFace(Integer nb_edge, Integer nb_face)
479{
480 m_nb_face = nb_face;
481 m_nb_edge = nb_edge;
482 Integer total = m_nb_face + m_nb_edge;
483 if (total != 0) {
484 Array<Integer>& buf = m_mng->m_ids_buffer;
485 m_first_item_index = buf.size();
486 buf.resize(m_first_item_index + total);
487 }
488}
489
490/*---------------------------------------------------------------------------*/
491/*---------------------------------------------------------------------------*/
492
493void ItemTypeInfoBuilder::
494_checkSetIsPolygon()
495{
496 m_is_polygon = (m_order == 1 && m_dimension == 2 && m_nb_node > 4);
497}
498
499/*---------------------------------------------------------------------------*/
500/*---------------------------------------------------------------------------*/
501
502} // End namespace Arcane
503
504/*---------------------------------------------------------------------------*/
505/*---------------------------------------------------------------------------*/
506
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Déclarations des types généraux de Arcane.
Integer size() const
Nombre d'éléments du vecteur.
Tableau d'items de types quelconques.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
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.
bool m_is_polygon
Indique si le type est un polygone.
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
UniqueArray< Integer > m_ids_buffer
Tableau contenant les données de type.
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.