Annexe A: Structure d’un fichier Amelet HDF
HDF5
Tout comme le format HDF5 est organisé hierarchiquement comme un système de fichiers avec des dossiers et des fichiers. Les principaux types d’objets sont:
- Group
-
Un “group” ressemble à un dossier dans un système de fichiers et peut contenir d’autres objets.
- Dataset
-
Un “dataset” est un tableau de données multidimensionnelles et est contenu dans un “group”, comme un fichier est contenu dans un dossier.
- Table
-
Un “table” est un “dataset” spécial représentant des données multicolonnes.
Voici un exemple de structure de fichier HDF5 :
data.h5/ |-- dataset1[@type=a_type] |-- table1 |-- group1 | |-- dataset2 | |-- dataset3 | |-- table2 | |-- group2 | | |-- table3 | | `-- table4 | `-- table5 |-- table2 `-- dataset3
Chaque objet est identifié par un chemin absolu ou relatif depuis le noeud racine ou
un autre noeud. Par exemple, le chemin absolu de table4
est /group1/group2/table4
.
Le chemin relatif de table4
par rapport à group1
est group2/table4
.
Chaque objet peut être décrit par des attributs, qui sont des paires clé-valeur.
Par exemple, l’attribut type
de dataset1
a pour valeur a_type
.
La valeur d’un attribut peut être de n’importe quel type pris en charge par HDF5, tels
que : entier, réel, booléen, chaîne de caractères.
L’extension h5 est souvent associée aux fichiers HDF5.
Amelet HDF
Amelet HDF est basé sur le format HDF5. Il ajoute des conventions pour l’organisation des données dans un fichier HDF5. Les conventions Amelet HDF sont les suivantes :
- Attributs de fichiers
-
Une instance de fichier Amelet HDF doit avoir les attributs avec les valeurs suivantes :
data.h5[@FORMAT=AMELETHDF | @AMELETHDF_FORMAT_VERSION=1.0.0]/ `-- physicalModel `-- volume |--$water `--$soltWater
- Des catégories prédéfinies
-
Les objets Amelet HDF sont organisés dans des catégories (ou “group”) prédéfinies. En voici une la structure complète:
data.h5/ |-- label |-- group |-- externalElement |-- globalEnvironment |-- electromagneticSource | |-- planeWave | |-- sphericalWave | |-- generator | |-- dipole | |-- sourceOnMesh | `-- antenna |-- physicalModel | |-- multiport | |-- multilayer | |-- slotProperties | |-- anisotropic | |-- volume | |-- aperture | |-- shield | `-- grid |-- mesh |-- floatingType |-- exchangeSurface |-- transmissionLine | `--transmissionLineElement |-- network | `-- $net1 | |-- topology | |-- tubes | |-- junctions | `-- connections |-- link |-- outputRequest |-- localizationSystem |-- extensionTypes | `-- $car `-- simulation `-- $sim1 |-- input `-- output
Pour plus d’informations, voir la documentation de la spécification Amelet HDF.
Les maillages dans Amelet HDF
Dans Amelet HDF, les maillages se trouvent dans la catégorie /mesh
. Etant
donné la possibilité de maillages hybrides, les maillages sont stockés dans
des groupes de la catégorie /mesh
. En voici un exemple :
data.h5/ `-- mesh/ |-- $gmesh1 | |-+ $mesh#5 | `-+ $mesh_6 `-- $gmesh2 |-- $mesh1[@type=unstructured]/ | |-- elementNodes | |-- elementTypes | |-- nodes | |-- group | | |-- $field-location[@type=node] | | |-- $right-wing[@type=element | | | @entityType=face] | | `-- $left-wing[@type=element | | @entityType=face] | |-- groupGroup | | `-- $wings | `-- selectorOnMesh | |-- nodes | |-- elements | `-- groups |-+ $mesh-two `-- $mesh-3[@type=structured]/ |-- cartesianGrid |-- group | |-- $field-location[@type=node] | |-- $right-wing[@type=element | | @entityType=face] | `-- $left-wing[@type=element | @entityType=face] |-- groupGroup | `-- $wings `-- selectorOnMesh |-- nodes |-- elements `-- groups
Les noms d’objets commençant par un |
Dans l’exemple ci-dessus, le maillage data.h5:/mesh/$gmesh2/$mesh1
est un maillage non structuré et data.h5:/mesh/$gmesh2/$mesh-3
est un
maillage structuré.
Maillage non structuré
Dans Amelet HDF, un maillage non structuré est un groupe d’un groupe
de la catégorie /mesh
portant l’attribut type
avec la valeur unstructured
,
et contenant les éléments obligatoires suivants :
nodes
-
Un dataset contenant les coordonnées (x, y, z en 3D) des noeuds du maillage.
elementTypes
-
Un dataset contenant les types des éléments du maillage. Ces types sont des entiers et sont définis dans la documentation officielle de la spécification Amelet HDF. Par exemple, le type d’un triangle linéaire est 11.
elementNodes
-
Un dataset (uni-dimensionnel) contenant la connectivité des éléments du maillage. Pour chaque ligne du dataset
elementTypes
, correspond une ou plusieurs lignes du datasetelementNodes
selon le type de l’élément.
Par exemple, pour le /mesh/$gmesh/$mesh/elementTypes
suivant :
index | type de l’élément |
---|---|
0 |
11 |
1 |
11 |
/mesh/$gmesh/$mesh/elementNodes
est :
index | indices des noeuds de l’élément |
---|---|
0 |
0 |
1 |
1 |
2 |
1 |
3 |
2 |
4 |
0 |
5 |
2 |
Un maillage non structuré peut contenir les éléments optionnels suivants :
group
-
Un groupe contenant des datasets d’entiers (groupes d’éléments). Ces groupes d’éléments peuvent être utilisés pour définir des zones cruciales pour la simulation. Ces datasets sont d’ensembles d’indices de noeuds ou d’éléments selon qu’ils aient un attribut
type
avec la valeurnode
ouelement
. Si l’attributtype
vautelement
, alors le dataset a un attributentityType
avec l’une des valeurs suivante :edge
-
Le dataset contient des éléments linéaires.
face
-
Le dataset contient des éléments surfaciques.
volume
-
Le dataset contient des éléments volumiques.
groupGroup
-
Un groupe contenant un ensemble de nom de groupes d’éléments. Autrement dit, il contient des datasets de chaînes de caractères. Ces chaînes de caractères sont les noms des groupes d’éléments contenus dans le groupe
group
.
Voici un exemple de maillage non structuré :
data.h5 `-- mesh/ `-- $gmesh1/ `-- $mesh1[@type=unstructured]/ |-- nodes |-- elementTypes |-- elementNodes |-- group | |-- $field-location[@type=node] | |-- $right-wing[@type=element | | @entityType=face] | `-- $left-wing[@type=element | @entityType=face] `-- groupGroup `-- $wings
avec data.h5:/mesh/$gmesh1/$mesh1/groupGroup/$wings
contenant :
index | les enfants de data.h5:/mesh/$gmesh1/$mesh1/group |
---|---|
0 |
$right-wing |
1 |
$left-wing |
Maillage structuré
Dans Amelet HDF, un maillage structuré est un groupe d’un groupe
de la catégorie /mesh
portant l’attribut type
avec la valeur structured
,
et contenant l’élément obligatoires suivants :
cartesianGrid
-
Un groupe représentant la grille cartésienne du maillage. Selon la dimension du maillage (1, 2 ou 3), la grille est représentée par les vecteurs (datasets uni-dimensionnels) de floattants
x
,y
etz
. Ces datasets possèdent un attribut obligatoirefloatingType
=vector
. Les noeuds du maillage sont les points de la grille cartésienne, c’est à dire les intersections des lignes de la grille cartésienne.
Selon la dimension de l’espace, chaque élément de la grille est défini à l’aide
des indices i, j, k respectivement des vecteurs x
, y
et z
. On distingue
principallement les éléments suivants :
node
-
Un noeud A est défini par un tuple d’entier, la dimension du tuple dépendant de la dimension de l’espace:
dimension de l’espace | coordonnées de A |
---|---|
1D |
i |
2D |
(i, j) |
3D |
(i, j, k) |
edge
-
Une arête A est définie par deux noeuds alignés A et B selon un axe de la grille.
dimension de l’espace | coordonnées de A | coordonnées B |
---|---|---|
1D |
i |
i+1 |
2D |
(i, j) |
(i+1, j) |
(i, j) |
(i, j+1) |
|
3D |
(i, j, k) |
(i+1, j, k) |
(i, j, k) |
(i, j+1, k) |
|
(i, j, k) |
(i, j, k+1) |
face
-
Une face est définie par deux noeuds A et B.
dimension de l’espace | coordonnées de A | coordonnées B |
---|---|---|
2D |
(i, j) |
(i+1, j+1) |
3D |
(i, j, k) |
(i+1, j+1, k) |
(i, j, k) |
(i, j+1, k+1) |
|
(i, j, k) |
(i+1, j, k+1) |
volume
-
Un volume est défini par deux noeuds A et B.
dimension de l’espace | coordonnées de A | coordonnées B |
---|---|---|
3D |
(i, j, k) |
(i+1, j+1, k+1) |
Tout comme un maillage non structuré, un maillage structuré peut contenir les éléments optionnels suivants :
-
group
-
groupGroup
Voici un exemple de maillage structuré :
data.h5 `-- mesh/ `-- $gmesh1/ `-- $mesh1[@type=structured]/ |-- cartesianGrid | |-- x[@physicalNature=length | | @unit=meter] | |-- y[@physicalNature=length | | @unit=meter] | `-- z[@physicalNature=length | @unit=meter] |-- group |-- $right-wing[@type=element @entityType=volume]
où data.h5:/mesh/$gmesh1/$mesh1/group/$right-wing
est :
imin |
jmin |
kmin |
imax |
jmax |
kmax |
1 |
1 |
1 |
2 |
2 |
2 |
15 |
15 |
15 |
27 |
25 |
27 |
Dans cet exemple, data.h5:/mesh/$gmesh1/$mesh1/group/$right-wing
est un
constité de 2 volumes.
Chaque ligne de data.h5:/mesh/$gmesh1/$mesh1/group/$right-wing
représente
ainsi un ou plusieurs parallelepipedes rectangles de la grille cartésienne.