Arcane  v3.16.2.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
192addFaceTriangle(Integer face_index, Integer n0, Integer n1, Integer n2)
193{
194 _checkDimension(3);
195 Array<Integer>& buf = m_mng->m_ids_buffer;
196 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
197 buf.add(IT_Triangle3);
198 buf.add(3);
199 buf.add(n0);
200 buf.add(n1);
201 buf.add(n2);
202 buf.add(3);
203 for (Integer i = 0; i < 3; ++i)
204 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
205}
206
207/*---------------------------------------------------------------------------*/
208/*---------------------------------------------------------------------------*/
209
211addFaceTriangle6(Integer face_index, Integer n0, Integer n1, Integer n2,
212 Integer n3, Integer n4, Integer n5)
213{
214 _checkDimension(3);
215 Array<Integer>& buf = m_mng->m_ids_buffer;
216 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
217 buf.add(IT_Triangle6);
218 buf.add(6);
219 buf.add(n0);
220 buf.add(n1);
221 buf.add(n2);
222 buf.add(n3);
223 buf.add(n4);
224 buf.add(n5);
225 buf.add(3);
226 for (Integer i = 0; i < 3; ++i)
227 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
228}
229
230/*---------------------------------------------------------------------------*/
231/*---------------------------------------------------------------------------*/
232
234addFaceQuad(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3)
235{
236 _checkDimension(3);
237 Array<Integer>& buf = m_mng->m_ids_buffer;
238 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
239 buf.add(IT_Quad4);
240 buf.add(4);
241 buf.add(n0);
242 buf.add(n1);
243 buf.add(n2);
244 buf.add(n3);
245 buf.add(4);
246 for (Integer i = 0; i < 4; ++i)
247 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
248}
249
250/*---------------------------------------------------------------------------*/
251/*---------------------------------------------------------------------------*/
252
254addFaceQuad8(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3,
255 Integer n4, Integer n5, Integer n6, Integer n7)
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_Quad8);
261 buf.add(8);
262 buf.add(n0);
263 buf.add(n1);
264 buf.add(n2);
265 buf.add(n3);
266 buf.add(n4);
267 buf.add(n5);
268 buf.add(n6);
269 buf.add(n7);
270 buf.add(4);
271 for (Integer i = 0; i < 4; ++i)
272 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
273}
274
275/*---------------------------------------------------------------------------*/
276/*---------------------------------------------------------------------------*/
277
279addFacePentagon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4)
280{
281 _checkDimension(3);
282 Array<Integer>& buf = m_mng->m_ids_buffer;
283 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
284 buf.add(IT_Pentagon5);
285 buf.add(5);
286 buf.add(n0);
287 buf.add(n1);
288 buf.add(n2);
289 buf.add(n3);
290 buf.add(n4);
291 buf.add(5);
292 for (Integer i = 0; i < 5; ++i)
293 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
294}
295
296/*---------------------------------------------------------------------------*/
297/*---------------------------------------------------------------------------*/
298
300addFaceHexagon(Integer face_index, Integer n0, Integer n1, Integer n2,
301 Integer n3, Integer n4, Integer n5)
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_Hexagon6);
307 buf.add(6);
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(6);
315 for (Integer i = 0; i < 6; ++i)
316 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
317}
318
319/*---------------------------------------------------------------------------*/
320/*---------------------------------------------------------------------------*/
321
323addFaceHeptagon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3,
324 Integer n4, Integer n5, Integer n6)
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_Heptagon7);
330 buf.add(7);
331 buf.add(n0);
332 buf.add(n1);
333 buf.add(n2);
334 buf.add(n3);
335 buf.add(n4);
336 buf.add(n5);
337 buf.add(n6);
338 buf.add(7);
339 for (Integer i = 0; i < 7; ++i)
340 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
341}
342
343/*---------------------------------------------------------------------------*/
344/*---------------------------------------------------------------------------*/
345
347addFaceOctogon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3,
348 Integer n4, Integer n5, Integer n6, Integer n7)
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_Octogon8);
354 buf.add(8);
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(n6);
362 buf.add(n7);
363 buf.add(8);
364 for (Integer i = 0; i < 8; ++i)
365 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
366}
367
368/*---------------------------------------------------------------------------*/
369/*---------------------------------------------------------------------------*/
370
373{
374 // Actuellement cette méthode est uniquement appelée pour les faces 2D donc
375 // l'élément actuel doit être de dimension 3.
376 _checkDimension(3);
377 Array<Integer>& buf = m_mng->m_ids_buffer;
378 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
379 buf.add(type_id);
380 Integer face_nb_node = n.size();
381 buf.add(face_nb_node);
382 for (Integer i = 0; i < face_nb_node; ++i)
383 buf.add(n[i]);
384 buf.add(face_nb_node); // nb edge; ne traite pas de cas particulier pour n==2
385 for (Integer i = 0; i < face_nb_node; ++i)
386 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
387}
388
389/*---------------------------------------------------------------------------*/
390/*---------------------------------------------------------------------------*/
391
394{
395 Integer cell_nb_edge = nbLocalEdge();
396 for (Integer i_face = 0; i_face < nbLocalFace(); ++i_face) {
397 Array<Integer>& buf = m_mng->m_ids_buffer;
398 Integer fi = buf[m_first_item_index + m_nb_edge + i_face];
399 Integer* index = &buf[fi];
400 LocalFace local_face(index);
401 Integer face_nb_node = local_face.nbNode();
402 Integer face_nb_edge = local_face.nbEdge();
403 for (Integer i_edge = 0; i_edge < face_nb_edge; ++i_edge) {
404 // L'objectif est de trouver l'arête de sommet [i_edge, i_edge+1] dans l'élément
405 Integer beginNode = local_face.node(i_edge);
406 Integer endNode = local_face.node((i_edge + 1) % face_nb_edge);
407 Integer face_edge = -1;
408 for (Integer i = 0; i < cell_nb_edge; ++i) {
409 LocalEdge local_edge = localEdge(i);
410 if ((local_edge.beginNode() == beginNode && local_edge.endNode() == endNode) ||
411 (local_edge.beginNode() == endNode && local_edge.endNode() == beginNode)) {
412 if (face_edge != -1)
413 ARCANE_FATAL("Conflicting item definition : duplicated edge [{0}:{1}] found as edge {2} and {3} of item {4}({5})",
414 beginNode, endNode, face_edge, i, typeName(), typeId());
415 face_edge = i;
416 }
417 }
418 if (face_edge == -1)
419 ARCANE_FATAL("Undefined edge [{0}:{1}] found as edge of item {2}({3})",
420 beginNode, endNode, typeName(), typeId());
421 index[3 + face_nb_node + i_edge] = face_edge;
422 ARCANE_ASSERT((face_edge == local_face.edge(i_edge)), ("Inconsitent face-edge allocation"));
423 }
424 }
425}
426
427/*---------------------------------------------------------------------------*/
428/*---------------------------------------------------------------------------*/
429
430void ItemTypeInfoBuilder::
431_setNbEdgeAndFace(Integer nb_edge, Integer nb_face)
432{
433 m_nb_face = nb_face;
434 m_nb_edge = nb_edge;
435 Integer total = m_nb_face + m_nb_edge;
436 if (total != 0) {
437 Array<Integer>& buf = m_mng->m_ids_buffer;
438 m_first_item_index = buf.size();
439 buf.resize(m_first_item_index + total);
440 }
441}
442
443/*---------------------------------------------------------------------------*/
444/*---------------------------------------------------------------------------*/
445
446} // End namespace Arcane
447
448/*---------------------------------------------------------------------------*/
449/*---------------------------------------------------------------------------*/
450
#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.
Classe de base des vecteurs 1D de données.
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 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.
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 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.