Arcane  v3.15.3.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ItemTypeMng.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/* ItemTypeMng.cc (C) 2000-2025 */
9/* */
10/* Gestionnaire des types d'entite du maillage. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/core/ItemTypeMng.h"
15
16#include "arcane/utils/Iostream.h"
17#include "arcane/utils/String.h"
18#include "arcane/utils/PlatformUtils.h"
19#include "arcane/utils/ITraceMng.h"
20#include "arcane/utils/TraceAccessor.h"
21#include "arcane/utils/IStackTraceService.h"
22#include "arcane/utils/IOException.h"
23#include "arcane/utils/FatalErrorException.h"
24#include "arcane/utils/Array.h"
25#include "arcane/utils/MultiBuffer.h"
26
27#include "arcane/core/ItemTypeInfoBuilder.h"
28#include "arcane/core/IParallelSuperMng.h"
29#include "arcane/core/ItemTypeInfoBuilder.h"
30
31// AMR
32#include "arcane/ItemRefinementPattern.h"
33
34#include <map>
35#include <set>
36
37/*---------------------------------------------------------------------------*/
38/*---------------------------------------------------------------------------*/
39
40namespace Arcane
41{
42
43/*---------------------------------------------------------------------------*/
44/*---------------------------------------------------------------------------*/
45
46const Integer ItemTypeMng::m_nb_builtin_item_type = NB_BASIC_ITEM_TYPE;
47
48/*---------------------------------------------------------------------------*/
49/*---------------------------------------------------------------------------*/
50
53: m_initialized(false)
54, m_types_buffer(0)
55{
56 m_initialized_counter = 0;
57}
58
59/*---------------------------------------------------------------------------*/
60/*---------------------------------------------------------------------------*/
61
62ItemTypeMng::
63~ItemTypeMng()
64{
65 delete m_types_buffer;
66}
67
68/*---------------------------------------------------------------------------*/
69/*---------------------------------------------------------------------------*/
70
73{
74 // Avec MPC, cette fonction peut être appelée plusieurs fois
75 // dans des threads différents. Comme tous les threads partagent
76 // le même singleton, seul le premier thread fait réelement l'init.
77 // ATTENTION: Cela est incompatible avec le mode readTypes()
78 // ou on lit les connectivités dans un fichier ARCANE_ITEM_TYPE_FILE.
79 Int32 max_rank = parallel_mng->commSize() + 1;
80 Int32 init_counter = ++m_initialized_counter;
81 if (init_counter == 1) {
82 _build(parallel_mng, trace);
83 m_initialized = true;
84 m_initialized_counter = max_rank;
85 }
86 else
87 // Ceux qui ne font pas l'init doivent attendre que cette derniere
88 // soit faite.
89 while (init_counter < max_rank)
90 init_counter = m_initialized_counter.load();
91}
92
93/*---------------------------------------------------------------------------*/
94/*---------------------------------------------------------------------------*/
95
98{
99 // Construit la connectivité des éléments.
100 // Pour les éléments classiques, la connectivité est la même que
101 // celle de VTK, disponible dans le document:
102 //
103 // https://vtk.org/wp-content/uploads/2015/04/file-formats.pdf
104
105 using Dimension = ItemTypeInfoBuilder::Dimension;
106
107 m_trace = trace;
110
111 // Null
112 {
113 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
114 m_types[IT_NullType] = type;
115
116 type->setInfos(this, IT_NullType, "NullType", Dimension::DimUnknown, 0, 0, 0);
117 }
118
119 // Vertex
120 {
121 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
122 m_types[IT_Vertex] = type;
123
124 type->setInfos(this, IT_Vertex, "Vertex", Dimension::Dim0, 0, 0, 0);
125 // TODO regarder si ce type est autorisé pour les mailles.
126 // Si ce n'est pas le cas, il faudrait définir un type
127 // pour les mailles 0D qui sont assimilables à des points.
128 }
129
130 // FaceVertex (face pour les maillages 1D)
131 {
132 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
133 m_types[IT_FaceVertex] = type;
134
135 type->setInfos(this, IT_FaceVertex, "FaceVertex", Dimension::Dim0, 1, 0, 0);
136 type->setIsValidForCell(false);
137 }
138
139 // Line2
140 {
141 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
142 m_types[IT_Line2] = type;
143
144 type->setInfos(this, IT_Line2, "Line2", Dimension::Dim1, 2, 0, 0);
145 type->setIsValidForCell(false);
146 }
147
148 // Line3
149 {
150 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
151 m_types[IT_Line3] = type;
152
153 type->setInfos(this, IT_Line3, "Line3", Dimension::Dim1, 3, 0, 0);
154 type->setIsValidForCell(false);
155 }
156
157 // CellLine2 (mailles pour les maillages 1D)
158 {
159 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
160 m_types[IT_CellLine2] = type;
161
162 type->setInfos(this, IT_CellLine2, "CellLine2", Dimension::Dim1, 2, 0, 2);
163
164 type->addFaceVertex(0, 0);
165 type->addFaceVertex(1, 1);
166 }
167
175 // Triangle3
176 {
177 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
178 m_types[IT_Triangle3] = type;
179
180 type->setInfos(this, IT_Triangle3, "Triangle3", Dimension::Dim2, 3, 3, 3);
181
182 type->addFaceLine(0, 0, 1);
183 type->addFaceLine(1, 1, 2);
184 type->addFaceLine(2, 2, 0);
185
186 type->addEdge(0, 0, 1, 1, 2);
187 type->addEdge(1, 1, 2, 2, 0);
188 type->addEdge(2, 2, 0, 0, 1);
189 }
190
191 // Triangle6
192 {
193 // TODO: Pour l'instant comme triangle3
194 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
195 m_types[IT_Triangle6] = type;
196
197 type->setInfos(this, IT_Triangle6, "Triangle6", Dimension::Dim2, 6, 3, 3);
198
199 type->addFaceLine3(0, 0, 1, 3);
200 type->addFaceLine3(1, 1, 2, 4);
201 type->addFaceLine3(2, 2, 0, 5);
202
203 type->addEdge(0, 0, 1, 1, 2);
204 type->addEdge(1, 1, 2, 2, 0);
205 type->addEdge(2, 2, 0, 0, 1);
206 }
207
208 // Quad4
209 {
210 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
211 m_types[IT_Quad4] = type;
212
213 type->setInfos(this, IT_Quad4, "Quad4", Dimension::Dim2, 4, 4, 4);
214
215 type->addFaceLine(0, 0, 1);
216 type->addFaceLine(1, 1, 2);
217 type->addFaceLine(2, 2, 3);
218 type->addFaceLine(3, 3, 0);
219
220 type->addEdge(0, 0, 1, 3, 1);
221 type->addEdge(1, 1, 2, 0, 2);
222 type->addEdge(2, 2, 3, 1, 3);
223 type->addEdge(3, 3, 0, 2, 0);
224 }
225
226 // Quad8
227 {
228 // TODO: Pour l'instant comme quad4
229 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
230 m_types[IT_Quad8] = type;
231
232 type->setInfos(this, IT_Quad8, "Quad8", Dimension::Dim2, 8, 4, 4);
233
234 type->addFaceLine3(0, 0, 1, 4);
235 type->addFaceLine3(1, 1, 2, 5);
236 type->addFaceLine3(2, 2, 3, 6);
237 type->addFaceLine3(3, 3, 0, 7);
238
239 type->addEdge(0, 0, 1, 3, 1);
240 type->addEdge(1, 1, 2, 0, 2);
241 type->addEdge(2, 2, 3, 1, 3);
242 type->addEdge(3, 3, 0, 2, 0);
243 }
244
245 // Pentagon5
246 {
247 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
248 m_types[IT_Pentagon5] = type;
249
250 type->setInfos(this, IT_Pentagon5, "Pentagon5", Dimension::Dim2, 5, 5, 5);
251
252 type->addFaceLine(0, 0, 1);
253 type->addFaceLine(1, 1, 2);
254 type->addFaceLine(2, 2, 3);
255 type->addFaceLine(3, 3, 4);
256 type->addFaceLine(4, 4, 0);
257
258 type->addEdge(0, 0, 1, 4, 1);
259 type->addEdge(1, 1, 2, 0, 2);
260 type->addEdge(2, 2, 3, 1, 3);
261 type->addEdge(3, 3, 4, 2, 4);
262 type->addEdge(4, 4, 0, 3, 0);
263 }
264
265 // Hexagon6
266 {
267 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
268 m_types[IT_Hexagon6] = type;
269
270 type->setInfos(this, IT_Hexagon6, "Hexagon6", Dimension::Dim2, 6, 6, 6);
271
272 type->addFaceLine(0, 0, 1);
273 type->addFaceLine(1, 1, 2);
274 type->addFaceLine(2, 2, 3);
275 type->addFaceLine(3, 3, 4);
276 type->addFaceLine(4, 4, 5);
277 type->addFaceLine(5, 5, 0);
278
279 type->addEdge(0, 0, 1, 5, 1);
280 type->addEdge(1, 1, 2, 0, 2);
281 type->addEdge(2, 2, 3, 1, 3);
282 type->addEdge(3, 3, 4, 2, 4);
283 type->addEdge(4, 4, 5, 3, 5);
284 type->addEdge(5, 5, 0, 4, 0);
285 }
286
287 // Hexaedron8
288 {
289 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
290 m_types[IT_Hexaedron8] = type;
291
292 type->setInfos(this, IT_Hexaedron8, "Hexaedron8", Dimension::Dim3, 8, 12, 6);
293
294 type->addFaceQuad(0, 0, 3, 2, 1);
295 type->addFaceQuad(1, 0, 4, 7, 3);
296 type->addFaceQuad(2, 0, 1, 5, 4);
297 type->addFaceQuad(3, 4, 5, 6, 7);
298 type->addFaceQuad(4, 1, 2, 6, 5);
299 type->addFaceQuad(5, 2, 3, 7, 6);
300
301 type->addEdge(0, 0, 1, 2, 0);
302 type->addEdge(1, 1, 2, 4, 0);
303 type->addEdge(2, 2, 3, 5, 0);
304 type->addEdge(3, 3, 0, 1, 0);
305 type->addEdge(4, 0, 4, 1, 2);
306 type->addEdge(5, 1, 5, 2, 4);
307 type->addEdge(6, 2, 6, 4, 5);
308 type->addEdge(7, 3, 7, 5, 1);
309 type->addEdge(8, 4, 5, 3, 2);
310 type->addEdge(9, 5, 6, 3, 4);
311 type->addEdge(10, 6, 7, 3, 5);
312 type->addEdge(11, 7, 4, 3, 1);
313 }
314
315 // Hexaedron20
316 {
317 // Pour l'instant comme Hexaedron8
318 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
319 m_types[IT_Hexaedron20] = type;
320
321 type->setInfos(this, IT_Hexaedron20, "Hexaedron20", Dimension::Dim3, 20, 12, 6);
322
323 type->addFaceQuad8(0, 0, 3, 2, 1, 11, 10, 9, 8);
324 type->addFaceQuad8(1, 0, 4, 7, 3, 16, 15, 19, 11);
325 type->addFaceQuad8(2, 0, 1, 5, 4, 8, 17, 12, 16);
326 type->addFaceQuad8(3, 4, 5, 6, 7, 19, 13, 14, 15);
327 type->addFaceQuad8(4, 1, 2, 6, 5, 9, 18, 13, 17);
328 type->addFaceQuad8(5, 2, 3, 7, 6, 10, 19, 14, 18);
329
330 type->addEdge(0, 0, 1, 2, 0);
331 type->addEdge(1, 1, 2, 4, 0);
332 type->addEdge(2, 2, 3, 5, 0);
333 type->addEdge(3, 3, 0, 1, 0);
334 type->addEdge(4, 0, 4, 1, 2);
335 type->addEdge(5, 1, 5, 2, 4);
336 type->addEdge(6, 2, 6, 4, 5);
337 type->addEdge(7, 3, 7, 5, 1);
338 type->addEdge(8, 4, 5, 3, 2);
339 type->addEdge(9, 5, 6, 3, 4);
340 type->addEdge(10, 6, 7, 3, 5);
341 type->addEdge(11, 7, 4, 3, 1);
342 }
343
344 // Pyramid5
345 {
346 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
347 m_types[IT_Pyramid5] = type;
348
349 type->setInfos(this, IT_Pyramid5, "Pyramid5", Dimension::Dim3, 5, 8, 5);
350
351 type->addFaceQuad(0, 0, 3, 2, 1);
352 type->addFaceTriangle(1, 0, 4, 3);
353 type->addFaceTriangle(2, 0, 1, 4);
354 type->addFaceTriangle(3, 1, 2, 4);
355 type->addFaceTriangle(4, 2, 3, 4);
356
357 type->addEdge(0, 0, 1, 2, 0);
358 type->addEdge(1, 1, 2, 3, 0);
359 type->addEdge(2, 2, 3, 4, 0);
360 type->addEdge(3, 3, 0, 1, 0);
361 type->addEdge(4, 0, 4, 1, 2);
362 type->addEdge(5, 1, 4, 2, 3);
363 type->addEdge(6, 2, 4, 3, 4);
364 type->addEdge(7, 3, 4, 4, 1);
365 }
366
367 // Pentaedron6
368 {
369 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
370 m_types[IT_Pentaedron6] = type;
371
372 type->setInfos(this, IT_Pentaedron6, "Pentaedron6", Dimension::Dim3, 6, 9, 5);
373
374 type->addFaceTriangle(0, 0, 2, 1);
375 type->addFaceQuad(1, 0, 3, 5, 2);
376 type->addFaceQuad(2, 0, 1, 4, 3);
377 type->addFaceTriangle(3, 3, 4, 5);
378 type->addFaceQuad(4, 1, 2, 5, 4);
379
380 type->addEdge(0, 0, 1, 2, 0);
381 type->addEdge(1, 1, 2, 4, 0);
382 type->addEdge(2, 2, 0, 1, 0);
383 type->addEdge(3, 0, 3, 1, 2);
384 type->addEdge(4, 1, 4, 2, 4);
385 type->addEdge(5, 2, 5, 4, 1);
386 type->addEdge(6, 3, 4, 3, 2);
387 type->addEdge(7, 4, 5, 3, 4);
388 type->addEdge(8, 5, 3, 3, 1);
389 }
390
391 // Tetraedron4
392 {
393 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
394 m_types[IT_Tetraedron4] = type;
395
396 type->setInfos(this, IT_Tetraedron4, "Tetraedron4", Dimension::Dim3, 4, 6, 4);
397
398 type->addFaceTriangle(0, 0, 2, 1);
399 type->addFaceTriangle(1, 0, 3, 2);
400 type->addFaceTriangle(2, 0, 1, 3);
401 type->addFaceTriangle(3, 1, 2, 3);
402
403 type->addEdge(0, 0, 1, 2, 0);
404 type->addEdge(1, 1, 2, 3, 0);
405 type->addEdge(2, 2, 0, 1, 0);
406 type->addEdge(3, 0, 3, 1, 2);
407 type->addEdge(4, 1, 3, 2, 3);
408 type->addEdge(5, 2, 3, 3, 1);
409 }
410
411 // Tetraedron10
412 {
413 // Pour l'instant comme Tetraedron4
414 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
415 m_types[IT_Tetraedron10] = type;
416
417 type->setInfos(this, IT_Tetraedron10, "Tetraedron10", Dimension::Dim3, 10, 6, 4);
418
419 type->addFaceTriangle6(0, 0, 2, 1, 6, 5, 4);
420 type->addFaceTriangle6(1, 0, 3, 2, 7, 9, 6);
421 type->addFaceTriangle6(2, 0, 1, 3, 4, 8, 7);
422 type->addFaceTriangle6(3, 1, 2, 3, 5, 9, 8);
423
424 type->addEdge(0, 0, 1, 2, 0);
425 type->addEdge(1, 1, 2, 3, 0);
426 type->addEdge(2, 2, 0, 1, 0);
427 type->addEdge(3, 0, 3, 1, 2);
428 type->addEdge(4, 1, 3, 2, 3);
429 type->addEdge(5, 2, 3, 3, 1);
430 }
431
432 // Heptaedron10
433 {
434 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
435 m_types[IT_Heptaedron10] = type;
436
437 type->setInfos(this, IT_Heptaedron10, "Heptaedron10", Dimension::Dim3, 10, 15, 7);
438
439 type->addFacePentagon(0, 0, 4, 3, 2, 1);
440 type->addFacePentagon(1, 5, 6, 7, 8, 9);
441 type->addFaceQuad(2, 0, 1, 6, 5);
442 type->addFaceQuad(3, 1, 2, 7, 6);
443 type->addFaceQuad(4, 2, 3, 8, 7);
444 type->addFaceQuad(5, 3, 4, 9, 8);
445 type->addFaceQuad(6, 4, 0, 5, 9);
446
447 type->addEdge(0, 0, 1, 2, 0);
448 type->addEdge(1, 1, 2, 3, 0);
449 type->addEdge(2, 2, 3, 4, 0);
450 type->addEdge(3, 3, 4, 5, 0);
451 type->addEdge(4, 4, 0, 6, 0);
452 type->addEdge(5, 5, 6, 1, 2);
453 type->addEdge(6, 6, 7, 1, 3);
454 type->addEdge(7, 7, 8, 1, 4);
455 type->addEdge(8, 8, 9, 1, 5);
456 type->addEdge(9, 9, 5, 1, 6);
457 type->addEdge(10, 0, 5, 6, 2);
458 type->addEdge(11, 1, 6, 2, 3);
459 type->addEdge(12, 2, 7, 3, 4);
460 type->addEdge(13, 3, 8, 4, 5);
461 type->addEdge(14, 4, 9, 5, 6);
462 }
463
464 // Octaedron12
465 {
466 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
467 m_types[IT_Octaedron12] = type;
468
469 type->setInfos(this, IT_Octaedron12, "Octaedron12", Dimension::Dim3, 12, 18, 8);
470
471 type->addFaceHexagon(0, 0, 5, 4, 3, 2, 1);
472 type->addFaceHexagon(1, 6, 7, 8, 9, 10, 11);
473 type->addFaceQuad(2, 0, 1, 7, 6);
474 type->addFaceQuad(3, 1, 2, 8, 7);
475 type->addFaceQuad(4, 2, 3, 9, 8);
476 type->addFaceQuad(5, 3, 4, 10, 9);
477 type->addFaceQuad(6, 4, 5, 11, 10);
478 type->addFaceQuad(7, 5, 0, 6, 11);
479
480 type->addEdge(0, 0, 1, 2, 0);
481 type->addEdge(1, 1, 2, 3, 0);
482 type->addEdge(2, 2, 3, 4, 0);
483 type->addEdge(3, 3, 4, 5, 0);
484 type->addEdge(4, 4, 5, 6, 0);
485 type->addEdge(5, 5, 0, 7, 0);
486 type->addEdge(6, 6, 7, 1, 2);
487 type->addEdge(7, 7, 8, 1, 3);
488 type->addEdge(8, 8, 9, 1, 4);
489 type->addEdge(9, 9, 10, 1, 5);
490 type->addEdge(10, 10, 11, 1, 6);
491 type->addEdge(11, 11, 6, 1, 7);
492 type->addEdge(12, 0, 6, 7, 2);
493 type->addEdge(13, 1, 7, 2, 3);
494 type->addEdge(14, 2, 8, 3, 4);
495 type->addEdge(15, 3, 9, 4, 5);
496 type->addEdge(16, 4, 10, 5, 6);
497 type->addEdge(17, 5, 11, 6, 7);
498 }
499
500 // HemiHexa7
501 {
502 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
503 m_types[IT_HemiHexa7] = type;
504
505 type->setInfos(this, IT_HemiHexa7, "HemiHexa7", Dimension::Dim3, 7, 11, 6);
506
507 type->addFaceTriangle(0, 0, 1, 2);
508 type->addFaceQuad(1, 0, 2, 3, 4);
509 type->addFaceQuad(2, 0, 5, 6, 1);
510 type->addFaceTriangle(3, 0, 4, 5);
511 type->addFaceQuad(4, 1, 6, 3, 2);
512 type->addFaceQuad(5, 3, 6, 5, 4);
513
514 type->addEdge(0, 0, 1, 0, 2);
515 type->addEdge(1, 1, 2, 0, 4);
516 type->addEdge(2, 2, 0, 0, 1);
517 type->addEdge(3, 2, 3, 1, 4);
518 type->addEdge(4, 3, 4, 1, 5);
519 type->addEdge(5, 4, 5, 3, 5);
520 type->addEdge(6, 5, 0, 3, 2);
521 type->addEdge(7, 0, 4, 3, 1);
522 type->addEdge(8, 5, 6, 2, 5);
523 type->addEdge(9, 6, 1, 2, 4);
524 type->addEdge(10, 3, 6, 5, 4);
525 }
526
527 // HemiHexa6
528 {
529 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
530 m_types[IT_HemiHexa6] = type;
531
532 type->setInfos(this, IT_HemiHexa6, "HemiHexa6", Dimension::Dim3, 6, 10, 6);
533
534 type->addFaceTriangle(0, 0, 1, 2);
535 type->addFaceQuad(1, 0, 2, 3, 4);
536 type->addFaceQuad(2, 0, 5, 3, 1);
537 type->addFaceTriangle(3, 0, 4, 5);
538 type->addFaceTriangle(4, 1, 3, 2);
539 type->addFaceTriangle(5, 3, 5, 4);
540
541 type->addEdge(0, 0, 1, 0, 2);
542 type->addEdge(1, 1, 2, 0, 4);
543 type->addEdge(2, 2, 0, 0, 1);
544 type->addEdge(3, 2, 3, 1, 4);
545 type->addEdge(4, 3, 4, 1, 5);
546 type->addEdge(5, 4, 5, 3, 5);
547 type->addEdge(6, 5, 0, 3, 2);
548 type->addEdge(7, 0, 4, 3, 1);
549 type->addEdge(8, 5, 3, 2, 5);
550 type->addEdge(9, 3, 1, 2, 4);
551 }
552
553 // HemiHexa5
554 {
555 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
556 m_types[IT_HemiHexa5] = type;
557
558 type->setInfos(this, IT_HemiHexa5, "HemiHexa5", Dimension::Dim3, 5, 7, 4);
559
560 type->addFaceTriangle(0, 0, 1, 2);
561 type->addFaceQuad(1, 0, 2, 3, 4);
562 type->addFaceQuad(2, 0, 4, 3, 1);
563 type->addFaceTriangle(3, 1, 3, 2);
564
565 type->addEdge(0, 0, 1, 0, 2);
566 type->addEdge(1, 1, 2, 0, 3);
567 type->addEdge(2, 2, 0, 0, 1);
568 type->addEdge(3, 2, 3, 1, 3);
569 type->addEdge(4, 3, 1, 2, 3);
570 type->addEdge(5, 3, 4, 1, 2);
571 type->addEdge(6, 4, 0, 1, 2);
572 }
573
574 // AntiWedgeLeft6
575 {
576 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
577 m_types[IT_AntiWedgeLeft6] = type;
578
579 type->setInfos(this, IT_AntiWedgeLeft6, "AntiWedgeLeft6", Dimension::Dim3, 6, 10, 6);
580
581 type->addFaceTriangle(0, 0, 2, 1);
582 type->addFaceQuad(1, 0, 3, 5, 2);
583 type->addFaceQuad(2, 0, 1, 4, 3);
584 type->addFaceTriangle(3, 3, 4, 5);
585 type->addFaceTriangle(4, 1, 2, 4);
586 type->addFaceTriangle(5, 2, 5, 4);
587
588 type->addEdge(0, 0, 1, 0, 2);
589 type->addEdge(1, 1, 2, 4, 0);
590 type->addEdge(2, 2, 0, 1, 0);
591 type->addEdge(3, 0, 3, 1, 2);
592 type->addEdge(4, 1, 4, 2, 4);
593 type->addEdge(5, 2, 5, 5, 1);
594 type->addEdge(6, 3, 4, 3, 2);
595 type->addEdge(7, 4, 5, 3, 5);
596 type->addEdge(8, 5, 3, 3, 1);
597 type->addEdge(9, 2, 4, 4, 5);
598 }
599
600 // AntiWedgeRight6
601 {
602 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
603 m_types[IT_AntiWedgeRight6] = type;
604
605 type->setInfos(this, IT_AntiWedgeRight6, "AntiWedgeRight6", Dimension::Dim3, 6, 10, 6);
606
607 type->addFaceTriangle(0, 0, 2, 1);
608 type->addFaceQuad(1, 0, 3, 5, 2);
609 type->addFaceQuad(2, 0, 1, 4, 3);
610 type->addFaceTriangle(3, 3, 4, 5);
611 type->addFaceTriangle(4, 1, 2, 5);
612 type->addFaceTriangle(5, 1, 5, 4);
613
614 type->addEdge(0, 0, 1, 0, 2);
615 type->addEdge(1, 1, 2, 4, 0);
616 type->addEdge(2, 2, 0, 1, 0);
617 type->addEdge(3, 0, 3, 1, 2);
618 type->addEdge(4, 1, 4, 2, 5);
619 type->addEdge(5, 2, 5, 4, 1);
620 type->addEdge(6, 3, 4, 3, 2);
621 type->addEdge(7, 4, 5, 3, 5);
622 type->addEdge(8, 5, 3, 3, 1);
623 type->addEdge(9, 1, 5, 5, 4);
624 }
625
626 // DiTetra5
627 {
628 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
629 m_types[IT_DiTetra5] = type;
630
631 type->setInfos(this, IT_DiTetra5, "DiTetra5", Dimension::Dim3, 5, 9, 6);
632
633 type->addFaceTriangle(0, 0, 1, 3);
634 type->addFaceTriangle(1, 1, 2, 3);
635 type->addFaceTriangle(2, 2, 0, 3);
636 type->addFaceTriangle(3, 1, 0, 4);
637 type->addFaceTriangle(4, 2, 1, 4);
638 type->addFaceTriangle(5, 0, 2, 4);
639
640 type->addEdge(0, 0, 1, 0, 3);
641 type->addEdge(1, 1, 2, 1, 4);
642 type->addEdge(2, 2, 0, 2, 5);
643 type->addEdge(3, 0, 3, 2, 0);
644 type->addEdge(4, 1, 3, 0, 1);
645 type->addEdge(5, 2, 3, 1, 2);
646 type->addEdge(6, 0, 4, 3, 5);
647 type->addEdge(7, 1, 4, 4, 3);
648 type->addEdge(8, 2, 4, 5, 4);
649 }
650
651 // DualNode
652 {
653 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
654 m_types[IT_DualNode] = type;
655
656 type->setInfos(this, IT_DualNode, "DualNode", 1, 0, 0);
657 }
658 // DualEdge
659 {
660 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
661 m_types[IT_DualEdge] = type;
662
663 type->setInfos(this, IT_DualEdge, "DualEdge", 1, 0, 0);
664 }
665 // DualFace
666 {
667 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
668 m_types[IT_DualFace] = type;
669
670 type->setInfos(this, IT_DualFace, "DualFace", 1, 0, 0);
671 }
672 // DualCell
673 {
674 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
675 m_types[IT_DualCell] = type;
676
677 type->setInfos(this, IT_DualCell, "DualCell", 1, 0, 0);
678 }
679 // DualParticle
680 {
681 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
682 m_types[IT_DualParticle] = type;
683
684 type->setInfos(this, IT_DualParticle, "DualParticle", 1, 0, 0);
685 }
686 // Link
687 {
688 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
689 m_types[IT_Link] = type;
690
691 type->setInfos(this, IT_Link, "Link", 0, 0, 0);
692 }
693
694 // Enneedron14
695 {
696 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
697 m_types[IT_Enneedron14] = type;
698
699 type->setInfos(this, IT_Enneedron14, "Enneedron14", Dimension::Dim3, 14, 21, 9);
700
701 type->addFaceHeptagon(0, 0, 6, 5, 4, 3, 2, 1);
702 type->addFaceHeptagon(1, 7, 8, 9, 10, 11, 12, 13);
703 type->addFaceQuad(2, 0, 1, 8, 7);
704 type->addFaceQuad(3, 1, 2, 9, 8);
705 type->addFaceQuad(4, 2, 3, 10, 9);
706 type->addFaceQuad(5, 3, 4, 11, 10);
707 type->addFaceQuad(6, 4, 5, 12, 11);
708 type->addFaceQuad(7, 5, 6, 13, 12);
709 type->addFaceQuad(8, 6, 0, 7, 13);
710
711 type->addEdge(0, 0, 1, 2, 0);
712 type->addEdge(1, 1, 2, 3, 0);
713 type->addEdge(2, 2, 3, 4, 0);
714 type->addEdge(3, 3, 4, 5, 0);
715 type->addEdge(4, 4, 5, 6, 0);
716 type->addEdge(5, 5, 6, 7, 0);
717 type->addEdge(6, 6, 0, 8, 0);
718 type->addEdge(7, 7, 8, 1, 2);
719 type->addEdge(8, 8, 9, 1, 3);
720 type->addEdge(9, 9, 10, 1, 4);
721 type->addEdge(10, 10, 11, 1, 5);
722 type->addEdge(11, 11, 12, 1, 6);
723 type->addEdge(12, 12, 13, 1, 7);
724 type->addEdge(13, 13, 7, 1, 8);
725 type->addEdge(14, 0, 7, 8, 2);
726 type->addEdge(15, 1, 8, 1, 2);
727 type->addEdge(16, 2, 9, 2, 3);
728 type->addEdge(17, 3, 10, 3, 4);
729 type->addEdge(18, 4, 11, 4, 5);
730 type->addEdge(19, 5, 12, 5, 6);
731 type->addEdge(20, 6, 13, 6, 7);
732 }
733 // Decaedron16
734 {
735 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
736 m_types[IT_Decaedron16] = type;
737
738 type->setInfos(this, IT_Decaedron16, "Decaedron16", Dimension::Dim3, 16, 24, 10);
739
740 type->addFaceOctogon(0, 0, 7, 6, 5, 4, 3, 2, 1);
741 type->addFaceOctogon(1, 8, 9, 10, 11, 12, 13, 14, 15);
742 type->addFaceQuad(2, 0, 1, 9, 8);
743 type->addFaceQuad(3, 1, 2, 10, 9);
744 type->addFaceQuad(4, 2, 3, 11, 10);
745 type->addFaceQuad(5, 3, 4, 12, 11);
746 type->addFaceQuad(6, 4, 5, 13, 12);
747 type->addFaceQuad(7, 5, 6, 14, 13);
748 type->addFaceQuad(8, 6, 7, 15, 14);
749 type->addFaceQuad(9, 7, 0, 8, 15);
750
751 type->addEdge(0, 0, 1, 2, 0);
752 type->addEdge(1, 1, 2, 3, 0);
753 type->addEdge(2, 2, 3, 4, 0);
754 type->addEdge(3, 3, 4, 5, 0);
755 type->addEdge(4, 4, 5, 6, 0);
756 type->addEdge(5, 5, 6, 7, 0);
757 type->addEdge(6, 6, 7, 8, 0);
758 type->addEdge(7, 7, 0, 9, 0);
759 type->addEdge(8, 8, 9, 1, 2);
760 type->addEdge(9, 9, 10, 1, 3);
761 type->addEdge(10, 10, 11, 1, 4);
762 type->addEdge(11, 11, 12, 1, 5);
763 type->addEdge(12, 12, 13, 1, 6);
764 type->addEdge(13, 13, 14, 1, 7);
765 type->addEdge(14, 14, 15, 1, 8);
766 type->addEdge(15, 15, 8, 1, 9);
767 type->addEdge(16, 0, 8, 9, 2);
768 type->addEdge(17, 1, 9, 2, 3);
769 type->addEdge(18, 2, 10, 3, 4);
770 type->addEdge(19, 3, 11, 4, 5);
771 type->addEdge(20, 4, 12, 5, 6);
772 type->addEdge(21, 5, 13, 6, 7);
773 type->addEdge(22, 6, 14, 7, 8);
774 type->addEdge(23, 7, 15, 8, 9);
775 }
776
777 // Heptagon7
778 {
779 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
780 m_types[IT_Heptagon7] = type;
781
782 type->setInfos(this, IT_Heptagon7, "Heptagon7", Dimension::Dim2, 7, 7, 7);
783
784 type->addFaceLine(0, 0, 1);
785 type->addFaceLine(1, 1, 2);
786 type->addFaceLine(2, 2, 3);
787 type->addFaceLine(3, 3, 4);
788 type->addFaceLine(4, 4, 5);
789 type->addFaceLine(5, 5, 6);
790 type->addFaceLine(6, 6, 0);
791
792 type->addEdge(0, 0, 1, 6, 1);
793 type->addEdge(1, 1, 2, 0, 2);
794 type->addEdge(2, 2, 3, 1, 3);
795 type->addEdge(3, 3, 4, 2, 4);
796 type->addEdge(4, 4, 5, 3, 5);
797 type->addEdge(5, 5, 6, 4, 6);
798 type->addEdge(6, 6, 0, 5, 0);
799 }
800
801 // Octogon8
802 {
803 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
804 m_types[IT_Octogon8] = type;
805
806 type->setInfos(this, IT_Octogon8, "Octogon8", Dimension::Dim2, 8, 8, 8);
807
808 type->addFaceLine(0, 0, 1);
809 type->addFaceLine(1, 1, 2);
810 type->addFaceLine(2, 2, 3);
811 type->addFaceLine(3, 3, 4);
812 type->addFaceLine(4, 4, 5);
813 type->addFaceLine(5, 5, 6);
814 type->addFaceLine(6, 6, 7);
815 type->addFaceLine(7, 7, 0);
816
817 type->addEdge(0, 0, 1, 7, 1);
818 type->addEdge(1, 1, 2, 0, 2);
819 type->addEdge(2, 2, 3, 1, 3);
820 type->addEdge(3, 3, 4, 2, 4);
821 type->addEdge(4, 4, 5, 3, 5);
822 type->addEdge(5, 5, 6, 4, 6);
823 type->addEdge(6, 6, 7, 5, 7);
824 type->addEdge(7, 7, 0, 6, 0);
825 }
826
827 // Cell3D_Line2
828 {
829 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
830 m_types[IT_Cell3D_Line2] = type;
831
832 type->setInfos(this, IT_Cell3D_Line2, "Cell3D_Line2", Dimension::Dim1, 2, 0, 0);
833 }
834
835 // Cell3D_Triangle3
836 {
837 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
838 m_types[IT_Cell3D_Triangle3] = type;
839
840 type->setInfos(this, IT_Cell3D_Triangle3, "Cell3D_Triangle3", Dimension::Dim2, 3, 0, 3);
841
842 type->addFaceLine(0, 0, 1);
843 type->addFaceLine(1, 1, 2);
844 type->addFaceLine(2, 2, 0);
845 }
846
847 // Cell3D_Quad4
848 {
849 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
850 m_types[IT_Cell3D_Quad4] = type;
851
852 type->setInfos(this, IT_Cell3D_Quad4, "Cell3D_Quad4", Dimension::Dim2, 4, 0, 4);
853
854 type->addFaceLine(0, 0, 1);
855 type->addFaceLine(1, 1, 2);
856 type->addFaceLine(2, 2, 3);
857 type->addFaceLine(3, 3, 0);
858 }
859
860 { // Polygon & Polyhedron: generic item types
861 String arcane_item_type_file = platform::getEnvironmentVariable("ARCANE_ITEM_TYPE_FILE");
862 if (!arcane_item_type_file.null()) {
863 // verify the existence of item type file. if doesn't exist return an exception
865 }
866 }
867
868 // Calcul les relations face->arêtes
869 // Cette opération doit être appelé en fin phase build
870 for (Integer i = 0; i < m_types.size(); ++i) {
871 ItemTypeInfoBuilder* type = static_cast<ItemTypeInfoBuilder*>(m_types[i]);
872 if (!type)
873 ARCANE_FATAL("ItemType '{0}' is not defined", type);
874 type->computeFaceEdgeInfos();
875 }
876}
877
878/*---------------------------------------------------------------------------*/
879/*---------------------------------------------------------------------------*/
880
882printTypes(std::ostream& ostr)
883{
884 ARCANE_ASSERT((m_initialized), ("Cannot use not built ItemTypeMng"));
885 Integer nb_type = m_types.size();
886 ostr << "** Number of types " << nb_type << '\n';
887 for (Integer i = 0; i < nb_type; ++i) {
888 ItemTypeInfo* type = m_types[i];
889 ostr << " - Type " << type->typeId()
890 << " Name: " << type->typeName()
891 << " Nodes: " << type->nbLocalNode()
892 << " Faces " << type->nbLocalFace() << '\n';
893 for (Integer z = 0, sz = type->nbLocalFace(); z < sz; ++z) {
895 ostr << " - - Face " << z << ":";
896 for (Integer zk = 0, szk = lf.nbNode(); zk < szk; ++zk) {
897 ostr << " " << lf.node(zk);
898 }
899 ostr << "\n";
900 }
901 ostr << "\n";
902 }
903}
904
905/*---------------------------------------------------------------------------*/
906/*---------------------------------------------------------------------------*/
932readTypes(IParallelSuperMng* pm, const String& filename)
933{
934 m_trace->info() << "Reading additional item types from file '" << filename << "'";
935
936 UniqueArray<Byte> bytes;
937 Integer size = 0;
938
939 // Lecture parallèle
940 if (pm->commRank() == 0) {
941 long unsigned int file_length = platform::getFileLength(filename);
942 if (file_length == 0)
943 throw IOException(A_FUNCINFO, "ARCANE_ITEM_TYPE_FILE is an empty file");
944 std::ifstream ifile;
945 ifile.open(filename.localstr(), std::ios::binary);
946 if (ifile.fail())
947 throw IOException(A_FUNCINFO, "Cannot open ARCANE_ITEM_TYPE_FILE item type file");
948 bytes.resize(arcaneCheckArraySize(file_length + 1));
949 ifile.read((char*)bytes.data(), file_length);
950 bytes[(Integer)file_length] = '\0';
951 if (ifile.bad())
952 throw IOException(A_FUNCINFO, "Cannot read ARCANE_ITEM_TYPE_FILE item type file");
953 size = bytes.size();
954 }
955 {
956 IntegerArrayView bs(1, &size);
957 pm->broadcast(bs, 0);
958 }
959 bytes.resize(size);
960 if (size != 0) {
961 pm->broadcast(bytes, 0);
962 }
963 else { // CC: add ending '\0'
964 bytes.resize(1);
965 bytes[0] = '\0';
966 }
967
968 // Already built polygons (size => identifier)
969 typedef std::map<Integer, Integer> PolygonMapper;
971 built_polygons[3] = IT_Triangle3;
972 built_polygons[4] = IT_Quad4;
973 built_polygons[5] = IT_Pentagon5;
974 built_polygons[6] = IT_Hexagon6;
975 typedef std::set<Integer> KnownTypes;
977 for (Integer i_type = 0; i_type < ItemTypeMng::nbBuiltInItemType(); ++i_type)
978 known_types.insert(i_type);
979
981 throw FatalErrorException(A_FUNCINFO, "Invalid initialization of built-in item types");
982
983 // Analyse du fichier de types
984 std::istringstream ifile((char*)bytes.unguardedBasePointer(), std::istringstream::in);
985 Integer nb_type = 0;
986 ifile >> nb_type;
987
989 Int16 typeId = -1, nbN = 0, nbE = 0, nbF = 0;
990 for (Integer i = 0; i < nb_type; ++i) {
991 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
992 ifile >> typeId >> nbF >> nbE;
993 if (typeId >= nb_type || typeId < 0)
994 throw IOException(A_FUNCINFO, String::format("Polyhedron reader cannot allow typeId {0}", typeId));
995 typeId += ItemTypeMng::nbBuiltInItemType(); // translation d'indexation
996 if (known_types.find(typeId) != known_types.end())
997 throw FatalErrorException(A_FUNCINFO, String::format("Already existing typeId {0}", typeId));
998 known_types.insert(typeId);
999 if (nbE == nbF) // 2d case nbN == nbE == nbF
1000 {
1001 nbN = nbE;
1002 }
1003 else
1004 nbN = nbE - nbF + 2; // Calcul du nb de noeuds nbN a partir de nbE et nbF (formule d'Euler)
1005
1006 type->setInfos(this, typeId, String::format("Polyhedron{0}_{1}-{2}-{3}", typeId, nbN, nbE, nbF), nbN, nbE, nbF);
1007 m_trace->debug(Trace::High) << "Adding " << type->typeName() << " type #"
1008 << typeId - ItemTypeMng::nbBuiltInItemType() << " with " << nbN << " nodes, "
1009 << nbE << " edges, " << nbF << " faces.";
1010 m_types[typeId] = type;
1011 for (Integer iface = 0; iface < nbF; ++iface) {
1012 ifile >> nbN;
1013 UniqueArray<Integer> nodeFace(nbN);
1014 for (Integer inodeFace = 0; inodeFace < nbN; ++inodeFace) {
1015 ifile >> nodeFace[inodeFace];
1016 }
1017 PolygonMapper::const_iterator finder = built_polygons.find(nbN);
1018 Int16 face_type = IT_NullType;
1019 if (finder != built_polygons.end()) {
1020 face_type = finder->second;
1021 m_trace->debug(Trace::High) << "\tAdding already existing face type " << face_type
1022 << " for face " << iface << " with " << nbN << " nodes";
1023 }
1024 else {
1026
1027 face_type = m_types.size();
1028 m_types.add(type2);
1029 built_polygons[nbN] = face_type;
1030
1031 type2->setInfos(this, face_type, String::format("Polygon{0}", nbN), nbN, nbN, nbN);
1032 for (Integer j = 0; j < nbN; ++j)
1033 type2->addFaceLine(j, j, (j + 1) % nbN);
1034
1035 for (Integer j = 0; j < nbN; ++j)
1036 type2->addEdge(j, j, (j + 1) % nbN, (j - 1 + nbN) % nbN, (j + 1) % nbN);
1037 m_trace->debug(Trace::High) << "\tAdding new face type " << face_type
1038 << " for face " << iface << " with " << nbN << " nodes";
1039 }
1040 type->addFaceGeneric(iface, face_type, nodeFace);
1041 }
1042 Integer node0, node1, leftFace, rightFace;
1043 for (Integer iedge = 0; iedge < nbE; ++iedge) {
1044 ifile >> node0 >> node1 >> leftFace >> rightFace;
1045 type->addEdge(iedge, node0, node1, leftFace, rightFace);
1046 }
1047 }
1048
1049 m_trace->debug(Trace::High) << "Total number of types : " << m_types.size();
1050}
1051
1052/*---------------------------------------------------------------------------*/
1053/*---------------------------------------------------------------------------*/
1054
1057{
1058 return _singleton()->types().size();
1059}
1060
1063{
1065}
1066/*---------------------------------------------------------------------------*/
1067/*---------------------------------------------------------------------------*/
1068
1071nbHChildrenByItemType(Integer type)
1072{
1073 switch (type) {
1074 case IT_Line2:
1075 return 2;
1076 case IT_Triangle3:
1077 return 4;
1078 case IT_Quad4:
1079 return 4;
1080 case IT_Pentagon5:
1081 return 4;
1082 case IT_Hexagon6:
1083 return 4;
1084 case IT_Tetraedron4:
1085 return 8;
1086 case IT_Pyramid5:
1087 return 0;
1088 case IT_Pentaedron6:
1089 return 8;
1090 case IT_Hexaedron8:
1091 return 8;
1092 case IT_Heptaedron10:
1093 case IT_Octaedron12:
1094 case IT_HemiHexa7:
1095 case IT_HemiHexa6:
1096 case IT_HemiHexa5:
1097 case IT_AntiWedgeLeft6:
1098 case IT_AntiWedgeRight6:
1099 case IT_DiTetra5:
1100 return 0;
1101 default:
1102 ARCANE_FATAL("Not supported Item Type '{0}'", type);
1103 }
1104}
1105
1106/*---------------------------------------------------------------------------*/
1107/*---------------------------------------------------------------------------*/
1108
1110
1118
1121{
1122 //GG: Ca plante avec Windows. Regarder pourquoi.
1123#ifndef ARCANE_OS_WIN32
1124 delete singleton_instance;
1125#endif
1126 singleton_instance = nullptr;
1127}
1128
1129/*---------------------------------------------------------------------------*/
1130/*---------------------------------------------------------------------------*/
1131
1133types() const
1134{
1135 ARCANE_ASSERT((m_initialized), ("Cannot use not built ItemTypeMng"));
1136 return m_types;
1137}
1138
1139/*---------------------------------------------------------------------------*/
1140/*---------------------------------------------------------------------------*/
1141
1143typeFromId(Integer id) const
1144{
1145 ARCANE_ASSERT((m_initialized), ("Cannot use not built ItemTypeMng"));
1146 return m_types[id];
1147}
1148
1149/*---------------------------------------------------------------------------*/
1150/*---------------------------------------------------------------------------*/
1151
1153typeFromId(ItemTypeId id) const
1154{
1155 ARCANE_ASSERT((m_initialized), ("Cannot use not built ItemTypeMng"));
1156 return m_types[id.typeId()];
1157}
1158
1159/*---------------------------------------------------------------------------*/
1160/*---------------------------------------------------------------------------*/
1161
1163typeName(Integer id) const
1164{
1165 return typeFromId(id)->typeName();
1166}
1167
1168/*---------------------------------------------------------------------------*/
1169/*---------------------------------------------------------------------------*/
1170
1172typeName(ItemTypeId id) const
1173{
1174 return typeFromId(id)->typeName();
1175}
1176
1177/*---------------------------------------------------------------------------*/
1178/*---------------------------------------------------------------------------*/
1179// Recopie de la fonction obsolète Item::typeName().
1180// TODO: voir pourquoi il y a un test sur nBasicItemType().
1181String ItemTypeMng::
1182_legacyTypeName(Integer t)
1183{
1184 if (t >= 0 && t < nbBasicItemType())
1185 return _singleton()->typeFromId(t)->typeName();
1186 return "InvalidType";
1187}
1188
1189/*---------------------------------------------------------------------------*/
1190/*---------------------------------------------------------------------------*/
1191
1193{
1194 auto has_general_cells = false;
1195 if (m_mesh_with_general_cells.find(mesh) != m_mesh_with_general_cells.end()) {
1196 has_general_cells = true;
1197 }
1198 return has_general_cells;
1199}
1200
1201/*---------------------------------------------------------------------------*/
1202/*---------------------------------------------------------------------------*/
1203
1205{
1206 ARCANE_ASSERT(mesh, ("Trying to indicate a null mesh contains general cells."));
1207 m_mesh_with_general_cells.insert(mesh);
1208}
1209
1210/*---------------------------------------------------------------------------*/
1211/*---------------------------------------------------------------------------*/
1212
1213} // End namespace Arcane
1214
1215/*---------------------------------------------------------------------------*/
1216/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Exception lorsqu'une erreur d'entrée/sortie est détectée.
Definition IOException.h:32
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
Classe abstraite du superviseur de parallélisme.
Type d'une entité (Item).
Definition ItemTypeId.h:32
Construction des infos d'un type d'entité du maillage.
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 face d'une maille.
Infos sur un type d'entité du maillage.
LocalFace localFace(Integer id) const
Connectivité locale de la i-ème face de la maille.
Integer nbLocalNode() const
Nombre de noeuds de l'entité
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
void readTypes(IParallelSuperMng *parallel_mng, const String &filename)
Lecture des types a partir d'un fichier de nom filename.
static void _destroySingleton()
Détruit le singleton.
void setMeshWithGeneralCells(IMesh *mesh) noexcept
Permet au maillage d'indiquer à l'ItemTypeMng s'il a des mailles génériques.
bool hasGeneralCells(IMesh *mesh) const
Indique si le maillage mesh contient des mailles génériques (en dehors des types intégrés ou addition...
ItemTypeMng()
Constructeur vide (non initialisé)
static Int32 nbHChildrenByItemType(Integer type)
AMR.
ITraceMng * m_trace
Gestionnaire de traces.
std::set< IMesh * > m_mesh_with_general_cells
Ensemble des maillages contenant des mailles générales (sans type défini)
static Integer nbBasicItemType()
nombre de types disponibles
ItemTypeInfo * typeFromId(Integer id) const
Type correspondant au numéro id.
bool m_initialized
Flag d'initialisation.
void build(IParallelSuperMng *parallel_mng, ITraceMng *trace)
Constructeur effectif.
UniqueArray< ItemTypeInfo * > m_types
Liste des types.
static ItemTypeMng * singleton_instance
Instance singleton.
ConstArrayView< ItemTypeInfo * > types() const
Liste des types disponibles.
MultiBufferT< ItemTypeInfoBuilder > * m_types_buffer
Allocations des objets de type (il faut un pointeur pour eviter inclusion multiple)
static Integer nbBuiltInItemType()
nombre de types intégrés (hors types additionnels)
void printTypes(std::ostream &ostr)
Affiche les infos sur les types disponibles sur le flot ostr.
static ItemTypeMng * _singleton()
Instance singleton du type.
String typeName(Integer id) const
Nom du type correspondant au numéro id.
static const Integer m_nb_builtin_item_type
Nombre de types intégrés (hors types additionnels)
void _build(IParallelSuperMng *parallel_mng, ITraceMng *trace)
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
Vue modifiable d'un tableau d'un type T.
Exception lorsqu'une erreur fatale est survenue.
Interface du gestionnaire de traces.
virtual TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium)=0
Flot pour un message de debug.
virtual TraceMessage info()=0
Flot pour un message d'information.
Chaîne de caractères unicode.
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:227
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Integer arcaneCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
Int32 Integer
Type représentant un entier.