Arcane  v3.16.0.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 "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"
26
27#include "arcane/core/ItemTypeInfoBuilder.h"
28#include "arcane/core/IParallelSuperMng.h"
29#include "arcane/core/ItemTypeInfoBuilder.h"
30
31// AMR
32#include "arcane/ItemRefinementPattern.h"
33
34#include <map>
35#include <set>
36
37/*---------------------------------------------------------------------------*/
38/*---------------------------------------------------------------------------*/
39
40namespace Arcane
41{
42
43/*---------------------------------------------------------------------------*/
44/*---------------------------------------------------------------------------*/
45
46const Integer ItemTypeMng::m_nb_builtin_item_type = NB_BASIC_ITEM_TYPE;
47
48/*---------------------------------------------------------------------------*/
49/*---------------------------------------------------------------------------*/
50
53: m_initialized(false)
54, m_types_buffer(0)
55{
56 m_initialized_counter = 0;
57}
58
59/*---------------------------------------------------------------------------*/
60/*---------------------------------------------------------------------------*/
61
62ItemTypeMng::
63~ItemTypeMng()
64{
65 delete m_types_buffer;
66}
67
68/*---------------------------------------------------------------------------*/
69/*---------------------------------------------------------------------------*/
70
72build(IParallelSuperMng* parallel_mng, ITraceMng* trace)
73{
74 // Avec MPC, cette fonction peut être appelée plusieurs fois
75 // dans des threads différents. Comme tous les threads partagent
76 // le même singleton, seul le premier thread fait réelement l'init.
77 // ATTENTION: Cela est incompatible avec le mode readTypes()
78 // ou on lit les connectivités dans un fichier ARCANE_ITEM_TYPE_FILE.
79 Int32 max_rank = parallel_mng->commSize() + 1;
80 Int32 init_counter = ++m_initialized_counter;
81 if (init_counter == 1) {
82 _build(parallel_mng, trace);
83 m_initialized = true;
84 m_initialized_counter = max_rank;
85 }
86 else
87 // Ceux qui ne font pas l'init doivent attendre que cette derniere
88 // soit faite.
89 while (init_counter < max_rank)
90 init_counter = m_initialized_counter.load();
91}
92
93/*---------------------------------------------------------------------------*/
94/*---------------------------------------------------------------------------*/
95
96void ItemTypeMng::
97_build(IParallelSuperMng* parallel_mng, ITraceMng* trace)
98{
99 // Construit la connectivité des éléments.
100 // Pour les éléments classiques, la connectivité est la même que
101 // celle de VTK, disponible dans le document:
102 //
103 // https://vtk.org/wp-content/uploads/2015/04/file-formats.pdf
104
105 using Dimension = ItemTypeInfoBuilder::Dimension;
106
107 m_trace = trace;
108 m_types.resize(m_nb_builtin_item_type);
109 m_types_buffer = new MultiBufferT<ItemTypeInfoBuilder>();
110
111 // Null
112 {
113 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
114 m_types[IT_NullType] = type;
115
116 type->setInfos(this, IT_NullType, "NullType", Dimension::DimUnknown, 0, 0, 0);
117 }
118
119 // Vertex
120 {
121 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
122 m_types[IT_Vertex] = type;
123
124 type->setInfos(this, IT_Vertex, "Vertex", Dimension::Dim0, 0, 0, 0);
125 // TODO regarder si ce type est autorisé pour les mailles.
126 // Si ce n'est pas le cas, il faudrait définir un type
127 // pour les mailles 0D qui sont assimilables à des points.
128 }
129
130 // FaceVertex (face pour les maillages 1D)
131 {
132 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
133 m_types[IT_FaceVertex] = type;
134
135 type->setInfos(this, IT_FaceVertex, "FaceVertex", Dimension::Dim0, 1, 0, 0);
136 type->setIsValidForCell(false);
137 }
138
139 // Line2
140 {
141 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
142 m_types[IT_Line2] = type;
143
144 type->setInfos(this, IT_Line2, "Line2", Dimension::Dim1, 2, 0, 0);
145 type->setIsValidForCell(false);
146 }
147
148 // Line3
149 {
150 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
151 m_types[IT_Line3] = type;
152 type->setOrder(2, ITI_Line2);
153
154 type->setInfos(this, IT_Line3, "Line3", Dimension::Dim1, 3, 0, 0);
155 type->setIsValidForCell(false);
156 }
157
158 // CellLine2 (mailles pour les maillages 1D)
159 {
160 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
161 m_types[IT_CellLine2] = type;
162
163 type->setInfos(this, IT_CellLine2, "CellLine2", Dimension::Dim1, 2, 0, 2);
164
165 type->addFaceVertex(0, 0);
166 type->addFaceVertex(1, 1);
167 }
168
169 /**
170 * SDP: Pour les polygones les faces et les aretes sont identiques.
171 *
172 * @note lors des declarations des aretes, on donne pour faces les
173 * aretes qui sont jointes a l'arete courante
174 */
175
176 // Triangle3
177 {
178 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
179 m_types[IT_Triangle3] = type;
180
181 type->setInfos(this, IT_Triangle3, "Triangle3", Dimension::Dim2, 3, 3, 3);
182
183 type->addFaceLine(0, 0, 1);
184 type->addFaceLine(1, 1, 2);
185 type->addFaceLine(2, 2, 0);
186
187 type->addEdge(0, 0, 1, 1, 2);
188 type->addEdge(1, 1, 2, 2, 0);
189 type->addEdge(2, 2, 0, 0, 1);
190 }
191
192 // Triangle6
193 {
194 // TODO: Pour l'instant comme triangle3
195 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
196 m_types[IT_Triangle6] = type;
197
198 type->setInfos(this, IT_Triangle6, "Triangle6", Dimension::Dim2, 6, 3, 3);
199 type->setOrder(2, ITI_Triangle3);
200
201 type->addFaceLine3(0, 0, 1, 3);
202 type->addFaceLine3(1, 1, 2, 4);
203 type->addFaceLine3(2, 2, 0, 5);
204
205 type->addEdge(0, 0, 1, 1, 2);
206 type->addEdge(1, 1, 2, 2, 0);
207 type->addEdge(2, 2, 0, 0, 1);
208 }
209
210 // Quad4
211 {
212 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
213 m_types[IT_Quad4] = type;
214
215 type->setInfos(this, IT_Quad4, "Quad4", Dimension::Dim2, 4, 4, 4);
216
217 type->addFaceLine(0, 0, 1);
218 type->addFaceLine(1, 1, 2);
219 type->addFaceLine(2, 2, 3);
220 type->addFaceLine(3, 3, 0);
221
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);
226 }
227
228 // Quad8
229 {
230 // TODO: Pour l'instant comme quad4
231 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
232 m_types[IT_Quad8] = type;
233
234 type->setInfos(this, IT_Quad8, "Quad8", Dimension::Dim2, 8, 4, 4);
235 type->setOrder(2, ITI_Quad4);
236
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);
241
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);
246 }
247
248 // Pentagon5
249 {
250 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
251 m_types[IT_Pentagon5] = type;
252
253 type->setInfos(this, IT_Pentagon5, "Pentagon5", Dimension::Dim2, 5, 5, 5);
254
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);
260
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);
266 }
267
268 // Hexagon6
269 {
270 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
271 m_types[IT_Hexagon6] = type;
272
273 type->setInfos(this, IT_Hexagon6, "Hexagon6", Dimension::Dim2, 6, 6, 6);
274
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);
281
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);
288 }
289
290 // Hexaedron8
291 {
292 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
293 m_types[IT_Hexaedron8] = type;
294
295 type->setInfos(this, IT_Hexaedron8, "Hexaedron8", Dimension::Dim3, 8, 12, 6);
296
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);
303
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);
316 }
317
318 // Hexaedron20
319 {
320 // Pour l'instant comme Hexaedron8
321 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
322 m_types[IT_Hexaedron20] = type;
323
324 type->setInfos(this, IT_Hexaedron20, "Hexaedron20", Dimension::Dim3, 20, 12, 6);
325 type->setOrder(2, ITI_Hexaedron8);
326
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);
333
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);
346 }
347
348 // Pyramid5
349 {
350 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
351 m_types[IT_Pyramid5] = type;
352
353 type->setInfos(this, IT_Pyramid5, "Pyramid5", Dimension::Dim3, 5, 8, 5);
354
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);
360
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);
369 }
370
371 // Pentaedron6
372 {
373 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
374 m_types[IT_Pentaedron6] = type;
375
376 type->setInfos(this, IT_Pentaedron6, "Pentaedron6", Dimension::Dim3, 6, 9, 5);
377
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);
383
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);
393 }
394
395 // Tetraedron4
396 {
397 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
398 m_types[IT_Tetraedron4] = type;
399
400 type->setInfos(this, IT_Tetraedron4, "Tetraedron4", Dimension::Dim3, 4, 6, 4);
401
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);
406
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);
413 }
414
415 // Tetraedron10
416 {
417 // Pour l'instant comme Tetraedron4
418 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
419 m_types[IT_Tetraedron10] = type;
420
421 type->setInfos(this, IT_Tetraedron10, "Tetraedron10", Dimension::Dim3, 10, 6, 4);
422 type->setOrder(2, ITI_Tetraedron4);
423
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);
428
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);
435 }
436
437 // Heptaedron10
438 {
439 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
440 m_types[IT_Heptaedron10] = type;
441
442 type->setInfos(this, IT_Heptaedron10, "Heptaedron10", Dimension::Dim3, 10, 15, 7);
443
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);
451
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);
467 }
468
469 // Octaedron12
470 {
471 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
472 m_types[IT_Octaedron12] = type;
473
474 type->setInfos(this, IT_Octaedron12, "Octaedron12", Dimension::Dim3, 12, 18, 8);
475
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);
484
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);
503 }
504
505 // HemiHexa7
506 {
507 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
508 m_types[IT_HemiHexa7] = type;
509
510 type->setInfos(this, IT_HemiHexa7, "HemiHexa7", Dimension::Dim3, 7, 11, 6);
511
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);
518
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);
530 }
531
532 // HemiHexa6
533 {
534 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
535 m_types[IT_HemiHexa6] = type;
536
537 type->setInfos(this, IT_HemiHexa6, "HemiHexa6", Dimension::Dim3, 6, 10, 6);
538
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);
545
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);
556 }
557
558 // HemiHexa5
559 {
560 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
561 m_types[IT_HemiHexa5] = type;
562
563 type->setInfos(this, IT_HemiHexa5, "HemiHexa5", Dimension::Dim3, 5, 7, 4);
564
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);
569
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);
577 }
578
579 // AntiWedgeLeft6
580 {
581 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
582 m_types[IT_AntiWedgeLeft6] = type;
583
584 type->setInfos(this, IT_AntiWedgeLeft6, "AntiWedgeLeft6", Dimension::Dim3, 6, 10, 6);
585
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);
592
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);
603 }
604
605 // AntiWedgeRight6
606 {
607 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
608 m_types[IT_AntiWedgeRight6] = type;
609
610 type->setInfos(this, IT_AntiWedgeRight6, "AntiWedgeRight6", Dimension::Dim3, 6, 10, 6);
611
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);
618
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);
629 }
630
631 // DiTetra5
632 {
633 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
634 m_types[IT_DiTetra5] = type;
635
636 type->setInfos(this, IT_DiTetra5, "DiTetra5", Dimension::Dim3, 5, 9, 6);
637
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);
644
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);
654 }
655
656 // DualNode
657 {
658 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
659 m_types[IT_DualNode] = type;
660
661 type->setInfos(this, IT_DualNode, "DualNode", 1, 0, 0);
662 }
663 // DualEdge
664 {
665 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
666 m_types[IT_DualEdge] = type;
667
668 type->setInfos(this, IT_DualEdge, "DualEdge", 1, 0, 0);
669 }
670 // DualFace
671 {
672 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
673 m_types[IT_DualFace] = type;
674
675 type->setInfos(this, IT_DualFace, "DualFace", 1, 0, 0);
676 }
677 // DualCell
678 {
679 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
680 m_types[IT_DualCell] = type;
681
682 type->setInfos(this, IT_DualCell, "DualCell", 1, 0, 0);
683 }
684 // DualParticle
685 {
686 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
687 m_types[IT_DualParticle] = type;
688
689 type->setInfos(this, IT_DualParticle, "DualParticle", 1, 0, 0);
690 }
691 // Link
692 {
693 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
694 m_types[IT_Link] = type;
695
696 type->setInfos(this, IT_Link, "Link", 0, 0, 0);
697 }
698
699 // Enneedron14
700 {
701 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
702 m_types[IT_Enneedron14] = type;
703
704 type->setInfos(this, IT_Enneedron14, "Enneedron14", Dimension::Dim3, 14, 21, 9);
705
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);
715
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);
737 }
738 // Decaedron16
739 {
740 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
741 m_types[IT_Decaedron16] = type;
742
743 type->setInfos(this, IT_Decaedron16, "Decaedron16", Dimension::Dim3, 16, 24, 10);
744
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);
755
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);
780 }
781
782 // Heptagon7
783 {
784 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
785 m_types[IT_Heptagon7] = type;
786
787 type->setInfos(this, IT_Heptagon7, "Heptagon7", Dimension::Dim2, 7, 7, 7);
788
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);
796
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);
804 }
805
806 // Octogon8
807 {
808 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
809 m_types[IT_Octogon8] = type;
810
811 type->setInfos(this, IT_Octogon8, "Octogon8", Dimension::Dim2, 8, 8, 8);
812
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);
821
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);
830 }
831
832 // Cell3D_Line2
833 {
834 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
835 m_types[IT_Cell3D_Line2] = type;
836
837 type->setInfos(this, IT_Cell3D_Line2, "Cell3D_Line2", Dimension::Dim1, 2, 0, 0);
838 }
839
840 // Cell3D_Triangle3
841 {
842 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
843 m_types[IT_Cell3D_Triangle3] = type;
844
845 type->setInfos(this, IT_Cell3D_Triangle3, "Cell3D_Triangle3", Dimension::Dim2, 3, 0, 3);
846
847 type->addFaceLine(0, 0, 1);
848 type->addFaceLine(1, 1, 2);
849 type->addFaceLine(2, 2, 0);
850 }
851
852 // Cell3D_Quad4
853 {
854 ItemTypeInfoBuilder* type = m_types_buffer->allocOne();
855 m_types[IT_Cell3D_Quad4] = type;
856
857 type->setInfos(this, IT_Cell3D_Quad4, "Cell3D_Quad4", Dimension::Dim2, 4, 0, 4);
858
859 type->addFaceLine(0, 0, 1);
860 type->addFaceLine(1, 1, 2);
861 type->addFaceLine(2, 2, 3);
862 type->addFaceLine(3, 3, 0);
863 }
864
865 { // Polygon & Polyhedron: generic item types
866 String arcane_item_type_file = platform::getEnvironmentVariable("ARCANE_ITEM_TYPE_FILE");
867 if (!arcane_item_type_file.null()) {
868 // verify the existence of item type file. if doesn't exist return an exception
869 readTypes(parallel_mng, arcane_item_type_file);
870 }
871 }
872
873 // Calcul les relations face->arêtes
874 // Cette opération doit être appelé en fin phase build
875 for (Integer i = 0; i < m_types.size(); ++i) {
876 ItemTypeInfoBuilder* type = static_cast<ItemTypeInfoBuilder*>(m_types[i]);
877 if (!type)
878 ARCANE_FATAL("ItemType '{0}' is not defined", type);
879 type->computeFaceEdgeInfos();
880 }
881}
882
883/*---------------------------------------------------------------------------*/
884/*---------------------------------------------------------------------------*/
885
887printTypes(std::ostream& ostr)
888{
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()
895 << " Name: " << type->typeName()
896 << " Nodes: " << type->nbLocalNode()
897 << " Faces " << type->nbLocalFace() << '\n';
898 for (Integer z = 0, sz = type->nbLocalFace(); z < sz; ++z) {
900 ostr << " - - Face " << z << ":";
901 for (Integer zk = 0, szk = lf.nbNode(); zk < szk; ++zk) {
902 ostr << " " << lf.node(zk);
903 }
904 ostr << "\n";
905 }
906 ostr << "\n";
907 }
908}
909
910/*---------------------------------------------------------------------------*/
911/*---------------------------------------------------------------------------*/
912/*!
913 * \brief Lecture d'un fichier de types voronoi.
914 *
915 * Une cellule voronoi est un polytope dont le nombre de faces et de noeuds
916 * varie d'une cellule a l'autre. Ici, le type de chaque cellule est lu dans
917 * un fichier de types associe a un maillage d'entree donne.
918 * Ce fichier est passe dans la variable d'environnement: ARCANE_ITEM_TYPE_FILE
919 * Ex: setenv ARCANE_ITEM_TYPE_FILE PATH_TO_FILE/item_file
920 * Le format du fichier est la suivante:
921 *
922 * nb_type
923 * type_id nb_faces nb_edges
924 * nb_node_face0 node0_face0 ... nodeN_face1
925 * . . .
926 * . . .
927 * . . .
928 * nb_node_faceN node0_faceN ... nodeN_faceN
929 *
930 * node0_edge0 node1_edge1 lefFace_edge0 rightFace_edge0
931 * .
932 * .
933 * .
934 * node0_edgeN node1_edge1 lefFace_edgeN rightFace_edgeN
935 */
936void ItemTypeMng::
937readTypes(IParallelSuperMng* pm, const String& filename)
938{
939 m_trace->info() << "Reading additional item types from file '" << filename << "'";
940
941 UniqueArray<Byte> bytes;
942 Integer size = 0;
943
944 // Lecture parallèle
945 if (pm->commRank() == 0) {
946 long unsigned int file_length = platform::getFileLength(filename);
947 if (file_length == 0)
948 throw IOException(A_FUNCINFO, "ARCANE_ITEM_TYPE_FILE is an empty file");
949 std::ifstream ifile;
950 ifile.open(filename.localstr(), std::ios::binary);
951 if (ifile.fail())
952 throw IOException(A_FUNCINFO, "Cannot open ARCANE_ITEM_TYPE_FILE item type file");
953 bytes.resize(arcaneCheckArraySize(file_length + 1));
954 ifile.read((char*)bytes.data(), file_length);
955 bytes[(Integer)file_length] = '\0';
956 if (ifile.bad())
957 throw IOException(A_FUNCINFO, "Cannot read ARCANE_ITEM_TYPE_FILE item type file");
958 size = bytes.size();
959 }
960 {
961 IntegerArrayView bs(1, &size);
962 pm->broadcast(bs, 0);
963 }
964 bytes.resize(size);
965 if (size != 0) {
966 pm->broadcast(bytes, 0);
967 }
968 else { // CC: add ending '\0'
969 bytes.resize(1);
970 bytes[0] = '\0';
971 }
972
973 // Already built polygons (size => identifier)
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;
982 for (Integer i_type = 0; i_type < ItemTypeMng::nbBuiltInItemType(); ++i_type)
983 known_types.insert(i_type);
984
985 if (ItemTypeMng::nbBuiltInItemType() != m_types.size())
986 throw FatalErrorException(A_FUNCINFO, "Invalid initialization of built-in item types");
987
988 // Analyse du fichier de types
989 std::istringstream ifile((char*)bytes.unguardedBasePointer(), std::istringstream::in);
990 Integer nb_type = 0;
991 ifile >> nb_type;
992
993 m_types.resize(ItemTypeMng::nbBuiltInItemType() + nb_type);
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));
1000 typeId += ItemTypeMng::nbBuiltInItemType(); // translation d'indexation
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);
1004 if (nbE == nbF) // 2d case nbN == nbE == nbF
1005 {
1006 nbN = nbE;
1007 }
1008 else
1009 nbN = nbE - nbF + 2; // Calcul du nb de noeuds nbN a partir de nbE et nbF (formule d'Euler)
1010
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 #"
1013 << typeId - ItemTypeMng::nbBuiltInItemType() << " with " << nbN << " nodes, "
1014 << nbE << " edges, " << nbF << " faces.";
1015 m_types[typeId] = type;
1016 for (Integer iface = 0; iface < nbF; ++iface) {
1017 ifile >> nbN;
1018 UniqueArray<Integer> nodeFace(nbN);
1019 for (Integer inodeFace = 0; inodeFace < nbN; ++inodeFace) {
1020 ifile >> nodeFace[inodeFace];
1021 }
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";
1028 }
1029 else {
1030 ItemTypeInfoBuilder* type2 = m_types_buffer->allocOne();
1031
1032 face_type = m_types.size();
1033 m_types.add(type2);
1034 built_polygons[nbN] = face_type;
1035
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);
1039
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";
1044 }
1045 type->addFaceGeneric(iface, face_type, nodeFace);
1046 }
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);
1051 }
1052 }
1053
1054 m_trace->debug(Trace::High) << "Total number of types : " << m_types.size();
1055}
1056
1057/*---------------------------------------------------------------------------*/
1058/*---------------------------------------------------------------------------*/
1059
1062{
1063 return _singleton()->types().size();
1064}
1065
1068{
1069 return m_nb_builtin_item_type;
1070}
1071/*---------------------------------------------------------------------------*/
1072/*---------------------------------------------------------------------------*/
1073
1074//! AMR
1077{
1078 switch (type) {
1079 case IT_Line2:
1080 return 2;
1081 case IT_Triangle3:
1082 return 4;
1083 case IT_Quad4:
1084 return 4;
1085 case IT_Pentagon5:
1086 return 4;
1087 case IT_Hexagon6:
1088 return 4;
1089 case IT_Tetraedron4:
1090 return 8;
1091 case IT_Pyramid5:
1092 return 0;
1093 case IT_Pentaedron6:
1094 return 8;
1095 case IT_Hexaedron8:
1096 return 8;
1097 case IT_Heptaedron10:
1098 case IT_Octaedron12:
1099 case IT_HemiHexa7:
1100 case IT_HemiHexa6:
1101 case IT_HemiHexa5:
1102 case IT_AntiWedgeLeft6:
1103 case IT_AntiWedgeRight6:
1104 case IT_DiTetra5:
1105 return 0;
1106 default:
1107 ARCANE_FATAL("Not supported Item Type '{0}'", type);
1108 }
1109}
1110
1111/*---------------------------------------------------------------------------*/
1112/*---------------------------------------------------------------------------*/
1113
1114ItemTypeMng* ItemTypeMng::singleton_instance = 0;
1115
1116ItemTypeMng* ItemTypeMng::
1117_singleton()
1118{
1119 if (!singleton_instance)
1120 singleton_instance = new ItemTypeMng();
1121 return singleton_instance;
1122}
1123
1124void ItemTypeMng::
1125_destroySingleton()
1126{
1127 //GG: Ca plante avec Windows. Regarder pourquoi.
1128#ifndef ARCANE_OS_WIN32
1129 delete singleton_instance;
1130#endif
1131 singleton_instance = nullptr;
1132}
1133
1134/*---------------------------------------------------------------------------*/
1135/*---------------------------------------------------------------------------*/
1136
1138types() const
1139{
1140 ARCANE_ASSERT((m_initialized), ("Cannot use not built ItemTypeMng"));
1141 return m_types;
1142}
1143
1144/*---------------------------------------------------------------------------*/
1145/*---------------------------------------------------------------------------*/
1146
1147ItemTypeInfo* ItemTypeMng::
1148typeFromId(Integer id) const
1149{
1150 ARCANE_ASSERT((m_initialized), ("Cannot use not built ItemTypeMng"));
1151 return m_types[id];
1152}
1153
1154/*---------------------------------------------------------------------------*/
1155/*---------------------------------------------------------------------------*/
1156
1157ItemTypeInfo* ItemTypeMng::
1158typeFromId(ItemTypeId id) const
1159{
1160 ARCANE_ASSERT((m_initialized), ("Cannot use not built ItemTypeMng"));
1161 return m_types[id.typeId()];
1162}
1163
1164/*---------------------------------------------------------------------------*/
1165/*---------------------------------------------------------------------------*/
1166
1168typeName(Integer id) const
1169{
1170 return typeFromId(id)->typeName();
1171}
1172
1173/*---------------------------------------------------------------------------*/
1174/*---------------------------------------------------------------------------*/
1175
1177typeName(ItemTypeId id) const
1178{
1179 return typeFromId(id)->typeName();
1180}
1181
1182/*---------------------------------------------------------------------------*/
1183/*---------------------------------------------------------------------------*/
1184// Recopie de la fonction obsolète Item::typeName().
1185// TODO: voir pourquoi il y a un test sur nBasicItemType().
1186String ItemTypeMng::
1187_legacyTypeName(Integer t)
1188{
1189 if (t >= 0 && t < nbBasicItemType())
1190 return _singleton()->typeFromId(t)->typeName();
1191 return "InvalidType";
1192}
1193
1194/*---------------------------------------------------------------------------*/
1195/*---------------------------------------------------------------------------*/
1196
1198{
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;
1202 }
1203 return has_general_cells;
1204}
1205
1206/*---------------------------------------------------------------------------*/
1207/*---------------------------------------------------------------------------*/
1208
1210{
1211 ARCANE_ASSERT(mesh, ("Trying to indicate a null mesh contains general cells."));
1212 m_mesh_with_general_cells.insert(mesh);
1213}
1214
1215/*---------------------------------------------------------------------------*/
1216/*---------------------------------------------------------------------------*/
1217
1218} // End namespace Arcane
1219
1220/*---------------------------------------------------------------------------*/
1221/*---------------------------------------------------------------------------*/
#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.
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 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 de maillage.
Definition ItemTypeMng.h:66
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:227
Vecteur 1D de données avec sémantique par valeur (style STL).
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:544
std::int16_t Int16
Type entier signé sur 16 bits.
std::int32_t Int32
Type entier signé sur 32 bits.