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;
80 Int32 init_counter = ++m_initialized_counter;
81 if (init_counter == 1) {
82 _build(parallel_mng, trace);
84 m_initialized_counter = max_rank;
89 while (init_counter < max_rank)
90 init_counter = m_initialized_counter.load();
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;
152 type->setOrder(2, ITI_Line2);
154 type->setInfos(
this, IT_Line3,
"Line3", Dimension::Dim1, 3, 0, 0);
155 type->setIsValidForCell(
false);
160 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
161 m_types[IT_CellLine2] = type;
163 type->setInfos(
this, IT_CellLine2,
"CellLine2", Dimension::Dim1, 2, 0, 2);
165 type->addFaceVertex(0, 0);
166 type->addFaceVertex(1, 1);
178 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
179 m_types[IT_Triangle3] = type;
181 type->setInfos(
this, IT_Triangle3,
"Triangle3", Dimension::Dim2, 3, 3, 3);
183 type->addFaceLine(0, 0, 1);
184 type->addFaceLine(1, 1, 2);
185 type->addFaceLine(2, 2, 0);
187 type->addEdge(0, 0, 1, 1, 2);
188 type->addEdge(1, 1, 2, 2, 0);
189 type->addEdge(2, 2, 0, 0, 1);
195 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
196 m_types[IT_Triangle6] = type;
198 type->setInfos(
this, IT_Triangle6,
"Triangle6", Dimension::Dim2, 6, 3, 3);
199 type->setOrder(2, ITI_Triangle3);
201 type->addFaceLine3(0, 0, 1, 3);
202 type->addFaceLine3(1, 1, 2, 4);
203 type->addFaceLine3(2, 2, 0, 5);
205 type->addEdge(0, 0, 1, 1, 2);
206 type->addEdge(1, 1, 2, 2, 0);
207 type->addEdge(2, 2, 0, 0, 1);
212 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
213 m_types[IT_Quad4] = type;
215 type->setInfos(
this, IT_Quad4,
"Quad4", Dimension::Dim2, 4, 4, 4);
217 type->addFaceLine(0, 0, 1);
218 type->addFaceLine(1, 1, 2);
219 type->addFaceLine(2, 2, 3);
220 type->addFaceLine(3, 3, 0);
222 type->addEdge(0, 0, 1, 3, 1);
223 type->addEdge(1, 1, 2, 0, 2);
224 type->addEdge(2, 2, 3, 1, 3);
225 type->addEdge(3, 3, 0, 2, 0);
231 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
232 m_types[IT_Quad8] = type;
234 type->setInfos(
this, IT_Quad8,
"Quad8", Dimension::Dim2, 8, 4, 4);
235 type->setOrder(2, ITI_Quad4);
237 type->addFaceLine3(0, 0, 1, 4);
238 type->addFaceLine3(1, 1, 2, 5);
239 type->addFaceLine3(2, 2, 3, 6);
240 type->addFaceLine3(3, 3, 0, 7);
242 type->addEdge(0, 0, 1, 3, 1);
243 type->addEdge(1, 1, 2, 0, 2);
244 type->addEdge(2, 2, 3, 1, 3);
245 type->addEdge(3, 3, 0, 2, 0);
250 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
251 m_types[IT_Pentagon5] = type;
253 type->setInfos(
this, IT_Pentagon5,
"Pentagon5", Dimension::Dim2, 5, 5, 5);
255 type->addFaceLine(0, 0, 1);
256 type->addFaceLine(1, 1, 2);
257 type->addFaceLine(2, 2, 3);
258 type->addFaceLine(3, 3, 4);
259 type->addFaceLine(4, 4, 0);
261 type->addEdge(0, 0, 1, 4, 1);
262 type->addEdge(1, 1, 2, 0, 2);
263 type->addEdge(2, 2, 3, 1, 3);
264 type->addEdge(3, 3, 4, 2, 4);
265 type->addEdge(4, 4, 0, 3, 0);
270 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
271 m_types[IT_Hexagon6] = type;
273 type->setInfos(
this, IT_Hexagon6,
"Hexagon6", Dimension::Dim2, 6, 6, 6);
275 type->addFaceLine(0, 0, 1);
276 type->addFaceLine(1, 1, 2);
277 type->addFaceLine(2, 2, 3);
278 type->addFaceLine(3, 3, 4);
279 type->addFaceLine(4, 4, 5);
280 type->addFaceLine(5, 5, 0);
282 type->addEdge(0, 0, 1, 5, 1);
283 type->addEdge(1, 1, 2, 0, 2);
284 type->addEdge(2, 2, 3, 1, 3);
285 type->addEdge(3, 3, 4, 2, 4);
286 type->addEdge(4, 4, 5, 3, 5);
287 type->addEdge(5, 5, 0, 4, 0);
292 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
293 m_types[IT_Hexaedron8] = type;
295 type->setInfos(
this, IT_Hexaedron8,
"Hexaedron8", Dimension::Dim3, 8, 12, 6);
297 type->addFaceQuad(0, 0, 3, 2, 1);
298 type->addFaceQuad(1, 0, 4, 7, 3);
299 type->addFaceQuad(2, 0, 1, 5, 4);
300 type->addFaceQuad(3, 4, 5, 6, 7);
301 type->addFaceQuad(4, 1, 2, 6, 5);
302 type->addFaceQuad(5, 2, 3, 7, 6);
304 type->addEdge(0, 0, 1, 2, 0);
305 type->addEdge(1, 1, 2, 4, 0);
306 type->addEdge(2, 2, 3, 5, 0);
307 type->addEdge(3, 3, 0, 1, 0);
308 type->addEdge(4, 0, 4, 1, 2);
309 type->addEdge(5, 1, 5, 2, 4);
310 type->addEdge(6, 2, 6, 4, 5);
311 type->addEdge(7, 3, 7, 5, 1);
312 type->addEdge(8, 4, 5, 3, 2);
313 type->addEdge(9, 5, 6, 3, 4);
314 type->addEdge(10, 6, 7, 3, 5);
315 type->addEdge(11, 7, 4, 3, 1);
321 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
322 m_types[IT_Hexaedron20] = type;
324 type->setInfos(
this, IT_Hexaedron20,
"Hexaedron20", Dimension::Dim3, 20, 12, 6);
325 type->setOrder(2, ITI_Hexaedron8);
327 type->addFaceQuad8(0, 0, 3, 2, 1, 11, 10, 9, 8);
328 type->addFaceQuad8(1, 0, 4, 7, 3, 16, 15, 19, 11);
329 type->addFaceQuad8(2, 0, 1, 5, 4, 8, 17, 12, 16);
330 type->addFaceQuad8(3, 4, 5, 6, 7, 12, 13, 14, 15);
331 type->addFaceQuad8(4, 1, 2, 6, 5, 9, 18, 13, 17);
332 type->addFaceQuad8(5, 2, 3, 7, 6, 10, 19, 14, 18);
334 type->addEdge(0, 0, 1, 2, 0);
335 type->addEdge(1, 1, 2, 4, 0);
336 type->addEdge(2, 2, 3, 5, 0);
337 type->addEdge(3, 3, 0, 1, 0);
338 type->addEdge(4, 0, 4, 1, 2);
339 type->addEdge(5, 1, 5, 2, 4);
340 type->addEdge(6, 2, 6, 4, 5);
341 type->addEdge(7, 3, 7, 5, 1);
342 type->addEdge(8, 4, 5, 3, 2);
343 type->addEdge(9, 5, 6, 3, 4);
344 type->addEdge(10, 6, 7, 3, 5);
345 type->addEdge(11, 7, 4, 3, 1);
350 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
351 m_types[IT_Pyramid5] = type;
353 type->setInfos(
this, IT_Pyramid5,
"Pyramid5", Dimension::Dim3, 5, 8, 5);
355 type->addFaceQuad(0, 0, 3, 2, 1);
356 type->addFaceTriangle(1, 0, 4, 3);
357 type->addFaceTriangle(2, 0, 1, 4);
358 type->addFaceTriangle(3, 1, 2, 4);
359 type->addFaceTriangle(4, 2, 3, 4);
361 type->addEdge(0, 0, 1, 2, 0);
362 type->addEdge(1, 1, 2, 3, 0);
363 type->addEdge(2, 2, 3, 4, 0);
364 type->addEdge(3, 3, 0, 1, 0);
365 type->addEdge(4, 0, 4, 1, 2);
366 type->addEdge(5, 1, 4, 2, 3);
367 type->addEdge(6, 2, 4, 3, 4);
368 type->addEdge(7, 3, 4, 4, 1);
373 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
374 m_types[IT_Pentaedron6] = type;
376 type->setInfos(
this, IT_Pentaedron6,
"Pentaedron6", Dimension::Dim3, 6, 9, 5);
378 type->addFaceTriangle(0, 0, 2, 1);
379 type->addFaceQuad(1, 0, 3, 5, 2);
380 type->addFaceQuad(2, 0, 1, 4, 3);
381 type->addFaceTriangle(3, 3, 4, 5);
382 type->addFaceQuad(4, 1, 2, 5, 4);
384 type->addEdge(0, 0, 1, 2, 0);
385 type->addEdge(1, 1, 2, 4, 0);
386 type->addEdge(2, 2, 0, 1, 0);
387 type->addEdge(3, 0, 3, 1, 2);
388 type->addEdge(4, 1, 4, 2, 4);
389 type->addEdge(5, 2, 5, 4, 1);
390 type->addEdge(6, 3, 4, 3, 2);
391 type->addEdge(7, 4, 5, 3, 4);
392 type->addEdge(8, 5, 3, 3, 1);
397 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
398 m_types[IT_Tetraedron4] = type;
400 type->setInfos(
this, IT_Tetraedron4,
"Tetraedron4", Dimension::Dim3, 4, 6, 4);
402 type->addFaceTriangle(0, 0, 2, 1);
403 type->addFaceTriangle(1, 0, 3, 2);
404 type->addFaceTriangle(2, 0, 1, 3);
405 type->addFaceTriangle(3, 1, 2, 3);
407 type->addEdge(0, 0, 1, 2, 0);
408 type->addEdge(1, 1, 2, 3, 0);
409 type->addEdge(2, 2, 0, 1, 0);
410 type->addEdge(3, 0, 3, 1, 2);
411 type->addEdge(4, 1, 3, 2, 3);
412 type->addEdge(5, 2, 3, 3, 1);
418 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
419 m_types[IT_Tetraedron10] = type;
421 type->setInfos(
this, IT_Tetraedron10,
"Tetraedron10", Dimension::Dim3, 10, 6, 4);
422 type->setOrder(2, ITI_Tetraedron4);
424 type->addFaceTriangle6(0, 0, 2, 1, 6, 5, 4);
425 type->addFaceTriangle6(1, 0, 3, 2, 7, 9, 6);
426 type->addFaceTriangle6(2, 0, 1, 3, 4, 8, 7);
427 type->addFaceTriangle6(3, 1, 2, 3, 5, 9, 8);
429 type->addEdge(0, 0, 1, 2, 0);
430 type->addEdge(1, 1, 2, 3, 0);
431 type->addEdge(2, 2, 0, 1, 0);
432 type->addEdge(3, 0, 3, 1, 2);
433 type->addEdge(4, 1, 3, 2, 3);
434 type->addEdge(5, 2, 3, 3, 1);
439 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
440 m_types[IT_Heptaedron10] = type;
442 type->setInfos(
this, IT_Heptaedron10,
"Heptaedron10", Dimension::Dim3, 10, 15, 7);
444 type->addFacePentagon(0, 0, 4, 3, 2, 1);
445 type->addFacePentagon(1, 5, 6, 7, 8, 9);
446 type->addFaceQuad(2, 0, 1, 6, 5);
447 type->addFaceQuad(3, 1, 2, 7, 6);
448 type->addFaceQuad(4, 2, 3, 8, 7);
449 type->addFaceQuad(5, 3, 4, 9, 8);
450 type->addFaceQuad(6, 4, 0, 5, 9);
452 type->addEdge(0, 0, 1, 2, 0);
453 type->addEdge(1, 1, 2, 3, 0);
454 type->addEdge(2, 2, 3, 4, 0);
455 type->addEdge(3, 3, 4, 5, 0);
456 type->addEdge(4, 4, 0, 6, 0);
457 type->addEdge(5, 5, 6, 1, 2);
458 type->addEdge(6, 6, 7, 1, 3);
459 type->addEdge(7, 7, 8, 1, 4);
460 type->addEdge(8, 8, 9, 1, 5);
461 type->addEdge(9, 9, 5, 1, 6);
462 type->addEdge(10, 0, 5, 6, 2);
463 type->addEdge(11, 1, 6, 2, 3);
464 type->addEdge(12, 2, 7, 3, 4);
465 type->addEdge(13, 3, 8, 4, 5);
466 type->addEdge(14, 4, 9, 5, 6);
471 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
472 m_types[IT_Octaedron12] = type;
474 type->setInfos(
this, IT_Octaedron12,
"Octaedron12", Dimension::Dim3, 12, 18, 8);
476 type->addFaceHexagon(0, 0, 5, 4, 3, 2, 1);
477 type->addFaceHexagon(1, 6, 7, 8, 9, 10, 11);
478 type->addFaceQuad(2, 0, 1, 7, 6);
479 type->addFaceQuad(3, 1, 2, 8, 7);
480 type->addFaceQuad(4, 2, 3, 9, 8);
481 type->addFaceQuad(5, 3, 4, 10, 9);
482 type->addFaceQuad(6, 4, 5, 11, 10);
483 type->addFaceQuad(7, 5, 0, 6, 11);
485 type->addEdge(0, 0, 1, 2, 0);
486 type->addEdge(1, 1, 2, 3, 0);
487 type->addEdge(2, 2, 3, 4, 0);
488 type->addEdge(3, 3, 4, 5, 0);
489 type->addEdge(4, 4, 5, 6, 0);
490 type->addEdge(5, 5, 0, 7, 0);
491 type->addEdge(6, 6, 7, 1, 2);
492 type->addEdge(7, 7, 8, 1, 3);
493 type->addEdge(8, 8, 9, 1, 4);
494 type->addEdge(9, 9, 10, 1, 5);
495 type->addEdge(10, 10, 11, 1, 6);
496 type->addEdge(11, 11, 6, 1, 7);
497 type->addEdge(12, 0, 6, 7, 2);
498 type->addEdge(13, 1, 7, 2, 3);
499 type->addEdge(14, 2, 8, 3, 4);
500 type->addEdge(15, 3, 9, 4, 5);
501 type->addEdge(16, 4, 10, 5, 6);
502 type->addEdge(17, 5, 11, 6, 7);
507 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
508 m_types[IT_HemiHexa7] = type;
510 type->setInfos(
this, IT_HemiHexa7,
"HemiHexa7", Dimension::Dim3, 7, 11, 6);
512 type->addFaceTriangle(0, 0, 1, 2);
513 type->addFaceQuad(1, 0, 2, 3, 4);
514 type->addFaceQuad(2, 0, 5, 6, 1);
515 type->addFaceTriangle(3, 0, 4, 5);
516 type->addFaceQuad(4, 1, 6, 3, 2);
517 type->addFaceQuad(5, 3, 6, 5, 4);
519 type->addEdge(0, 0, 1, 0, 2);
520 type->addEdge(1, 1, 2, 0, 4);
521 type->addEdge(2, 2, 0, 0, 1);
522 type->addEdge(3, 2, 3, 1, 4);
523 type->addEdge(4, 3, 4, 1, 5);
524 type->addEdge(5, 4, 5, 3, 5);
525 type->addEdge(6, 5, 0, 3, 2);
526 type->addEdge(7, 0, 4, 3, 1);
527 type->addEdge(8, 5, 6, 2, 5);
528 type->addEdge(9, 6, 1, 2, 4);
529 type->addEdge(10, 3, 6, 5, 4);
534 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
535 m_types[IT_HemiHexa6] = type;
537 type->setInfos(
this, IT_HemiHexa6,
"HemiHexa6", Dimension::Dim3, 6, 10, 6);
539 type->addFaceTriangle(0, 0, 1, 2);
540 type->addFaceQuad(1, 0, 2, 3, 4);
541 type->addFaceQuad(2, 0, 5, 3, 1);
542 type->addFaceTriangle(3, 0, 4, 5);
543 type->addFaceTriangle(4, 1, 3, 2);
544 type->addFaceTriangle(5, 3, 5, 4);
546 type->addEdge(0, 0, 1, 0, 2);
547 type->addEdge(1, 1, 2, 0, 4);
548 type->addEdge(2, 2, 0, 0, 1);
549 type->addEdge(3, 2, 3, 1, 4);
550 type->addEdge(4, 3, 4, 1, 5);
551 type->addEdge(5, 4, 5, 3, 5);
552 type->addEdge(6, 5, 0, 3, 2);
553 type->addEdge(7, 0, 4, 3, 1);
554 type->addEdge(8, 5, 3, 2, 5);
555 type->addEdge(9, 3, 1, 2, 4);
560 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
561 m_types[IT_HemiHexa5] = type;
563 type->setInfos(
this, IT_HemiHexa5,
"HemiHexa5", Dimension::Dim3, 5, 7, 4);
565 type->addFaceTriangle(0, 0, 1, 2);
566 type->addFaceQuad(1, 0, 2, 3, 4);
567 type->addFaceQuad(2, 0, 4, 3, 1);
568 type->addFaceTriangle(3, 1, 3, 2);
570 type->addEdge(0, 0, 1, 0, 2);
571 type->addEdge(1, 1, 2, 0, 3);
572 type->addEdge(2, 2, 0, 0, 1);
573 type->addEdge(3, 2, 3, 1, 3);
574 type->addEdge(4, 3, 1, 2, 3);
575 type->addEdge(5, 3, 4, 1, 2);
576 type->addEdge(6, 4, 0, 1, 2);
581 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
582 m_types[IT_AntiWedgeLeft6] = type;
584 type->setInfos(
this, IT_AntiWedgeLeft6,
"AntiWedgeLeft6", Dimension::Dim3, 6, 10, 6);
586 type->addFaceTriangle(0, 0, 2, 1);
587 type->addFaceQuad(1, 0, 3, 5, 2);
588 type->addFaceQuad(2, 0, 1, 4, 3);
589 type->addFaceTriangle(3, 3, 4, 5);
590 type->addFaceTriangle(4, 1, 2, 4);
591 type->addFaceTriangle(5, 2, 5, 4);
593 type->addEdge(0, 0, 1, 0, 2);
594 type->addEdge(1, 1, 2, 4, 0);
595 type->addEdge(2, 2, 0, 1, 0);
596 type->addEdge(3, 0, 3, 1, 2);
597 type->addEdge(4, 1, 4, 2, 4);
598 type->addEdge(5, 2, 5, 5, 1);
599 type->addEdge(6, 3, 4, 3, 2);
600 type->addEdge(7, 4, 5, 3, 5);
601 type->addEdge(8, 5, 3, 3, 1);
602 type->addEdge(9, 2, 4, 4, 5);
607 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
608 m_types[IT_AntiWedgeRight6] = type;
610 type->setInfos(
this, IT_AntiWedgeRight6,
"AntiWedgeRight6", Dimension::Dim3, 6, 10, 6);
612 type->addFaceTriangle(0, 0, 2, 1);
613 type->addFaceQuad(1, 0, 3, 5, 2);
614 type->addFaceQuad(2, 0, 1, 4, 3);
615 type->addFaceTriangle(3, 3, 4, 5);
616 type->addFaceTriangle(4, 1, 2, 5);
617 type->addFaceTriangle(5, 1, 5, 4);
619 type->addEdge(0, 0, 1, 0, 2);
620 type->addEdge(1, 1, 2, 4, 0);
621 type->addEdge(2, 2, 0, 1, 0);
622 type->addEdge(3, 0, 3, 1, 2);
623 type->addEdge(4, 1, 4, 2, 5);
624 type->addEdge(5, 2, 5, 4, 1);
625 type->addEdge(6, 3, 4, 3, 2);
626 type->addEdge(7, 4, 5, 3, 5);
627 type->addEdge(8, 5, 3, 3, 1);
628 type->addEdge(9, 1, 5, 5, 4);
633 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
634 m_types[IT_DiTetra5] = type;
636 type->setInfos(
this, IT_DiTetra5,
"DiTetra5", Dimension::Dim3, 5, 9, 6);
638 type->addFaceTriangle(0, 0, 1, 3);
639 type->addFaceTriangle(1, 1, 2, 3);
640 type->addFaceTriangle(2, 2, 0, 3);
641 type->addFaceTriangle(3, 1, 0, 4);
642 type->addFaceTriangle(4, 2, 1, 4);
643 type->addFaceTriangle(5, 0, 2, 4);
645 type->addEdge(0, 0, 1, 0, 3);
646 type->addEdge(1, 1, 2, 1, 4);
647 type->addEdge(2, 2, 0, 2, 5);
648 type->addEdge(3, 0, 3, 2, 0);
649 type->addEdge(4, 1, 3, 0, 1);
650 type->addEdge(5, 2, 3, 1, 2);
651 type->addEdge(6, 0, 4, 3, 5);
652 type->addEdge(7, 1, 4, 4, 3);
653 type->addEdge(8, 2, 4, 5, 4);
658 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
659 m_types[IT_DualNode] = type;
661 type->setInfos(
this, IT_DualNode,
"DualNode", 1, 0, 0);
665 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
666 m_types[IT_DualEdge] = type;
668 type->setInfos(
this, IT_DualEdge,
"DualEdge", 1, 0, 0);
672 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
673 m_types[IT_DualFace] = type;
675 type->setInfos(
this, IT_DualFace,
"DualFace", 1, 0, 0);
679 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
680 m_types[IT_DualCell] = type;
682 type->setInfos(
this, IT_DualCell,
"DualCell", 1, 0, 0);
686 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
687 m_types[IT_DualParticle] = type;
689 type->setInfos(
this, IT_DualParticle,
"DualParticle", 1, 0, 0);
693 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
694 m_types[IT_Link] = type;
696 type->setInfos(
this, IT_Link,
"Link", 0, 0, 0);
701 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
702 m_types[IT_Enneedron14] = type;
704 type->setInfos(
this, IT_Enneedron14,
"Enneedron14", Dimension::Dim3, 14, 21, 9);
706 type->addFaceHeptagon(0, 0, 6, 5, 4, 3, 2, 1);
707 type->addFaceHeptagon(1, 7, 8, 9, 10, 11, 12, 13);
708 type->addFaceQuad(2, 0, 1, 8, 7);
709 type->addFaceQuad(3, 1, 2, 9, 8);
710 type->addFaceQuad(4, 2, 3, 10, 9);
711 type->addFaceQuad(5, 3, 4, 11, 10);
712 type->addFaceQuad(6, 4, 5, 12, 11);
713 type->addFaceQuad(7, 5, 6, 13, 12);
714 type->addFaceQuad(8, 6, 0, 7, 13);
716 type->addEdge(0, 0, 1, 2, 0);
717 type->addEdge(1, 1, 2, 3, 0);
718 type->addEdge(2, 2, 3, 4, 0);
719 type->addEdge(3, 3, 4, 5, 0);
720 type->addEdge(4, 4, 5, 6, 0);
721 type->addEdge(5, 5, 6, 7, 0);
722 type->addEdge(6, 6, 0, 8, 0);
723 type->addEdge(7, 7, 8, 1, 2);
724 type->addEdge(8, 8, 9, 1, 3);
725 type->addEdge(9, 9, 10, 1, 4);
726 type->addEdge(10, 10, 11, 1, 5);
727 type->addEdge(11, 11, 12, 1, 6);
728 type->addEdge(12, 12, 13, 1, 7);
729 type->addEdge(13, 13, 7, 1, 8);
730 type->addEdge(14, 0, 7, 8, 2);
731 type->addEdge(15, 1, 8, 1, 2);
732 type->addEdge(16, 2, 9, 2, 3);
733 type->addEdge(17, 3, 10, 3, 4);
734 type->addEdge(18, 4, 11, 4, 5);
735 type->addEdge(19, 5, 12, 5, 6);
736 type->addEdge(20, 6, 13, 6, 7);
740 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
741 m_types[IT_Decaedron16] = type;
743 type->setInfos(
this, IT_Decaedron16,
"Decaedron16", Dimension::Dim3, 16, 24, 10);
745 type->addFaceOctogon(0, 0, 7, 6, 5, 4, 3, 2, 1);
746 type->addFaceOctogon(1, 8, 9, 10, 11, 12, 13, 14, 15);
747 type->addFaceQuad(2, 0, 1, 9, 8);
748 type->addFaceQuad(3, 1, 2, 10, 9);
749 type->addFaceQuad(4, 2, 3, 11, 10);
750 type->addFaceQuad(5, 3, 4, 12, 11);
751 type->addFaceQuad(6, 4, 5, 13, 12);
752 type->addFaceQuad(7, 5, 6, 14, 13);
753 type->addFaceQuad(8, 6, 7, 15, 14);
754 type->addFaceQuad(9, 7, 0, 8, 15);
756 type->addEdge(0, 0, 1, 2, 0);
757 type->addEdge(1, 1, 2, 3, 0);
758 type->addEdge(2, 2, 3, 4, 0);
759 type->addEdge(3, 3, 4, 5, 0);
760 type->addEdge(4, 4, 5, 6, 0);
761 type->addEdge(5, 5, 6, 7, 0);
762 type->addEdge(6, 6, 7, 8, 0);
763 type->addEdge(7, 7, 0, 9, 0);
764 type->addEdge(8, 8, 9, 1, 2);
765 type->addEdge(9, 9, 10, 1, 3);
766 type->addEdge(10, 10, 11, 1, 4);
767 type->addEdge(11, 11, 12, 1, 5);
768 type->addEdge(12, 12, 13, 1, 6);
769 type->addEdge(13, 13, 14, 1, 7);
770 type->addEdge(14, 14, 15, 1, 8);
771 type->addEdge(15, 15, 8, 1, 9);
772 type->addEdge(16, 0, 8, 9, 2);
773 type->addEdge(17, 1, 9, 2, 3);
774 type->addEdge(18, 2, 10, 3, 4);
775 type->addEdge(19, 3, 11, 4, 5);
776 type->addEdge(20, 4, 12, 5, 6);
777 type->addEdge(21, 5, 13, 6, 7);
778 type->addEdge(22, 6, 14, 7, 8);
779 type->addEdge(23, 7, 15, 8, 9);
784 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
785 m_types[IT_Heptagon7] = type;
787 type->setInfos(
this, IT_Heptagon7,
"Heptagon7", Dimension::Dim2, 7, 7, 7);
789 type->addFaceLine(0, 0, 1);
790 type->addFaceLine(1, 1, 2);
791 type->addFaceLine(2, 2, 3);
792 type->addFaceLine(3, 3, 4);
793 type->addFaceLine(4, 4, 5);
794 type->addFaceLine(5, 5, 6);
795 type->addFaceLine(6, 6, 0);
797 type->addEdge(0, 0, 1, 6, 1);
798 type->addEdge(1, 1, 2, 0, 2);
799 type->addEdge(2, 2, 3, 1, 3);
800 type->addEdge(3, 3, 4, 2, 4);
801 type->addEdge(4, 4, 5, 3, 5);
802 type->addEdge(5, 5, 6, 4, 6);
803 type->addEdge(6, 6, 0, 5, 0);
808 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
809 m_types[IT_Octogon8] = type;
811 type->setInfos(
this, IT_Octogon8,
"Octogon8", Dimension::Dim2, 8, 8, 8);
813 type->addFaceLine(0, 0, 1);
814 type->addFaceLine(1, 1, 2);
815 type->addFaceLine(2, 2, 3);
816 type->addFaceLine(3, 3, 4);
817 type->addFaceLine(4, 4, 5);
818 type->addFaceLine(5, 5, 6);
819 type->addFaceLine(6, 6, 7);
820 type->addFaceLine(7, 7, 0);
822 type->addEdge(0, 0, 1, 7, 1);
823 type->addEdge(1, 1, 2, 0, 2);
824 type->addEdge(2, 2, 3, 1, 3);
825 type->addEdge(3, 3, 4, 2, 4);
826 type->addEdge(4, 4, 5, 3, 5);
827 type->addEdge(5, 5, 6, 4, 6);
828 type->addEdge(6, 6, 7, 5, 7);
829 type->addEdge(7, 7, 0, 6, 0);
834 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
835 m_types[IT_Cell3D_Line2] = type;
837 type->setInfos(
this, IT_Cell3D_Line2,
"Cell3D_Line2", Dimension::Dim1, 2, 0, 0);
842 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
843 m_types[IT_Cell3D_Triangle3] = type;
845 type->setInfos(
this, IT_Cell3D_Triangle3,
"Cell3D_Triangle3", Dimension::Dim2, 3, 0, 3);
847 type->addFaceLine(0, 0, 1);
848 type->addFaceLine(1, 1, 2);
849 type->addFaceLine(2, 2, 0);
854 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
855 m_types[IT_Cell3D_Quad4] = type;
857 type->setInfos(
this, IT_Cell3D_Quad4,
"Cell3D_Quad4", Dimension::Dim2, 4, 0, 4);
859 type->addFaceLine(0, 0, 1);
860 type->addFaceLine(1, 1, 2);
861 type->addFaceLine(2, 2, 3);
862 type->addFaceLine(3, 3, 0);
867 if (!arcane_item_type_file.null()) {
869 readTypes(parallel_mng, arcane_item_type_file);
875 for (
Integer i = 0; i < m_types.size(); ++i) {
876 ItemTypeInfoBuilder* type =
static_cast<ItemTypeInfoBuilder*
>(m_types[i]);
879 type->computeFaceEdgeInfos();
889 ARCANE_ASSERT((m_initialized), (
"Cannot use not built ItemTypeMng"));
890 Integer nb_type = m_types.size();
891 ostr <<
"** Number of types " << nb_type <<
'\n';
892 for (
Integer i = 0; i < nb_type; ++i) {
893 ItemTypeInfo* type = m_types[i];
894 ostr <<
" - Type " << type->
typeId()
900 ostr <<
" - - Face " << z <<
":";
902 ostr <<
" " << lf.
node(zk);
939 m_trace->
info() <<
"Reading additional item types from file '" << filename <<
"'";
947 if (file_length == 0)
948 throw IOException(A_FUNCINFO,
"ARCANE_ITEM_TYPE_FILE is an empty file");
950 ifile.open(filename.
localstr(), std::ios::binary);
952 throw IOException(A_FUNCINFO,
"Cannot open ARCANE_ITEM_TYPE_FILE item type file");
954 ifile.read((
char*)bytes.
data(), file_length);
955 bytes[(
Integer)file_length] =
'\0';
957 throw IOException(A_FUNCINFO,
"Cannot read ARCANE_ITEM_TYPE_FILE item type file");
974 typedef std::map<Integer, Integer> PolygonMapper;
975 PolygonMapper built_polygons;
976 built_polygons[3] = IT_Triangle3;
977 built_polygons[4] = IT_Quad4;
978 built_polygons[5] = IT_Pentagon5;
979 built_polygons[6] = IT_Hexagon6;
980 typedef std::set<Integer> KnownTypes;
981 KnownTypes known_types;
983 known_types.insert(i_type);
986 throw FatalErrorException(A_FUNCINFO,
"Invalid initialization of built-in item types");
989 std::istringstream ifile((
char*)bytes.unguardedBasePointer(), std::istringstream::in);
994 Int16 typeId = -1, nbN = 0, nbE = 0, nbF = 0;
995 for (
Integer i = 0; i < nb_type; ++i) {
996 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
997 ifile >> typeId >> nbF >> nbE;
998 if (typeId >= nb_type || typeId < 0)
999 throw IOException(A_FUNCINFO, String::format(
"Polyhedron reader cannot allow typeId {0}", typeId));
1001 if (known_types.find(typeId) != known_types.end())
1002 throw FatalErrorException(A_FUNCINFO, String::format(
"Already existing typeId {0}", typeId));
1003 known_types.insert(typeId);
1009 nbN = nbE - nbF + 2;
1011 type->setInfos(
this, typeId, String::format(
"Polyhedron{0}_{1}-{2}-{3}", typeId, nbN, nbE, nbF), nbN, nbE, nbF);
1012 m_trace->debug(
Trace::High) <<
"Adding " << type->typeName() <<
" type #"
1014 << nbE <<
" edges, " << nbF <<
" faces.";
1015 m_types[typeId] = type;
1016 for (
Integer iface = 0; iface < nbF; ++iface) {
1018 UniqueArray<Integer> nodeFace(nbN);
1019 for (
Integer inodeFace = 0; inodeFace < nbN; ++inodeFace) {
1020 ifile >> nodeFace[inodeFace];
1022 PolygonMapper::const_iterator finder = built_polygons.find(nbN);
1023 Int16 face_type = IT_NullType;
1024 if (finder != built_polygons.end()) {
1025 face_type = finder->second;
1026 m_trace->debug(
Trace::High) <<
"\tAdding already existing face type " << face_type
1027 <<
" for face " << iface <<
" with " << nbN <<
" nodes";
1030 ItemTypeInfoBuilder* type2 = m_types_buffer->allocOne();
1032 face_type = m_types.size();
1034 built_polygons[nbN] = face_type;
1036 type2->setInfos(
this, face_type, String::format(
"Polygon{0}", nbN), nbN, nbN, nbN);
1037 for (
Integer j = 0; j < nbN; ++j)
1038 type2->addFaceLine(j, j, (j + 1) % nbN);
1040 for (
Integer j = 0; j < nbN; ++j)
1041 type2->addEdge(j, j, (j + 1) % nbN, (j - 1 + nbN) % nbN, (j + 1) % nbN);
1042 m_trace->debug(
Trace::High) <<
"\tAdding new face type " << face_type
1043 <<
" for face " << iface <<
" with " << nbN <<
" nodes";
1045 type->addFaceGeneric(iface, face_type, nodeFace);
1047 Integer node0, node1, leftFace, rightFace;
1048 for (
Integer iedge = 0; iedge < nbE; ++iedge) {
1049 ifile >> node0 >> node1 >> leftFace >> rightFace;
1050 type->addEdge(iedge, node0, node1, leftFace, rightFace);
1054 m_trace->debug(
Trace::High) <<
"Total number of types : " << m_types.size();
1063 return _singleton()->types().size();
1069 return m_nb_builtin_item_type;
1089 case IT_Tetraedron4:
1093 case IT_Pentaedron6:
1097 case IT_Heptaedron10:
1098 case IT_Octaedron12:
1102 case IT_AntiWedgeLeft6:
1103 case IT_AntiWedgeRight6:
1119 if (!singleton_instance)
1121 return singleton_instance;
1128#ifndef ARCANE_OS_WIN32
1129 delete singleton_instance;
1131 singleton_instance =
nullptr;
1140 ARCANE_ASSERT((m_initialized), (
"Cannot use not built ItemTypeMng"));
1150 ARCANE_ASSERT((m_initialized), (
"Cannot use not built ItemTypeMng"));
1160 ARCANE_ASSERT((m_initialized), (
"Cannot use not built ItemTypeMng"));
1161 return m_types[
id.typeId()];
1191 return "InvalidType";
1199 auto has_general_cells =
false;
1200 if (m_mesh_with_general_cells.find(mesh) != m_mesh_with_general_cells.end()) {
1201 has_general_cells =
true;
1203 return has_general_cells;
1211 ARCANE_ASSERT(mesh, (
"Trying to indicate a null mesh contains general cells."));
1212 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.
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 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 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.
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.