Arcane  v3.16.0.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_dimension = static_cast<Int16>(dimension);
51 m_nb_node = nb_node;
52 m_type_name = type_name;
53 _setNbEdgeAndFace(nb_edge, nb_face);
54}
55
56/*---------------------------------------------------------------------------*/
57/*---------------------------------------------------------------------------*/
58
59void ItemTypeInfoBuilder::
60setInfos(ItemTypeMng* mng, ItemTypeId type_id, String type_name,
61 Int32 nb_node, Int32 nb_edge, Int32 nb_face)
62{
63 setInfos(mng, type_id, type_name, Dimension::DimUnknown, nb_node, nb_edge, nb_face);
64}
65
66/*---------------------------------------------------------------------------*/
67/*---------------------------------------------------------------------------*/
68
69void ItemTypeInfoBuilder::
70setInfos(ItemTypeMng* mng, Int16 type_id, String type_name,
71 Int32 nb_node, Int32 nb_edge, Int32 nb_face)
72{
73 setInfos(mng, ItemTypeId::fromInteger(type_id), type_name, nb_node, nb_edge, nb_face);
74}
75
76/*---------------------------------------------------------------------------*/
77/*---------------------------------------------------------------------------*/
78
79void ItemTypeInfoBuilder::
80setInfos(ItemTypeMng* mng, Int16 type_id, String type_name, Dimension dimension,
81 Int32 nb_node, Int32 nb_edge, Int32 nb_face)
82{
83 setInfos(mng, ItemTypeId(type_id), type_name, dimension, nb_node, nb_edge, nb_face);
84}
85
86/*---------------------------------------------------------------------------*/
87/*---------------------------------------------------------------------------*/
88
90addEdge(Int32 edge_index, Int32 n0, Int32 n1, Int32 f_left, Int32 f_right)
91{
92 Array<Integer>& buf = m_mng->m_ids_buffer;
93 buf[m_first_item_index + edge_index] = buf.size();
94 buf.add(n0);
95 buf.add(n1);
96 buf.add(f_left);
97 buf.add(f_right);
98}
99
100/*---------------------------------------------------------------------------*/
101/*---------------------------------------------------------------------------*/
102
104addFaceVertex(Integer face_index, Integer n0)
105{
106 _checkDimension(1);
107 Array<Integer>& buf = m_mng->m_ids_buffer;
108 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
109 buf.add(IT_FaceVertex);
110 buf.add(1);
111 buf.add(n0);
112 buf.add(0); // no edge
113}
114
115/*---------------------------------------------------------------------------*/
116/*---------------------------------------------------------------------------*/
117
119addFaceLine(Integer face_index, Integer n0, Integer n1)
120{
121 _checkDimension(2);
122 Array<Integer>& buf = m_mng->m_ids_buffer;
123 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
124 buf.add(IT_Line2);
125 buf.add(2);
126 buf.add(n0);
127 buf.add(n1);
128 buf.add(0); // no edge
129}
130
131//! Ajoute une ligne quadratique à la liste des faces (pour les elements 2D)
133addFaceLine3(Integer face_index, Integer n0, Integer n1, Integer n2)
134{
135 _checkDimension(2);
136 Array<Integer>& buf = m_mng->m_ids_buffer;
137 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
138 buf.add(IT_Line3);
139 buf.add(3);
140 buf.add(n0);
141 buf.add(n1);
142 buf.add(n2);
143 buf.add(0); // no edge
144}
145
146/*---------------------------------------------------------------------------*/
147/*---------------------------------------------------------------------------*/
148
150addFaceTriangle(Integer face_index, Integer n0, Integer n1, Integer n2)
151{
152 _checkDimension(3);
153 Array<Integer>& buf = m_mng->m_ids_buffer;
154 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
155 buf.add(IT_Triangle3);
156 buf.add(3);
157 buf.add(n0);
158 buf.add(n1);
159 buf.add(n2);
160 buf.add(3);
161 for (Integer i = 0; i < 3; ++i)
162 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
163}
164
165/*---------------------------------------------------------------------------*/
166/*---------------------------------------------------------------------------*/
167
169addFaceTriangle6(Integer face_index, Integer n0, Integer n1, Integer n2,
170 Integer n3, Integer n4, Integer n5)
171{
172 _checkDimension(3);
173 Array<Integer>& buf = m_mng->m_ids_buffer;
174 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
175 buf.add(IT_Triangle6);
176 buf.add(6);
177 buf.add(n0);
178 buf.add(n1);
179 buf.add(n2);
180 buf.add(n3);
181 buf.add(n4);
182 buf.add(n5);
183 buf.add(3);
184 for (Integer i = 0; i < 3; ++i)
185 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
186}
187
188/*---------------------------------------------------------------------------*/
189/*---------------------------------------------------------------------------*/
190
192addFaceQuad(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3)
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_Quad4);
198 buf.add(4);
199 buf.add(n0);
200 buf.add(n1);
201 buf.add(n2);
202 buf.add(n3);
203 buf.add(4);
204 for (Integer i = 0; i < 4; ++i)
205 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
206}
207
208/*---------------------------------------------------------------------------*/
209/*---------------------------------------------------------------------------*/
210
212addFaceQuad8(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3,
213 Integer n4, Integer n5, Integer n6, Integer n7)
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_Quad8);
219 buf.add(8);
220 buf.add(n0);
221 buf.add(n1);
222 buf.add(n2);
223 buf.add(n3);
224 buf.add(n4);
225 buf.add(n5);
226 buf.add(n6);
227 buf.add(n7);
228 buf.add(4);
229 for (Integer i = 0; i < 4; ++i)
230 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
231}
232
233/*---------------------------------------------------------------------------*/
234/*---------------------------------------------------------------------------*/
235
237addFacePentagon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4)
238{
239 _checkDimension(3);
240 Array<Integer>& buf = m_mng->m_ids_buffer;
241 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
242 buf.add(IT_Pentagon5);
243 buf.add(5);
244 buf.add(n0);
245 buf.add(n1);
246 buf.add(n2);
247 buf.add(n3);
248 buf.add(n4);
249 buf.add(5);
250 for (Integer i = 0; i < 5; ++i)
251 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
252}
253
254/*---------------------------------------------------------------------------*/
255/*---------------------------------------------------------------------------*/
256
258addFaceHexagon(Integer face_index, Integer n0, Integer n1, Integer n2,
259 Integer n3, Integer n4, Integer n5)
260{
261 _checkDimension(3);
262 Array<Integer>& buf = m_mng->m_ids_buffer;
263 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
264 buf.add(IT_Hexagon6);
265 buf.add(6);
266 buf.add(n0);
267 buf.add(n1);
268 buf.add(n2);
269 buf.add(n3);
270 buf.add(n4);
271 buf.add(n5);
272 buf.add(6);
273 for (Integer i = 0; i < 6; ++i)
274 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
275}
276
277/*---------------------------------------------------------------------------*/
278/*---------------------------------------------------------------------------*/
279
281addFaceHeptagon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3,
282 Integer n4, Integer n5, Integer n6)
283{
284 _checkDimension(3);
285 Array<Integer>& buf = m_mng->m_ids_buffer;
286 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
287 buf.add(IT_Heptagon7);
288 buf.add(7);
289 buf.add(n0);
290 buf.add(n1);
291 buf.add(n2);
292 buf.add(n3);
293 buf.add(n4);
294 buf.add(n5);
295 buf.add(n6);
296 buf.add(7);
297 for (Integer i = 0; i < 7; ++i)
298 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
299}
300
301/*---------------------------------------------------------------------------*/
302/*---------------------------------------------------------------------------*/
303
305addFaceOctogon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3,
306 Integer n4, Integer n5, Integer n6, Integer n7)
307{
308 _checkDimension(3);
309 Array<Integer>& buf = m_mng->m_ids_buffer;
310 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
311 buf.add(IT_Octogon8);
312 buf.add(8);
313 buf.add(n0);
314 buf.add(n1);
315 buf.add(n2);
316 buf.add(n3);
317 buf.add(n4);
318 buf.add(n5);
319 buf.add(n6);
320 buf.add(n7);
321 buf.add(8);
322 for (Integer i = 0; i < 8; ++i)
323 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
324}
325
326/*---------------------------------------------------------------------------*/
327/*---------------------------------------------------------------------------*/
328
331{
332 // Actuellement cette méthode est uniquement appelée pour les faces 2D donc
333 // l'élément actuel doit être de dimension 3.
334 _checkDimension(3);
335 Array<Integer>& buf = m_mng->m_ids_buffer;
336 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
337 buf.add(type_id);
338 Integer face_nb_node = n.size();
339 buf.add(face_nb_node);
340 for (Integer i = 0; i < face_nb_node; ++i)
341 buf.add(n[i]);
342 buf.add(face_nb_node); // nb edge; ne traite pas de cas particulier pour n==2
343 for (Integer i = 0; i < face_nb_node; ++i)
344 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
345}
346
347/*---------------------------------------------------------------------------*/
348/*---------------------------------------------------------------------------*/
349
352{
353 Integer cell_nb_edge = nbLocalEdge();
354 for (Integer i_face = 0; i_face < nbLocalFace(); ++i_face) {
355 Array<Integer>& buf = m_mng->m_ids_buffer;
356 Integer fi = buf[m_first_item_index + m_nb_edge + i_face];
357 Integer* index = &buf[fi];
358 LocalFace local_face(index);
359 Integer face_nb_node = local_face.nbNode();
360 Integer face_nb_edge = local_face.nbEdge();
361 for (Integer i_edge = 0; i_edge < face_nb_edge; ++i_edge) {
362 // L'objectif est de trouver l'arête de sommet [i_edge, i_edge+1] dans l'élément
363 Integer beginNode = local_face.node(i_edge);
364 Integer endNode = local_face.node((i_edge + 1) % face_nb_edge);
365 Integer face_edge = -1;
366 for (Integer i = 0; i < cell_nb_edge; ++i) {
367 LocalEdge local_edge = localEdge(i);
368 if ((local_edge.beginNode() == beginNode && local_edge.endNode() == endNode) ||
369 (local_edge.beginNode() == endNode && local_edge.endNode() == beginNode)) {
370 if (face_edge != -1)
371 ARCANE_FATAL("Conflicting item definition : duplicated edge [{0}:{1}] found as edge {2} and {3} of item {4}({5})",
372 beginNode, endNode, face_edge, i, typeName(), typeId());
373 face_edge = i;
374 }
375 }
376 if (face_edge == -1)
377 ARCANE_FATAL("Undefined edge [{0}:{1}] found as edge of item {2}({3})",
378 beginNode, endNode, typeName(), typeId());
379 index[3 + face_nb_node + i_edge] = face_edge;
380 ARCANE_ASSERT((face_edge == local_face.edge(i_edge)), ("Inconsitent face-edge allocation"));
381 }
382 }
383}
384
385/*---------------------------------------------------------------------------*/
386/*---------------------------------------------------------------------------*/
387
388void ItemTypeInfoBuilder::
389_setNbEdgeAndFace(Integer nb_edge, Integer nb_face)
390{
391 m_nb_face = nb_face;
392 m_nb_edge = nb_edge;
393 Integer total = m_nb_face + m_nb_edge;
394 if (total != 0) {
395 Array<Integer>& buf = m_mng->m_ids_buffer;
396 m_first_item_index = buf.size();
397 buf.resize(m_first_item_index + total);
398 }
399}
400
401/*---------------------------------------------------------------------------*/
402/*---------------------------------------------------------------------------*/
403
404} // End namespace Arcane
405
406/*---------------------------------------------------------------------------*/
407/*---------------------------------------------------------------------------*/
408
#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 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 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 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.
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 nbLocalFace() const
Nombre de faces de l'entité
Int16 typeId() const
Numéro du type.
Gestionnaire des types d'entités de maillage.
Definition ItemTypeMng.h:66
UniqueArray< Integer > m_ids_buffer
Tampon d'allocation des 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.