Cette page décrit la gestion des maillages cartésiens dans Arcane.
- Note
- Pour l'instant, Arcane ne gère pas automatiquement le recalcul des infos de structuration lorsque le maillage change. Il faut appeler explicitement Arcane::ICartesianMesh::computeDirections() pour faire ce recalcul.
Initialisation
Pour avoir les infos sur un maillage cartésien, il est nécessaire d'avoir une instance de la classe Arcane::ICartesianMesh. Pour récupérer une telle instance, il faut utiliser la méthode Arcane::ICartsianMesh::getReference():
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.
- Avertissement
- Une fois l'instance créée et avant de pouvoir l'utiliser, il est nécessaire de calculer les infos de direction via la méthode Arcane::ICartesianMesh::computeDirections(). Cet appel ne doit être fait qu'une seule fois si le maillage ne change pas, par exemple lors de l'initialisation du code.
virtual void computeDirections()=0
Calcule les infos pour les accès par direction.
Utilisation des infos par direction
Une fois ceci fait, il est possible d'avoir des infos sur les entités pour une direction donnée. Les directions possibles sont données par le type #eMeshDirection. Il est aussi possible d'utiliser un entier pour spécifier la direction, 0 correspondant à la direction X, 1 à la direction Y et 2 à la direction Z. Pour des raisons de lisibilité, il est conseillé d'utiliser le type énuméré si possible. Par exemple, pour récupérer les infos sur les mailles de la direction Y :
Infos sur les mailles d'une direction spécifique X,Y ou Z d'un maillage structuré.
virtual CellDirectionMng cellDirection(eMeshDirection dir)=0
Liste des mailles dans la direction dir.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
- Avertissement
- Les objets gérant les entités par direction sont des objets temporaires qui ne doivent pas être conservés notamment d'une itération à l'autre ou lorsque le maillage change.
Une fois une direction récupérée, il est possible d'itérer sur toutes les entités de la direction et pour les mailles par exemple d'avoir la maille avant et après :
}
Maille avant et après une maille suivant une direction.
Pour les mailles de bord, il est possible que prev_cell ou next_cell soit nulle. Cela peut se tester via la méthode Arcane::Cell::null().
La récupération des noeuds d'une direction se fait de la même manière.
}
Noeud avant et après un noeud suivant une direction.
virtual NodeDirectionMng nodeDirection(eMeshDirection dir)=0
Liste des noeuds dans la direction dir.
Infos sur les noeuds d'une direction spécifique X,Y ou Z d'un maillage structuré.
Pour les faces, l'écriture est similaire mais au lieu de récupérer la face avant et après la face courante, on peut récupérer la maille avant et après :
}
Infos sur maille avant et après une face suivant une direction.
Infos sur les face d'une direction spécifique X,Y ou Z d'un maillage structuré.
virtual FaceDirectionMng faceDirection(eMeshDirection dir)=0
Liste des faces dans la direction dir.
Enfin, pour les mailles, il est possible de récupérer des infos directionnelles sur les noeuds d'une maille suivant une direction, via la classe Arcane::DirCellNode.
}
Maille avec info directionnelle des noeuds.
De la même manière, il est aussi possible de connaitre la face devant et derrière la maille dans une direction donnée (cela fonctionne aussi en 3D) :
}
Maille avec info directionnelle des faces.
Pour itérer sur toutes les directions d'un maillage, il est possible de boucler comme suit :
for( Integer idir=0; idir<nb_dir; ++idir){
...
}
}
virtual Integer dimension()=0
Dimension du maillage (1D, 2D ou 3D).
Il est possible de connaître le nombre global de maille dans une direction donnée via Arcane::CellDirectionMng::globalNbCell(). De même, il est possible, en supposant que le découpage en sous-domaine peut se représenter sous forme d'une grille, de connaître la numérotation dans cette grille via Arcane::CellDirectionMng::subDomainOffset(). Cette numérotation commence à 0.
Il est aussi possible de connaître le nombre de mailles propre du sous-domaine dans une direction donnée via Arcane::CellDirectionMng::ownNbCell(). Il est aussi possible de connaître l'offset dans la grile de la première maille propre via Arcane::CellDirectionMng::ownCellOffset().
- Avertissement
- Ces informations ne sont accessibles que si le maillage a été généré via le générateur spécifique cartésien. En particulier, elles ne sont pas accessibles si le maillage est issu d'un fichier. Pour plus d'informations, se reporter à la description de ces méthodes.
Utilisation des connectivités cartésiennnes
Il est possible en 2D d'avoir accès aux mailles autour d'un noeud et aux noeuds de la maille sans passer par les connectivités directionnelles. Cela se fait via l'objet Arcane::CartesianConnectivity qui est retourné par l'appel à Arcane::ICartesianMesh::connectivity(). Par exemple :
CartesianConnectivity cc = cartesian_mesh->connectivity();
Node n = *inode;
Cell c1 = cc.upperLeft(n);
Cell c2 = cc.upperRight(n);
Cell c3 = cc.lowerRight(n);
Cell c4 = cc.lowerLeft(n);
info(6) << " C1=" << ItemPrinter(c1) << " C2=" << ItemPrinter(c2)
<< " C3=" << ItemPrinter(c3) << " C4=" << ItemPrinter(c4);
}
Et de la même manière pour les mailles :
}
Informations de connectivité d'un maillage cartésien.
Cell lowerRight(Node n) const
Maille en bas à droite du noeud n.
Cell upperLeft(Node n) const
Maille en haut à gauche du noeud n.
Cell lowerLeft(Node n) const
Maille en bas à gauche du noeud n.
Cell upperRight(Node n) const
Maille en haut à droite du noeud n.
virtual CartesianConnectivity connectivity()=0
Informations sur la connectivité
Ces connectivités sont aussi accessibles en 3D. La nomemclature est la même que pour les connectivités 2D. Le préfixe topZ est utilisé pour les noeuds du dessus de la même suivant la direction Z. Pour ceux du dessous, il n'y a pas de préfixe et donc le nom de la méthode est le même qu'en 2D. Cela permet éventuellement d'utiliser le même code en 2D et en 3D.
}
Cell topZUpperRight(Node n) const
En 3D, maille en haut à droite du noeud n.
Cell topZLowerRight(Node n) const
En 3D, maille en bas à droite du noeud n.
Cell topZLowerLeft(Node n) const
En 3D, maille en bas à gauche du noeud n.
Cell topZUpperLeft(Node n) const
En 3D, maille en haut à gauche du noeud n.