Lire un maillage non structuré
Créer un maillage avec des familles
Lire un maillage avec des familles
La routine \ref MEDmeshCr / \ref mmhcre permet de créer un maillage dans un fichier MED. Un maillage est identifié par son nom qui est une chaîne de \ref MED_NAME_SIZE caractères (comme tous les noms d'objets du modèle). Lors de la création du maillage, il est nécessaire de préciser outre son nom, sa dimension, la dimension de l'espace de calcul, son type (structuré ou non structuré), l'unité des pas de temps et mode de tri de ces pas de temps (utile pour les maillages évolutifs), ainsi que le type de repère des coordonnées. Dans un premier temps nous ne travaillerons que sur des maillages non évolutifs.
A minima il est nécessaire de définir pour un tel maillage les coordonnées de ses noeuds, ainsi que la connectivité de ses mailles (cf. \ref connectivites).
L'écriture des coordonnées des noeuds d'un maillage non structuré se fait par l'intermédiaire de la routine \ref MEDmeshNodeCoordinateWr / \ref mmhcow. Cette routine permet l'écriture d'un tableau de coordonnées selon un pas de temps et/ou un numéro d'itération donnés. Comme pour d'autres routines prenant en paramètre des données multi-composantes, on peut choisir le mode de stockage de ces données en mémoire -i.e. \ref MED_FULL_INTERLACE (les composantes d'une entité apparaissent avant celles de l'entité suivante : X1Y1Z1X2Y2Z2...), ou \ref MED_NO_INTERLACE (les composantes n°i de toutes les entités apparaissent avant les composantes n°i+1 (X1X2....Y1Y2....Z1Z2...).
La routine \ref MEDmeshElementConnectivityWr / \ref mmhcyw permet d'écrire les connectivités d'un type géométrique correspondant à un élément d'un maillage selon un pas de temps et/ou un numéro d'itération donnés. L'écriture s'effectue donc type géométrique par type géométrique pour tous les types d'élements : maille (\ref MED_CELL), face (\ref MED_DESCENDING_FACE) ou arête (\ref MED_DESCENDING_EDGE). Une maille est décrite soit par connectivité nodale (\ref MED_NODAL : liste ordonnée des numéros des noeuds), soit par connectivité descendante (\ref MED_DESCENDING : liste ordonnée des numéros des noeuds, arêtes ou faces selon la dimension de la maille considérée). A noter qu'en connectivité nodale, on ne doit écrire que les mailles, les entités faces et arêtes n'étant utilisées que pour la connectivité descendante. Dans le modèle MED, toutes les entités d'un maillage ont une numérotation globale implicite qui débute à 1. Pour les éléments, la numérotation implicite s'obtient en parcourant l'ensemble des types géométriques selon l'ordre de définition du modèle de données. La règle à appliquer pour définir la taille mémoire "T" nécessaire au stockage de la connectivité d'une entité géométrique est la suivante. Dans le cas de la connectivité nodale, on a "T" = nombre de noeuds. Dans le cas de la connectivité descendante, pour une entité de dimension 3 on a "T" = nombre de faces ; pour une entité de dimension 2, on a "T" = nombre d'arêtes, pour une entité de dimension 1, on a "T" = nombre de noeuds.
Même si on ne définit aucun repérage sur les entités d'un maillage, il est nécessaire de créer la famille de numéro zéro qui ne comporte aucun groupe. Par défaut, toutes les entités du maillage, se rattachent à cette famille. Cette création se fait avec la routine \ref MEDfamilyCr / \ref mfacre.
Le premier exemple suivant permet de créer dans un fichier MED, un maillage non structuré 2D.
\include UsesCase_MEDmesh_1.c
Dans MED, l'accès aux objets du modèle stockés dans un fichier se fait via deux approches possibles : accès par le nom ou via un itérateur. Pour ce qui concerne les maillages, la routine \ref MEDmeshInfoByName / \ref mmhmin permet de lire les informations relatives à un maillage dont on connaît le nom. Les informations lues correspondent à celles écrites par la routine \ref MEDmeshCr / \ref mmhcre.
Il est ensuite nécessaire pour chaque type d'entité, de lire le nombre d'éléments présents dans le maillage. Cette lecture se faite avec la routine \ref MEDmeshnEntity / \ref mmhnme.
Une fois les nombres d'entités connus (noeuds, mailles, et éventuellement faces et arêtes), il est nécessaire de lire les coordonnées des noeuds avec la routine \ref MEDmeshNodeCoordinateRd / \ref mmhcor et la connectivité de chacun des types géométriques d'éléments présents dans le fichier avec la routine \ref MEDmeshElementConnectivityRd / \ref mmhcyr.
L'exemple suivant permet la lecture du maillage créé avec le premier cas d'utilisation.
\include UsesCase_MEDmesh_2.c
Une approche plus générique dans la lecture d'un maillage non structuré est donnée dans l'exemple suivant. La routine \ref MEDnMesh / \ref mmhnmh va lire le nombre de maillage dans le fichier. Il s'agit ensuite d'itérer sur ces maillages. La routine \ref MEDmeshInfo / \ref mmhmii permet de lire les informations relatives à un maillage à partir d'un itérateur. La routine \ref MEDmeshnAxis / \ref mmhnax permet de récupérer la dimension de l'espace de calcul en vue de dimensionner la taille des paramètres utiles à la routine MEDmeshInfo.
Comme dans le cas précédent, il est nécessaire de lire les coordonnées des noeuds et la connectivité des mailles du maille (on se place dans le cas d'une connectivité définie en mode nodal). Les routines \ref MEDmeshnEntity / \ref mmhnme et \ref MEDmeshNodeCoordinateRd / \ref mmhcor permettent respectivement de connaître le nombre de noeuds et lire leurs coordonnées. Pour ce qui concerne la lecture de la connectivité des mailles, l'approche proposée est ici plus générique que précédemment. La routine \ref MEDmeshnEntity / \ref mmhnme est d'abord utilisée pour connaître le nombre de type géométriques de mailles présents dans le maillage. Il s'agit ensuite d'itérer sur ce nombre afin de récupérer à chaque itération : le nom et le type géométrique avec la routine \ref MEDmeshEntityInfo / \ref mmheni, le nombre d'élément avec la routine \ref MEDmeshnEntity / \ref mmhnme et le tableau de connectivité avec la routine \ref MEDmeshElementConnectivityRd / \ref mmhcyr.
\include UsesCase_MEDmesh_3.c
La création d'un maillage structuré s'effectue avec la routine \ref MEDmeshCr / \ref mmhcre, en précisant qu'il s'agit d'un maillage de type \ref MED_STRUCTURED_MESH. La géométrie d'un maillage structuré est uniquement définie par ses noeuds. La connectivité entre les noeuds est de type (i,j,k) en 3D, (i,j) en 2D et (i) en 1D. On distingue 3 catégories de maillage structuré : les grilles cartésiennes définies dans un repère de coordonnées cartésien (\ref MED_CARTESIAN_GRID), les grilles définies selon un repère de coordonnées polaire (\ref MED_POLAR_GRID), et les grilles curvilignes (\ref MED_CURVILINEAR_GRID).
Dans un maillage structuré, la connaissance des indices d'un noeud en donne la position relative. Nous adopterons le système d'indexation suivant pour ce type de maillage :
Par convention également, le noeud "origine" d'une grille a pour index (1,1,1) en 3D, (1,1) en 2D et (1) en 1D.
Voici par exemple le résultat obtenu pour une grille "5x3".
Dans un maillage structuré, la numérotation des noeuds et des éléments est implicite. Considérons un maillage structuré 2D dont le premier axe comporte "n" points et le second axe "p" points : le noeud d'index (i,j) a pour numéro (i + (j-1) *n) ; l'élément d'index (i,j) (élément porté par le noeud d'index (i,j)) a pour numéro (i + (j-1) * (n-1).
Si on reporte cette convention de numérotation des noeuds et des éléments sur notre grille "5x3", on obtient :
L'écriture des coordonnées d'un maillage structuré correspondant à une grille MED_CARTESIAN_GRID ou MED_POLAR_GRID ne nécessite que l'écriture des indices de coordonnées selon chacun des axes du repère de coordonnées. La routine \ref MEDmeshGridIndexCoordinateWr / \ref mmhgcw permet l'écriture des indices d'un axe donné. Cette routine doit être appelé pour chaque axe du repère de coordonnées. Pour ce qui concerne une grille MED_CURVILINEAR_GRID, il est nécessaire d'écrire toutes les coordonnées des noeuds au même titre que pour un maillage non structuré avec la routine \ref MEDmeshNodeCoordinateWr / \ref mmhcow.
Il est inutile dans un maillage structuré d'écrire la connectivité des mailles dont la définition est implicite. Cependant ces mailles existent bien. Elles sont de type MED_POINT1 pour un maillage 0D, MED_SEG2 pour un maillage 1D, MED_QUAD4 pour un maillage 2D et MED_HEXA8 pour un maillage 3D. Il est possible d'associer à ces mailles tout comme pour les éléments d'un maillage non structuré, les attributs des entités d'un maillage : un numéro (optionnel), un nom (optionnel) de taille \ref MED_SNAME_SIZE caractères, un numéro de famille. La routine \ref MEDmeshEntityNumberWr / \ref mmhenw permet d'écrire un tableau de numéro pour un type d'entité donné. La routine \ref MEDmeshEntityNameWr / \ref mmheaw permet d'écrire un tableau de noms pour un type d'entité donné. L'écriture des noms et numéros des entités d'un maillage est optionnelle. La routine \ref MEDmeshEntityFamilyNumberWr / \ref mmhfnw permet quant à elle l'écriture des numéros de famille. L'écriture des numéros de famille est optionnelle uniquement lorsque toutes les entités du maillage sont rattachés à la famille 0.
\include UsesCase_MEDmesh_4.c
Une fois le type de maillage identifié avec la routine \ref MEDmeshInfoByName / \ref mmhmin ou \ref MEDmeshInfo / \ref mmhmii, il est nécessaire de lire à quelle catégorie correspond le maillage structuré via la routine \ref MEDmeshGridTypeRd / \ref mmhgtr. Pour les grilles MED_CARTESIAN_GRID ou MED_POLAR_GRID, il est nécessaire de lire les indices de coordonnées selon chaque axes du repère de coordonnées : la routine \ref MEDmeshnEntity / \ref mmhnme permet de lire le nombre d'indices selon un axe donné, la routine \ref MEDmeshGridIndexCoordinateRd / \ref mmhgcr permet la lecture des indices de coordonnées selon les axes de coordonnées du repère. Pour ce qui concerne une grille MED_CURVILINEAR_GRID, il est nécessaire de lire toutes les coordonnées des noeuds au même titre que pour un maillage non structuré avec la routine \ref MEDmeshNodeCoordinateRd / \ref mmhcor.
L'exemple suivant permet la lecture du maillage structuré créé dans le cas d'utilisation précédent.
\include UsesCase_MEDmesh_5.c
Dans MED, les familles constituent une partition de l'ensemble des entités du maillage : chaque entité du maillage (noeud, maille, face ou arête) appartient à une seule famille. Une famille permet de repérer des zones à particulariser pour le calcul : propriétés physiques, conditions aux limites, extraction des résultats, etc. Un objet famille est identifié par son nom (chaîne de \ref MED_NAME_SIZE caractères) et son numéro. Une famille est décrite par une liste de groupes auxquels les entités de la famille appartiennent. Un groupe est identifié par une chaîne de caractères de \ref MED_LNAME_SIZE caractères.
Une famille donnée ne peut porter que sur un seul type d'entité, une famille est donc soit (exclusif) : une famille de noeuds, une famille d'éléments (mailles/faces/arêtes). Dans un maillage MED, on trouve trois types de familles: la famille de numéro 0 qui ne comporte aucun groupe ; zéro ou plusieurs familles de noeuds dont le numéro doit être strictement positif ; zéro ou plusieurs familles d'éléments (mailles/faces/arêtes) dont le numéro doit être strictement négatif.
La définition de la famille vide de numéro 0 est obligatoire, elle constitue la famille de référence pour tous les noeuds et les éléments qui n'appartiennent à aucun groupe. Une famille de noeuds peut porter le même nom qu'un famille d'éléments. Par contre les familles d'éléments (respectivement de noeuds) doivent toutes avoir des noms différents. La création d'une famille dans un maillage se fait à l'aide de la routine \ref MEDfamilyCr / \ref mfacre.
Le numéro de famille est le lien existant entre la famille considérée et une entité du maillage (noeud, maille, face ou arête). Ce numéro doit être unique dans chaque maillage. La routine \ref MEDmeshEntityFamilyNumberWr / \ref mmhfnw permet l'écriture des numéros de famille pour un type d'entité donné.
Le cas d'utilisation suivant créé dans un maillage non structuré 2D, une famille associée aux noeuds situés sur le bord du maillage. Cette famille porte le numéro 1 et tous les noeuds situés au bord sont rattachés à cette famille. Les numéro de famille des autres noeuds reste à 0.
\include UsesCase_MEDmesh_10.c
Pour lire un maillage MED de façon générique, il est nécessaire de lire les familles qui outre la famille 0, existent potentiellement dans le maillage. De plus pour chaque type d'entité présent dans le maillage, il est nécessaire de lire le numéro de famille.
La routine \ref MEDnFamily / \ref mfanfa lit le nombre de famille dans un maillage. Il s'agit ensuite d'itérer sur chacune de ces familles. A chaque itération, la routine \ref MEDnFamilyGroup / \ref mfanfg permet de lire le nombre de groupe d'une famille et la routine \ref MEDfamilyInfo / \ref mfafai permet de récupérer les informations relatives à une famille : nom, numéro, liste des groupes. A noter qu'il est également possible d'utiliser la routine \ref MEDfamily23Info / \ref mfaofi pour lire les informations relatives aux familles des fichiers MED 2.3 qui en plus des groupes pouvaient comporter une liste d'attributs entiers (notion devenue obsolète dans MED 3.0), le nombre d'attribut d'une famille pouvant être récupéré avec la routine \ref MEDnFamily23Attribute / \ref mfaona.
Il est possible de lire les numéros de famille pour chaque type d'entité du maillage avec la routine \ref MEDmeshEntityFamilyNumberRd / \ref mmhfnr. Si le tableau de numéro n'est pas présent, cela indique que toutes les entités concernées portent le numéro de famille 0.
Le cas d'utilisation suivant offre un exemple de lecture des familles d'un maillage.
\include UsesCase_MEDmesh_11.c
L'exemple suivant propose une approche similaire avec les routines permettant la lecture des fichiers MED 2.3.
\include test9.c