Arcane  v3.15.3.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::
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::
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{
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) {
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.
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.
Informations locales sur une face d'une maille.
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.
Référence à une instance.
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-