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"
32#include "arcane/ItemRefinementPattern.h"
46const Integer ItemTypeMng::m_nb_builtin_item_type = NB_BASIC_ITEM_TYPE;
56 m_initialized_counter = 0;
65 delete m_types_buffer;
108 m_types.resize(m_nb_builtin_item_type);
114 m_types[IT_NullType] = type;
116 type->setInfos(
this, IT_NullType,
"NullType", Dimension::DimUnknown, 0, 0, 0);
121 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
122 m_types[IT_Vertex] = type;
124 type->setInfos(
this, IT_Vertex,
"Vertex", Dimension::Dim0, 0, 0, 0);
132 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
133 m_types[IT_FaceVertex] = type;
135 type->setInfos(
this, IT_FaceVertex,
"FaceVertex", Dimension::Dim0, 1, 0, 0);
136 type->setIsValidForCell(
false);
141 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
142 m_types[IT_Line2] = type;
144 type->setInfos(
this, IT_Line2,
"Line2", Dimension::Dim1, 2, 0, 0);
145 type->setIsValidForCell(
false);
150 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
151 m_types[IT_Line3] = type;
153 type->setInfos(
this, IT_Line3,
"Line3", Dimension::Dim1, 3, 0, 0);
154 type->setIsValidForCell(
false);
159 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
160 m_types[IT_CellLine2] = type;
162 type->setInfos(
this, IT_CellLine2,
"CellLine2", Dimension::Dim1, 2, 0, 2);
164 type->addFaceVertex(0, 0);
165 type->addFaceVertex(1, 1);
177 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
178 m_types[IT_Triangle3] = type;
180 type->setInfos(
this, IT_Triangle3,
"Triangle3", Dimension::Dim2, 3, 3, 3);
182 type->addFaceLine(0, 0, 1);
183 type->addFaceLine(1, 1, 2);
184 type->addFaceLine(2, 2, 0);
186 type->addEdge(0, 0, 1, 1, 2);
187 type->addEdge(1, 1, 2, 2, 0);
188 type->addEdge(2, 2, 0, 0, 1);
194 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
195 m_types[IT_Triangle6] = type;
197 type->setInfos(
this, IT_Triangle6,
"Triangle6", Dimension::Dim2, 6, 3, 3);
199 type->addFaceLine3(0, 0, 1, 3);
200 type->addFaceLine3(1, 1, 2, 4);
201 type->addFaceLine3(2, 2, 0, 5);
203 type->addEdge(0, 0, 1, 1, 2);
204 type->addEdge(1, 1, 2, 2, 0);
205 type->addEdge(2, 2, 0, 0, 1);
210 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
211 m_types[IT_Quad4] = type;
213 type->setInfos(
this, IT_Quad4,
"Quad4", Dimension::Dim2, 4, 4, 4);
215 type->addFaceLine(0, 0, 1);
216 type->addFaceLine(1, 1, 2);
217 type->addFaceLine(2, 2, 3);
218 type->addFaceLine(3, 3, 0);
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);
229 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
230 m_types[IT_Quad8] = type;
232 type->setInfos(
this, IT_Quad8,
"Quad8", Dimension::Dim2, 8, 4, 4);
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);
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);
247 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
248 m_types[IT_Pentagon5] = type;
250 type->setInfos(
this, IT_Pentagon5,
"Pentagon5", Dimension::Dim2, 5, 5, 5);
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);
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);
267 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
268 m_types[IT_Hexagon6] = type;
270 type->setInfos(
this, IT_Hexagon6,
"Hexagon6", Dimension::Dim2, 6, 6, 6);
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);
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);
289 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
290 m_types[IT_Hexaedron8] = type;
292 type->setInfos(
this, IT_Hexaedron8,
"Hexaedron8", Dimension::Dim3, 8, 12, 6);
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);
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);
318 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
319 m_types[IT_Hexaedron20] = type;
321 type->setInfos(
this, IT_Hexaedron20,
"Hexaedron20", Dimension::Dim3, 20, 12, 6);
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);
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);
346 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
347 m_types[IT_Pyramid5] = type;
349 type->setInfos(
this, IT_Pyramid5,
"Pyramid5", Dimension::Dim3, 5, 8, 5);
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);
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);
369 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
370 m_types[IT_Pentaedron6] = type;
372 type->setInfos(
this, IT_Pentaedron6,
"Pentaedron6", Dimension::Dim3, 6, 9, 5);
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);
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);
393 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
394 m_types[IT_Tetraedron4] = type;
396 type->setInfos(
this, IT_Tetraedron4,
"Tetraedron4", Dimension::Dim3, 4, 6, 4);
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);
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);
414 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
415 m_types[IT_Tetraedron10] = type;
417 type->setInfos(
this, IT_Tetraedron10,
"Tetraedron10", Dimension::Dim3, 10, 6, 4);
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);
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);
434 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
435 m_types[IT_Heptaedron10] = type;
437 type->setInfos(
this, IT_Heptaedron10,
"Heptaedron10", Dimension::Dim3, 10, 15, 7);
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);
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);
466 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
467 m_types[IT_Octaedron12] = type;
469 type->setInfos(
this, IT_Octaedron12,
"Octaedron12", Dimension::Dim3, 12, 18, 8);
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);
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);
502 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
503 m_types[IT_HemiHexa7] = type;
505 type->setInfos(
this, IT_HemiHexa7,
"HemiHexa7", Dimension::Dim3, 7, 11, 6);
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);
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);
529 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
530 m_types[IT_HemiHexa6] = type;
532 type->setInfos(
this, IT_HemiHexa6,
"HemiHexa6", Dimension::Dim3, 6, 10, 6);
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);
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);
555 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
556 m_types[IT_HemiHexa5] = type;
558 type->setInfos(
this, IT_HemiHexa5,
"HemiHexa5", Dimension::Dim3, 5, 7, 4);
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);
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);
576 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
577 m_types[IT_AntiWedgeLeft6] = type;
579 type->setInfos(
this, IT_AntiWedgeLeft6,
"AntiWedgeLeft6", Dimension::Dim3, 6, 10, 6);
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);
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);
602 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
603 m_types[IT_AntiWedgeRight6] = type;
605 type->setInfos(
this, IT_AntiWedgeRight6,
"AntiWedgeRight6", Dimension::Dim3, 6, 10, 6);
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);
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);
628 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
629 m_types[IT_DiTetra5] = type;
631 type->setInfos(
this, IT_DiTetra5,
"DiTetra5", Dimension::Dim3, 5, 9, 6);
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);
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);
653 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
654 m_types[IT_DualNode] = type;
656 type->setInfos(
this, IT_DualNode,
"DualNode", 1, 0, 0);
660 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
661 m_types[IT_DualEdge] = type;
663 type->setInfos(
this, IT_DualEdge,
"DualEdge", 1, 0, 0);
667 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
668 m_types[IT_DualFace] = type;
670 type->setInfos(
this, IT_DualFace,
"DualFace", 1, 0, 0);
674 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
675 m_types[IT_DualCell] = type;
677 type->setInfos(
this, IT_DualCell,
"DualCell", 1, 0, 0);
681 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
682 m_types[IT_DualParticle] = type;
684 type->setInfos(
this, IT_DualParticle,
"DualParticle", 1, 0, 0);
688 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
689 m_types[IT_Link] = type;
691 type->setInfos(
this, IT_Link,
"Link", 0, 0, 0);
696 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
697 m_types[IT_Enneedron14] = type;
699 type->setInfos(
this, IT_Enneedron14,
"Enneedron14", Dimension::Dim3, 14, 21, 9);
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);
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);
735 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
736 m_types[IT_Decaedron16] = type;
738 type->setInfos(
this, IT_Decaedron16,
"Decaedron16", Dimension::Dim3, 16, 24, 10);
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);
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);
779 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
780 m_types[IT_Heptagon7] = type;
782 type->setInfos(
this, IT_Heptagon7,
"Heptagon7", Dimension::Dim2, 7, 7, 7);
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);
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);
803 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
804 m_types[IT_Octogon8] = type;
806 type->setInfos(
this, IT_Octogon8,
"Octogon8", Dimension::Dim2, 8, 8, 8);
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);
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);
829 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
830 m_types[IT_Cell3D_Line2] = type;
832 type->setInfos(
this, IT_Cell3D_Line2,
"Cell3D_Line2", Dimension::Dim1, 2, 0, 0);
837 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
838 m_types[IT_Cell3D_Triangle3] = type;
840 type->setInfos(
this, IT_Cell3D_Triangle3,
"Cell3D_Triangle3", Dimension::Dim2, 3, 0, 3);
842 type->addFaceLine(0, 0, 1);
843 type->addFaceLine(1, 1, 2);
844 type->addFaceLine(2, 2, 0);
849 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
850 m_types[IT_Cell3D_Quad4] = type;
852 type->setInfos(
this, IT_Cell3D_Quad4,
"Cell3D_Quad4", Dimension::Dim2, 4, 0, 4);
854 type->addFaceLine(0, 0, 1);
855 type->addFaceLine(1, 1, 2);
856 type->addFaceLine(2, 2, 3);
857 type->addFaceLine(3, 3, 0);
861 String arcane_item_type_file = platform::getEnvironmentVariable(
"ARCANE_ITEM_TYPE_FILE");
862 if (!arcane_item_type_file.null()) {
864 readTypes(parallel_mng, arcane_item_type_file);
870 for (Integer i = 0; i < m_types.size(); ++i) {
871 ItemTypeInfoBuilder* type =
static_cast<ItemTypeInfoBuilder*
>(m_types[i]);
874 type->computeFaceEdgeInfos();
884 ARCANE_ASSERT((m_initialized), (
"Cannot use not built ItemTypeMng"));
885 Integer
nb_type = m_types.size();
887 for (Integer i = 0; i <
nb_type; ++i) {
895 ostr <<
" - - Face " << z <<
":";
934 m_trace->
info() <<
"Reading additional item types from file '" <<
filename <<
"'";
940 if (
pm->commRank() == 0) {
943 throw IOException(A_FUNCINFO,
"ARCANE_ITEM_TYPE_FILE is an empty file");
947 throw IOException(A_FUNCINFO,
"Cannot open ARCANE_ITEM_TYPE_FILE item type file");
952 throw IOException(A_FUNCINFO,
"Cannot read ARCANE_ITEM_TYPE_FILE item type file");
969 typedef std::map<Integer, Integer> PolygonMapper;
970 PolygonMapper built_polygons;
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;
976 KnownTypes known_types;
978 known_types.insert(i_type);
981 throw FatalErrorException(A_FUNCINFO,
"Invalid initialization of built-in item types");
984 std::istringstream ifile((
char*)bytes.unguardedBasePointer(), std::istringstream::in);
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));
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);
1004 nbN = nbE - nbF + 2;
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 #"
1009 << nbE <<
" edges, " << nbF <<
" faces.";
1010 m_types[typeId] = type;
1011 for (Integer iface = 0; iface < nbF; ++iface) {
1013 UniqueArray<Integer> nodeFace(nbN);
1014 for (Integer inodeFace = 0; inodeFace < nbN; ++inodeFace) {
1015 ifile >> nodeFace[inodeFace];
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";
1025 ItemTypeInfoBuilder* type2 = m_types_buffer->allocOne();
1027 face_type = m_types.size();
1029 built_polygons[nbN] = face_type;
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);
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";
1040 type->addFaceGeneric(iface, face_type, nodeFace);
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);
1049 m_trace->
debug(Trace::High) <<
"Total number of types : " << m_types.size();
1058 return _singleton()->types().size();
1064 return m_nb_builtin_item_type;
1084 case IT_Tetraedron4:
1088 case IT_Pentaedron6:
1092 case IT_Heptaedron10:
1093 case IT_Octaedron12:
1097 case IT_AntiWedgeLeft6:
1098 case IT_AntiWedgeRight6:
1114 if (!singleton_instance)
1116 return singleton_instance;
1123#ifndef ARCANE_OS_WIN32
1124 delete singleton_instance;
1126 singleton_instance =
nullptr;
1135 ARCANE_ASSERT((m_initialized), (
"Cannot use not built ItemTypeMng"));
1145 ARCANE_ASSERT((m_initialized), (
"Cannot use not built ItemTypeMng"));
1155 ARCANE_ASSERT((m_initialized), (
"Cannot use not built ItemTypeMng"));
1156 return m_types[
id.typeId()];
1182_legacyTypeName(Integer
t)
1185 return _singleton()->typeFromId(
t)->typeName();
1186 return "InvalidType";
1195 if (m_mesh_with_general_cells.find(mesh) != m_mesh_with_general_cells.end()) {
1206 ARCANE_ASSERT(mesh, (
"Trying to indicate a null mesh contains general cells."));
1207 m_mesh_with_general_cells.insert(mesh);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
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 ...
Type d'une entité (Item).
Dimension
Dimension du type.
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.
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.
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.
Référence à une instance.
Chaîne de caractères unicode.
-*- 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....
ArrayView< Integer > IntegerArrayView
Equivalent C d'un tableau à une dimension d'entiers.
Int32 Integer
Type représentant un entier.