14#include "arcane/utils/TraceAccessor.h"
15#include "arcane/utils/NotImplementedException.h"
16#include "arcane/utils/AutoDestroyUserData.h"
17#include "arcane/utils/IUserDataList.h"
18#include "arcane/utils/Ref.h"
19#include "arcane/utils/ScopedPtr.h"
20#include "arcane/utils/PlatformUtils.h"
23#include "arcane/core/IMesh.h"
24#include "arcane/core/ItemPrinter.h"
25#include "arcane/core/IItemFamily.h"
26#include "arcane/core/IParallelMng.h"
27#include "arcane/core/VariableTypes.h"
28#include "arcane/core/Properties.h"
29#include "arcane/core/IMeshModifier.h"
30#include "arcane/core/MeshStats.h"
31#include "arcane/core/ICartesianMeshGenerationInfo.h"
32#include "arcane/core/MeshEvents.h"
33#include "arcane/core/MeshKind.h"
34#include "arcane/core/internal/IMeshInternal.h"
36#include "arcane/cartesianmesh/ICartesianMesh.h"
37#include "arcane/cartesianmesh/CartesianConnectivity.h"
38#include "arcane/cartesianmesh/CartesianMeshRenumberingInfo.h"
39#include "arcane/cartesianmesh/CartesianMeshCoarsening.h"
40#include "arcane/cartesianmesh/CartesianMeshCoarsening2.h"
41#include "arcane/cartesianmesh/CartesianMeshPatchListView.h"
42#include "arcane/cartesianmesh/internal/CartesianMeshPatch.h"
43#include "arcane/cartesianmesh/internal/ICartesianMeshInternal.h"
45#include "arcane/cartesianmesh/internal/CartesianMeshUniqueIdRenumbering.h"
46#include "arcane/cartesianmesh/v2/CartesianMeshUniqueIdRenumberingV2.h"
48#include "arcane/cartesianmesh/CartesianMeshAMRPatchMng.h"
49#include "arcane/core/IGhostLayerMng.h"
91 return m_cartesian_mesh->_createCartesianMeshCoarsening2();
119 void build()
override;
129 return m_all_items_direction_info->cellDirection(
dir);
134 return m_all_items_direction_info->cellDirection(
idir);
139 return m_all_items_direction_info->faceDirection(
dir);
144 return m_all_items_direction_info->faceDirection(
idir);
149 return m_all_items_direction_info->nodeDirection(
dir);
154 return m_all_items_direction_info->nodeDirection(
idir);
163 return m_connectivity;
166 Int32
nbPatch()
const override {
return m_amr_patches.size(); }
196 InternalApi m_internal_api;
200 IMesh* m_mesh =
nullptr;
206 bool m_is_amr =
false;
214 bool m_is_mesh_event_added =
false;
215 Int64 m_mesh_timestamp = 0;
228 void _saveInfosInProperties();
230 std::tuple<CellGroup, NodeGroup>
235 void _checkNeedComputeDirections();
236 void _checkAddObservableMeshChanged();
239 m_amr_patches.add(v);
240 m_amr_patches_pointer.add(v.get());
247extern "C++" ICartesianMesh*
248arcaneCreateCartesianMesh(IMesh* mesh)
250 auto* cm =
new CartesianMeshImpl(mesh);
259CartesianMeshImpl(IMesh* mesh)
260: TraceAccessor(mesh->traceMng())
261, m_internal_api(this)
266, m_amr_type(mesh->meshKind().meshAMRKind())
268 if (m_amr_type == eMeshAMRKind::PatchCartesianMeshOnly)
269 m_internal_api.initCartesianMeshAMRPatchMng();
271 m_all_items_direction_info =
makeRef(
new CartesianMeshPatch(
this,-1));
272 _addPatchInstance(m_all_items_direction_info);
278void CartesianMeshImpl::
281 m_properties =
new Properties(*(
mesh()->properties()),
"CartesianMesh");
286const Int32 SERIALIZE_VERSION = 1;
292void CartesianMeshImpl::
293_checkNeedComputeDirections()
296 if (m_mesh_timestamp!=new_timestamp){
297 info() <<
"Mesh timestamp has changed (old=" << m_mesh_timestamp <<
" new=" << new_timestamp <<
")";
305void CartesianMeshImpl::
306_saveInfosInProperties()
309 m_properties->set(
"Version",SERIALIZE_VERSION);
312 UniqueArray<String> patch_group_names;
314 patch_group_names.add(x.name());
316 m_properties->set(
"PatchGroupNames",patch_group_names);
325 info() <<
"Creating 'CartesianMesh' infos from dump";
328 Int32 v = m_properties->getInt32(
"Version");
329 if (v!=SERIALIZE_VERSION)
330 ARCANE_FATAL(
"Bad serializer version: trying to read from incompatible checkpoint v={0} expected={1}",
331 v,SERIALIZE_VERSION);
352void CartesianMeshImpl::
353_checkAddObservableMeshChanged()
355 if (m_is_mesh_event_added)
357 m_is_mesh_event_added =
true;
360 auto f1 = [&](
const MeshEventArgs&){ this->_checkNeedComputeDirections(); };
370 info() <<
"CartesianMesh: computeDirections()";
373 _checkAddObservableMeshChanged();
375 m_amr_patches.clear();
376 m_amr_patches_pointer.clear();
377 _addPatchInstance(m_all_items_direction_info);
379 m_is_amr = m_mesh->isAmrActivated();
420 info(4) <<
"Cartesian mesh compute directions is_amr=" << m_is_amr;
422 for( Integer i=0; i<
nb_node; ++i ){
427 bool is_3d = m_mesh->dimension() == 3;
437 for (Integer i = 0; i <
nb_face; ++i) {
471 for (Integer i = 0; i <
nb_face; ++i) {
496 info() <<
"Informations from IMesh properties:";
498 auto*
cmgi = ICartesianMeshGenerationInfo::getReference(m_mesh,
true);
500 info() <<
"GlobalNbCell = " <<
cmgi->globalNbCells();
501 info() <<
"OwnNbCell: " <<
cmgi->ownNbCells();
502 info() <<
"SubDomainOffset: " <<
cmgi->subDomainOffsets();
503 info() <<
"OwnCellOffset: " <<
cmgi->ownCellOffsets();
508 auto x = _buildPatchGroups(
mesh()->allLevelCells(0),0);
529 cdm._internalSetOffsetAndNbCellInfos(
cmgi->globalNbCells()[
idir],
cmgi->ownNbCells()[
idir],
533 info() <<
"Compute cartesian connectivity";
535 m_permutation_storage.resize(1);
536 m_permutation_storage[0].compute();
537 m_nodes_to_cell_storage.resize(
mesh()->nodeFamily()->maxLocalId());
538 m_cells_to_node_storage.resize(
mesh()->cellFamily()->maxLocalId());
539 m_connectivity.
_setStorage(m_nodes_to_cell_storage,m_cells_to_node_storage,&m_permutation_storage[0]);
546 info() <<
"AMR Patch name=" << cells.name() <<
" size=" << cells.size() <<
" index=" <<
patch_index;
548 _addPatchInstance(makeRef(
cdi));
560 _saveInfosInProperties();
566std::tuple<CellGroup,NodeGroup> CartesianMeshImpl::
596void CartesianMeshImpl::
600 IItemFamily* cell_family = m_mesh->cellFamily();
601 IItemFamily* face_family = m_mesh->faceFamily();
602 IItemFamily* node_family = m_mesh->nodeFamily();
604 Int32 max_cell_id = cell_family->maxLocalId();
605 Int32 max_face_id = face_family->maxLocalId();
606 Int32 max_node_id = node_family->maxLocalId();
608 CellDirectionMng& cell_dm = cdi.cellDirection(dir);
609 cell_dm._internalResizeInfos(max_cell_id);
611 FaceDirectionMng& face_dm = cdi.faceDirection(dir);
612 face_dm._internalResizeInfos(max_face_id);
614 NodeDirectionMng& node_dm = cdi.nodeDirection(dir);
615 node_dm._internalResizeInfos(max_node_id);
618 info(4) <<
"COMPUTE DIRECTION dir=" << dir;
620 Int32 prev_local_face = -1;
622 Integer mesh_dim = m_mesh->dimension();
625 prev_local_face = (next_local_face + 2) % 4;
626 else if (mesh_dim==3)
627 prev_local_face = (next_local_face + 3) % 6;
629 cell_dm._internalSetLocalFaceIndex(next_local_face,prev_local_face);
633 std::set<Int32> cells_set;
635 cells_set.insert(icell.itemLocalId());
642 Int32 my_level = cell.level();
643 Face next_face = cell.face(next_local_face);
644 Cell next_cell = next_face.backCell()==cell ? next_face.frontCell() : next_face.backCell();
645 if (cells_set.find(next_cell.localId())==cells_set.end())
647 else if (next_cell.level()!=my_level)
650 Face prev_face = cell.face(prev_local_face);
651 Cell prev_cell = prev_face.backCell()==cell ? prev_face.frontCell() : prev_face.backCell();
652 if (cells_set.find(prev_cell.localId())==cells_set.end())
654 else if (prev_cell.level()!=my_level)
656 cell_dm.m_infos_view[icell.itemLocalId()] = CellDirectionMng::ItemDirectionInfo(next_cell,prev_cell);
658 cell_dm._internalComputeInnerAndOuterItems(all_cells);
659 face_dm._internalComputeInfos(cell_dm,cells_center,faces_center);
660 node_dm._internalComputeInfos(cell_dm,all_nodes,cells_center);
666void CartesianMeshImpl::
667_refinePatch(Real3 position,Real3 length,
bool is_3d)
669 UniqueArray<Int32> cells_local_id;
670 _cellsInZone(position, length, is_3d, cells_local_id);
672 _applyRefine(cells_local_id);
673 _saveInfosInProperties();
679void CartesianMeshImpl::
680_coarseZone(Real3 position, Real3 length,
bool is_3d)
682 UniqueArray<Int32> cells_local_id;
683 _cellsInZone(position, length, is_3d, cells_local_id);
685 _applyCoarse(cells_local_id);
686 _saveInfosInProperties();
692void CartesianMeshImpl::
693_cellsInZone(Real3 position, Real3 length,
bool is_3d, UniqueArray<Int32>& cells_local_id)
699 Real3 min_pos = position;
700 Real3 max_pos = min_pos + length;
701 cells_local_id.clear();
705 for (NodeLocalId inode : cell.nodeIds())
706 center += nodes_coord[inode];
707 center /= cell.nbNode();
708 bool is_inside_x = center.x > min_pos.x && center.x < max_pos.x;
709 bool is_inside_y = center.y > min_pos.y && center.y < max_pos.y;
710 bool is_inside_z = (center.z > min_pos.z && center.z < max_pos.z) || !is_3d;
711 if (is_inside_x && is_inside_y && is_inside_z) {
712 cells_local_id.add(icell.itemLocalId());
723 info() <<
"REFINEMENT 2D position=" << position <<
" length=" << length;
735 info() <<
"REFINEMENT 3D position=" << position <<
" length=" << length;
736 _refinePatch(position,length,
true);
745 info() <<
"COARSEN 2D position=" << position <<
" length=" << length;
757 info() <<
"COARSEN 3D position=" << position <<
" length=" << length;
758 _coarseZone(position, length,
true);
768 ARCANE_FATAL(
"You cannot reduce number of ghost layer of level 0 with this method");
816 for (Integer i = 0; i < cell.nbHChildren(); ++i) {
818 cell_lid2[cell.level()].add(cell.hChild(i).localId());
860 min = std::min(min,
nlevel);
861 max = std::max(max,
nlevel);
875 Integer
new_level = ((min == max) ? min + 1 : max);
897 ARCANE_FATAL(
"Error in ghost layer counter algo. Report it plz.");
902 for (Integer i =
level_max - 1; i >= 0; --i) {
904 if (m_mesh->parallelMng()->reduce(Parallel::ReduceMax,
cell_lid2[i].size()) == 0) {
909 m_mesh->modifier()->flagCellToCoarsen(
cell_lid2[i]);
910 m_mesh->modifier()->coarsenItemsV2(
false);
921void CartesianMeshImpl::
946 for(Integer
k=0;
k<
c.nbHChildren(); ++
k ){
959void CartesianMeshImpl::
966 IParallelMng* pm = m_mesh->parallelMng();
969 [&pm](
const CellGroup& cells) { return pm->reduce(Parallel::ReduceMax, cells.size()) == 0; });
977void CartesianMeshImpl::
978_applyRefine(ConstArrayView<Int32> cells_local_id)
980 IItemFamily* cell_family = m_mesh->cellFamily();
981 Integer nb_cell = cells_local_id.size();
982 info(4) <<
"Local_NbCellToRefine = " << nb_cell;
984 String parent_group_name = String(
"CartesianMeshPatchParentCells")+index;
985 CellGroup parent_cells = cell_family->createGroup(parent_group_name,cells_local_id,
true);
987 IParallelMng* pm = m_mesh->parallelMng();
988 Int64 total_nb_cell = pm->
reduce(Parallel::ReduceSum,nb_cell);
989 info(4) <<
"Global_NbCellToRefine = " << total_nb_cell;
990 if (total_nb_cell==0)
993 if(m_amr_type == eMeshAMRKind::Cell) {
994 debug() <<
"Refine with modifier() (for all mesh types)";
995 m_mesh->modifier()->flagCellToRefine(cells_local_id);
996 m_mesh->modifier()->adapt();
998 else if(m_amr_type == eMeshAMRKind::PatchCartesianMeshOnly) {
999 debug() <<
"Refine with specific refiner (for cartesian mesh only)";
1001 m_internal_api.cartesianMeshAMRPatchMng()->flagCellToRefine(cells_local_id);
1002 m_internal_api.cartesianMeshAMRPatchMng()->refine();
1004 else if(m_amr_type == eMeshAMRKind::Patch) {
1005 ARCANE_FATAL(
"General patch AMR is not implemented. Please use PatchCartesianMeshOnly (3)");
1012 MeshStats ms(
traceMng(),m_mesh,m_mesh->parallelMng());
1021void CartesianMeshImpl::
1022_applyCoarse(ConstArrayView<Int32> cells_local_id)
1024 Integer nb_cell = cells_local_id.size();
1025 info(4) <<
"Local_NbCellToCoarsen = " << nb_cell;
1027 IParallelMng* pm = m_mesh->parallelMng();
1028 Int64 total_nb_cell = pm->
reduce(Parallel::ReduceSum, nb_cell);
1029 info(4) <<
"Global_NbCellToCoarsen = " << total_nb_cell;
1030 if (total_nb_cell == 0)
1033 _removeCellsInPatches(cells_local_id);
1035 if (m_amr_type == eMeshAMRKind::Cell) {
1036 debug() <<
"Coarse with modifier() (for all mesh types)";
1037 m_mesh->modifier()->flagCellToCoarsen(cells_local_id);
1038 m_mesh->modifier()->coarsenItemsV2(
true);
1040 else if (m_amr_type == eMeshAMRKind::PatchCartesianMeshOnly) {
1041 ARCANE_NOT_YET_IMPLEMENTED(
"Patch AMR for Cartesian only is not implemented yet");
1043 else if (m_amr_type == eMeshAMRKind::Patch) {
1044 ARCANE_FATAL(
"General patch AMR is not implemented. Please use PatchCartesianMeshOnly (3)");
1051 MeshStats ms(
traceMng(), m_mesh, m_mesh->parallelMng());
1062 info(4) <<
"Check valid CartesianMesh";
1064 for( Integer i=0; i<
nb_patch; ++i ){
1076 auto*
cmgi = ICartesianMeshGenerationInfo::getReference(m_mesh,
true);
1081 ARCANE_FATAL(
"Invalid value '{0}' for renumberFaceMethod(). Valid values are 0 or 1",
1089 ARCANE_FATAL(
"Invalid value '{0}' for renumberPatchMethod(). Valid values are 0, 1, 2, 3 or 4",
1097 warning() <<
"The patch method 2 is experimental!";
1103 if (v.isSortAfterRenumbering()){
1104 info() <<
"Compacting and Sorting after renumbering";
1105 m_mesh->nodeFamily()->compactItems(
true);
1106 m_mesh->faceFamily()->compactItems(
true);
1107 m_mesh->cellFamily()->compactItems(
true);
1125_createCartesianMeshCoarsening2()
1141 const char* name =
"CartesianMesh";
1150 ARCANE_FATAL(
"The mesh {0} is not yet created",
h.meshName());
1156 mk.setMeshStructure(eMeshStructure::Cartesian);
1157 mesh->_internalApi()->setMeshKind(
mk);
1164 return adud->data();
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fichier contenant les mécanismes de gestion des évènements.
Informations de connectivité d'un maillage cartésien.
void _computeInfos(IMesh *mesh, VariableNodeReal3 &nodes_coord, VariableCellReal3 &cells_coord)
Calcule les infos de connectivité.
void _setStorage(ArrayView< Index > nodes_to_cell, ArrayView< Index > cells_to_node, const Permutation *permutation)
Positionne les tableaux contenant les infos de connectivité
Déraffine un maillage cartésien par 2.
Déraffine un maillage cartésien par 2.
void addPatchFromExistingChildren(ConstArrayView< Int32 > parent_cells_local_id) override
Créé un patch avec tous les enfants des mailles parent_cells_local_id.
Ref< ICartesianMeshAMRPatchMng > cartesianMeshAMRPatchMng() override
Méthode permettant de récupérer l'instance de CartesianMeshAMRPatchMng.
Ref< CartesianMeshCoarsening2 > createCartesianMeshCoarsening2() override
Créé une instance pour gérer le déraffinement du maillage (V2).
void initCartesianMeshAMRPatchMng() override
Méthode permettant de créer une instance de CartesianMeshAMRPatchMng.
Infos spécifiques à un maillage cartésien.
void refinePatch3D(Real3 position, Real3 length) override
Raffine en 3D un bloc du maillage cartésien.
Int32 nbPatch() const override
Nombre de patchs du maillage.
Integer reduceNbGhostLayers(Integer level, Integer target_nb_ghost_layers) override
Méthode permettant de supprimer une ou plusieurs couches de mailles fantômes sur un niveau de raffine...
ITraceMng * traceMng() const override
Gestionnaire de trace associé.
CellDirectionMng cellDirection(Integer idir) override
Liste des mailles dans la direction dir (0, 1 ou 2)
void recreateFromDump() override
Recalcule les informations de cartésiennes après une reprise.
void computeDirections() override
Calcule les infos pour les accès par direction.
FaceDirectionMng faceDirection(Integer idir) override
Liste des faces dans la direction dir (0, 1 ou 2)
void _addPatch(const CellGroup &parent_group)
Créé un patch avec tous les enfants du groupe parent_cells.
NodeDirectionMng nodeDirection(Integer idir) override
Liste des noeuds dans la direction dir (0, 1 ou 2)
Int32 m_local_face_direction[3]
Indice dans la numérotation locale de la maille, de la face dans.
void checkValid() const override
Effectue des vérifications sur la validité de l'instance.
IMesh * mesh() const override
Maillage associé à ce maillage cartésien.
FaceDirectionMng faceDirection(eMeshDirection dir) override
Liste des faces dans la direction dir.
NodeDirectionMng nodeDirection(eMeshDirection dir) override
Liste des noeuds dans la direction dir.
void refinePatch2D(Real2 position, Real2 length) override
Raffine en 2D un bloc du maillage cartésien.
ICartesianMeshPatch * patch(Int32 index) const override
Retourne le index-ième patch du maillage.
void coarseZone2D(Real2 position, Real2 length) override
Dé-raffine en 2D un bloc du maillage cartésien.
void renumberItemsUniqueId(const CartesianMeshRenumberingInfo &v) override
Renumérote les uniqueId() des entités.
UniqueArray< CellGroup > m_amr_patch_cell_groups
Groupe de mailles pour chaque patch AMR.
ICartesianMeshInternal * _internalApi() override
API interne à Arcane.
void coarseZone3D(Real3 position, Real3 length) override
Dé-raffine en 3D un bloc du maillage cartésien.
Ref< CartesianMeshCoarsening > createCartesianMeshCoarsening() override
Créé une instance pour gérer le déraffinement du maillage.
CartesianPatch amrPatch(Int32 index) const override
Retourne le index-ième patch du maillage.
CellDirectionMng cellDirection(eMeshDirection dir) override
Liste des mailles dans la direction dir.
CartesianMeshPatchListView patches() const override
Vue sur la liste des patchs.
CartesianConnectivity connectivity() override
Informations sur la connectivité
Vue sur une liste de patchs.
Informations par direction pour chaque genre d'entité du maillage.
Informations pour la renumérotation.
Renumérotation des uniqueId() pour les maillages cartésiens.
Renumérotation des uniqueId() pour les maillages cartésiens.
Patch AMR d'un maillage cartésien.
Infos sur les mailles d'une direction spécifique X,Y ou Z d'un maillage structuré.
Vue sur les informations des mailles.
Conserve des références d'observateurs.
Infos sur les face d'une direction spécifique X,Y ou Z d'un maillage structuré.
Partie interne de ICartesianMesh.
Interface d'un patch AMR d'un maillage cartésien.
Interface d'un maillage cartésien.
static ICartesianMesh * getReference(const MeshHandleOrMesh &mesh, bool create=true)
Récupère ou créé la référence associée à mesh.
virtual IMesh * mesh() const =0
Maillage associé à ce maillage cartésien.
Interface d'une famille d'entités.
virtual Int64 timestamp()=0
Compteur indiquant le temps de dernière modification du maillage.
virtual EventObservable< const MeshEventArgs & > & eventObservable(eMeshEventType type)=0
Observable pour un évènement.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
Interface d'une liste qui gère des données utilisateurs.
Interface pour une donnée utilisateur attachée à un autre objet.
Classe de base d'une vue sur une connectivité non structurée.
NodeGroup nodeGroup() const
Groupe des noeuds des éléments de ce groupe.
void removeItems(Int32ConstArrayView items_local_id, bool check_if_present=true)
Supprime des entités.
ItemVectorView view() const
Vue sur les entités du groupe.
IItemFamily * itemFamily() const
Famille d'entité à laquelle appartient ce groupe (0 pour le group nul)
bool null() const
true is le groupe est le groupe nul
Classe utilitaire pour imprimer les infos sur une entité.
Vue sur un tableau typé d'entités.
Int32ConstArrayView localIds() const
Tableau des numéros locaux des entités.
Int32 nbNode() const
Nombre de noeuds de l'entité
NodeLocalIdView nodeIds() const
Liste des noeuds de l'entité
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Arguments des évènements sur le maillage.
Classe de compatibilité pour contenir un MeshHandle ou un IMesh*.
Caractéristiques d'un maillage.
Infos sur les noeuds d'une direction spécifique X,Y ou Z d'un maillage structuré.
Classe gérant un vecteur de réel de dimension 2.
Classe gérant un vecteur de réel de dimension 3.
Paramètres nécessaires à la construction d'une variable.
Interface du gestionnaire de traces.
Exception lorsqu'une fonction n'est pas implémentée.
Chaîne de caractères unicode.
Classe d'accès aux traces.
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage warning() const
Flot pour un message d'avertissement.
TraceMessage info() const
Flot pour un message d'information.
ItemGroupT< Cell > CellGroup
Groupe de mailles.
ItemGroupT< Node > NodeGroup
Groupe de noeuds.
MeshVariableScalarRefT< Cell, Real3 > VariableCellReal3
Grandeur au centre des mailles de type coordonnées.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
MeshVariableScalarRefT< Face, Real3 > VariableFaceReal3
Grandeur aux faces de type coordonnées.
Int32 toInt32(Real r)
Converti un Real en Int32.
IMemoryAllocator * getDefaultDataAllocator()
Allocateur par défaut pour les données.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
bool arcaneIsCheck()
Vrai si on est en mode vérification.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
eMeshDirection
Type de la direction pour un maillage structuré
@ EndPrepareDump
Evènement envoyé à la fin de prepareForDump()
eMeshAMRKind
Type de maillage AMR.
Int32 Integer
Type représentant un entier.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
Real y
deuxième composante du couple
Real x
première composante du couple