Arcane  v4.1.1.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ItemTypeMng.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* ItemTypeMng.cc (C) 2000-2025 */
9/* */
10/* Gestionnaire des types d'entite du maillage. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/core/ItemTypeMng.h"
15
16#include "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"
27
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"
35
36// AMR
37#include "arcane/ItemRefinementPattern.h"
38
39#include <map>
40#include <set>
41
42/*---------------------------------------------------------------------------*/
43/*---------------------------------------------------------------------------*/
44
45namespace Arcane
46{
47
48/*---------------------------------------------------------------------------*/
49/*---------------------------------------------------------------------------*/
50
51const Integer ItemTypeMng::m_nb_builtin_item_type = NB_BASIC_ITEM_TYPE;
52
53/*---------------------------------------------------------------------------*/
54/*---------------------------------------------------------------------------*/
55
60
61/*---------------------------------------------------------------------------*/
62/*---------------------------------------------------------------------------*/
63
64ItemTypeMng::
65~ItemTypeMng()
66{
67 delete m_types_buffer;
68}
69
70/*---------------------------------------------------------------------------*/
71/*---------------------------------------------------------------------------*/
72
74build(IMesh* mesh)
75{
76 if (m_initialized)
77 ARCANE_FATAL("ItemTypeMng instance is already initialized");
78 // Récupère le IParallelSuperMng via l'application.
79 // Une fois qu'on aura supprimé l'instance singleton, on pourra
80 // simplement utiliser le IParallelMng.
81 IParallelSuperMng* super_pm = mesh->subDomain()->application()->parallelSuperMng();
82 _buildTypes(mesh, super_pm, mesh->traceMng());
83 m_initialized = true;
84}
85
86/*---------------------------------------------------------------------------*/
87/*---------------------------------------------------------------------------*/
88
90build(IParallelSuperMng* parallel_mng, ITraceMng* trace)
91{
92 _buildSingleton(parallel_mng, trace);
93}
94
95/*---------------------------------------------------------------------------*/
96/*---------------------------------------------------------------------------*/
97
98void ItemTypeMng::
99_buildSingleton(IParallelSuperMng* parallel_mng, ITraceMng* trace)
100{
101 // Avec MPC, cette fonction peut être appelée plusieurs fois
102 // dans des threads différents. Comme tous les threads partagent
103 // le même singleton, seul le premier thread fait réellement l'initialisation.
104 // ATTENTION: Cela est incompatible avec le mode readTypes()
105 // ou on lit les connectivités dans un fichier ARCANE_ITEM_TYPE_FILE.
106 Int32 max_rank = parallel_mng->commSize() + 1;
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;
112 }
113 else
114 // Ceux qui ne font pas l'initialisation doivent attendre que cette dernière
115 // soit faite.
116 while (init_counter < max_rank)
117 init_counter = m_initialized_counter.load();
118}
119
120/*---------------------------------------------------------------------------*/
121/*---------------------------------------------------------------------------*/
122/*!
123 * \brief Construit les types des entités.
124 *
125 * \note Pour l'instance singleton, \a mesh est nul.
126 */
127void ItemTypeMng::
128_buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace)
129{
130 // Construit la connectivité des éléments.
131 // Pour les éléments classiques, la connectivité est la même que
132 // celle de VTK, disponible dans le document:
133 //
134 // https://vtk.org/wp-content/uploads/2015/04/file-formats.pdf
135
136 using Dimension = ItemTypeInfoBuilder::Dimension;
137 bool is_non_manifold = false;
138 if (mesh)
139 is_non_manifold = mesh->meshKind().isNonManifold();
140
141 m_trace = trace;
142 m_types.resize(m_nb_builtin_item_type);
143 m_types_buffer = new MultiBufferT<ItemTypeInfoBuilder>();
144
145 // Null
146 {
147 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
148 m_types[IT_NullType] = type;
149
150 type->setInfos(this, IT_NullType, "NullType", Dimension::DimUnknown, 0, 0, 0);
151 }
152
153 // Vertex
154 {
155 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
156 m_types[IT_Vertex] = type;
157
158 type->setInfos(this, IT_Vertex, "Vertex", Dimension::Dim0, 0, 0, 0);
159 // TODO regarder si ce type est autorisé pour les mailles.
160 // Si ce n'est pas le cas, il faudrait définir un type
161 // pour les mailles 0D qui sont assimilables à des points.
162 }
163
164 // FaceVertex (face pour les maillages 1D)
165 {
166 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
167 m_types[IT_FaceVertex] = type;
168
169 type->setInfos(this, IT_FaceVertex, "FaceVertex", Dimension::Dim0, 1, 0, 0);
170 type->setIsValidForCell(false);
171 }
172
173 // Line2
174 {
175 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
176 m_types[IT_Line2] = type;
177
178 type->setInfos(this, IT_Line2, "Line2", Dimension::Dim1, 2, 0, 0);
179 type->setIsValidForCell(true);
180 }
181
182 // Line3
183 {
184 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
185 m_types[IT_Line3] = type;
186
187 type->setInfos(this, IT_Line3, "Line3", Dimension::Dim1, 3, 0, 0);
188 type->setOrder(2, ITI_Line2);
189 type->setIsValidForCell(false);
190 }
191
192 // Line4
193 {
194 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
195 m_types[IT_Line4] = type;
196
197 type->setInfos(this, IT_Line4, "Line4", Dimension::Dim1, 4, 0, 0);
198 type->setOrder(3, ITI_Line2);
199 type->setIsValidForCell(false);
200 }
201
202 // CellLine2 (mailles pour les maillages 1D)
203 {
204 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
205 m_types[IT_CellLine2] = type;
206
207 type->setInfos(this, IT_CellLine2, "CellLine2", Dimension::Dim1, 2, 0, 2);
208
209 type->addFaceVertex(0, 0);
210 type->addFaceVertex(1, 1);
211 }
212
213 /**
214 * SDP: Pour les polygones les faces et les arêtes sont identiques.
215 *
216 * @note lors des declarations des arêtes, on donne pour faces les
217 * arêtes qui sont jointes a l'arête courante
218 */
219
220 // Triangle3
221 {
222 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
223 m_types[IT_Triangle3] = type;
224
225 type->setInfos(this, IT_Triangle3, "Triangle3", Dimension::Dim2, 3, 3, 3);
226
227 type->addEdgeAndFaceLine(0, { 0, 1 }, { 1, 2 });
228 type->addEdgeAndFaceLine(1, { 1, 2 }, { 2, 0 });
229 type->addEdgeAndFaceLine(2, { 2, 0 }, { 0, 1 });
230 }
231
232 // Triangle6
233 {
234 // TODO: Pour l'instant comme triangle3
235 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
236 m_types[IT_Triangle6] = type;
237
238 type->setInfos(this, IT_Triangle6, "Triangle6", Dimension::Dim2, 6, 3, 3);
239 type->setOrder(2, ITI_Triangle3);
240
241 type->addFaceLine3(0, 0, 1, 3);
242 type->addFaceLine3(1, 1, 2, 4);
243 type->addFaceLine3(2, 2, 0, 5);
244
245 type->addEdge(0, 0, 1, 1, 2);
246 type->addEdge(1, 1, 2, 2, 0);
247 type->addEdge(2, 2, 0, 0, 1);
248 }
249
250 // Triangle10
251 {
252 // TODO: Pour l'instant comme triangle3
253 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
254 m_types[IT_Triangle10] = type;
255
256 type->setInfos(this, IT_Triangle10, "Triangle10", Dimension::Dim2, 10, 3, 3);
257 type->setOrder(3, ITI_Triangle3);
258 type->setHasCenterNode(true);
259
260 type->addFaceLine4(0, 0, 1, 3, 4);
261 type->addFaceLine4(1, 1, 2, 5, 6);
262 type->addFaceLine4(2, 2, 0, 7, 8);
263
264 type->addEdge(0, 0, 1, 1, 2);
265 type->addEdge(1, 1, 2, 2, 0);
266 type->addEdge(2, 2, 0, 0, 1);
267 }
268
269 // Quad4
270 {
271 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
272 m_types[IT_Quad4] = type;
273
274 type->setInfos(this, IT_Quad4, "Quad4", Dimension::Dim2, 4, 4, 4);
275
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 });
280 }
281
282 // Quad8
283 {
284 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
285 m_types[IT_Quad8] = type;
286
287 type->setInfos(this, IT_Quad8, "Quad8", Dimension::Dim2, 8, 4, 4);
288 type->setOrder(2, ITI_Quad4);
289
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);
294
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);
299 }
300
301 // Quad9
302 {
303 // Comme Quad8 mais avec un noeud en plus au milieu du quadrangle
304 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
305 m_types[IT_Quad9] = type;
306
307 type->setInfos(this, IT_Quad9, "Quad9", Dimension::Dim2, 9, 4, 4);
308 type->setOrder(2, ITI_Quad4);
309 type->setHasCenterNode(true);
310
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);
315
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);
320 }
321
322 // Pentagon5
323 {
324 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
325 m_types[IT_Pentagon5] = type;
326
327 type->setInfos(this, IT_Pentagon5, "Pentagon5", Dimension::Dim2, 5, 5, 5);
328
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);
334
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);
340 }
341
342 // Hexagon6
343 {
344 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
345 m_types[IT_Hexagon6] = type;
346
347 type->setInfos(this, IT_Hexagon6, "Hexagon6", Dimension::Dim2, 6, 6, 6);
348
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);
355
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);
362 }
363
364 // Hexaedron8
365 {
366 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
367 m_types[IT_Hexaedron8] = type;
368
369 type->setInfos(this, IT_Hexaedron8, "Hexaedron8", Dimension::Dim3, 8, 12, 6);
370
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);
377
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);
390 }
391
392 // Hexaedron20
393 {
394 // Pour l'instant comme Hexaedron8
395 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
396 m_types[IT_Hexaedron20] = type;
397
398 type->setInfos(this, IT_Hexaedron20, "Hexaedron20", Dimension::Dim3, 20, 12, 6);
399 type->setOrder(2, ITI_Hexaedron8);
400
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);
407
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);
420 }
421
422 // Hexaedron27
423 {
424 // Pour l'instant comme Hexaedron8
425 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
426 m_types[IT_Hexaedron27] = type;
427
428 type->setInfos(this, IT_Hexaedron27, "Hexaedron27", Dimension::Dim3, 27, 12, 6);
429 type->setOrder(2, ITI_Hexaedron8);
430 type->setHasCenterNode(true);
431
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);
438
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);
451 }
452
453 // Pyramid5
454 {
455 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
456 m_types[IT_Pyramid5] = type;
457
458 type->setInfos(this, IT_Pyramid5, "Pyramid5", Dimension::Dim3, 5, 8, 5);
459
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);
465
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);
474 }
475
476 // Pyramid13
477 {
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);
482
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);
488
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);
497 }
498
499 // Pentaedron6
500 {
501 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
502 m_types[IT_Pentaedron6] = type;
503
504 type->setInfos(this, IT_Pentaedron6, "Pentaedron6", Dimension::Dim3, 6, 9, 5);
505
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);
511
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);
521 }
522
523 // Pentaedron15
524 {
525 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
526 m_types[IT_Pentaedron15] = type;
527 type->setOrder(2, ITI_Pentaedron15);
528
529 type->setInfos(this, IT_Pentaedron15, "Pentaedron15", Dimension::Dim3, 15, 9, 5);
530
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);
536
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);
546 }
547
548 // Tetraedron4
549 {
550 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
551 m_types[IT_Tetraedron4] = type;
552
553 type->setInfos(this, IT_Tetraedron4, "Tetraedron4", Dimension::Dim3, 4, 6, 4);
554
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);
559
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);
566 }
567
568 // Tetraedron10
569 {
570 // Pour l'instant comme Tetraedron4
571 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
572 m_types[IT_Tetraedron10] = type;
573
574 type->setInfos(this, IT_Tetraedron10, "Tetraedron10", Dimension::Dim3, 10, 6, 4);
575 type->setOrder(2, ITI_Tetraedron4);
576
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);
581
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);
588 }
589
590 // Heptaedron10
591 {
592 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
593 m_types[IT_Heptaedron10] = type;
594
595 type->setInfos(this, IT_Heptaedron10, "Heptaedron10", Dimension::Dim3, 10, 15, 7);
596
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);
604
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);
620 }
621
622 // Octaedron12
623 {
624 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
625 m_types[IT_Octaedron12] = type;
626
627 type->setInfos(this, IT_Octaedron12, "Octaedron12", Dimension::Dim3, 12, 18, 8);
628
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);
637
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);
656 }
657
658 // HemiHexa7
659 {
660 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
661 m_types[IT_HemiHexa7] = type;
662
663 type->setInfos(this, IT_HemiHexa7, "HemiHexa7", Dimension::Dim3, 7, 11, 6);
664
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);
671
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);
683 }
684
685 // HemiHexa6
686 {
687 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
688 m_types[IT_HemiHexa6] = type;
689
690 type->setInfos(this, IT_HemiHexa6, "HemiHexa6", Dimension::Dim3, 6, 10, 6);
691
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);
698
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);
709 }
710
711 // HemiHexa5
712 {
713 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
714 m_types[IT_HemiHexa5] = type;
715
716 type->setInfos(this, IT_HemiHexa5, "HemiHexa5", Dimension::Dim3, 5, 7, 4);
717
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);
722
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);
730 }
731
732 // AntiWedgeLeft6
733 {
734 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
735 m_types[IT_AntiWedgeLeft6] = type;
736
737 type->setInfos(this, IT_AntiWedgeLeft6, "AntiWedgeLeft6", Dimension::Dim3, 6, 10, 6);
738
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);
745
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);
756 }
757
758 // AntiWedgeRight6
759 {
760 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
761 m_types[IT_AntiWedgeRight6] = type;
762
763 type->setInfos(this, IT_AntiWedgeRight6, "AntiWedgeRight6", Dimension::Dim3, 6, 10, 6);
764
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);
771
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);
782 }
783
784 // DiTetra5
785 {
786 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
787 m_types[IT_DiTetra5] = type;
788
789 type->setInfos(this, IT_DiTetra5, "DiTetra5", Dimension::Dim3, 5, 9, 6);
790
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);
797
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);
807 }
808
809 // DualNode
810 {
811 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
812 m_types[IT_DualNode] = type;
813
814 type->setInfos(this, IT_DualNode, "DualNode", 1, 0, 0);
815 }
816 // DualEdge
817 {
818 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
819 m_types[IT_DualEdge] = type;
820
821 type->setInfos(this, IT_DualEdge, "DualEdge", 1, 0, 0);
822 }
823 // DualFace
824 {
825 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
826 m_types[IT_DualFace] = type;
827
828 type->setInfos(this, IT_DualFace, "DualFace", 1, 0, 0);
829 }
830 // DualCell
831 {
832 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
833 m_types[IT_DualCell] = type;
834
835 type->setInfos(this, IT_DualCell, "DualCell", 1, 0, 0);
836 }
837 // DualParticle
838 {
839 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
840 m_types[IT_DualParticle] = type;
841
842 type->setInfos(this, IT_DualParticle, "DualParticle", 1, 0, 0);
843 }
844 // Link
845 {
846 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
847 m_types[IT_Link] = type;
848
849 type->setInfos(this, IT_Link, "Link", 0, 0, 0);
850 }
851
852 // Enneedron14
853 {
854 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
855 m_types[IT_Enneedron14] = type;
856
857 type->setInfos(this, IT_Enneedron14, "Enneedron14", Dimension::Dim3, 14, 21, 9);
858
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);
868
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);
890 }
891 // Decaedron16
892 {
893 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
894 m_types[IT_Decaedron16] = type;
895
896 type->setInfos(this, IT_Decaedron16, "Decaedron16", Dimension::Dim3, 16, 24, 10);
897
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);
908
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);
933 }
934
935 // Heptagon7
936 {
937 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
938 m_types[IT_Heptagon7] = type;
939
940 type->setInfos(this, IT_Heptagon7, "Heptagon7", Dimension::Dim2, 7, 7, 7);
941
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 });
949 }
950
951 // Octogon8
952 {
953 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
954 m_types[IT_Octogon8] = type;
955
956 type->setInfos(this, IT_Octogon8, "Octogon8", Dimension::Dim2, 8, 8, 8);
957
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 });
966 }
967
968 // Cell3D_Line2
969 {
970 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
971 m_types[IT_Cell3D_Line2] = type;
972
973 type->setInfos(this, IT_Cell3D_Line2, "Cell3D_Line2", Dimension::Dim1, 2, 0, 0);
974 }
975
976 // CellLine3 (maille d'ordre 2 pour les maillages 1D)
977 {
978 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
979 m_types[IT_CellLine3] = type;
980 type->setOrder(2, ITI_CellLine2);
981
982 type->setInfos(this, IT_CellLine3, "CellLine3", Dimension::Dim1, 3, 0, 2);
983
984 type->addFaceVertex(0, 0);
985 type->addFaceVertex(1, 1);
986 }
987
988 // Cell3D_Line3
989 {
990 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
991 m_types[IT_Cell3D_Line3] = type;
992 type->setOrder(2, ITI_Cell3D_Line2);
993
994 type->setInfos(this, IT_Cell3D_Line3, "Cell3D_Line3", Dimension::Dim1, 3, 0, 0);
995 }
996
997 // Cell3D_Triangle3
998 {
999 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
1000 m_types[IT_Cell3D_Triangle3] = type;
1001 Int32 nb_face = 3;
1002 Int32 nb_edge = 0;
1003 if (is_non_manifold)
1004 std::swap(nb_face, nb_edge);
1005
1006 type->setInfos(this, IT_Cell3D_Triangle3, "Cell3D_Triangle3", Dimension::Dim2, 3, nb_edge, nb_face);
1007
1008 if (is_non_manifold) {
1009 type->addEdge2D(0, 0, 1);
1010 type->addEdge2D(1, 1, 2);
1011 type->addEdge2D(2, 2, 0);
1012 }
1013 else {
1014 type->addFaceLine(0, 0, 1);
1015 type->addFaceLine(1, 1, 2);
1016 type->addFaceLine(2, 2, 0);
1017 }
1018 }
1019
1020 // Cell3D_Triangle6
1021 {
1022 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
1023 m_types[IT_Cell3D_Triangle6] = type;
1024 Int32 nb_face = 3;
1025 Int32 nb_edge = 0;
1026 if (is_non_manifold)
1027 std::swap(nb_face, nb_edge);
1028
1029 type->setInfos(this, IT_Cell3D_Triangle6, "Cell3D_Triangle6", Dimension::Dim2, 6, nb_edge, nb_face);
1030 type->setOrder(2, ITI_Cell3D_Triangle3);
1031
1032 if (is_non_manifold) {
1033 type->addEdge2D(0, 0, 1);
1034 type->addEdge2D(1, 1, 2);
1035 type->addEdge2D(2, 2, 0);
1036 }
1037 else {
1038 type->addFaceLine3(0, 0, 1, 3);
1039 type->addFaceLine3(1, 1, 2, 4);
1040 type->addFaceLine3(2, 2, 0, 5);
1041 }
1042 }
1043
1044 // Cell3D_Quad4
1045 {
1046 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
1047 m_types[IT_Cell3D_Quad4] = type;
1048 Int32 nb_face = 4;
1049 Int32 nb_edge = 0;
1050 if (is_non_manifold)
1051 std::swap(nb_face, nb_edge);
1052
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);
1059 }
1060 else {
1061 type->addFaceLine(0, 0, 1);
1062 type->addFaceLine(1, 1, 2);
1063 type->addFaceLine(2, 2, 3);
1064 type->addFaceLine(3, 3, 0);
1065 }
1066 }
1067
1068 // Cell3D_Quad8
1069 {
1070 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
1071 m_types[IT_Cell3D_Quad8] = type;
1072
1073 Int32 nb_face = 4;
1074 Int32 nb_edge = 0;
1075 if (is_non_manifold)
1076 std::swap(nb_face, nb_edge);
1077
1078 type->setInfos(this, IT_Cell3D_Quad8, "Cell3D_Quad8", Dimension::Dim2, 8, nb_edge, nb_face);
1079 type->setOrder(2, ITI_Cell3D_Quad4);
1080
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);
1086 }
1087 else {
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);
1092 }
1093 }
1094
1095 // Cell3D_Quad9
1096 {
1097 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
1098 m_types[IT_Cell3D_Quad9] = type;
1099
1100 Int32 nb_face = 4;
1101 Int32 nb_edge = 0;
1102 if (is_non_manifold)
1103 std::swap(nb_face, nb_edge);
1104
1105 type->setInfos(this, IT_Cell3D_Quad9, "Cell3D_Quad9", Dimension::Dim2, 9, nb_edge, nb_face);
1106 type->setOrder(2, ITI_Cell3D_Quad4);
1107
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);
1113 }
1114 else {
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);
1119 }
1120 }
1121
1122 { // Polygon & Polyhedron: generic item types
1123 String arcane_item_type_file = platform::getEnvironmentVariable("ARCANE_ITEM_TYPE_FILE");
1124 if (!arcane_item_type_file.null()) {
1125 // verify the existence of item type file. if doesn't exist return an exception
1126 _readTypes(parallel_mng, arcane_item_type_file);
1127 }
1128 }
1129
1130 // Calcul les relations face->arêtes
1131 // Cette opération doit être appelé en fin phase build
1132 for (Integer i = 0; i < m_types.size(); ++i) {
1133 ItemTypeInfoBuilder* type = static_cast<ItemTypeInfoBuilder*>(m_types[i]);
1134 if (!type)
1135 ARCANE_FATAL("ItemType '{0}' is not defined", type);
1136 type->computeFaceEdgeInfos();
1137 }
1138}
1139
1140/*---------------------------------------------------------------------------*/
1141/*---------------------------------------------------------------------------*/
1142
1144printTypes(std::ostream& ostr)
1145{
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()
1152 << " Name: " << type->typeName()
1153 << " Nodes: " << type->nbLocalNode()
1154 << " Faces " << type->nbLocalFace() << '\n';
1155 for (Integer z = 0, sz = type->nbLocalFace(); z < sz; ++z) {
1156 ItemTypeInfo::LocalFace lf = type->localFace(z);
1157 ostr << " - - Face " << z << ":";
1158 for (Integer zk = 0, szk = lf.nbNode(); zk < szk; ++zk) {
1159 ostr << " " << lf.node(zk);
1160 }
1161 ostr << "\n";
1162 }
1163 ostr << "\n";
1164 }
1165}
1166
1167/*---------------------------------------------------------------------------*/
1168/*---------------------------------------------------------------------------*/
1169/*!
1170 * \brief Lecture d'un fichier de types voronoi.
1171 *
1172 * Une cellule voronoi est un polytope dont le nombre de faces et de noeuds
1173 * varie d'une cellule a l'autre. Ici, le type de chaque cellule est lu dans
1174 * un fichier de types associe a un maillage d'entree donne.
1175 * Ce fichier est passe dans la variable d'environnement: ARCANE_ITEM_TYPE_FILE
1176 * Ex: setenv ARCANE_ITEM_TYPE_FILE PATH_TO_FILE/item_file
1177 * Le format du fichier est la suivante:
1178 *
1179 * nb_type
1180 * type_id nb_faces nb_edges
1181 * nb_node_face0 node0_face0 ... nodeN_face1
1182 * . . .
1183 * . . .
1184 * . . .
1185 * nb_node_faceN node0_faceN ... nodeN_faceN
1186 *
1187 * node0_edge0 node1_edge1 lefFace_edge0 rightFace_edge0
1188 * .
1189 * .
1190 * .
1191 * node0_edgeN node1_edge1 lefFace_edgeN rightFace_edgeN
1192 */
1193void ItemTypeMng::
1194_readTypes(IParallelSuperMng* pm, const String& filename)
1195{
1196 m_trace->info() << "Reading additional item types from file '" << filename << "'";
1197
1198 UniqueArray<Byte> bytes;
1199 Integer size = 0;
1200
1201 // Lecture parallèle
1202 if (pm->commRank() == 0) {
1203 long unsigned int file_length = platform::getFileLength(filename);
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);
1208 if (ifile.fail())
1209 throw IOException(A_FUNCINFO, "Cannot open ARCANE_ITEM_TYPE_FILE item type file");
1210 bytes.resize(arcaneCheckArraySize(file_length + 1));
1211 ifile.read((char*)bytes.data(), file_length);
1212 bytes[(Integer)file_length] = '\0';
1213 if (ifile.bad())
1214 throw IOException(A_FUNCINFO, "Cannot read ARCANE_ITEM_TYPE_FILE item type file");
1215 size = bytes.size();
1216 }
1217 {
1218 IntegerArrayView bs(1, &size);
1219 pm->broadcast(bs, 0);
1220 }
1221 bytes.resize(size);
1222 if (size != 0) {
1223 pm->broadcast(bytes, 0);
1224 }
1225 else { // CC: add ending '\0'
1226 bytes.resize(1);
1227 bytes[0] = '\0';
1228 }
1229
1230 // Already built polygons (size => identifier)
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;
1239 for (Integer i_type = 0; i_type < ItemTypeMng::nbBuiltInItemType(); ++i_type)
1240 known_types.insert(i_type);
1241
1242 if (ItemTypeMng::nbBuiltInItemType() != m_types.size())
1243 throw FatalErrorException(A_FUNCINFO, "Invalid initialization of built-in item types");
1244
1245 // Analyse du fichier de types
1246 std::istringstream ifile((char*)bytes.unguardedBasePointer(), std::istringstream::in);
1247 Integer nb_type = 0;
1248 ifile >> nb_type;
1249
1250 m_types.resize(ItemTypeMng::nbBuiltInItemType() + nb_type);
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));
1257 typeId += ItemTypeMng::nbBuiltInItemType(); // translation d'indexation
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);
1261 if (nbE == nbF) // 2d case nbN == nbE == nbF
1262 {
1263 nbN = nbE;
1264 }
1265 else
1266 nbN = nbE - nbF + 2; // Calcul du nb de noeuds nbN a partir de nbE et nbF (formule d'Euler)
1267
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 #"
1270 << typeId - ItemTypeMng::nbBuiltInItemType() << " with " << nbN << " nodes, "
1271 << nbE << " edges, " << nbF << " faces.";
1272 m_types[typeId] = type;
1273 for (Integer iface = 0; iface < nbF; ++iface) {
1274 ifile >> nbN;
1275 UniqueArray<Integer> nodeFace(nbN);
1276 for (Integer inodeFace = 0; inodeFace < nbN; ++inodeFace) {
1277 ifile >> nodeFace[inodeFace];
1278 }
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";
1285 }
1286 else {
1287 ItemTypeInfoBuilder* type2 = m_types_buffer->allocOne();
1288
1289 face_type = m_types.size();
1290 m_types.add(type2);
1291 built_polygons[nbN] = face_type;
1292
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);
1296
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";
1301 }
1302 type->addFaceGeneric(iface, face_type, nodeFace);
1303 }
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);
1308 }
1309 }
1310
1311 m_trace->debug(Trace::High) << "Total number of types : " << m_types.size();
1312}
1313
1314/*---------------------------------------------------------------------------*/
1315/*---------------------------------------------------------------------------*/
1316
1319{
1320 return _singleton()->types().size();
1321}
1322
1325{
1326 return m_nb_builtin_item_type;
1327}
1328/*---------------------------------------------------------------------------*/
1329/*---------------------------------------------------------------------------*/
1330
1331//! AMR
1334{
1335 switch (type) {
1336 case IT_Line2:
1337 return 2;
1338 case IT_Triangle3:
1339 return 4;
1340 case IT_Quad4:
1341 return 4;
1342 case IT_Pentagon5:
1343 return 4;
1344 case IT_Hexagon6:
1345 return 4;
1346 case IT_Tetraedron4:
1347 return 8;
1348 case IT_Pyramid5:
1349 return 0;
1350 case IT_Pentaedron6:
1351 return 8;
1352 case IT_Hexaedron8:
1353 return 8;
1354 case IT_Heptaedron10:
1355 case IT_Octaedron12:
1356 case IT_HemiHexa7:
1357 case IT_HemiHexa6:
1358 case IT_HemiHexa5:
1359 case IT_AntiWedgeLeft6:
1360 case IT_AntiWedgeRight6:
1361 case IT_DiTetra5:
1362 return 0;
1363 default:
1364 ARCANE_FATAL("Not supported Item Type '{0}'", type);
1365 }
1366}
1367
1368/*---------------------------------------------------------------------------*/
1369/*---------------------------------------------------------------------------*/
1370
1371ItemTypeMng* ItemTypeMng::singleton_instance = 0;
1372
1373ItemTypeMng* ItemTypeMng::
1374_singleton()
1375{
1376 if (!singleton_instance)
1377 singleton_instance = new ItemTypeMng();
1378 return singleton_instance;
1379}
1380
1381void ItemTypeMng::
1382_destroySingleton()
1383{
1384 //GG: Ca plante avec Windows. Regarder pourquoi.
1385#ifndef ARCANE_OS_WIN32
1386 delete singleton_instance;
1387#endif
1388 singleton_instance = nullptr;
1389}
1390
1391/*---------------------------------------------------------------------------*/
1392/*---------------------------------------------------------------------------*/
1393
1395types() const
1396{
1397 ARCANE_ASSERT((m_initialized), ("Cannot use not built ItemTypeMng"));
1398 return m_types;
1399}
1400
1401/*---------------------------------------------------------------------------*/
1402/*---------------------------------------------------------------------------*/
1403
1404ItemTypeInfo* ItemTypeMng::
1405typeFromId(Integer id) const
1406{
1407 ARCANE_ASSERT((m_initialized), ("Cannot use not built ItemTypeMng"));
1408 return m_types[id];
1409}
1410
1411/*---------------------------------------------------------------------------*/
1412/*---------------------------------------------------------------------------*/
1413
1414ItemTypeInfo* ItemTypeMng::
1415typeFromId(ItemTypeId id) const
1416{
1417 ARCANE_ASSERT((m_initialized), ("Cannot use not built ItemTypeMng"));
1418 return m_types[id.typeId()];
1419}
1420
1421/*---------------------------------------------------------------------------*/
1422/*---------------------------------------------------------------------------*/
1423
1425typeName(Integer id) const
1426{
1427 return typeFromId(id)->typeName();
1428}
1429
1430/*---------------------------------------------------------------------------*/
1431/*---------------------------------------------------------------------------*/
1432
1434typeName(ItemTypeId id) const
1435{
1436 return typeFromId(id)->typeName();
1437}
1438
1439/*---------------------------------------------------------------------------*/
1440/*---------------------------------------------------------------------------*/
1441// Recopie de la fonction obsolète Item::typeName().
1442// TODO: voir pourquoi il y a un test sur nBasicItemType().
1443String ItemTypeMng::
1444_legacyTypeName(Integer t)
1445{
1446 if (t >= 0 && t < nbBasicItemType())
1447 return _singleton()->typeFromId(t)->typeName();
1448 return "InvalidType";
1449}
1450
1451/*---------------------------------------------------------------------------*/
1452/*---------------------------------------------------------------------------*/
1453
1455{
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;
1459 }
1460 return has_general_cells;
1461}
1462
1463/*---------------------------------------------------------------------------*/
1464/*---------------------------------------------------------------------------*/
1465
1467{
1468 ARCANE_ASSERT(mesh, ("Trying to indicate a null mesh contains general cells."));
1469 m_mesh_with_general_cells.insert(mesh);
1470}
1471
1472/*---------------------------------------------------------------------------*/
1473/*---------------------------------------------------------------------------*/
1474
1475} // End namespace Arcane
1476
1477/*---------------------------------------------------------------------------*/
1478/*---------------------------------------------------------------------------*/
#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.
Definition IOException.h:32
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).
Definition ItemTypeId.h:32
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.
Definition ItemTypeMng.h:65
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.
Definition String.cc:228
ARCCORE_BASE_EXPORT long unsigned int getFileLength(const String &filename)
Longueur du fichier filename. Si le fichier n'est pas lisible ou n'existe pas, retourne 0.
ARCCORE_BASE_EXPORT String getEnvironmentVariable(const String &name)
Variable d'environnement du nom name.
-*- 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.
Definition UtilsTypes.h:473
std::int16_t Int16
Type entier signé sur 16 bits.
std::int32_t Int32
Type entier signé sur 32 bits.