14#include "arcane/core/ItemTypeMng.h"
16#include "ItemTypeId.h"
17#include "arcane/utils/Iostream.h"
18#include "arcane/utils/String.h"
19#include "arcane/utils/PlatformUtils.h"
20#include "arcane/utils/ITraceMng.h"
21#include "arcane/utils/TraceAccessor.h"
22#include "arcane/utils/IStackTraceService.h"
23#include "arcane/utils/IOException.h"
24#include "arcane/utils/FatalErrorException.h"
25#include "arcane/utils/Array.h"
26#include "arcane/utils/MultiBuffer.h"
28#include "arcane/core/ItemTypeInfoBuilder.h"
29#include "arcane/core/IParallelSuperMng.h"
30#include "arcane/core/ItemTypeInfoBuilder.h"
31#include "arcane/core/IMesh.h"
32#include "arcane/core/MeshKind.h"
33#include "arcane/core/ISubDomain.h"
34#include "arcane/core/IApplication.h"
37#include "arcane/ItemRefinementPattern.h"
51const Integer ItemTypeMng::m_nb_builtin_item_type = NB_BASIC_ITEM_TYPE;
67 delete m_types_buffer;
77 ARCANE_FATAL(
"ItemTypeMng instance is already initialized");
82 _buildTypes(mesh, super_pm, mesh->traceMng());
92 _buildSingleton(parallel_mng, trace);
107 Int32 init_counter = ++m_initialized_counter;
108 if (init_counter == 1) {
109 _buildTypes(
nullptr, parallel_mng, trace);
110 m_initialized =
true;
111 m_initialized_counter = max_rank;
116 while (init_counter < max_rank)
117 init_counter = m_initialized_counter.load();
137 bool is_non_manifold =
false;
139 is_non_manifold = mesh->meshKind().isNonManifold();
142 m_types.resize(m_nb_builtin_item_type);
143 m_types_buffer =
new MultiBufferT<ItemTypeInfoBuilder>();
147 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
148 m_types[IT_NullType] = type;
150 type->setInfos(
this, IT_NullType,
"NullType", Dimension::DimUnknown, 0, 0, 0);
155 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
156 m_types[IT_Vertex] = type;
158 type->setInfos(
this, IT_Vertex,
"Vertex", Dimension::Dim0, 0, 0, 0);
166 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
167 m_types[IT_FaceVertex] = type;
169 type->setInfos(
this, IT_FaceVertex,
"FaceVertex", Dimension::Dim0, 1, 0, 0);
170 type->setIsValidForCell(
false);
175 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
176 m_types[IT_Line2] = type;
178 type->setInfos(
this, IT_Line2,
"Line2", Dimension::Dim1, 2, 0, 0);
179 type->setIsValidForCell(
true);
184 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
185 m_types[IT_Line3] = type;
187 type->setInfos(
this, IT_Line3,
"Line3", Dimension::Dim1, 3, 0, 0);
188 type->setOrder(2, ITI_Line2);
189 type->setIsValidForCell(
false);
194 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
195 m_types[IT_Line4] = type;
197 type->setInfos(
this, IT_Line4,
"Line4", Dimension::Dim1, 4, 0, 0);
198 type->setOrder(3, ITI_Line2);
199 type->setIsValidForCell(
false);
204 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
205 m_types[IT_CellLine2] = type;
207 type->setInfos(
this, IT_CellLine2,
"CellLine2", Dimension::Dim1, 2, 0, 2);
209 type->addFaceVertex(0, 0);
210 type->addFaceVertex(1, 1);
222 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
223 m_types[IT_Triangle3] = type;
225 type->setInfos(
this, IT_Triangle3,
"Triangle3", Dimension::Dim2, 3, 3, 3);
227 type->addEdgeAndFaceLine(0, { 0, 1 }, { 1, 2 });
228 type->addEdgeAndFaceLine(1, { 1, 2 }, { 2, 0 });
229 type->addEdgeAndFaceLine(2, { 2, 0 }, { 0, 1 });
235 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
236 m_types[IT_Triangle6] = type;
238 type->setInfos(
this, IT_Triangle6,
"Triangle6", Dimension::Dim2, 6, 3, 3);
239 type->setOrder(2, ITI_Triangle3);
241 type->addFaceLine3(0, 0, 1, 3);
242 type->addFaceLine3(1, 1, 2, 4);
243 type->addFaceLine3(2, 2, 0, 5);
245 type->addEdge(0, 0, 1, 1, 2);
246 type->addEdge(1, 1, 2, 2, 0);
247 type->addEdge(2, 2, 0, 0, 1);
253 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
254 m_types[IT_Triangle10] = type;
256 type->setInfos(
this, IT_Triangle10,
"Triangle10", Dimension::Dim2, 10, 3, 3);
257 type->setOrder(3, ITI_Triangle3);
258 type->setHasCenterNode(
true);
260 type->addFaceLine4(0, 0, 1, 3, 4);
261 type->addFaceLine4(1, 1, 2, 5, 6);
262 type->addFaceLine4(2, 2, 0, 7, 8);
264 type->addEdge(0, 0, 1, 1, 2);
265 type->addEdge(1, 1, 2, 2, 0);
266 type->addEdge(2, 2, 0, 0, 1);
271 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
272 m_types[IT_Quad4] = type;
274 type->setInfos(
this, IT_Quad4,
"Quad4", Dimension::Dim2, 4, 4, 4);
276 type->addEdgeAndFaceLine(0, { 0, 1 }, { 3, 1 });
277 type->addEdgeAndFaceLine(1, { 1, 2 }, { 0, 2 });
278 type->addEdgeAndFaceLine(2, { 2, 3 }, { 1, 3 });
279 type->addEdgeAndFaceLine(3, { 3, 0 }, { 2, 0 });
284 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
285 m_types[IT_Quad8] = type;
287 type->setInfos(
this, IT_Quad8,
"Quad8", Dimension::Dim2, 8, 4, 4);
288 type->setOrder(2, ITI_Quad4);
290 type->addFaceLine3(0, 0, 1, 4);
291 type->addFaceLine3(1, 1, 2, 5);
292 type->addFaceLine3(2, 2, 3, 6);
293 type->addFaceLine3(3, 3, 0, 7);
295 type->addEdge(0, 0, 1, 3, 1);
296 type->addEdge(1, 1, 2, 0, 2);
297 type->addEdge(2, 2, 3, 1, 3);
298 type->addEdge(3, 3, 0, 2, 0);
304 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
305 m_types[IT_Quad9] = type;
307 type->setInfos(
this, IT_Quad9,
"Quad9", Dimension::Dim2, 9, 4, 4);
308 type->setOrder(2, ITI_Quad4);
309 type->setHasCenterNode(
true);
311 type->addFaceLine3(0, 0, 1, 4);
312 type->addFaceLine3(1, 1, 2, 5);
313 type->addFaceLine3(2, 2, 3, 6);
314 type->addFaceLine3(3, 3, 0, 7);
316 type->addEdge(0, 0, 1, 3, 1);
317 type->addEdge(1, 1, 2, 0, 2);
318 type->addEdge(2, 2, 3, 1, 3);
319 type->addEdge(3, 3, 0, 2, 0);
324 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
325 m_types[IT_Pentagon5] = type;
327 type->setInfos(
this, IT_Pentagon5,
"Pentagon5", Dimension::Dim2, 5, 5, 5);
329 type->addFaceLine(0, 0, 1);
330 type->addFaceLine(1, 1, 2);
331 type->addFaceLine(2, 2, 3);
332 type->addFaceLine(3, 3, 4);
333 type->addFaceLine(4, 4, 0);
335 type->addEdge(0, 0, 1, 4, 1);
336 type->addEdge(1, 1, 2, 0, 2);
337 type->addEdge(2, 2, 3, 1, 3);
338 type->addEdge(3, 3, 4, 2, 4);
339 type->addEdge(4, 4, 0, 3, 0);
344 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
345 m_types[IT_Hexagon6] = type;
347 type->setInfos(
this, IT_Hexagon6,
"Hexagon6", Dimension::Dim2, 6, 6, 6);
349 type->addFaceLine(0, 0, 1);
350 type->addFaceLine(1, 1, 2);
351 type->addFaceLine(2, 2, 3);
352 type->addFaceLine(3, 3, 4);
353 type->addFaceLine(4, 4, 5);
354 type->addFaceLine(5, 5, 0);
356 type->addEdge(0, 0, 1, 5, 1);
357 type->addEdge(1, 1, 2, 0, 2);
358 type->addEdge(2, 2, 3, 1, 3);
359 type->addEdge(3, 3, 4, 2, 4);
360 type->addEdge(4, 4, 5, 3, 5);
361 type->addEdge(5, 5, 0, 4, 0);
366 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
367 m_types[IT_Hexaedron8] = type;
369 type->setInfos(
this, IT_Hexaedron8,
"Hexaedron8", Dimension::Dim3, 8, 12, 6);
371 type->addFaceQuad(0, 0, 3, 2, 1);
372 type->addFaceQuad(1, 0, 4, 7, 3);
373 type->addFaceQuad(2, 0, 1, 5, 4);
374 type->addFaceQuad(3, 4, 5, 6, 7);
375 type->addFaceQuad(4, 1, 2, 6, 5);
376 type->addFaceQuad(5, 2, 3, 7, 6);
378 type->addEdge(0, 0, 1, 2, 0);
379 type->addEdge(1, 1, 2, 4, 0);
380 type->addEdge(2, 2, 3, 5, 0);
381 type->addEdge(3, 3, 0, 1, 0);
382 type->addEdge(4, 0, 4, 1, 2);
383 type->addEdge(5, 1, 5, 2, 4);
384 type->addEdge(6, 2, 6, 4, 5);
385 type->addEdge(7, 3, 7, 5, 1);
386 type->addEdge(8, 4, 5, 3, 2);
387 type->addEdge(9, 5, 6, 3, 4);
388 type->addEdge(10, 6, 7, 3, 5);
389 type->addEdge(11, 7, 4, 3, 1);
395 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
396 m_types[IT_Hexaedron20] = type;
398 type->setInfos(
this, IT_Hexaedron20,
"Hexaedron20", Dimension::Dim3, 20, 12, 6);
399 type->setOrder(2, ITI_Hexaedron8);
401 type->addFaceQuad8(0, 0, 4, 7, 3, 16, 15, 19, 11);
402 type->addFaceQuad8(1, 1, 2, 6, 5, 9, 18, 13, 17);
403 type->addFaceQuad8(2, 0, 1, 5, 4, 8, 17, 12, 16);
404 type->addFaceQuad8(3, 0, 3, 2, 1, 11, 10, 9, 8);
405 type->addFaceQuad8(4, 2, 3, 7, 6, 10, 19, 14, 18);
406 type->addFaceQuad8(5, 4, 5, 6, 7, 12, 13, 14, 15);
408 type->addEdge(0, 0, 1, 2, 0);
409 type->addEdge(1, 1, 2, 4, 0);
410 type->addEdge(2, 2, 3, 5, 0);
411 type->addEdge(3, 3, 0, 1, 0);
412 type->addEdge(4, 0, 4, 1, 2);
413 type->addEdge(5, 1, 5, 2, 4);
414 type->addEdge(6, 2, 6, 4, 5);
415 type->addEdge(7, 3, 7, 5, 1);
416 type->addEdge(8, 4, 5, 3, 2);
417 type->addEdge(9, 5, 6, 3, 4);
418 type->addEdge(10, 6, 7, 3, 5);
419 type->addEdge(11, 7, 4, 3, 1);
425 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
426 m_types[IT_Hexaedron27] = type;
428 type->setInfos(
this, IT_Hexaedron27,
"Hexaedron27", Dimension::Dim3, 27, 12, 6);
429 type->setOrder(2, ITI_Hexaedron8);
430 type->setHasCenterNode(
true);
432 type->addFaceQuad9(0, 0, 4, 7, 3, 16, 15, 19, 11, 20);
433 type->addFaceQuad9(1, 1, 2, 6, 5, 9, 18, 13, 17, 21);
434 type->addFaceQuad9(2, 0, 1, 5, 4, 8, 17, 12, 16, 22);
435 type->addFaceQuad9(3, 0, 3, 2, 1, 11, 10, 9, 8, 24);
436 type->addFaceQuad9(4, 2, 3, 7, 6, 10, 19, 14, 18, 23);
437 type->addFaceQuad9(5, 4, 5, 6, 7, 12, 13, 14, 15, 25);
439 type->addEdge(0, 0, 1, 2, 0);
440 type->addEdge(1, 1, 2, 4, 0);
441 type->addEdge(2, 2, 3, 5, 0);
442 type->addEdge(3, 3, 0, 1, 0);
443 type->addEdge(4, 0, 4, 1, 2);
444 type->addEdge(5, 1, 5, 2, 4);
445 type->addEdge(6, 2, 6, 4, 5);
446 type->addEdge(7, 3, 7, 5, 1);
447 type->addEdge(8, 4, 5, 3, 2);
448 type->addEdge(9, 5, 6, 3, 4);
449 type->addEdge(10, 6, 7, 3, 5);
450 type->addEdge(11, 7, 4, 3, 1);
455 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
456 m_types[IT_Pyramid5] = type;
458 type->setInfos(
this, IT_Pyramid5,
"Pyramid5", Dimension::Dim3, 5, 8, 5);
460 type->addFaceQuad(0, 0, 3, 2, 1);
461 type->addFaceTriangle(1, 0, 4, 3);
462 type->addFaceTriangle(2, 0, 1, 4);
463 type->addFaceTriangle(3, 1, 2, 4);
464 type->addFaceTriangle(4, 2, 3, 4);
466 type->addEdge(0, 0, 1, 2, 0);
467 type->addEdge(1, 1, 2, 3, 0);
468 type->addEdge(2, 2, 3, 4, 0);
469 type->addEdge(3, 3, 0, 1, 0);
470 type->addEdge(4, 0, 4, 1, 2);
471 type->addEdge(5, 1, 4, 2, 3);
472 type->addEdge(6, 2, 4, 3, 4);
473 type->addEdge(7, 3, 4, 4, 1);
478 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
479 m_types[IT_Pyramid13] = type;
480 type->setOrder(2, ITI_Pyramid5);
481 type->setInfos(
this, IT_Pyramid13,
"Pyramid13", Dimension::Dim3, 13, 8, 5);
483 type->addFaceQuad8(0, 0, 3, 2, 1, 5, 6, 7, 8);
484 type->addFaceTriangle6(1, 0, 4, 3, 9, 12, 8);
485 type->addFaceTriangle6(2, 0, 1, 4, 5, 10, 9);
486 type->addFaceTriangle6(3, 1, 2, 4, 6, 11, 10);
487 type->addFaceTriangle6(4, 2, 3, 4, 7, 12, 11);
489 type->addEdge(0, 0, 1, 2, 0);
490 type->addEdge(1, 1, 2, 3, 0);
491 type->addEdge(2, 2, 3, 4, 0);
492 type->addEdge(3, 3, 0, 1, 0);
493 type->addEdge(4, 0, 4, 1, 2);
494 type->addEdge(5, 1, 4, 2, 3);
495 type->addEdge(6, 2, 4, 3, 4);
496 type->addEdge(7, 3, 4, 4, 1);
501 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
502 m_types[IT_Pentaedron6] = type;
504 type->setInfos(
this, IT_Pentaedron6,
"Pentaedron6", Dimension::Dim3, 6, 9, 5);
506 type->addFaceTriangle(0, 0, 2, 1);
507 type->addFaceQuad(1, 0, 3, 5, 2);
508 type->addFaceQuad(2, 0, 1, 4, 3);
509 type->addFaceTriangle(3, 3, 4, 5);
510 type->addFaceQuad(4, 1, 2, 5, 4);
512 type->addEdge(0, 0, 1, 2, 0);
513 type->addEdge(1, 1, 2, 4, 0);
514 type->addEdge(2, 2, 0, 1, 0);
515 type->addEdge(3, 0, 3, 1, 2);
516 type->addEdge(4, 1, 4, 2, 4);
517 type->addEdge(5, 2, 5, 4, 1);
518 type->addEdge(6, 3, 4, 3, 2);
519 type->addEdge(7, 4, 5, 3, 4);
520 type->addEdge(8, 5, 3, 3, 1);
525 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
526 m_types[IT_Pentaedron15] = type;
527 type->setOrder(2, ITI_Pentaedron15);
529 type->setInfos(
this, IT_Pentaedron15,
"Pentaedron15", Dimension::Dim3, 15, 9, 5);
531 type->addFaceTriangle6(0, 0, 2, 1, 6, 7, 8);
532 type->addFaceQuad8(1, 0, 3, 5, 2, 12, 11, 14, 8);
533 type->addFaceQuad8(2, 0, 1, 4, 3, 6, 13, 9, 3);
534 type->addFaceTriangle6(3, 3, 4, 5, 9, 10, 11);
535 type->addFaceQuad8(4, 1, 2, 5, 4, 7, 14, 10, 13);
537 type->addEdge(0, 0, 1, 2, 0);
538 type->addEdge(1, 1, 2, 4, 0);
539 type->addEdge(2, 2, 0, 1, 0);
540 type->addEdge(3, 0, 3, 1, 2);
541 type->addEdge(4, 1, 4, 2, 4);
542 type->addEdge(5, 2, 5, 4, 1);
543 type->addEdge(6, 3, 4, 3, 2);
544 type->addEdge(7, 4, 5, 3, 4);
545 type->addEdge(8, 5, 3, 3, 1);
550 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
551 m_types[IT_Tetraedron4] = type;
553 type->setInfos(
this, IT_Tetraedron4,
"Tetraedron4", Dimension::Dim3, 4, 6, 4);
555 type->addFaceTriangle(0, 0, 2, 1);
556 type->addFaceTriangle(1, 0, 3, 2);
557 type->addFaceTriangle(2, 0, 1, 3);
558 type->addFaceTriangle(3, 1, 2, 3);
560 type->addEdge(0, 0, 1, 2, 0);
561 type->addEdge(1, 1, 2, 3, 0);
562 type->addEdge(2, 2, 0, 1, 0);
563 type->addEdge(3, 0, 3, 1, 2);
564 type->addEdge(4, 1, 3, 2, 3);
565 type->addEdge(5, 2, 3, 3, 1);
571 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
572 m_types[IT_Tetraedron10] = type;
574 type->setInfos(
this, IT_Tetraedron10,
"Tetraedron10", Dimension::Dim3, 10, 6, 4);
575 type->setOrder(2, ITI_Tetraedron4);
577 type->addFaceTriangle6(0, 0, 2, 1, 6, 5, 4);
578 type->addFaceTriangle6(1, 0, 3, 2, 7, 9, 6);
579 type->addFaceTriangle6(2, 0, 1, 3, 4, 8, 7);
580 type->addFaceTriangle6(3, 1, 2, 3, 5, 9, 8);
582 type->addEdge(0, 0, 1, 2, 0);
583 type->addEdge(1, 1, 2, 3, 0);
584 type->addEdge(2, 2, 0, 1, 0);
585 type->addEdge(3, 0, 3, 1, 2);
586 type->addEdge(4, 1, 3, 2, 3);
587 type->addEdge(5, 2, 3, 3, 1);
592 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
593 m_types[IT_Heptaedron10] = type;
595 type->setInfos(
this, IT_Heptaedron10,
"Heptaedron10", Dimension::Dim3, 10, 15, 7);
597 type->addFacePentagon(0, 0, 4, 3, 2, 1);
598 type->addFacePentagon(1, 5, 6, 7, 8, 9);
599 type->addFaceQuad(2, 0, 1, 6, 5);
600 type->addFaceQuad(3, 1, 2, 7, 6);
601 type->addFaceQuad(4, 2, 3, 8, 7);
602 type->addFaceQuad(5, 3, 4, 9, 8);
603 type->addFaceQuad(6, 4, 0, 5, 9);
605 type->addEdge(0, 0, 1, 2, 0);
606 type->addEdge(1, 1, 2, 3, 0);
607 type->addEdge(2, 2, 3, 4, 0);
608 type->addEdge(3, 3, 4, 5, 0);
609 type->addEdge(4, 4, 0, 6, 0);
610 type->addEdge(5, 5, 6, 1, 2);
611 type->addEdge(6, 6, 7, 1, 3);
612 type->addEdge(7, 7, 8, 1, 4);
613 type->addEdge(8, 8, 9, 1, 5);
614 type->addEdge(9, 9, 5, 1, 6);
615 type->addEdge(10, 0, 5, 6, 2);
616 type->addEdge(11, 1, 6, 2, 3);
617 type->addEdge(12, 2, 7, 3, 4);
618 type->addEdge(13, 3, 8, 4, 5);
619 type->addEdge(14, 4, 9, 5, 6);
624 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
625 m_types[IT_Octaedron12] = type;
627 type->setInfos(
this, IT_Octaedron12,
"Octaedron12", Dimension::Dim3, 12, 18, 8);
629 type->addFaceHexagon(0, 0, 5, 4, 3, 2, 1);
630 type->addFaceHexagon(1, 6, 7, 8, 9, 10, 11);
631 type->addFaceQuad(2, 0, 1, 7, 6);
632 type->addFaceQuad(3, 1, 2, 8, 7);
633 type->addFaceQuad(4, 2, 3, 9, 8);
634 type->addFaceQuad(5, 3, 4, 10, 9);
635 type->addFaceQuad(6, 4, 5, 11, 10);
636 type->addFaceQuad(7, 5, 0, 6, 11);
638 type->addEdge(0, 0, 1, 2, 0);
639 type->addEdge(1, 1, 2, 3, 0);
640 type->addEdge(2, 2, 3, 4, 0);
641 type->addEdge(3, 3, 4, 5, 0);
642 type->addEdge(4, 4, 5, 6, 0);
643 type->addEdge(5, 5, 0, 7, 0);
644 type->addEdge(6, 6, 7, 1, 2);
645 type->addEdge(7, 7, 8, 1, 3);
646 type->addEdge(8, 8, 9, 1, 4);
647 type->addEdge(9, 9, 10, 1, 5);
648 type->addEdge(10, 10, 11, 1, 6);
649 type->addEdge(11, 11, 6, 1, 7);
650 type->addEdge(12, 0, 6, 7, 2);
651 type->addEdge(13, 1, 7, 2, 3);
652 type->addEdge(14, 2, 8, 3, 4);
653 type->addEdge(15, 3, 9, 4, 5);
654 type->addEdge(16, 4, 10, 5, 6);
655 type->addEdge(17, 5, 11, 6, 7);
660 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
661 m_types[IT_HemiHexa7] = type;
663 type->setInfos(
this, IT_HemiHexa7,
"HemiHexa7", Dimension::Dim3, 7, 11, 6);
665 type->addFaceTriangle(0, 0, 1, 2);
666 type->addFaceQuad(1, 0, 2, 3, 4);
667 type->addFaceQuad(2, 0, 5, 6, 1);
668 type->addFaceTriangle(3, 0, 4, 5);
669 type->addFaceQuad(4, 1, 6, 3, 2);
670 type->addFaceQuad(5, 3, 6, 5, 4);
672 type->addEdge(0, 0, 1, 0, 2);
673 type->addEdge(1, 1, 2, 0, 4);
674 type->addEdge(2, 2, 0, 0, 1);
675 type->addEdge(3, 2, 3, 1, 4);
676 type->addEdge(4, 3, 4, 1, 5);
677 type->addEdge(5, 4, 5, 3, 5);
678 type->addEdge(6, 5, 0, 3, 2);
679 type->addEdge(7, 0, 4, 3, 1);
680 type->addEdge(8, 5, 6, 2, 5);
681 type->addEdge(9, 6, 1, 2, 4);
682 type->addEdge(10, 3, 6, 5, 4);
687 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
688 m_types[IT_HemiHexa6] = type;
690 type->setInfos(
this, IT_HemiHexa6,
"HemiHexa6", Dimension::Dim3, 6, 10, 6);
692 type->addFaceTriangle(0, 0, 1, 2);
693 type->addFaceQuad(1, 0, 2, 3, 4);
694 type->addFaceQuad(2, 0, 5, 3, 1);
695 type->addFaceTriangle(3, 0, 4, 5);
696 type->addFaceTriangle(4, 1, 3, 2);
697 type->addFaceTriangle(5, 3, 5, 4);
699 type->addEdge(0, 0, 1, 0, 2);
700 type->addEdge(1, 1, 2, 0, 4);
701 type->addEdge(2, 2, 0, 0, 1);
702 type->addEdge(3, 2, 3, 1, 4);
703 type->addEdge(4, 3, 4, 1, 5);
704 type->addEdge(5, 4, 5, 3, 5);
705 type->addEdge(6, 5, 0, 3, 2);
706 type->addEdge(7, 0, 4, 3, 1);
707 type->addEdge(8, 5, 3, 2, 5);
708 type->addEdge(9, 3, 1, 2, 4);
713 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
714 m_types[IT_HemiHexa5] = type;
716 type->setInfos(
this, IT_HemiHexa5,
"HemiHexa5", Dimension::Dim3, 5, 7, 4);
718 type->addFaceTriangle(0, 0, 1, 2);
719 type->addFaceQuad(1, 0, 2, 3, 4);
720 type->addFaceQuad(2, 0, 4, 3, 1);
721 type->addFaceTriangle(3, 1, 3, 2);
723 type->addEdge(0, 0, 1, 0, 2);
724 type->addEdge(1, 1, 2, 0, 3);
725 type->addEdge(2, 2, 0, 0, 1);
726 type->addEdge(3, 2, 3, 1, 3);
727 type->addEdge(4, 3, 1, 2, 3);
728 type->addEdge(5, 3, 4, 1, 2);
729 type->addEdge(6, 4, 0, 1, 2);
734 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
735 m_types[IT_AntiWedgeLeft6] = type;
737 type->setInfos(
this, IT_AntiWedgeLeft6,
"AntiWedgeLeft6", Dimension::Dim3, 6, 10, 6);
739 type->addFaceTriangle(0, 0, 2, 1);
740 type->addFaceQuad(1, 0, 3, 5, 2);
741 type->addFaceQuad(2, 0, 1, 4, 3);
742 type->addFaceTriangle(3, 3, 4, 5);
743 type->addFaceTriangle(4, 1, 2, 4);
744 type->addFaceTriangle(5, 2, 5, 4);
746 type->addEdge(0, 0, 1, 0, 2);
747 type->addEdge(1, 1, 2, 4, 0);
748 type->addEdge(2, 2, 0, 1, 0);
749 type->addEdge(3, 0, 3, 1, 2);
750 type->addEdge(4, 1, 4, 2, 4);
751 type->addEdge(5, 2, 5, 5, 1);
752 type->addEdge(6, 3, 4, 3, 2);
753 type->addEdge(7, 4, 5, 3, 5);
754 type->addEdge(8, 5, 3, 3, 1);
755 type->addEdge(9, 2, 4, 4, 5);
760 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
761 m_types[IT_AntiWedgeRight6] = type;
763 type->setInfos(
this, IT_AntiWedgeRight6,
"AntiWedgeRight6", Dimension::Dim3, 6, 10, 6);
765 type->addFaceTriangle(0, 0, 2, 1);
766 type->addFaceQuad(1, 0, 3, 5, 2);
767 type->addFaceQuad(2, 0, 1, 4, 3);
768 type->addFaceTriangle(3, 3, 4, 5);
769 type->addFaceTriangle(4, 1, 2, 5);
770 type->addFaceTriangle(5, 1, 5, 4);
772 type->addEdge(0, 0, 1, 0, 2);
773 type->addEdge(1, 1, 2, 4, 0);
774 type->addEdge(2, 2, 0, 1, 0);
775 type->addEdge(3, 0, 3, 1, 2);
776 type->addEdge(4, 1, 4, 2, 5);
777 type->addEdge(5, 2, 5, 4, 1);
778 type->addEdge(6, 3, 4, 3, 2);
779 type->addEdge(7, 4, 5, 3, 5);
780 type->addEdge(8, 5, 3, 3, 1);
781 type->addEdge(9, 1, 5, 5, 4);
786 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
787 m_types[IT_DiTetra5] = type;
789 type->setInfos(
this, IT_DiTetra5,
"DiTetra5", Dimension::Dim3, 5, 9, 6);
791 type->addFaceTriangle(0, 0, 1, 3);
792 type->addFaceTriangle(1, 1, 2, 3);
793 type->addFaceTriangle(2, 2, 0, 3);
794 type->addFaceTriangle(3, 1, 0, 4);
795 type->addFaceTriangle(4, 2, 1, 4);
796 type->addFaceTriangle(5, 0, 2, 4);
798 type->addEdge(0, 0, 1, 0, 3);
799 type->addEdge(1, 1, 2, 1, 4);
800 type->addEdge(2, 2, 0, 2, 5);
801 type->addEdge(3, 0, 3, 2, 0);
802 type->addEdge(4, 1, 3, 0, 1);
803 type->addEdge(5, 2, 3, 1, 2);
804 type->addEdge(6, 0, 4, 3, 5);
805 type->addEdge(7, 1, 4, 4, 3);
806 type->addEdge(8, 2, 4, 5, 4);
811 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
812 m_types[IT_DualNode] = type;
814 type->setInfos(
this, IT_DualNode,
"DualNode", 1, 0, 0);
818 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
819 m_types[IT_DualEdge] = type;
821 type->setInfos(
this, IT_DualEdge,
"DualEdge", 1, 0, 0);
825 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
826 m_types[IT_DualFace] = type;
828 type->setInfos(
this, IT_DualFace,
"DualFace", 1, 0, 0);
832 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
833 m_types[IT_DualCell] = type;
835 type->setInfos(
this, IT_DualCell,
"DualCell", 1, 0, 0);
839 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
840 m_types[IT_DualParticle] = type;
842 type->setInfos(
this, IT_DualParticle,
"DualParticle", 1, 0, 0);
846 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
847 m_types[IT_Link] = type;
849 type->setInfos(
this, IT_Link,
"Link", 0, 0, 0);
854 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
855 m_types[IT_Enneedron14] = type;
857 type->setInfos(
this, IT_Enneedron14,
"Enneedron14", Dimension::Dim3, 14, 21, 9);
859 type->addFaceHeptagon(0, 0, 6, 5, 4, 3, 2, 1);
860 type->addFaceHeptagon(1, 7, 8, 9, 10, 11, 12, 13);
861 type->addFaceQuad(2, 0, 1, 8, 7);
862 type->addFaceQuad(3, 1, 2, 9, 8);
863 type->addFaceQuad(4, 2, 3, 10, 9);
864 type->addFaceQuad(5, 3, 4, 11, 10);
865 type->addFaceQuad(6, 4, 5, 12, 11);
866 type->addFaceQuad(7, 5, 6, 13, 12);
867 type->addFaceQuad(8, 6, 0, 7, 13);
869 type->addEdge(0, 0, 1, 2, 0);
870 type->addEdge(1, 1, 2, 3, 0);
871 type->addEdge(2, 2, 3, 4, 0);
872 type->addEdge(3, 3, 4, 5, 0);
873 type->addEdge(4, 4, 5, 6, 0);
874 type->addEdge(5, 5, 6, 7, 0);
875 type->addEdge(6, 6, 0, 8, 0);
876 type->addEdge(7, 7, 8, 1, 2);
877 type->addEdge(8, 8, 9, 1, 3);
878 type->addEdge(9, 9, 10, 1, 4);
879 type->addEdge(10, 10, 11, 1, 5);
880 type->addEdge(11, 11, 12, 1, 6);
881 type->addEdge(12, 12, 13, 1, 7);
882 type->addEdge(13, 13, 7, 1, 8);
883 type->addEdge(14, 0, 7, 8, 2);
884 type->addEdge(15, 1, 8, 1, 2);
885 type->addEdge(16, 2, 9, 2, 3);
886 type->addEdge(17, 3, 10, 3, 4);
887 type->addEdge(18, 4, 11, 4, 5);
888 type->addEdge(19, 5, 12, 5, 6);
889 type->addEdge(20, 6, 13, 6, 7);
893 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
894 m_types[IT_Decaedron16] = type;
896 type->setInfos(
this, IT_Decaedron16,
"Decaedron16", Dimension::Dim3, 16, 24, 10);
898 type->addFaceOctogon(0, 0, 7, 6, 5, 4, 3, 2, 1);
899 type->addFaceOctogon(1, 8, 9, 10, 11, 12, 13, 14, 15);
900 type->addFaceQuad(2, 0, 1, 9, 8);
901 type->addFaceQuad(3, 1, 2, 10, 9);
902 type->addFaceQuad(4, 2, 3, 11, 10);
903 type->addFaceQuad(5, 3, 4, 12, 11);
904 type->addFaceQuad(6, 4, 5, 13, 12);
905 type->addFaceQuad(7, 5, 6, 14, 13);
906 type->addFaceQuad(8, 6, 7, 15, 14);
907 type->addFaceQuad(9, 7, 0, 8, 15);
909 type->addEdge(0, 0, 1, 2, 0);
910 type->addEdge(1, 1, 2, 3, 0);
911 type->addEdge(2, 2, 3, 4, 0);
912 type->addEdge(3, 3, 4, 5, 0);
913 type->addEdge(4, 4, 5, 6, 0);
914 type->addEdge(5, 5, 6, 7, 0);
915 type->addEdge(6, 6, 7, 8, 0);
916 type->addEdge(7, 7, 0, 9, 0);
917 type->addEdge(8, 8, 9, 1, 2);
918 type->addEdge(9, 9, 10, 1, 3);
919 type->addEdge(10, 10, 11, 1, 4);
920 type->addEdge(11, 11, 12, 1, 5);
921 type->addEdge(12, 12, 13, 1, 6);
922 type->addEdge(13, 13, 14, 1, 7);
923 type->addEdge(14, 14, 15, 1, 8);
924 type->addEdge(15, 15, 8, 1, 9);
925 type->addEdge(16, 0, 8, 9, 2);
926 type->addEdge(17, 1, 9, 2, 3);
927 type->addEdge(18, 2, 10, 3, 4);
928 type->addEdge(19, 3, 11, 4, 5);
929 type->addEdge(20, 4, 12, 5, 6);
930 type->addEdge(21, 5, 13, 6, 7);
931 type->addEdge(22, 6, 14, 7, 8);
932 type->addEdge(23, 7, 15, 8, 9);
937 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
938 m_types[IT_Heptagon7] = type;
940 type->setInfos(
this, IT_Heptagon7,
"Heptagon7", Dimension::Dim2, 7, 7, 7);
942 type->addEdgeAndFaceLine(0, { 0, 1 }, { 6, 1 });
943 type->addEdgeAndFaceLine(1, { 1, 2 }, { 0, 2 });
944 type->addEdgeAndFaceLine(2, { 2, 3 }, { 1, 3 });
945 type->addEdgeAndFaceLine(3, { 3, 4 }, { 2, 4 });
946 type->addEdgeAndFaceLine(4, { 4, 5 }, { 3, 5 });
947 type->addEdgeAndFaceLine(5, { 5, 6 }, { 4, 6 });
948 type->addEdgeAndFaceLine(6, { 6, 0 }, { 5, 0 });
953 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
954 m_types[IT_Octogon8] = type;
956 type->setInfos(
this, IT_Octogon8,
"Octogon8", Dimension::Dim2, 8, 8, 8);
958 type->addEdgeAndFaceLine(0, { 0, 1 }, { 7, 1 });
959 type->addEdgeAndFaceLine(1, { 1, 2 }, { 0, 2 });
960 type->addEdgeAndFaceLine(2, { 2, 3 }, { 1, 3 });
961 type->addEdgeAndFaceLine(3, { 3, 4 }, { 2, 4 });
962 type->addEdgeAndFaceLine(4, { 4, 5 }, { 3, 5 });
963 type->addEdgeAndFaceLine(5, { 5, 6 }, { 4, 6 });
964 type->addEdgeAndFaceLine(6, { 6, 7 }, { 5, 7 });
965 type->addEdgeAndFaceLine(7, { 7, 0 }, { 6, 0 });
970 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
971 m_types[IT_Cell3D_Line2] = type;
973 type->setInfos(
this, IT_Cell3D_Line2,
"Cell3D_Line2", Dimension::Dim1, 2, 0, 0);
978 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
979 m_types[IT_CellLine3] = type;
980 type->setOrder(2, ITI_CellLine2);
982 type->setInfos(
this, IT_CellLine3,
"CellLine3", Dimension::Dim1, 3, 0, 2);
984 type->addFaceVertex(0, 0);
985 type->addFaceVertex(1, 1);
990 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
991 m_types[IT_Cell3D_Line3] = type;
992 type->setOrder(2, ITI_Cell3D_Line2);
994 type->setInfos(
this, IT_Cell3D_Line3,
"Cell3D_Line3", Dimension::Dim1, 3, 0, 0);
999 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
1000 m_types[IT_Cell3D_Triangle3] = type;
1003 if (is_non_manifold)
1004 std::swap(nb_face, nb_edge);
1006 type->setInfos(
this, IT_Cell3D_Triangle3,
"Cell3D_Triangle3", Dimension::Dim2, 3, nb_edge, nb_face);
1008 if (is_non_manifold) {
1009 type->addEdge2D(0, 0, 1);
1010 type->addEdge2D(1, 1, 2);
1011 type->addEdge2D(2, 2, 0);
1014 type->addFaceLine(0, 0, 1);
1015 type->addFaceLine(1, 1, 2);
1016 type->addFaceLine(2, 2, 0);
1022 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
1023 m_types[IT_Cell3D_Triangle6] = type;
1026 if (is_non_manifold)
1027 std::swap(nb_face, nb_edge);
1029 type->setInfos(
this, IT_Cell3D_Triangle6,
"Cell3D_Triangle6", Dimension::Dim2, 6, nb_edge, nb_face);
1030 type->setOrder(2, ITI_Cell3D_Triangle3);
1032 if (is_non_manifold) {
1033 type->addEdge2D(0, 0, 1);
1034 type->addEdge2D(1, 1, 2);
1035 type->addEdge2D(2, 2, 0);
1038 type->addFaceLine3(0, 0, 1, 3);
1039 type->addFaceLine3(1, 1, 2, 4);
1040 type->addFaceLine3(2, 2, 0, 5);
1046 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
1047 m_types[IT_Cell3D_Quad4] = type;
1050 if (is_non_manifold)
1051 std::swap(nb_face, nb_edge);
1053 type->setInfos(
this, IT_Cell3D_Quad4,
"Cell3D_Quad4", Dimension::Dim2, 4, nb_edge, nb_face);
1054 if (is_non_manifold) {
1055 type->addEdge2D(0, 0, 1);
1056 type->addEdge2D(1, 1, 2);
1057 type->addEdge2D(2, 2, 3);
1058 type->addEdge2D(3, 3, 0);
1061 type->addFaceLine(0, 0, 1);
1062 type->addFaceLine(1, 1, 2);
1063 type->addFaceLine(2, 2, 3);
1064 type->addFaceLine(3, 3, 0);
1070 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
1071 m_types[IT_Cell3D_Quad8] = type;
1075 if (is_non_manifold)
1076 std::swap(nb_face, nb_edge);
1078 type->setInfos(
this, IT_Cell3D_Quad8,
"Cell3D_Quad8", Dimension::Dim2, 8, nb_edge, nb_face);
1079 type->setOrder(2, ITI_Cell3D_Quad4);
1081 if (is_non_manifold) {
1082 type->addEdge2D(0, 0, 1);
1083 type->addEdge2D(1, 1, 2);
1084 type->addEdge2D(2, 2, 3);
1085 type->addEdge2D(3, 3, 0);
1088 type->addFaceLine3(0, 0, 1, 4);
1089 type->addFaceLine3(1, 1, 2, 5);
1090 type->addFaceLine3(2, 2, 3, 6);
1091 type->addFaceLine3(3, 3, 0, 7);
1097 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
1098 m_types[IT_Cell3D_Quad9] = type;
1102 if (is_non_manifold)
1103 std::swap(nb_face, nb_edge);
1105 type->setInfos(
this, IT_Cell3D_Quad9,
"Cell3D_Quad9", Dimension::Dim2, 9, nb_edge, nb_face);
1106 type->setOrder(2, ITI_Cell3D_Quad4);
1108 if (is_non_manifold) {
1109 type->addEdge2D(0, 0, 1);
1110 type->addEdge2D(1, 1, 2);
1111 type->addEdge2D(2, 2, 3);
1112 type->addEdge2D(3, 3, 0);
1115 type->addFaceLine3(0, 0, 1, 4);
1116 type->addFaceLine3(1, 1, 2, 5);
1117 type->addFaceLine3(2, 2, 3, 6);
1118 type->addFaceLine3(3, 3, 0, 7);
1124 if (!arcane_item_type_file.null()) {
1126 _readTypes(parallel_mng, arcane_item_type_file);
1132 for (
Integer i = 0; i < m_types.size(); ++i) {
1133 ItemTypeInfoBuilder* type =
static_cast<ItemTypeInfoBuilder*
>(m_types[i]);
1136 type->computeFaceEdgeInfos();
1146 ARCANE_ASSERT((m_initialized), (
"Cannot use not built ItemTypeMng"));
1147 Integer nb_type = m_types.size();
1148 ostr <<
"** Number of types " << nb_type <<
'\n';
1149 for (
Integer i = 0; i < nb_type; ++i) {
1150 ItemTypeInfo* type = m_types[i];
1151 ostr <<
" - Type " << type->
typeId()
1157 ostr <<
" - - Face " << z <<
":";
1159 ostr <<
" " << lf.
node(zk);
1196 m_trace->
info() <<
"Reading additional item types from file '" << filename <<
"'";
1198 UniqueArray<Byte> bytes;
1204 if (file_length == 0)
1205 throw IOException(A_FUNCINFO,
"ARCANE_ITEM_TYPE_FILE is an empty file");
1206 std::ifstream ifile;
1207 ifile.open(filename.
localstr(), std::ios::binary);
1209 throw IOException(A_FUNCINFO,
"Cannot open ARCANE_ITEM_TYPE_FILE item type file");
1211 ifile.read((
char*)bytes.data(), file_length);
1212 bytes[(
Integer)file_length] =
'\0';
1214 throw IOException(A_FUNCINFO,
"Cannot read ARCANE_ITEM_TYPE_FILE item type file");
1215 size = bytes.size();
1231 typedef std::map<Integer, Integer> PolygonMapper;
1232 PolygonMapper built_polygons;
1233 built_polygons[3] = IT_Triangle3;
1234 built_polygons[4] = IT_Quad4;
1235 built_polygons[5] = IT_Pentagon5;
1236 built_polygons[6] = IT_Hexagon6;
1237 typedef std::set<Integer> KnownTypes;
1238 KnownTypes known_types;
1240 known_types.insert(i_type);
1243 throw FatalErrorException(A_FUNCINFO,
"Invalid initialization of built-in item types");
1246 std::istringstream ifile((
char*)bytes.unguardedBasePointer(), std::istringstream::in);
1251 Int16 typeId = -1, nbN = 0, nbE = 0, nbF = 0;
1252 for (
Integer i = 0; i < nb_type; ++i) {
1253 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
1254 ifile >> typeId >> nbF >> nbE;
1255 if (typeId >= nb_type || typeId < 0)
1256 throw IOException(A_FUNCINFO, String::format(
"Polyhedron reader cannot allow typeId {0}", typeId));
1258 if (known_types.find(typeId) != known_types.end())
1259 throw FatalErrorException(A_FUNCINFO, String::format(
"Already existing typeId {0}", typeId));
1260 known_types.insert(typeId);
1266 nbN = nbE - nbF + 2;
1268 type->setInfos(
this, typeId, String::format(
"Polyhedron{0}_{1}-{2}-{3}", typeId, nbN, nbE, nbF), nbN, nbE, nbF);
1269 m_trace->debug(
Trace::High) <<
"Adding " << type->typeName() <<
" type #"
1271 << nbE <<
" edges, " << nbF <<
" faces.";
1272 m_types[typeId] = type;
1273 for (
Integer iface = 0; iface < nbF; ++iface) {
1275 UniqueArray<Integer> nodeFace(nbN);
1276 for (
Integer inodeFace = 0; inodeFace < nbN; ++inodeFace) {
1277 ifile >> nodeFace[inodeFace];
1279 PolygonMapper::const_iterator finder = built_polygons.find(nbN);
1280 Int16 face_type = IT_NullType;
1281 if (finder != built_polygons.end()) {
1282 face_type = finder->second;
1283 m_trace->debug(
Trace::High) <<
"\tAdding already existing face type " << face_type
1284 <<
" for face " << iface <<
" with " << nbN <<
" nodes";
1287 ItemTypeInfoBuilder* type2 = m_types_buffer->allocOne();
1289 face_type = m_types.size();
1291 built_polygons[nbN] = face_type;
1293 type2->setInfos(
this, face_type, String::format(
"Polygon{0}", nbN), nbN, nbN, nbN);
1294 for (
Integer j = 0; j < nbN; ++j)
1295 type2->addFaceLine(j, j, (j + 1) % nbN);
1297 for (
Integer j = 0; j < nbN; ++j)
1298 type2->addEdge(j, j, (j + 1) % nbN, (j - 1 + nbN) % nbN, (j + 1) % nbN);
1299 m_trace->debug(
Trace::High) <<
"\tAdding new face type " << face_type
1300 <<
" for face " << iface <<
" with " << nbN <<
" nodes";
1302 type->addFaceGeneric(iface, face_type, nodeFace);
1304 Integer node0, node1, leftFace, rightFace;
1305 for (
Integer iedge = 0; iedge < nbE; ++iedge) {
1306 ifile >> node0 >> node1 >> leftFace >> rightFace;
1307 type->addEdge(iedge, node0, node1, leftFace, rightFace);
1311 m_trace->debug(
Trace::High) <<
"Total number of types : " << m_types.size();
1320 return _singleton()->types().size();
1326 return m_nb_builtin_item_type;
1346 case IT_Tetraedron4:
1350 case IT_Pentaedron6:
1354 case IT_Heptaedron10:
1355 case IT_Octaedron12:
1359 case IT_AntiWedgeLeft6:
1360 case IT_AntiWedgeRight6:
1376 if (!singleton_instance)
1378 return singleton_instance;
1385#ifndef ARCANE_OS_WIN32
1386 delete singleton_instance;
1388 singleton_instance =
nullptr;
1397 ARCANE_ASSERT((m_initialized), (
"Cannot use not built ItemTypeMng"));
1407 ARCANE_ASSERT((m_initialized), (
"Cannot use not built ItemTypeMng"));
1417 ARCANE_ASSERT((m_initialized), (
"Cannot use not built ItemTypeMng"));
1418 return m_types[
id.typeId()];
1448 return "InvalidType";
1456 auto has_general_cells =
false;
1457 if (m_mesh_with_general_cells.find(mesh) != m_mesh_with_general_cells.end()) {
1458 has_general_cells =
true;
1460 return has_general_cells;
1468 ARCANE_ASSERT(mesh, (
"Trying to indicate a null mesh contains general cells."));
1469 m_mesh_with_general_cells.insert(mesh);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Vue constante d'un tableau de type T.
virtual IParallelSuperMng * parallelSuperMng()=0
Gestionnaire superviseur du parallélisme.
Exception lorsqu'une erreur d'entrée/sortie est détectée.
virtual void broadcast(ByteArrayView send_buf, Integer process_id)=0
Envoie un tableau de valeurs sur tous les processus Cette opération synchronise le tableau de valeur ...
virtual Int32 commRank() const =0
Retourne le numéro du process (compris entre 0 et nbProcess()-1)
virtual IApplication * application() const =0
Retourne le gestionnaire principal.
virtual Int32 commSize() const =0
Retourne le nombre total de process utilisés.
Interface du gestionnaire de traces.
virtual TraceMessage info()=0
Flot pour un message d'information.
Type d'une entité (Item).
Dimension
Dimension du type.
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 nbNode() const
Nombre de noeuds de la face.
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 d'un maillage.
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.
static Integer nbBasicItemType()
nombre de types disponibles
ItemTypeInfo * typeFromId(Integer id) const
Type correspondant au numéro id.
void build(IParallelSuperMng *parallel_mng, ITraceMng *trace)
Constructeur effectif.
ConstArrayView< ItemTypeInfo * > types() const
Liste des types disponibles.
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.
String typeName(Integer id) const
Nom du type correspondant au numéro id.
Chaîne de caractères unicode.
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
-*- 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.
ArrayView< Integer > IntegerArrayView
Equivalent C d'un tableau à une dimension d'entiers.
std::int16_t Int16
Type entier signé sur 16 bits.
std::int32_t Int32
Type entier signé sur 32 bits.