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)
263, m_nodes_to_cell_storage(platform::getDefaultDataAllocator())
264, m_cells_to_node_storage(platform::getDefaultDataAllocator())
265, m_permutation_storage(platform::getDefaultDataAllocator())
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;
433 for (Integer i = 0; i <
nb_face; ++i) {
471 for (Integer i = 0; i <
nb_face; ++i) {
502 info() <<
"Informations from IMesh properties:";
504 auto*
cmgi = ICartesianMeshGenerationInfo::getReference(m_mesh,
true);
506 info() <<
"GlobalNbCell = " <<
cmgi->globalNbCells();
507 info() <<
"OwnNbCell: " <<
cmgi->ownNbCells();
508 info() <<
"SubDomainOffset: " <<
cmgi->subDomainOffsets();
509 info() <<
"OwnCellOffset: " <<
cmgi->ownCellOffsets();
514 auto x = _buildPatchGroups(
mesh()->allLevelCells(0),0);
535 cdm._internalSetOffsetAndNbCellInfos(
cmgi->globalNbCells()[
idir],
cmgi->ownNbCells()[
idir],
539 info() <<
"Compute cartesian connectivity";
541 m_permutation_storage.resize(1);
542 m_permutation_storage[0].compute();
543 m_nodes_to_cell_storage.resize(
mesh()->nodeFamily()->maxLocalId());
544 m_cells_to_node_storage.resize(
mesh()->cellFamily()->maxLocalId());
545 m_connectivity.
_setStorage(m_nodes_to_cell_storage,m_cells_to_node_storage,&m_permutation_storage[0]);
552 info() <<
"AMR Patch name=" << cells.name() <<
" size=" << cells.size() <<
" index=" <<
patch_index;
554 _addPatchInstance(makeRef(
cdi));
566 _saveInfosInProperties();
572std::tuple<CellGroup,NodeGroup> CartesianMeshImpl::
602void CartesianMeshImpl::
606 IItemFamily* cell_family = m_mesh->cellFamily();
607 IItemFamily* face_family = m_mesh->faceFamily();
608 IItemFamily* node_family = m_mesh->nodeFamily();
610 Int32 max_cell_id = cell_family->maxLocalId();
611 Int32 max_face_id = face_family->maxLocalId();
612 Int32 max_node_id = node_family->maxLocalId();
614 CellDirectionMng& cell_dm = cdi.cellDirection(dir);
615 cell_dm._internalResizeInfos(max_cell_id);
617 FaceDirectionMng& face_dm = cdi.faceDirection(dir);
618 face_dm._internalResizeInfos(max_face_id);
620 NodeDirectionMng& node_dm = cdi.nodeDirection(dir);
621 node_dm._internalResizeInfos(max_node_id);
624 info(4) <<
"COMPUTE DIRECTION dir=" << dir;
626 Int32 prev_local_face = -1;
628 Integer mesh_dim = m_mesh->dimension();
631 prev_local_face = (next_local_face + 2) % 4;
632 else if (mesh_dim==3)
633 prev_local_face = (next_local_face + 3) % 6;
635 cell_dm._internalSetLocalFaceIndex(next_local_face,prev_local_face);
639 std::set<Int32> cells_set;
641 cells_set.insert(icell.itemLocalId());
648 Int32 my_level = cell.level();
649 Face next_face = cell.face(next_local_face);
650 Cell next_cell = next_face.backCell()==cell ? next_face.frontCell() : next_face.backCell();
651 if (cells_set.find(next_cell.localId())==cells_set.end())
653 else if (next_cell.level()!=my_level)
656 Face prev_face = cell.face(prev_local_face);
657 Cell prev_cell = prev_face.backCell()==cell ? prev_face.frontCell() : prev_face.backCell();
658 if (cells_set.find(prev_cell.localId())==cells_set.end())
660 else if (prev_cell.level()!=my_level)
662 cell_dm.m_infos_view[icell.itemLocalId()] = CellDirectionMng::ItemDirectionInfo(next_cell,prev_cell);
664 cell_dm._internalComputeInnerAndOuterItems(all_cells);
665 face_dm._internalComputeInfos(cell_dm,cells_center,faces_center);
666 node_dm._internalComputeInfos(cell_dm,all_nodes,cells_center);
672void CartesianMeshImpl::
673_refinePatch(Real3 position,Real3 length,
bool is_3d)
675 UniqueArray<Int32> cells_local_id;
676 _cellsInZone(position, length, is_3d, cells_local_id);
678 _applyRefine(cells_local_id);
679 _saveInfosInProperties();
685void CartesianMeshImpl::
686_coarseZone(Real3 position, Real3 length,
bool is_3d)
688 UniqueArray<Int32> cells_local_id;
689 _cellsInZone(position, length, is_3d, cells_local_id);
691 _applyCoarse(cells_local_id);
692 _saveInfosInProperties();
698void CartesianMeshImpl::
699_cellsInZone(Real3 position, Real3 length,
bool is_3d, UniqueArray<Int32>& cells_local_id)
705 Real3 min_pos = position;
706 Real3 max_pos = min_pos + length;
707 cells_local_id.clear();
711 for (NodeLocalId inode : cell.nodeIds())
712 center += nodes_coord[inode];
713 center /= cell.nbNode();
714 bool is_inside_x = center.x > min_pos.x && center.x < max_pos.x;
715 bool is_inside_y = center.y > min_pos.y && center.y < max_pos.y;
716 bool is_inside_z = (center.z > min_pos.z && center.z < max_pos.z) || !is_3d;
717 if (is_inside_x && is_inside_y && is_inside_z) {
718 cells_local_id.add(icell.itemLocalId());
729 info() <<
"REFINEMENT 2D position=" << position <<
" length=" << length;
741 info() <<
"REFINEMENT 3D position=" << position <<
" length=" << length;
742 _refinePatch(position,length,
true);
751 info() <<
"COARSEN 2D position=" << position <<
" length=" << length;
763 info() <<
"COARSEN 3D position=" << position <<
" length=" << length;
764 _coarseZone(position, length,
true);
774 ARCANE_FATAL(
"You cannot reduce number of ghost layer of level 0 with this method");
817 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);
871 if (min == 10 && max == -1) {
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.
-*- 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