Arcane  4.2.3.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
FaceDirectionMng.cc
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/*---------------------------------------------------------------------------*/
8/* FaceDirectionMng.cc (C) 2000-2026 */
9/* */
10/* Infos sur les faces d'une direction X Y ou Z d'un maillage structuré. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/cartesianmesh/FaceDirectionMng.h"
15
16#include "arcane/utils/FatalErrorException.h"
17#include "arcane/utils/Real3.h"
18#include "arcane/utils/PlatformUtils.h"
19
20#include "arcane/core/IItemFamily.h"
21#include "arcane/core/ItemGroup.h"
22#include "arcane/core/IMesh.h"
23#include "arcane/core/VariableTypes.h"
24
25#include "arcane/cartesianmesh/ICartesianMesh.h"
26#include "arcane/cartesianmesh/CellDirectionMng.h"
27#include "arcane/cartesianmesh/internal/ICartesianMeshInternal.h"
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
32namespace Arcane
33{
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
37
39{
40 public:
41 Impl() : m_infos(platform::getDefaultDataAllocator()){}
42 public:
43 FaceGroup m_inner_all_items;
44 FaceGroup m_outer_all_items;
45 FaceGroup m_inpatch_all_items;
46 FaceGroup m_overlap_all_items;
47 FaceGroup m_all_items;
48 ICartesianMesh* m_cartesian_mesh = nullptr;
49 Integer m_patch_index = -1;
51};
52
53/*---------------------------------------------------------------------------*/
54/*---------------------------------------------------------------------------*/
55
58: m_direction(MD_DirInvalid)
59, m_p (nullptr)
60{
61}
62
63/*---------------------------------------------------------------------------*/
64/*---------------------------------------------------------------------------*/
65
66void FaceDirectionMng::
67_internalInit(ICartesianMesh* cm,eMeshDirection dir,Integer patch_index)
68{
69 if (m_p)
70 ARCANE_FATAL("Initialisation already done");
71 m_p = new Impl();
72 m_direction = dir;
73 m_p->m_cartesian_mesh = cm;
74 m_p->m_patch_index = patch_index;
75}
76
77/*---------------------------------------------------------------------------*/
78/*---------------------------------------------------------------------------*/
79
80void FaceDirectionMng::
81_internalDestroy()
82{
83 delete m_p;
84 m_p = nullptr;
85}
86
87/*---------------------------------------------------------------------------*/
88/*---------------------------------------------------------------------------*/
89
90void FaceDirectionMng::
91_internalResizeInfos(Int32 new_size)
92{
93 m_p->m_infos.resize(new_size);
94 m_infos_view = m_p->m_infos.view();
95}
96
97/*---------------------------------------------------------------------------*/
98/*---------------------------------------------------------------------------*/
99
100void FaceDirectionMng::
101_internalComputeInfos(const CellDirectionMng& cell_dm,const VariableCellReal3& cells_center,
102 const VariableFaceReal3& faces_center)
103{
104 IMesh* mesh = m_p->m_cartesian_mesh->mesh();
105 IItemFamily* face_family = mesh->faceFamily();
106 IItemFamily* cell_family = mesh->cellFamily();
107 int dir = (int)m_direction;
108 String base_group_name = String("Direction")+dir;
109 if (m_p->m_patch_index>=0)
110 base_group_name = base_group_name + String("AMRPatch")+m_p->m_patch_index;
111
112 // Calcule la liste des faces dans une direction donnée.
113 // Il faut pour chaque maille ajouter dans la liste des faces
114 // les deux faces de la direction souhaitées en prenant bien soin
115 // de ne pas ajouter deux fois la même face.
116 UniqueArray<Int32> faces_lid;
117 {
118 CellGroup all_cells = cell_dm.allCells();
119 faces_lid.reserve(all_cells.size());
120 // Ensemble des faces déjà ajoutées
121 UniqueArray<bool> done_faces(face_family->maxLocalId(), false);
122 ENUMERATE_CELL (icell, all_cells) {
123 DirCellFace dcf(cell_dm.cellFace(*icell));
124 Face next_face = dcf.next();
125 Face prev_face = dcf.previous();
126
127 //! Ajoute la face d'avant à la liste des faces de cette direction
128 Int32 prev_lid = prev_face.localId();
129 if (!done_faces[prev_lid]) {
130 faces_lid.add(prev_lid);
131 done_faces[prev_lid] = true;
132 }
133 Int32 next_lid = next_face.localId();
134 if (!done_faces[next_lid]) {
135 faces_lid.add(next_lid);
136 done_faces[next_lid] = true;
137 }
138 }
139 }
140
141 FaceGroup all_faces = face_family->createGroup(String("AllFaces")+base_group_name,Int32ConstArrayView(),true);
142 all_faces.setItems(faces_lid,true);
143
144 UniqueArray<Int32> inner_lids;
145 UniqueArray<Int32> outer_lids;
146 ENUMERATE_FACE (iitem, all_faces) {
147 Int32 lid = iitem.itemLocalId();
148 Face face = *iitem;
149 // TODO: ne pas utiliser nbCell() mais faire cela via le marqueur utilisé précédemment
150 if (face.nbCell() == 1)
151 outer_lids.add(lid);
152 else
153 inner_lids.add(lid);
154 }
155 m_p->m_inner_all_items = face_family->createGroup(String("AllInner")+base_group_name,inner_lids,true);
156 m_p->m_outer_all_items = face_family->createGroup(String("AllOuter")+base_group_name,outer_lids,true);
157 m_p->m_all_items = all_faces;
158 m_cells = CellInfoListView(cell_family);
159
160 _computeCellInfos(cell_dm,cells_center,faces_center);
161}
162
163/*---------------------------------------------------------------------------*/
164/*---------------------------------------------------------------------------*/
165
166void FaceDirectionMng::
167_internalComputeInfos(const CellDirectionMng& cell_dm)
168{
169 IMesh* mesh = m_p->m_cartesian_mesh->mesh();
170 IItemFamily* face_family = mesh->faceFamily();
171 IItemFamily* cell_family = mesh->cellFamily();
172 int dir = (int)m_direction;
173 String base_group_name = String("Direction") + dir;
174 if (m_p->m_patch_index >= 0)
175 base_group_name = base_group_name + String("AMRPatch") + m_p->m_patch_index;
176
177 // Calcule la liste des faces dans une direction donnée.
178 // Il faut pour chaque maille ajouter dans la liste des faces
179 // les deux faces de la direction souhaitées en prenant bien soin
180 // de ne pas ajouter deux fois la même face.
181 UniqueArray<Int32> faces_lid;
182 {
183 CellGroup all_cells = cell_dm.allCells();
184 faces_lid.reserve(all_cells.size());
185 // Ensemble des faces déjà ajoutées
186 UniqueArray<bool> done_faces(face_family->maxLocalId(), false);
187 ENUMERATE_ (Cell, icell, all_cells) {
188 DirCellFace dcf(cell_dm.cellFace(*icell));
189 Face next_face = dcf.next();
190 Face prev_face = dcf.previous();
191
192 //! Ajoute la face d'avant à la liste des faces de cette direction
193 Int32 prev_lid = prev_face.localId();
194 if (!done_faces[prev_lid]) {
195 faces_lid.add(prev_lid);
196 done_faces[prev_lid] = true;
197 }
198 Int32 next_lid = next_face.localId();
199 if (!done_faces[next_lid]) {
200 faces_lid.add(next_lid);
201 done_faces[next_lid] = true;
202 }
203 }
204 }
205
206 FaceGroup all_faces = face_family->createGroup(String("AllFaces") + base_group_name, Int32ConstArrayView(), true);
207 all_faces.setItems(faces_lid, true);
208
209 UniqueArray<Int32> inner_cells_lid;
210 UniqueArray<Int32> outer_cells_lid;
211 cell_dm.innerCells().view().fillLocalIds(inner_cells_lid);
212 cell_dm.outerCells().view().fillLocalIds(outer_cells_lid);
213
214 UniqueArray<Int32> inner_lids;
215 UniqueArray<Int32> outer_lids;
216 UniqueArray<Int32> inpatch_lids;
217 UniqueArray<Int32> overlap_lids;
218 ENUMERATE_ (Face, iface, all_faces) {
219 Int32 lid = iface.itemLocalId();
220 Face face = *iface;
221 if (face.nbCell() == 1) {
222 if (inner_cells_lid.contains(face.cell(0).localId())) {
223 inner_lids.add(lid);
224 inpatch_lids.add(lid);
225 }
226 else if (outer_cells_lid.contains(face.cell(0).localId())) {
227 outer_lids.add(lid);
228 inpatch_lids.add(lid);
229 }
230 else {
231 overlap_lids.add(lid);
232 }
233 }
234 else {
235 bool c0_inner_cell = inner_cells_lid.contains(face.cell(0).localId());
236 bool c1_inner_cell = inner_cells_lid.contains(face.cell(1).localId());
237 if (c0_inner_cell || c1_inner_cell) {
238 inner_lids.add(lid);
239 inpatch_lids.add(lid);
240 }
241 else {
242 bool c0_outer_cell = outer_cells_lid.contains(face.cell(0).localId());
243 bool c1_outer_cell = outer_cells_lid.contains(face.cell(1).localId());
244 if (c0_outer_cell || c1_outer_cell) {
245 outer_lids.add(lid);
246 inpatch_lids.add(lid);
247 }
248 else {
249 overlap_lids.add(lid);
250 }
251 }
252 }
253 }
254 m_p->m_inner_all_items = face_family->createGroup(String("AllInner") + base_group_name, inner_lids, true);
255 m_p->m_outer_all_items = face_family->createGroup(String("AllOuter") + base_group_name, outer_lids, true);
256 m_p->m_inpatch_all_items = face_family->createGroup(String("AllInPatch") + base_group_name, inpatch_lids, true);
257 m_p->m_overlap_all_items = face_family->createGroup(String("AllOverlap") + base_group_name, overlap_lids, true);
258 m_p->m_all_items = all_faces;
259 m_cells = CellInfoListView(cell_family);
260
261 _computeCellInfos();
262}
263
264/*---------------------------------------------------------------------------*/
265/*---------------------------------------------------------------------------*/
266
267bool FaceDirectionMng::
268_hasFace(Cell cell,Int32 face_local_id) const
269{
270 for( FaceLocalId iface_lid : cell.faceIds() ){
271 if (iface_lid==face_local_id)
272 return true;
273 }
274 return false;
275}
276
277/*---------------------------------------------------------------------------*/
278/*---------------------------------------------------------------------------*/
279/*!
280 * \brief Calcule des mailles avant et après une face, dans une direction donnée.
281 *
282 * Pour être indépendant de la façon dont est créé le maillage, on utilise les coordonnées
283 * des centres des faces et des centres des mailles.
284 */
285void FaceDirectionMng::
286_computeCellInfos(const CellDirectionMng& cell_dm,const VariableCellReal3& cells_center,
287 const VariableFaceReal3& faces_center)
288{
289 eMeshDirection dir = m_direction;
290
291 // Créé l'ensemble des mailles du patch et s'en sert
292 // pour être sur que chaque maille devant/derrière est dans
293 // cet ensemble
294 UniqueArray<bool> is_patch_cell(cell_dm.allCells().itemFamily()->maxLocalId(), false);
295 ENUMERATE_CELL (icell, cell_dm.allCells()) {
296 is_patch_cell[icell.itemLocalId()] = true;
297 }
298
299 ENUMERATE_FACE(iface,m_p->m_all_items){
300 Face face = *iface;
301 Int32 face_lid = iface.itemLocalId();
302 Real3 face_coord = faces_center[iface];
303 Cell front_cell = face.frontCell();
304 Cell back_cell = face.backCell();
305
306 // Vérifie que les mailles sont dans notre patch.
307 if (!front_cell.null())
308 if (!is_patch_cell[front_cell.localId()])
309 front_cell = Cell();
310 if (!back_cell.null())
311 if (!is_patch_cell[back_cell.localId()])
312 back_cell = Cell();
313
314 bool is_inverse = false;
315 if (!front_cell.null()){
316 Real3 front_coord = cells_center[front_cell];
317 if (dir==MD_DirX){
318 if (front_coord.x<face_coord.x)
319 is_inverse = true;
320 }
321 else if (dir==MD_DirY){
322 if (front_coord.y<face_coord.y)
323 is_inverse = true;
324 }
325 else if (dir==MD_DirZ){
326 if (front_coord.z<face_coord.z)
327 is_inverse = true;
328 }
329 }
330 else{
331 Real3 back_coord = cells_center[back_cell];
332 if (dir==MD_DirX){
333 if (back_coord.x>face_coord.x)
334 is_inverse = true;
335 }
336 else if (dir==MD_DirY){
337 if (back_coord.y>face_coord.y)
338 is_inverse = true;
339 }
340 else if (dir==MD_DirZ){
341 if (back_coord.z>face_coord.z)
342 is_inverse = true;
343 }
344 }
345 // Si la face a deux mailles connectées, regarde le niveau AMR de ces
346 // deux mailles et s'il est différent, ne conserve que la maille
347 // dont le niveau AMR est celui de la face.
348 if (!back_cell.null() && !front_cell.null()){
349 Int32 back_level = back_cell.level();
350 Int32 front_level = front_cell.level();
351 if (back_level!=front_level){
352 // La face n'a pas l'information de son niveau mais si les deux
353 // mailles ne sont pas de même niveau la face n'appartient qu'à une
354 // seule des deux mailles. On ne garde donc que cette dernière.
355 if (!_hasFace(back_cell,face_lid))
356 back_cell = Cell();
357 if (!_hasFace(front_cell,face_lid))
358 front_cell = Cell();
359 }
360 }
361 if (is_inverse)
362 m_infos_view[face_lid] = ItemDirectionInfo(back_cell, front_cell);
363 else
364 m_infos_view[face_lid] = ItemDirectionInfo(front_cell, back_cell);
365 }
366}
367
368/*---------------------------------------------------------------------------*/
369/*---------------------------------------------------------------------------*/
370
371void FaceDirectionMng::
372_computeCellInfos() const
373{
374 Ref<ICartesianMeshNumberingMngInternal> numbering = m_p->m_cartesian_mesh->_internalApi()->cartesianMeshNumberingMngInternal();
375 eMeshDirection dir = m_direction;
376 // ITraceMng* tm = m_p->m_cartesian_mesh->traceMng();
377
378 ENUMERATE_ (Face, iface, m_p->m_all_items) {
379 Face face = *iface;
380 Cell front_cell = face.frontCell();
381 Cell back_cell = face.backCell();
382 // tm->info() << "FaceUID : " << face.uniqueId()
383 // << " -- backCellUID : " << back_cell.uniqueId()
384 // << " -- backCellLevel : " << back_cell.level()
385 // << " -- frontCellUID : " << front_cell.uniqueId()
386 // << " -- frontCellLevel : " << front_cell.level()
387 // << " -- dir : " << dir;
388 bool is_inverse = false;
389 if (!front_cell.null() && !back_cell.null()) {
390
391 // Si la face a deux mailles connectées, regarde le niveau AMR de ces
392 // deux mailles et s'il est différent, ne conserve que la maille
393 // dont le niveau AMR est celui de la face.
394 Int32 front_cell_level = front_cell.level();
395 Int32 back_cell_level = back_cell.level();
396 if (front_cell_level != back_cell_level) {
397 Int32 face_level = numbering->faceLevel(face.uniqueId());
398 if (front_cell_level != face_level) {
399 front_cell = Cell();
400 }
401 else {
402 back_cell = Cell();
403 }
404 }
405
406 if (back_cell.uniqueId() > front_cell.uniqueId()) {
407 is_inverse = true;
408 }
409 }
410 // L'ordre de la numérotation est décrit dans le fichier
411 // CartesianMeshAMRPatchMng.cc (tag #priority_owner_2d).
412 if (back_cell.null()) {
413 Int64 uids[6];
414 ArrayView av_uids(numbering->nbFaceByCell(), uids);
415 numbering->cellFaceUniqueIds(front_cell, av_uids);
416 if (m_p->m_cartesian_mesh->mesh()->dimension() == 2) {
417 if (dir == MD_DirX) {
418 if (face.uniqueId() == av_uids[1])
419 is_inverse = true;
420 else if (face.uniqueId() != av_uids[3])
421 ARCANE_FATAL("Bad connectivity, did you call computeDirection() ? -- Expected : {0} -- Found : {1}", av_uids[3], face.uniqueId());
422 }
423 else if (dir == MD_DirY) {
424 if (face.uniqueId() == av_uids[2])
425 is_inverse = true;
426 else if (face.uniqueId() != av_uids[0])
427 ARCANE_FATAL("Bad connectivity, did you call computeDirection() ? -- Expected : {0} -- Found : {1}", av_uids[0], face.uniqueId());
428 }
429 }
430 else if (m_p->m_cartesian_mesh->mesh()->dimension() == 3) {
431 if (dir == MD_DirX) {
432 if (face.uniqueId() == av_uids[4])
433 is_inverse = true;
434 else if (face.uniqueId() != av_uids[1])
435 ARCANE_FATAL("Bad connectivity, did you call computeDirection() ? -- Expected : {0} -- Found : {1}", av_uids[1], face.uniqueId());
436 }
437 else if (dir == MD_DirY) {
438 if (face.uniqueId() == av_uids[5])
439 is_inverse = true;
440 else if (face.uniqueId() != av_uids[2])
441 ARCANE_FATAL("Bad connectivity, did you call computeDirection() ? -- Expected : {0} -- Found : {1}", av_uids[2], face.uniqueId());
442 }
443 else if (dir == MD_DirZ) {
444 if (face.uniqueId() == av_uids[3])
445 is_inverse = true;
446 else if (face.uniqueId() != av_uids[0])
447 ARCANE_FATAL("Bad connectivity, did you call computeDirection() ? -- Expected : {0} -- Found : {1}", av_uids[0], face.uniqueId());
448 }
449 }
450 }
451 else if (front_cell.null()) {
452 Int64 uids[6];
453 ArrayView av_uids(numbering->nbFaceByCell(), uids);
454 numbering->cellFaceUniqueIds(back_cell, av_uids);
455 if (m_p->m_cartesian_mesh->mesh()->dimension() == 2) {
456 if (dir == MD_DirX) {
457 if (face.uniqueId() == av_uids[3])
458 is_inverse = true;
459 else if (face.uniqueId() != av_uids[1])
460 ARCANE_FATAL("Bad connectivity, did you call computeDirection() ? -- Expected : {0} -- Found : {1}", av_uids[1], face.uniqueId());
461 }
462 else if (dir == MD_DirY) {
463 if (face.uniqueId() == av_uids[0])
464 is_inverse = true;
465 else if (face.uniqueId() != av_uids[2])
466 ARCANE_FATAL("Bad connectivity, did you call computeDirection() ? -- Expected : {0} -- Found : {1}", av_uids[2], face.uniqueId());
467 }
468 }
469 else if (m_p->m_cartesian_mesh->mesh()->dimension() == 3) {
470 if (dir == MD_DirX) {
471 if (face.uniqueId() == av_uids[1])
472 is_inverse = true;
473 else if (face.uniqueId() != av_uids[4])
474 ARCANE_FATAL("Bad connectivity, did you call computeDirection() ? -- Expected : {0} -- Found : {1}", av_uids[4], face.uniqueId());
475 }
476 else if (dir == MD_DirY) {
477 if (face.uniqueId() == av_uids[2])
478 is_inverse = true;
479 else if (face.uniqueId() != av_uids[5])
480 ARCANE_FATAL("Bad connectivity, did you call computeDirection() ? -- Expected : {0} -- Found : {1}", av_uids[5], face.uniqueId());
481 }
482 else if (dir == MD_DirZ) {
483 if (face.uniqueId() == av_uids[0])
484 is_inverse = true;
485 else if (face.uniqueId() != av_uids[3])
486 ARCANE_FATAL("Bad connectivity, did you call computeDirection() ? -- Expected : {0} -- Found : {1}", av_uids[3], face.uniqueId());
487 }
488 }
489 }
490 // tm->info() << "FaceUID : " << face.uniqueId()
491 // << " -- backCellUID : " << back_cell.uniqueId()
492 // << " -- frontCellUID : " << front_cell.uniqueId()
493 // << " -- is_inverse : " << is_inverse
494 // << " -- dir : " << dir;
495
496 if (is_inverse)
497 m_infos_view[iface.itemLocalId()] = ItemDirectionInfo(back_cell, front_cell);
498 else
499 m_infos_view[iface.itemLocalId()] = ItemDirectionInfo(front_cell, back_cell);
500 }
501}
502
503/*---------------------------------------------------------------------------*/
504/*---------------------------------------------------------------------------*/
505
507allFaces() const
508{
509 return m_p->m_all_items;
510}
511
512/*---------------------------------------------------------------------------*/
513/*---------------------------------------------------------------------------*/
514
516overlapFaces() const
517{
518 return m_p->m_overlap_all_items;
519}
520
521/*---------------------------------------------------------------------------*/
522/*---------------------------------------------------------------------------*/
523
525inPatchFaces() const
526{
527 return m_p->m_inpatch_all_items;
528}
529
530/*---------------------------------------------------------------------------*/
531/*---------------------------------------------------------------------------*/
532
534innerFaces() const
535{
536 return m_p->m_inner_all_items;
537}
538
539/*---------------------------------------------------------------------------*/
540/*---------------------------------------------------------------------------*/
541
543outerFaces() const
544{
545 return m_p->m_outer_all_items;
546}
547
548/*---------------------------------------------------------------------------*/
549/*---------------------------------------------------------------------------*/
550
551} // End namespace Arcane
552
553/*---------------------------------------------------------------------------*/
554/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ENUMERATE_FACE(name, group)
Enumérateur générique d'un groupe de faces.
#define ENUMERATE_(type, name, group)
Enumérateur générique d'un groupe d'entité
#define ENUMERATE_CELL(name, group)
Enumérateur générique d'un groupe de mailles.
Infos sur les mailles d'une direction spécifique X,Y ou Z d'un maillage structuré.
Maille d'un maillage.
Definition Item.h:1214
FaceGroup inPatchFaces() const
Groupe de toutes les faces du patch dans la direction.
DirFace face(Face f) const
Face direction correspondant à la face f.
FaceGroup overlapFaces() const
Groupe de toutes les faces de recouvrement dans la direction.
FaceDirectionMng()
Créé une instance vide.
FaceGroup innerFaces() const
Groupe de toutes les faces internes dans la direction.
FaceGroup outerFaces() const
Groupe de toutes les faces externes dans la direction.
FaceGroup allFaces() const
Groupe de toutes les faces dans la direction.
Interface d'un maillage cartésien.
void setItems(Int32ConstArrayView items_local_id)
Positionne les entités du groupe.
Definition ItemGroup.cc:489
Vecteur 1D de données avec sémantique par valeur (style STL).
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
ItemGroupT< Cell > CellGroup
Groupe de mailles.
Definition ItemTypes.h:183
ItemGroupT< Face > FaceGroup
Groupe de faces.
Definition ItemTypes.h:178
MeshVariableScalarRefT< Cell, Real3 > VariableCellReal3
Grandeur au centre des mailles de type coordonnées.
MeshVariableScalarRefT< Face, Real3 > VariableFaceReal3
Grandeur aux faces de type coordonnées.
IMemoryAllocator * getDefaultDataAllocator()
Allocateur par défaut pour les données.
-- 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.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:480
eMeshDirection
Type de la direction pour un maillage structuré
@ MD_DirInvalid
Direction invalide ou non initialisée.
@ MD_DirZ
Direction Z.
@ MD_DirY
Direction Y.
@ MD_DirX
Direction X.
@ Cell
Le maillage est AMR par maille.
Definition MeshKind.h:52
std::int32_t Int32
Type entier signé sur 32 bits.