14#include "arcane/core/ItemTypeMng.h"
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"
27#include "arcane/core/ItemTypeInfoBuilder.h"
28#include "arcane/core/IParallelSuperMng.h"
29#include "arcane/core/ItemTypeInfoBuilder.h"
30#include "arcane/core/IMesh.h"
31#include "arcane/core/MeshKind.h"
32#include "arcane/core/ISubDomain.h"
33#include "arcane/core/IApplication.h"
36#include "arcane/ItemRefinementPattern.h"
50const Integer ItemTypeMng::m_nb_builtin_item_type = NB_BASIC_ITEM_TYPE;
66 delete m_types_buffer;
76 ARCANE_FATAL(
"ItemTypeMng instance is already initialized");
81 _buildTypes(mesh, super_pm, mesh->traceMng());
91 _buildSingleton(parallel_mng, trace);
106 Int32 init_counter = ++m_initialized_counter;
107 if (init_counter == 1) {
108 _buildTypes(
nullptr, parallel_mng, trace);
109 m_initialized =
true;
110 m_initialized_counter = max_rank;
115 while (init_counter < max_rank)
116 init_counter = m_initialized_counter.load();
136 bool is_non_manifold =
false;
138 is_non_manifold = mesh->meshKind().isNonManifold();
141 m_types.resize(m_nb_builtin_item_type);
142 m_types_buffer =
new MultiBufferT<ItemTypeInfoBuilder>();
146 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
147 m_types[IT_NullType] = type;
149 type->setInfos(
this, IT_NullType,
"NullType", Dimension::DimUnknown, 0, 0, 0);
154 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
155 m_types[IT_Vertex] = type;
157 type->setInfos(
this, IT_Vertex,
"Vertex", Dimension::Dim0, 0, 0, 0);
165 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
166 m_types[IT_FaceVertex] = type;
168 type->setInfos(
this, IT_FaceVertex,
"FaceVertex", Dimension::Dim0, 1, 0, 0);
169 type->setIsValidForCell(
false);
174 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
175 m_types[IT_Line2] = type;
177 type->setInfos(
this, IT_Line2,
"Line2", Dimension::Dim1, 2, 0, 0);
178 type->setIsValidForCell(
true);
183 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
184 m_types[IT_Line3] = type;
185 type->setOrder(2, ITI_Line2);
187 type->setInfos(
this, IT_Line3,
"Line3", Dimension::Dim1, 3, 0, 0);
188 type->setIsValidForCell(
false);
193 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
194 m_types[IT_CellLine2] = type;
196 type->setInfos(
this, IT_CellLine2,
"CellLine2", Dimension::Dim1, 2, 0, 2);
198 type->addFaceVertex(0, 0);
199 type->addFaceVertex(1, 1);
211 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
212 m_types[IT_Triangle3] = type;
214 type->setInfos(
this, IT_Triangle3,
"Triangle3", Dimension::Dim2, 3, 3, 3);
216 type->addEdgeAndFaceLine(0, { 0, 1 }, { 1, 2 });
217 type->addEdgeAndFaceLine(1, { 1, 2 }, { 2, 0 });
218 type->addEdgeAndFaceLine(2, { 2, 0 }, { 0, 1 });
224 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
225 m_types[IT_Triangle6] = type;
227 type->setInfos(
this, IT_Triangle6,
"Triangle6", Dimension::Dim2, 6, 3, 3);
228 type->setOrder(2, ITI_Triangle3);
230 type->addFaceLine3(0, 0, 1, 3);
231 type->addFaceLine3(1, 1, 2, 4);
232 type->addFaceLine3(2, 2, 0, 5);
234 type->addEdge(0, 0, 1, 1, 2);
235 type->addEdge(1, 1, 2, 2, 0);
236 type->addEdge(2, 2, 0, 0, 1);
241 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
242 m_types[IT_Quad4] = type;
244 type->setInfos(
this, IT_Quad4,
"Quad4", Dimension::Dim2, 4, 4, 4);
246 type->addEdgeAndFaceLine(0, { 0, 1 }, { 3, 1 });
247 type->addEdgeAndFaceLine(1, { 1, 2 }, { 0, 2 });
248 type->addEdgeAndFaceLine(2, { 2, 3 }, { 1, 3 });
249 type->addEdgeAndFaceLine(3, { 3, 0 }, { 2, 0 });
255 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
256 m_types[IT_Quad8] = type;
258 type->setInfos(
this, IT_Quad8,
"Quad8", Dimension::Dim2, 8, 4, 4);
259 type->setOrder(2, ITI_Quad4);
261 type->addFaceLine3(0, 0, 1, 4);
262 type->addFaceLine3(1, 1, 2, 5);
263 type->addFaceLine3(2, 2, 3, 6);
264 type->addFaceLine3(3, 3, 0, 7);
266 type->addEdge(0, 0, 1, 3, 1);
267 type->addEdge(1, 1, 2, 0, 2);
268 type->addEdge(2, 2, 3, 1, 3);
269 type->addEdge(3, 3, 0, 2, 0);
274 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
275 m_types[IT_Pentagon5] = type;
277 type->setInfos(
this, IT_Pentagon5,
"Pentagon5", Dimension::Dim2, 5, 5, 5);
279 type->addFaceLine(0, 0, 1);
280 type->addFaceLine(1, 1, 2);
281 type->addFaceLine(2, 2, 3);
282 type->addFaceLine(3, 3, 4);
283 type->addFaceLine(4, 4, 0);
285 type->addEdge(0, 0, 1, 4, 1);
286 type->addEdge(1, 1, 2, 0, 2);
287 type->addEdge(2, 2, 3, 1, 3);
288 type->addEdge(3, 3, 4, 2, 4);
289 type->addEdge(4, 4, 0, 3, 0);
294 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
295 m_types[IT_Hexagon6] = type;
297 type->setInfos(
this, IT_Hexagon6,
"Hexagon6", Dimension::Dim2, 6, 6, 6);
299 type->addFaceLine(0, 0, 1);
300 type->addFaceLine(1, 1, 2);
301 type->addFaceLine(2, 2, 3);
302 type->addFaceLine(3, 3, 4);
303 type->addFaceLine(4, 4, 5);
304 type->addFaceLine(5, 5, 0);
306 type->addEdge(0, 0, 1, 5, 1);
307 type->addEdge(1, 1, 2, 0, 2);
308 type->addEdge(2, 2, 3, 1, 3);
309 type->addEdge(3, 3, 4, 2, 4);
310 type->addEdge(4, 4, 5, 3, 5);
311 type->addEdge(5, 5, 0, 4, 0);
316 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
317 m_types[IT_Hexaedron8] = type;
319 type->setInfos(
this, IT_Hexaedron8,
"Hexaedron8", Dimension::Dim3, 8, 12, 6);
321 type->addFaceQuad(0, 0, 3, 2, 1);
322 type->addFaceQuad(1, 0, 4, 7, 3);
323 type->addFaceQuad(2, 0, 1, 5, 4);
324 type->addFaceQuad(3, 4, 5, 6, 7);
325 type->addFaceQuad(4, 1, 2, 6, 5);
326 type->addFaceQuad(5, 2, 3, 7, 6);
328 type->addEdge(0, 0, 1, 2, 0);
329 type->addEdge(1, 1, 2, 4, 0);
330 type->addEdge(2, 2, 3, 5, 0);
331 type->addEdge(3, 3, 0, 1, 0);
332 type->addEdge(4, 0, 4, 1, 2);
333 type->addEdge(5, 1, 5, 2, 4);
334 type->addEdge(6, 2, 6, 4, 5);
335 type->addEdge(7, 3, 7, 5, 1);
336 type->addEdge(8, 4, 5, 3, 2);
337 type->addEdge(9, 5, 6, 3, 4);
338 type->addEdge(10, 6, 7, 3, 5);
339 type->addEdge(11, 7, 4, 3, 1);
345 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
346 m_types[IT_Hexaedron20] = type;
348 type->setInfos(
this, IT_Hexaedron20,
"Hexaedron20", Dimension::Dim3, 20, 12, 6);
349 type->setOrder(2, ITI_Hexaedron8);
351 type->addFaceQuad8(0, 0, 3, 2, 1, 11, 10, 9, 8);
352 type->addFaceQuad8(1, 0, 4, 7, 3, 16, 15, 19, 11);
353 type->addFaceQuad8(2, 0, 1, 5, 4, 8, 17, 12, 16);
354 type->addFaceQuad8(3, 4, 5, 6, 7, 12, 13, 14, 15);
355 type->addFaceQuad8(4, 1, 2, 6, 5, 9, 18, 13, 17);
356 type->addFaceQuad8(5, 2, 3, 7, 6, 10, 19, 14, 18);
358 type->addEdge(0, 0, 1, 2, 0);
359 type->addEdge(1, 1, 2, 4, 0);
360 type->addEdge(2, 2, 3, 5, 0);
361 type->addEdge(3, 3, 0, 1, 0);
362 type->addEdge(4, 0, 4, 1, 2);
363 type->addEdge(5, 1, 5, 2, 4);
364 type->addEdge(6, 2, 6, 4, 5);
365 type->addEdge(7, 3, 7, 5, 1);
366 type->addEdge(8, 4, 5, 3, 2);
367 type->addEdge(9, 5, 6, 3, 4);
368 type->addEdge(10, 6, 7, 3, 5);
369 type->addEdge(11, 7, 4, 3, 1);
374 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
375 m_types[IT_Pyramid5] = type;
377 type->setInfos(
this, IT_Pyramid5,
"Pyramid5", Dimension::Dim3, 5, 8, 5);
379 type->addFaceQuad(0, 0, 3, 2, 1);
380 type->addFaceTriangle(1, 0, 4, 3);
381 type->addFaceTriangle(2, 0, 1, 4);
382 type->addFaceTriangle(3, 1, 2, 4);
383 type->addFaceTriangle(4, 2, 3, 4);
385 type->addEdge(0, 0, 1, 2, 0);
386 type->addEdge(1, 1, 2, 3, 0);
387 type->addEdge(2, 2, 3, 4, 0);
388 type->addEdge(3, 3, 0, 1, 0);
389 type->addEdge(4, 0, 4, 1, 2);
390 type->addEdge(5, 1, 4, 2, 3);
391 type->addEdge(6, 2, 4, 3, 4);
392 type->addEdge(7, 3, 4, 4, 1);
397 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
398 m_types[IT_Pentaedron6] = type;
400 type->setInfos(
this, IT_Pentaedron6,
"Pentaedron6", Dimension::Dim3, 6, 9, 5);
402 type->addFaceTriangle(0, 0, 2, 1);
403 type->addFaceQuad(1, 0, 3, 5, 2);
404 type->addFaceQuad(2, 0, 1, 4, 3);
405 type->addFaceTriangle(3, 3, 4, 5);
406 type->addFaceQuad(4, 1, 2, 5, 4);
408 type->addEdge(0, 0, 1, 2, 0);
409 type->addEdge(1, 1, 2, 4, 0);
410 type->addEdge(2, 2, 0, 1, 0);
411 type->addEdge(3, 0, 3, 1, 2);
412 type->addEdge(4, 1, 4, 2, 4);
413 type->addEdge(5, 2, 5, 4, 1);
414 type->addEdge(6, 3, 4, 3, 2);
415 type->addEdge(7, 4, 5, 3, 4);
416 type->addEdge(8, 5, 3, 3, 1);
421 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
422 m_types[IT_Tetraedron4] = type;
424 type->setInfos(
this, IT_Tetraedron4,
"Tetraedron4", Dimension::Dim3, 4, 6, 4);
426 type->addFaceTriangle(0, 0, 2, 1);
427 type->addFaceTriangle(1, 0, 3, 2);
428 type->addFaceTriangle(2, 0, 1, 3);
429 type->addFaceTriangle(3, 1, 2, 3);
431 type->addEdge(0, 0, 1, 2, 0);
432 type->addEdge(1, 1, 2, 3, 0);
433 type->addEdge(2, 2, 0, 1, 0);
434 type->addEdge(3, 0, 3, 1, 2);
435 type->addEdge(4, 1, 3, 2, 3);
436 type->addEdge(5, 2, 3, 3, 1);
442 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
443 m_types[IT_Tetraedron10] = type;
445 type->setInfos(
this, IT_Tetraedron10,
"Tetraedron10", Dimension::Dim3, 10, 6, 4);
446 type->setOrder(2, ITI_Tetraedron4);
448 type->addFaceTriangle6(0, 0, 2, 1, 6, 5, 4);
449 type->addFaceTriangle6(1, 0, 3, 2, 7, 9, 6);
450 type->addFaceTriangle6(2, 0, 1, 3, 4, 8, 7);
451 type->addFaceTriangle6(3, 1, 2, 3, 5, 9, 8);
453 type->addEdge(0, 0, 1, 2, 0);
454 type->addEdge(1, 1, 2, 3, 0);
455 type->addEdge(2, 2, 0, 1, 0);
456 type->addEdge(3, 0, 3, 1, 2);
457 type->addEdge(4, 1, 3, 2, 3);
458 type->addEdge(5, 2, 3, 3, 1);
463 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
464 m_types[IT_Heptaedron10] = type;
466 type->setInfos(
this, IT_Heptaedron10,
"Heptaedron10", Dimension::Dim3, 10, 15, 7);
468 type->addFacePentagon(0, 0, 4, 3, 2, 1);
469 type->addFacePentagon(1, 5, 6, 7, 8, 9);
470 type->addFaceQuad(2, 0, 1, 6, 5);
471 type->addFaceQuad(3, 1, 2, 7, 6);
472 type->addFaceQuad(4, 2, 3, 8, 7);
473 type->addFaceQuad(5, 3, 4, 9, 8);
474 type->addFaceQuad(6, 4, 0, 5, 9);
476 type->addEdge(0, 0, 1, 2, 0);
477 type->addEdge(1, 1, 2, 3, 0);
478 type->addEdge(2, 2, 3, 4, 0);
479 type->addEdge(3, 3, 4, 5, 0);
480 type->addEdge(4, 4, 0, 6, 0);
481 type->addEdge(5, 5, 6, 1, 2);
482 type->addEdge(6, 6, 7, 1, 3);
483 type->addEdge(7, 7, 8, 1, 4);
484 type->addEdge(8, 8, 9, 1, 5);
485 type->addEdge(9, 9, 5, 1, 6);
486 type->addEdge(10, 0, 5, 6, 2);
487 type->addEdge(11, 1, 6, 2, 3);
488 type->addEdge(12, 2, 7, 3, 4);
489 type->addEdge(13, 3, 8, 4, 5);
490 type->addEdge(14, 4, 9, 5, 6);
495 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
496 m_types[IT_Octaedron12] = type;
498 type->setInfos(
this, IT_Octaedron12,
"Octaedron12", Dimension::Dim3, 12, 18, 8);
500 type->addFaceHexagon(0, 0, 5, 4, 3, 2, 1);
501 type->addFaceHexagon(1, 6, 7, 8, 9, 10, 11);
502 type->addFaceQuad(2, 0, 1, 7, 6);
503 type->addFaceQuad(3, 1, 2, 8, 7);
504 type->addFaceQuad(4, 2, 3, 9, 8);
505 type->addFaceQuad(5, 3, 4, 10, 9);
506 type->addFaceQuad(6, 4, 5, 11, 10);
507 type->addFaceQuad(7, 5, 0, 6, 11);
509 type->addEdge(0, 0, 1, 2, 0);
510 type->addEdge(1, 1, 2, 3, 0);
511 type->addEdge(2, 2, 3, 4, 0);
512 type->addEdge(3, 3, 4, 5, 0);
513 type->addEdge(4, 4, 5, 6, 0);
514 type->addEdge(5, 5, 0, 7, 0);
515 type->addEdge(6, 6, 7, 1, 2);
516 type->addEdge(7, 7, 8, 1, 3);
517 type->addEdge(8, 8, 9, 1, 4);
518 type->addEdge(9, 9, 10, 1, 5);
519 type->addEdge(10, 10, 11, 1, 6);
520 type->addEdge(11, 11, 6, 1, 7);
521 type->addEdge(12, 0, 6, 7, 2);
522 type->addEdge(13, 1, 7, 2, 3);
523 type->addEdge(14, 2, 8, 3, 4);
524 type->addEdge(15, 3, 9, 4, 5);
525 type->addEdge(16, 4, 10, 5, 6);
526 type->addEdge(17, 5, 11, 6, 7);
531 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
532 m_types[IT_HemiHexa7] = type;
534 type->setInfos(
this, IT_HemiHexa7,
"HemiHexa7", Dimension::Dim3, 7, 11, 6);
536 type->addFaceTriangle(0, 0, 1, 2);
537 type->addFaceQuad(1, 0, 2, 3, 4);
538 type->addFaceQuad(2, 0, 5, 6, 1);
539 type->addFaceTriangle(3, 0, 4, 5);
540 type->addFaceQuad(4, 1, 6, 3, 2);
541 type->addFaceQuad(5, 3, 6, 5, 4);
543 type->addEdge(0, 0, 1, 0, 2);
544 type->addEdge(1, 1, 2, 0, 4);
545 type->addEdge(2, 2, 0, 0, 1);
546 type->addEdge(3, 2, 3, 1, 4);
547 type->addEdge(4, 3, 4, 1, 5);
548 type->addEdge(5, 4, 5, 3, 5);
549 type->addEdge(6, 5, 0, 3, 2);
550 type->addEdge(7, 0, 4, 3, 1);
551 type->addEdge(8, 5, 6, 2, 5);
552 type->addEdge(9, 6, 1, 2, 4);
553 type->addEdge(10, 3, 6, 5, 4);
558 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
559 m_types[IT_HemiHexa6] = type;
561 type->setInfos(
this, IT_HemiHexa6,
"HemiHexa6", Dimension::Dim3, 6, 10, 6);
563 type->addFaceTriangle(0, 0, 1, 2);
564 type->addFaceQuad(1, 0, 2, 3, 4);
565 type->addFaceQuad(2, 0, 5, 3, 1);
566 type->addFaceTriangle(3, 0, 4, 5);
567 type->addFaceTriangle(4, 1, 3, 2);
568 type->addFaceTriangle(5, 3, 5, 4);
570 type->addEdge(0, 0, 1, 0, 2);
571 type->addEdge(1, 1, 2, 0, 4);
572 type->addEdge(2, 2, 0, 0, 1);
573 type->addEdge(3, 2, 3, 1, 4);
574 type->addEdge(4, 3, 4, 1, 5);
575 type->addEdge(5, 4, 5, 3, 5);
576 type->addEdge(6, 5, 0, 3, 2);
577 type->addEdge(7, 0, 4, 3, 1);
578 type->addEdge(8, 5, 3, 2, 5);
579 type->addEdge(9, 3, 1, 2, 4);
584 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
585 m_types[IT_HemiHexa5] = type;
587 type->setInfos(
this, IT_HemiHexa5,
"HemiHexa5", Dimension::Dim3, 5, 7, 4);
589 type->addFaceTriangle(0, 0, 1, 2);
590 type->addFaceQuad(1, 0, 2, 3, 4);
591 type->addFaceQuad(2, 0, 4, 3, 1);
592 type->addFaceTriangle(3, 1, 3, 2);
594 type->addEdge(0, 0, 1, 0, 2);
595 type->addEdge(1, 1, 2, 0, 3);
596 type->addEdge(2, 2, 0, 0, 1);
597 type->addEdge(3, 2, 3, 1, 3);
598 type->addEdge(4, 3, 1, 2, 3);
599 type->addEdge(5, 3, 4, 1, 2);
600 type->addEdge(6, 4, 0, 1, 2);
605 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
606 m_types[IT_AntiWedgeLeft6] = type;
608 type->setInfos(
this, IT_AntiWedgeLeft6,
"AntiWedgeLeft6", Dimension::Dim3, 6, 10, 6);
610 type->addFaceTriangle(0, 0, 2, 1);
611 type->addFaceQuad(1, 0, 3, 5, 2);
612 type->addFaceQuad(2, 0, 1, 4, 3);
613 type->addFaceTriangle(3, 3, 4, 5);
614 type->addFaceTriangle(4, 1, 2, 4);
615 type->addFaceTriangle(5, 2, 5, 4);
617 type->addEdge(0, 0, 1, 0, 2);
618 type->addEdge(1, 1, 2, 4, 0);
619 type->addEdge(2, 2, 0, 1, 0);
620 type->addEdge(3, 0, 3, 1, 2);
621 type->addEdge(4, 1, 4, 2, 4);
622 type->addEdge(5, 2, 5, 5, 1);
623 type->addEdge(6, 3, 4, 3, 2);
624 type->addEdge(7, 4, 5, 3, 5);
625 type->addEdge(8, 5, 3, 3, 1);
626 type->addEdge(9, 2, 4, 4, 5);
631 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
632 m_types[IT_AntiWedgeRight6] = type;
634 type->setInfos(
this, IT_AntiWedgeRight6,
"AntiWedgeRight6", Dimension::Dim3, 6, 10, 6);
636 type->addFaceTriangle(0, 0, 2, 1);
637 type->addFaceQuad(1, 0, 3, 5, 2);
638 type->addFaceQuad(2, 0, 1, 4, 3);
639 type->addFaceTriangle(3, 3, 4, 5);
640 type->addFaceTriangle(4, 1, 2, 5);
641 type->addFaceTriangle(5, 1, 5, 4);
643 type->addEdge(0, 0, 1, 0, 2);
644 type->addEdge(1, 1, 2, 4, 0);
645 type->addEdge(2, 2, 0, 1, 0);
646 type->addEdge(3, 0, 3, 1, 2);
647 type->addEdge(4, 1, 4, 2, 5);
648 type->addEdge(5, 2, 5, 4, 1);
649 type->addEdge(6, 3, 4, 3, 2);
650 type->addEdge(7, 4, 5, 3, 5);
651 type->addEdge(8, 5, 3, 3, 1);
652 type->addEdge(9, 1, 5, 5, 4);
657 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
658 m_types[IT_DiTetra5] = type;
660 type->setInfos(
this, IT_DiTetra5,
"DiTetra5", Dimension::Dim3, 5, 9, 6);
662 type->addFaceTriangle(0, 0, 1, 3);
663 type->addFaceTriangle(1, 1, 2, 3);
664 type->addFaceTriangle(2, 2, 0, 3);
665 type->addFaceTriangle(3, 1, 0, 4);
666 type->addFaceTriangle(4, 2, 1, 4);
667 type->addFaceTriangle(5, 0, 2, 4);
669 type->addEdge(0, 0, 1, 0, 3);
670 type->addEdge(1, 1, 2, 1, 4);
671 type->addEdge(2, 2, 0, 2, 5);
672 type->addEdge(3, 0, 3, 2, 0);
673 type->addEdge(4, 1, 3, 0, 1);
674 type->addEdge(5, 2, 3, 1, 2);
675 type->addEdge(6, 0, 4, 3, 5);
676 type->addEdge(7, 1, 4, 4, 3);
677 type->addEdge(8, 2, 4, 5, 4);
682 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
683 m_types[IT_DualNode] = type;
685 type->setInfos(
this, IT_DualNode,
"DualNode", 1, 0, 0);
689 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
690 m_types[IT_DualEdge] = type;
692 type->setInfos(
this, IT_DualEdge,
"DualEdge", 1, 0, 0);
696 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
697 m_types[IT_DualFace] = type;
699 type->setInfos(
this, IT_DualFace,
"DualFace", 1, 0, 0);
703 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
704 m_types[IT_DualCell] = type;
706 type->setInfos(
this, IT_DualCell,
"DualCell", 1, 0, 0);
710 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
711 m_types[IT_DualParticle] = type;
713 type->setInfos(
this, IT_DualParticle,
"DualParticle", 1, 0, 0);
717 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
718 m_types[IT_Link] = type;
720 type->setInfos(
this, IT_Link,
"Link", 0, 0, 0);
725 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
726 m_types[IT_Enneedron14] = type;
728 type->setInfos(
this, IT_Enneedron14,
"Enneedron14", Dimension::Dim3, 14, 21, 9);
730 type->addFaceHeptagon(0, 0, 6, 5, 4, 3, 2, 1);
731 type->addFaceHeptagon(1, 7, 8, 9, 10, 11, 12, 13);
732 type->addFaceQuad(2, 0, 1, 8, 7);
733 type->addFaceQuad(3, 1, 2, 9, 8);
734 type->addFaceQuad(4, 2, 3, 10, 9);
735 type->addFaceQuad(5, 3, 4, 11, 10);
736 type->addFaceQuad(6, 4, 5, 12, 11);
737 type->addFaceQuad(7, 5, 6, 13, 12);
738 type->addFaceQuad(8, 6, 0, 7, 13);
740 type->addEdge(0, 0, 1, 2, 0);
741 type->addEdge(1, 1, 2, 3, 0);
742 type->addEdge(2, 2, 3, 4, 0);
743 type->addEdge(3, 3, 4, 5, 0);
744 type->addEdge(4, 4, 5, 6, 0);
745 type->addEdge(5, 5, 6, 7, 0);
746 type->addEdge(6, 6, 0, 8, 0);
747 type->addEdge(7, 7, 8, 1, 2);
748 type->addEdge(8, 8, 9, 1, 3);
749 type->addEdge(9, 9, 10, 1, 4);
750 type->addEdge(10, 10, 11, 1, 5);
751 type->addEdge(11, 11, 12, 1, 6);
752 type->addEdge(12, 12, 13, 1, 7);
753 type->addEdge(13, 13, 7, 1, 8);
754 type->addEdge(14, 0, 7, 8, 2);
755 type->addEdge(15, 1, 8, 1, 2);
756 type->addEdge(16, 2, 9, 2, 3);
757 type->addEdge(17, 3, 10, 3, 4);
758 type->addEdge(18, 4, 11, 4, 5);
759 type->addEdge(19, 5, 12, 5, 6);
760 type->addEdge(20, 6, 13, 6, 7);
764 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
765 m_types[IT_Decaedron16] = type;
767 type->setInfos(
this, IT_Decaedron16,
"Decaedron16", Dimension::Dim3, 16, 24, 10);
769 type->addFaceOctogon(0, 0, 7, 6, 5, 4, 3, 2, 1);
770 type->addFaceOctogon(1, 8, 9, 10, 11, 12, 13, 14, 15);
771 type->addFaceQuad(2, 0, 1, 9, 8);
772 type->addFaceQuad(3, 1, 2, 10, 9);
773 type->addFaceQuad(4, 2, 3, 11, 10);
774 type->addFaceQuad(5, 3, 4, 12, 11);
775 type->addFaceQuad(6, 4, 5, 13, 12);
776 type->addFaceQuad(7, 5, 6, 14, 13);
777 type->addFaceQuad(8, 6, 7, 15, 14);
778 type->addFaceQuad(9, 7, 0, 8, 15);
780 type->addEdge(0, 0, 1, 2, 0);
781 type->addEdge(1, 1, 2, 3, 0);
782 type->addEdge(2, 2, 3, 4, 0);
783 type->addEdge(3, 3, 4, 5, 0);
784 type->addEdge(4, 4, 5, 6, 0);
785 type->addEdge(5, 5, 6, 7, 0);
786 type->addEdge(6, 6, 7, 8, 0);
787 type->addEdge(7, 7, 0, 9, 0);
788 type->addEdge(8, 8, 9, 1, 2);
789 type->addEdge(9, 9, 10, 1, 3);
790 type->addEdge(10, 10, 11, 1, 4);
791 type->addEdge(11, 11, 12, 1, 5);
792 type->addEdge(12, 12, 13, 1, 6);
793 type->addEdge(13, 13, 14, 1, 7);
794 type->addEdge(14, 14, 15, 1, 8);
795 type->addEdge(15, 15, 8, 1, 9);
796 type->addEdge(16, 0, 8, 9, 2);
797 type->addEdge(17, 1, 9, 2, 3);
798 type->addEdge(18, 2, 10, 3, 4);
799 type->addEdge(19, 3, 11, 4, 5);
800 type->addEdge(20, 4, 12, 5, 6);
801 type->addEdge(21, 5, 13, 6, 7);
802 type->addEdge(22, 6, 14, 7, 8);
803 type->addEdge(23, 7, 15, 8, 9);
808 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
809 m_types[IT_Heptagon7] = type;
811 type->setInfos(
this, IT_Heptagon7,
"Heptagon7", Dimension::Dim2, 7, 7, 7);
813 type->addEdgeAndFaceLine(0, { 0, 1 }, { 6, 1 });
814 type->addEdgeAndFaceLine(1, { 1, 2 }, { 0, 2 });
815 type->addEdgeAndFaceLine(2, { 2, 3 }, { 1, 3 });
816 type->addEdgeAndFaceLine(3, { 3, 4 }, { 2, 4 });
817 type->addEdgeAndFaceLine(4, { 4, 5 }, { 3, 5 });
818 type->addEdgeAndFaceLine(5, { 5, 6 }, { 4, 6 });
819 type->addEdgeAndFaceLine(6, { 6, 0 }, { 5, 0 });
824 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
825 m_types[IT_Octogon8] = type;
827 type->setInfos(
this, IT_Octogon8,
"Octogon8", Dimension::Dim2, 8, 8, 8);
829 type->addEdgeAndFaceLine(0, { 0, 1 }, { 7, 1 });
830 type->addEdgeAndFaceLine(1, { 1, 2 }, { 0, 2 });
831 type->addEdgeAndFaceLine(2, { 2, 3 }, { 1, 3 });
832 type->addEdgeAndFaceLine(3, { 3, 4 }, { 2, 4 });
833 type->addEdgeAndFaceLine(4, { 4, 5 }, { 3, 5 });
834 type->addEdgeAndFaceLine(5, { 5, 6 }, { 4, 6 });
835 type->addEdgeAndFaceLine(6, { 6, 7 }, { 5, 7 });
836 type->addEdgeAndFaceLine(7, { 7, 0 }, { 6, 0 });
841 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
842 m_types[IT_Cell3D_Line2] = type;
844 type->setInfos(
this, IT_Cell3D_Line2,
"Cell3D_Line2", Dimension::Dim1, 2, 0, 0);
849 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
850 m_types[IT_Cell3D_Triangle3] = type;
854 std::swap(nb_face, nb_edge);
856 type->setInfos(
this, IT_Cell3D_Triangle3,
"Cell3D_Triangle3", Dimension::Dim2, 3, nb_edge, nb_face);
858 if (is_non_manifold) {
859 type->addEdge2D(0, 0, 1);
860 type->addEdge2D(1, 1, 2);
861 type->addEdge2D(2, 2, 0);
864 type->addFaceLine(0, 0, 1);
865 type->addFaceLine(1, 1, 2);
866 type->addFaceLine(2, 2, 0);
872 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
873 m_types[IT_Cell3D_Quad4] = type;
877 std::swap(nb_face, nb_edge);
879 type->setInfos(
this, IT_Cell3D_Quad4,
"Cell3D_Quad4", Dimension::Dim2, 4, nb_edge, nb_face);
880 if (is_non_manifold) {
881 type->addEdge2D(0, 0, 1);
882 type->addEdge2D(1, 1, 2);
883 type->addEdge2D(2, 2, 3);
884 type->addEdge2D(3, 3, 0);
887 type->addFaceLine(0, 0, 1);
888 type->addFaceLine(1, 1, 2);
889 type->addFaceLine(2, 2, 3);
890 type->addFaceLine(3, 3, 0);
896 if (!arcane_item_type_file.null()) {
898 _readTypes(parallel_mng, arcane_item_type_file);
904 for (
Integer i = 0; i < m_types.size(); ++i) {
905 ItemTypeInfoBuilder* type =
static_cast<ItemTypeInfoBuilder*
>(m_types[i]);
908 type->computeFaceEdgeInfos();
918 ARCANE_ASSERT((m_initialized), (
"Cannot use not built ItemTypeMng"));
919 Integer nb_type = m_types.size();
920 ostr <<
"** Number of types " << nb_type <<
'\n';
921 for (
Integer i = 0; i < nb_type; ++i) {
922 ItemTypeInfo* type = m_types[i];
923 ostr <<
" - Type " << type->
typeId()
929 ostr <<
" - - Face " << z <<
":";
931 ostr <<
" " << lf.
node(zk);
968 m_trace->
info() <<
"Reading additional item types from file '" << filename <<
"'";
976 if (file_length == 0)
977 throw IOException(A_FUNCINFO,
"ARCANE_ITEM_TYPE_FILE is an empty file");
979 ifile.open(filename.
localstr(), std::ios::binary);
981 throw IOException(A_FUNCINFO,
"Cannot open ARCANE_ITEM_TYPE_FILE item type file");
983 ifile.read((
char*)bytes.
data(), file_length);
984 bytes[(
Integer)file_length] =
'\0';
986 throw IOException(A_FUNCINFO,
"Cannot read ARCANE_ITEM_TYPE_FILE item type file");
1003 typedef std::map<Integer, Integer> PolygonMapper;
1004 PolygonMapper built_polygons;
1005 built_polygons[3] = IT_Triangle3;
1006 built_polygons[4] = IT_Quad4;
1007 built_polygons[5] = IT_Pentagon5;
1008 built_polygons[6] = IT_Hexagon6;
1009 typedef std::set<Integer> KnownTypes;
1010 KnownTypes known_types;
1012 known_types.insert(i_type);
1015 throw FatalErrorException(A_FUNCINFO,
"Invalid initialization of built-in item types");
1018 std::istringstream ifile((
char*)bytes.unguardedBasePointer(), std::istringstream::in);
1023 Int16 typeId = -1, nbN = 0, nbE = 0, nbF = 0;
1024 for (
Integer i = 0; i < nb_type; ++i) {
1025 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
1026 ifile >> typeId >> nbF >> nbE;
1027 if (typeId >= nb_type || typeId < 0)
1028 throw IOException(A_FUNCINFO, String::format(
"Polyhedron reader cannot allow typeId {0}", typeId));
1030 if (known_types.find(typeId) != known_types.end())
1031 throw FatalErrorException(A_FUNCINFO, String::format(
"Already existing typeId {0}", typeId));
1032 known_types.insert(typeId);
1038 nbN = nbE - nbF + 2;
1040 type->setInfos(
this, typeId, String::format(
"Polyhedron{0}_{1}-{2}-{3}", typeId, nbN, nbE, nbF), nbN, nbE, nbF);
1041 m_trace->debug(
Trace::High) <<
"Adding " << type->typeName() <<
" type #"
1043 << nbE <<
" edges, " << nbF <<
" faces.";
1044 m_types[typeId] = type;
1045 for (
Integer iface = 0; iface < nbF; ++iface) {
1047 UniqueArray<Integer> nodeFace(nbN);
1048 for (
Integer inodeFace = 0; inodeFace < nbN; ++inodeFace) {
1049 ifile >> nodeFace[inodeFace];
1051 PolygonMapper::const_iterator finder = built_polygons.find(nbN);
1052 Int16 face_type = IT_NullType;
1053 if (finder != built_polygons.end()) {
1054 face_type = finder->second;
1055 m_trace->debug(
Trace::High) <<
"\tAdding already existing face type " << face_type
1056 <<
" for face " << iface <<
" with " << nbN <<
" nodes";
1059 ItemTypeInfoBuilder* type2 = m_types_buffer->allocOne();
1061 face_type = m_types.size();
1063 built_polygons[nbN] = face_type;
1065 type2->setInfos(
this, face_type, String::format(
"Polygon{0}", nbN), nbN, nbN, nbN);
1066 for (
Integer j = 0; j < nbN; ++j)
1067 type2->addFaceLine(j, j, (j + 1) % nbN);
1069 for (
Integer j = 0; j < nbN; ++j)
1070 type2->addEdge(j, j, (j + 1) % nbN, (j - 1 + nbN) % nbN, (j + 1) % nbN);
1071 m_trace->debug(
Trace::High) <<
"\tAdding new face type " << face_type
1072 <<
" for face " << iface <<
" with " << nbN <<
" nodes";
1074 type->addFaceGeneric(iface, face_type, nodeFace);
1076 Integer node0, node1, leftFace, rightFace;
1077 for (
Integer iedge = 0; iedge < nbE; ++iedge) {
1078 ifile >> node0 >> node1 >> leftFace >> rightFace;
1079 type->addEdge(iedge, node0, node1, leftFace, rightFace);
1083 m_trace->debug(
Trace::High) <<
"Total number of types : " << m_types.size();
1092 return _singleton()->types().size();
1098 return m_nb_builtin_item_type;
1118 case IT_Tetraedron4:
1122 case IT_Pentaedron6:
1126 case IT_Heptaedron10:
1127 case IT_Octaedron12:
1131 case IT_AntiWedgeLeft6:
1132 case IT_AntiWedgeRight6:
1148 if (!singleton_instance)
1150 return singleton_instance;
1157#ifndef ARCANE_OS_WIN32
1158 delete singleton_instance;
1160 singleton_instance =
nullptr;
1169 ARCANE_ASSERT((m_initialized), (
"Cannot use not built ItemTypeMng"));
1179 ARCANE_ASSERT((m_initialized), (
"Cannot use not built ItemTypeMng"));
1189 ARCANE_ASSERT((m_initialized), (
"Cannot use not built ItemTypeMng"));
1190 return m_types[
id.typeId()];
1220 return "InvalidType";
1228 auto has_general_cells =
false;
1229 if (m_mesh_with_general_cells.find(mesh) != m_mesh_with_general_cells.end()) {
1230 has_general_cells =
true;
1232 return has_general_cells;
1240 ARCANE_ASSERT(mesh, (
"Trying to indicate a null mesh contains general cells."));
1241 m_mesh_with_general_cells.insert(mesh);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Integer size() const
Nombre d'éléments du vecteur.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
const T * data() const
Accès à la racine du tableau hors toute protection.
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.
Vecteur 1D de données avec sémantique par valeur (style STL).
-*- 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.