Arcane  4.1.11.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
DualUniqueIdMng.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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#ifndef ARCANE_MESH_DUALUNIQUEIDMNG_H
8#define ARCANE_MESH_DUALUNIQUEIDMNG_H
9
10/*---------------------------------------------------------------------------*/
11/*---------------------------------------------------------------------------*/
12#include <utility>
13#include "arcane/utils/String.h"
14#include "arcane/utils/TraceAccessor.h"
15
16/*---------------------------------------------------------------------------*/
17/*---------------------------------------------------------------------------*/
18
19/*
20 * Strategy for numbering UniqueIds of items (DualNode, Link) in a graph
21 *
22 * DualNode :
23 * --------
24 *
25 * The UniqueId is created from that of the item
26 * For now, we assume that the item's UniqueId is encoded on 30 bits,
27 * which means we allow 2^30 items (about 1 billion)
28 *
29 * DualNode with DualItem of type Node :
30 * [ 29 bit (Node UniqueId) |
31 * 32 bit (0) |
32 * 2 bit (Node Code 0 0) |
33 * 1 bit (Positive Sign 0 )]
34 * = 64 bit
35 *
36 * DualNode with DualItem of type Face :
37 * [ 29 bit (Face UniqueId) |
38 * 32 bit (0) |
39 * 2 bit (Face Code 0 1) |
40 * 1 bit (Positive Sign 0 )]
41 * = 64 bit
42 *
43 * DualNode with DualItem of type Cell :
44 * [ 29 bit (Cell UniqueId) |
45 * 32 bit (0) |
46 * 2 bit (Cell Code 1 0) |
47 * 1 bit (Positive Sign 0 )]
48 * = 64 bit
49 *
50 * DualNode with DualItem of type Edge :
51 * [ 29 bit (Edge UniqueId) |
52 * 32 bit (0) |
53 * 2 bit (Edge Code 1 1) |
54 * 1 bit (Positive Sign 0 )]
55 * = 64 bit
56 *
57 * It is possible to create multiple DualNodes per item. In this case, the DualNodes are
58 * differentiated by their rank (on 4 bits, i.e., 2^4=16 dualnodes per item maximum)
59 * In this use case, we only allow 2^25 items (=33 554 432 items)
60 *
61 * DualNode with DualItem of type Node|Face|Cell|Edge :
62 * [ 25 bit (Item UniqueId) |
63 * [ 4 bit (DualItem rank) |
64 * 32 bit (0) |
65 * 2 bit (Edge Code 1 1) |
66 * 1 bit (Positive Sign 0 )]
67 * = 64 bit
68 *
69 * Link :
70 * ----
71 *
72 * We concatenate the UniqueIds of the items joined by the Link
73 *
74 * Link linking Item_1 and Item_2 =
75 * [ 29 bit (Item_1 UniqueId) |
76 * 29 bit (Item_2 UniqueId) |
77 * 1 bit (0) |
78 * 2 bit (Item_1 Code) |
79 * 2 bit (Item_2 Code) |
80 * 1 bit (Positive Sign 0 )]
81 * = 64 bit
82 *
83 * If there are multiple dualnodes per item, we specify the ranks of the dualnodes of the linked items.
84 *
85 * Link linking DualItem_1 rank_1 and DualItem_2 rank_2 =
86 * [ 25 bit (Item_1 UniqueId) |
87 * [ 4 bit (DualItem_1 rank) |
88 * [ 25 bit (Item_2 UniqueId) |
89 * [ 4 bit (DualItem_2 rank) |
90 * 1 bit (0) |
91 * 2 bit (Item_1 Code) |
92 * 2 bit (Item_2 Code) |
93 * 1 bit (Positive Sign 0 )]
94 * = 64 bit
95 *
96 *
97 */
98
99/*---------------------------------------------------------------------------*/
100/*---------------------------------------------------------------------------*/
101
103#include "arcane/Item.h"
104#include "arcane/utils/TraceAccessor.h"
105#include "arcane/utils/FatalErrorException.h"
106
107/*---------------------------------------------------------------------------*/
108/*---------------------------------------------------------------------------*/
109
110namespace Arcane
111{
112
113/*---------------------------------------------------------------------------*/
114/*---------------------------------------------------------------------------*/
115
116class ARCANE_MESH_EXPORT DualUniqueIdMng
117: public TraceAccessor
118{
119 private:
120
122
123 public:
124
125 static const Int64 node_code = 0;
126 static const Int64 face_code = Int64(1) << 62;
127 static const Int64 cell_code = Int64(1) << 61;
128 static const Int64 edge_code = (Int64(1) << 61) + (Int64(1) << 62);
129 static const Int64 particle_code = (Int64(1) << 61) + (Int64(1) << 62);
130
131 bool m_use_dual_particle = true;
132
133 DualUniqueIdMng(ITraceMng* trace_mng, bool use_dual_particle = true)
134 : TraceAccessor(trace_mng)
135 , m_use_dual_particle(use_dual_particle)
136 {}
137
138 ~DualUniqueIdMng() {}
139
140 public:
141
142 inline eItemKind codeToItemKind(Int64 code);
143 inline eItemKind uidToDualItemKind(Int64 unique_id);
144 inline Int64 uniqueIdOf(eItemKind item_kind, Int64 item_uid);
145
146 template <typename ItemT>
147 inline static Int64 uniqueIdOf(const ItemT& item);
148
149 template <typename ItemT>
150 inline Int64 debugUniqueIdOf(const ItemT& item);
151
152 inline std::tuple<eItemKind, Int64> uniqueIdOfDualItem(const DoF& item);
153
154 template <typename ItemT>
155 inline static Int64 uniqueIdOf(const ItemT& item, const Integer rank);
156
157 template <typename ItemT_1, typename ItemT_2>
158 inline static Int64 uniqueIdOf(const ItemT_1& item_1, const ItemT_2& item_2);
159
160 inline std::pair<std::tuple<eItemKind, Int64>, std::tuple<eItemKind, Int64>> uniqueIdOfPairOfDualItems(const DoF& item);
161
162 template <typename ItemT_1, typename ItemT_2>
163 inline static Int64 uniqueIdOf(const ItemT_1& item_1, const Integer item_1_rank,
164 const ItemT_2& item_2, const Integer item_2_rank);
165
166 inline static Integer rankOf(const DoF&);
167
168 inline void info(const DoF& node, const Item& dual_item) const;
169 inline void info(const DoF& link, const DoF& dual_node0, const DoF& dual_node1, const Item& dual_item0, const Item& dual_item1) const;
170
171 inline Int64 debugDualItemUniqueId(DoF& node) const;
172
173 private:
174
175 template <typename ItemT, typename Type>
177
178 template <Integer Nbit, typename Type>
179 inline static bool _onlyFirstBitUsed(const Type id);
180
181 inline bool _checkDualNode(const DoF& node, const Item& dual_item) const;
182 inline bool _checkLink(const DoF& link, const Item& dual_item0, const Item& dual_item1) const;
183
184 inline Int64 _extractFirstCode(const Int64 id) const;
185 inline Int64 _extractSecondCode(const Int64 id) const;
186 inline Int64 _extractFirstId(const Int64 id) const;
187 inline Int64 _extractSecondId(const Int64 id) const;
188
189 inline bool _codeIsValid(const Item& item, const Int64 code) const;
190 inline bool _idIsValid(const Item& item, const Int64 id) const;
191};
192
193/*---------------------------------------------------------------------------*/
194/*---------------------------------------------------------------------------*/
195
196// Code for DualNodes based on Item
197template <>
198struct ARCANE_MESH_EXPORT DualUniqueIdMng::traits_item_code<Node, Int64>
199{
200 static const Int64 code = 0;
201};
202
203template <>
204struct ARCANE_MESH_EXPORT DualUniqueIdMng::traits_item_code<Face, Int64>
205{
206 static const Int64 code = Int64(1) << 62;
207};
208
209template <>
210struct ARCANE_MESH_EXPORT DualUniqueIdMng::traits_item_code<Cell, Int64>
211{
212 static const Int64 code = Int64(1) << 61;
213};
214template <>
215struct ARCANE_MESH_EXPORT DualUniqueIdMng::traits_item_code<Edge, Int64>
216{
217 static const Int64 code = (Int64(1) << 61) + (Int64(1) << 62);
218};
219
220template <>
221struct ARCANE_MESH_EXPORT DualUniqueIdMng::traits_item_code<Particle, Int64>
222{
224 static const Int64 code = (Int64(1) << 61) + (Int64(1) << 62);
225};
226
227/*---------------------------------------------------------------------------*/
228/*---------------------------------------------------------------------------*/
229
230// Checks that only the first Nbit bits are used
231//
232// Example:
233// bool onlyFirstBitUsed<4,Integer>(Integer id) with sizeof(Integer) = 8 bits
234// the method returns true if the integer id is encoded on the first 4 bits,
235// (i.e., if the last 4 bits are 0)
236//
237// By doing this, we create a filter equal to 1 for the last 4 bits and we
238// use the binary comparison &. If the result is zero, we return true
239//
240template <Integer Nbit, typename Type>
241inline bool
242DualUniqueIdMng::
243_onlyFirstBitUsed(const Type id)
244{
245 ARCANE_ASSERT((Nbit > 0), ("Error template parameter Nbit <= 0"));
246
247 [[maybe_unused]] const Integer nb_bit_max = (Integer)(8 * sizeof(Type));
248
249 ARCANE_ASSERT((Nbit < nb_bit_max), ("Error 8*sizeof(Type) <= Nbit"));
250
251 // filter on the nb_bit_max - Nbit last bits
252 const Type Nbit_first_bits_nulls = ~((1 << Nbit) - 1);
253
254 // If the nb_bit_max - Nbit last bits are zero, true
255 return (Nbit_first_bits_nulls & id) == Type(0);
256}
257
258/*---------------------------------------------------------------------------*/
259/*---------------------------------------------------------------------------*/
260
261template <typename ItemT>
262inline Int64
263DualUniqueIdMng::
264uniqueIdOf(const ItemT& item)
265{
266 ARCANE_ASSERT((8 * sizeof(Int64) == 64), ("Int64 is not 64-bits"));
267 ARCANE_ASSERT((_onlyFirstBitUsed<29, Int64>(item.uniqueId())),
268 (String::format("Item kind={0} uid={1} : invalid uid (more than 29 bit)",
269 itemKindName(item.kind()), item.uniqueId())
270 .localstr()));
271
272 const Int64 unique_id = item.uniqueId();
273
274 return unique_id | traits_item_code<ItemT, Int64>::code;
275}
276
277template <typename ItemT>
278inline Int64
279DualUniqueIdMng::
280debugUniqueIdOf(const ItemT& item)
281{
282 ARCANE_ASSERT((8 * sizeof(Int64) == 64), ("Int64 is not 64-bits"));
283 ARCANE_ASSERT((_onlyFirstBitUsed<29, Int64>(item.uniqueId())),
284 (String::format("Item kind={0} uid={1} : invalid uid (more than 29 bit)",
285 itemKindName(item.kind()), item.uniqueId())
286 .localstr()));
287
288 const Int64 unique_id = item.uniqueId();
289
290 return unique_id | traits_item_code<ItemT, Int64>::code;
291}
292
293inline eItemKind
294DualUniqueIdMng::
295uidToDualItemKind(Int64 unique_id)
296{
297 Int64 code = _extractSecondCode(unique_id);
298
299 if (code == face_code)
300 return IK_Face;
301 if (code == node_code)
302 return IK_Node;
303 if (code == cell_code)
304 return IK_Cell;
305 if (m_use_dual_particle && code == particle_code)
306 return IK_Particle;
307 else if (code == edge_code)
308 return IK_Edge;
309 return IK_Unknown;
310}
311
312inline eItemKind
313DualUniqueIdMng::
314codeToItemKind(Int64 code)
315{
316 if (code == face_code)
317 return IK_Face;
318 if (code == node_code)
319 return IK_Node;
320 if (code == cell_code)
321 return IK_Cell;
322 if (m_use_dual_particle && code == particle_code)
323 return IK_Particle;
324 else if (code == edge_code)
325 return IK_Edge;
326
327 return IK_Unknown;
328}
329
330inline Int64
331DualUniqueIdMng::
332uniqueIdOf(eItemKind item_kind, Int64 item_uid)
333{
334 ARCANE_ASSERT((8 * sizeof(Int64) == 64), ("Int64 is not 64-bits"));
335 ARCANE_ASSERT((_onlyFirstBitUsed<29, Int64>(item_uid)),
336 (String::format("Item kind={0} uid={1} : invalid uid (more than 29 bit)",
337 itemKindName(item_kind), item_uid)
338 .localstr()));
339
340 switch (item_kind) {
341 case IK_Node:
342 return item_uid | node_code;
343 case IK_Face:
344 return item_uid | face_code;
345 case IK_Cell:
346 return item_uid | cell_code;
347 case IK_Edge:
348 return item_uid | edge_code;
349 case IK_Particle:
350 return item_uid | particle_code;
351 default:
352 throw FatalErrorException(A_FUNCINFO, "Item not defined in graph");
353 }
354 return -1;
355}
356
357inline std::tuple<eItemKind, Int64>
358DualUniqueIdMng::
359uniqueIdOfDualItem(const DoF& node)
360{
361 ARCANE_ASSERT((8 * sizeof(Int64) == 64), ("Int64 is not 64-bits"));
362 const Int64 node_id = node.uniqueId();
363 const Int64 dual_id = _extractFirstId(node_id);
364 eItemKind item_kind = uidToDualItemKind(node_id);
365
366 return std::make_tuple(item_kind, dual_id);
367}
368
369/*---------------------------------------------------------------------------*/
370/*---------------------------------------------------------------------------*/
371
372template <typename ItemT>
373inline Int64
374DualUniqueIdMng::
375uniqueIdOf(const ItemT& item, const Integer rank)
376{
377 ARCANE_ASSERT((8 * sizeof(Int64) == 64), ("Int64 is not 64-bits"));
378 ARCANE_ASSERT((_onlyFirstBitUsed<25, Int64>(item.uniqueId())),
379 (String::format("Item kind={0} uid={1} : invalid uid (more than 25 bit)",
380 itemKindName(item.kind()), item.uniqueId())
381 .localstr()));
382 ARCANE_ASSERT((_onlyFirstBitUsed<4, Int64>(Int64(rank))),
383 (String::format("rank={0} : invalid level (more than 4 bit)", rank).localstr()));
384
385 const Int64 unique_id = item.uniqueId();
386
387 return unique_id | Int64(rank) << 25 | traits_item_code<ItemT, Int64>::code;
388}
389
390/*---------------------------------------------------------------------------*/
391/*---------------------------------------------------------------------------*/
392
393template <typename ItemT_1, typename ItemT_2>
394inline Int64
395DualUniqueIdMng::
396uniqueIdOf(const ItemT_1& item_1, const ItemT_2& item_2)
397{
398 ARCANE_ASSERT((8 * sizeof(Int64) == 64), ("Int64 is not 64-bits"));
399 ARCANE_ASSERT((_onlyFirstBitUsed<29, Int64>(item_1.uniqueId())),
400 (String::format("Item kind={0} uid={1} : invalid uid (more than 29 bit)",
401 itemKindName(item_1.kind()), item_1.uniqueId())
402 .localstr()));
403 ARCANE_ASSERT((_onlyFirstBitUsed<29, Int64>(item_2.uniqueId())),
404 (String::format("Item kind={0} uid={1} : invalid uid (more than 29 bit)",
405 itemKindName(item_2.kind()), item_2.uniqueId())
406 .localstr()));
407
408 const Int64 item_1_unique_id = item_1.uniqueId();
409 const Int64 item_2_unique_id = item_2.uniqueId();
410
411 return item_1_unique_id | // id of item 1 on 29 bits
412 item_2_unique_id << 29 | // id of item 2 on the next 29 bits
413 traits_item_code<ItemT_1, Int64>::code >> 2 | // code of item 1 on the next 2 bits
414 traits_item_code<ItemT_2, Int64>::code; // code of item 2 on the last 2 bits
415}
416
417inline std::pair<std::tuple<eItemKind, Int64>, std::tuple<eItemKind, Int64>>
418DualUniqueIdMng::
419uniqueIdOfPairOfDualItems(const DoF& link)
420{
421 ARCANE_ASSERT((8 * sizeof(Int64) == 64), ("Int64 is not 64-bits"));
422
423 const Int64 link_id = link.uniqueId();
424
425 const Int64 code_1 = _extractFirstCode(link_id);
426 const Int64 id_1 = _extractFirstId(link_id);
427 const eItemKind kind_1 = codeToItemKind(code_1);
428
429 const Int64 code_2 = _extractSecondCode(link_id);
430 const Int64 id_2 = _extractSecondId(link_id);
431 const eItemKind kind_2 = codeToItemKind(code_2);
432
433 return std::make_pair(std::make_tuple(kind_1, id_1), std::make_tuple(kind_2, id_2));
434}
435
436/*---------------------------------------------------------------------------*/
437/*---------------------------------------------------------------------------*/
438
439template <typename ItemT_1, typename ItemT_2>
440inline Int64
441DualUniqueIdMng::
442uniqueIdOf(const ItemT_1& item_1, const Integer item_1_rank, const ItemT_2& item_2, const Integer item_2_rank)
443{
444 ARCANE_ASSERT((8 * sizeof(Int64) == 64), ("Int64 is not 64-bits"));
445 ARCANE_ASSERT((_onlyFirstBitUsed<25, Int64>(item_1.uniqueId())),
446 (String::format("Item kind={0} uid={1} : invalid uid (more than 25 bit)",
447 itemKindName(item_1.kind()), item_1.uniqueId())
448 .localstr()));
449 ARCANE_ASSERT((_onlyFirstBitUsed<4, Int64>(Int64(item_1_rank))),
450 (String::format("rank={0} : invalid level (more than 4 bit)", item_1_rank).localstr()));
451 ARCANE_ASSERT((_onlyFirstBitUsed<25, Int64>(item_2.uniqueId())),
452 (String::format("Item kind={0} uid={1} : invalid uid (more than 25 bit)",
453 itemKindName(item_2.kind()), item_2.uniqueId())
454 .localstr()));
455 ARCANE_ASSERT((_onlyFirstBitUsed<4, Int64>(Int64(item_2_rank))),
456 (String::format("rank={0} : invalid level (more than 4 bit)", item_2_rank).localstr()));
457
458 const Int64 item_1_unique_id = item_1.uniqueId();
459 const Int64 item_2_unique_id = item_2.uniqueId();
460
461 return item_1_unique_id | // id of item 1 on 25 bits
462 Int64(item_1_rank) << 25 | // rank of item 1 on 4 bits
463 item_2_unique_id << 29 | // id of item 2 on the next 25 bits
464 Int64(item_2_rank) << 54 | // rank of item 2 on the next 4 bits
465 traits_item_code<ItemT_1, Int64>::code >> 2 | // code of item 1 on the next 2 bits
466 traits_item_code<ItemT_2, Int64>::code; // code of item 2 on the last 2 bits
467}
468
469/*---------------------------------------------------------------------------*/
470/*---------------------------------------------------------------------------*/
471inline Integer
472DualUniqueIdMng::
473rankOf(const DoF& node)
474{
475 const Int64 id = node.uniqueId();
476 return Integer((~((Int64(1) << 25) - 1) & id) >> 25);
477}
478
479/*---------------------------------------------------------------------------*/
480/*---------------------------------------------------------------------------*/
481inline bool
482DualUniqueIdMng::
483_codeIsValid(const Item& item, const Int64 code) const
484{
485 const eItemKind item_kind = item.kind();
486 switch (item_kind) {
487 case IK_Face:
489 return false;
490 }
491 break;
492 case IK_Node:
494 return false;
495 }
496 break;
497 case IK_Cell:
499 return false;
500 }
501 break;
502 case IK_Edge:
504 return false;
505 }
506 break;
507 case IK_Particle:
509 return false;
510 }
511 break;
512 default:
513 throw FatalErrorException(A_FUNCINFO, "Item not defined in graph");
514 }
515 return true;
516}
517
518/*---------------------------------------------------------------------------*/
519/*---------------------------------------------------------------------------*/
520
521inline bool
522DualUniqueIdMng::
523_idIsValid(const Item& item, const Int64 id) const
524{
525 return (id != item.uniqueId()) ? false : true;
526}
527
528/*---------------------------------------------------------------------------*/
529/*---------------------------------------------------------------------------*/
530
531inline Int64
532DualUniqueIdMng::
533_extractSecondCode(const Int64 id) const
534{
535 return ~((Int64(1) << 61) - 1) & id;
536}
537
538/*---------------------------------------------------------------------------*/
539/*---------------------------------------------------------------------------*/
540
541inline Int64
542DualUniqueIdMng::
543_extractFirstId(const Int64 id) const
544{
545 return ((Int64(1) << 29) - 1) & id;
546}
547
548/*---------------------------------------------------------------------------*/
549/*---------------------------------------------------------------------------*/
550
551inline Int64
552DualUniqueIdMng::
553_extractFirstCode(const Int64 id) const
554{
555 return (~(((Int64(1) << 59) - 1) | ~((Int64(1) << 61) - 1)) & id) << 2;
556}
557
558/*---------------------------------------------------------------------------*/
559/*---------------------------------------------------------------------------*/
560
561inline Int64
562DualUniqueIdMng::
563_extractSecondId(const Int64 id) const
564{
565 return (~(((Int64(1) << 29) - 1) | ~((Int64(1) << 59) - 1)) & id) >> 29;
566}
567
568/*---------------------------------------------------------------------------*/
569/*---------------------------------------------------------------------------*/
570
571inline bool
572DualUniqueIdMng::
573_checkDualNode(const DoF& node, const Item& dual_item) const
574{
575 const Int64 node_id = node.uniqueId();
576
577 const Int64 code = _extractSecondCode(node_id);
578 const Int64 id = _extractFirstId(node_id);
579
580 return _codeIsValid(dual_item, code) && _idIsValid(dual_item, id);
581}
582
583/*---------------------------------------------------------------------------*/
584/*---------------------------------------------------------------------------*/
585
586inline bool
587DualUniqueIdMng::
588_checkLink(const DoF& link, const Item& item_1, const Item& item_2) const
589{
590
591 const Int64 link_id = link.uniqueId();
592
593 const Int64 code_1 = _extractFirstCode(link_id);
594 const Int64 id_1 = _extractFirstId(link_id);
595
596 const Int64 code_2 = _extractSecondCode(link_id);
597 const Int64 id_2 = _extractSecondId(link_id);
598
599 return _codeIsValid(item_1, code_1) && _idIsValid(item_1, id_1) && _codeIsValid(item_2, code_2) && _idIsValid(item_2, id_2);
600}
601
602/*---------------------------------------------------------------------------*/
603/*---------------------------------------------------------------------------*/
604
605inline void
607info(const DoF& node, const Item& dual_item) const
608{
609 ARCANE_ASSERT((_checkDualNode(node, dual_item) == true), ("Error from dual node consistence. Do you use DualUniqueIdMng to generate unique id of graph item ?"));
610
611 info() << " -- Dual Node with unique id " << node.uniqueId()
612 << " of item of kind " << dual_item.kind()
613 << " and unique id " << dual_item.uniqueId();
614}
615
616/*---------------------------------------------------------------------------*/
617/*---------------------------------------------------------------------------*/
618
619inline void
621info(const DoF& link, const DoF& dual_node0, const DoF& dual_node1, const Item& dual_item0, const Item& dual_item1) const
622{
623 ARCANE_ASSERT((_checkLink(link, dual_item0, dual_item1) == true), ("Error from link consistence. Do you use DualUniqueIdMng to generate unique id of graph item ?"));
624
625 info() << "- Link with unique id " << link.uniqueId() << " of :";
626
627 info(dual_node0, dual_item0);
628
629 info() << " and :";
630
631 info(dual_node1, dual_item1);
632}
633
634/*---------------------------------------------------------------------------*/
635/*---------------------------------------------------------------------------*/
636
637} // namespace Arcane
638
639/*---------------------------------------------------------------------------*/
640/*---------------------------------------------------------------------------*/
641
642#endif
Fichier de configuration d'Arcane.
classe degré de liberté.
Definition Item.h:1532
TraceMessage info() const
Flot pour un message d'information.
Interface du gestionnaire de traces.
Classe de base d'un élément de maillage.
Definition Item.h:83
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessage info() const
Flot pour un message d'information.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
eItemKind
Genre d'entité de maillage.
@ IK_Particle
Entité de maillage de genre particule.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Unknown
Entité de maillage de genre inconnu ou non initialisé
@ IK_Face
Entité de maillage de genre face.
@ IK_Edge
Entité de maillage de genre arête.
const char * itemKindName(eItemKind kind)
Nom du genre d'entité.
Type
Type of JSON value.
Definition rapidjson.h:730
static const Int64 code
Warning: incompatible with simultaneous use of dual nodes on edges and particles.