Concepts et fonctionnalités avancés sur les fichiers

### Monter et démonter des fichiers MED

Les objets du modèle de données MED comme les champs et les maillages peuvent être répartis dans des fichiers différents. Il est parfois utile par exemple lorsqu'on lit un champ, d'avoir accès au maillage associé au champ. La routine MEDfileObjectsMount / mfiomn permet de monter le contenu d'un fichier MED pour un type d'objet donné (exemples : champ, maillage) dans le fichier MED courant. Une fois le montage effectué, l'accès aux données montées est transparent. Lorsque l'accès aux données montées n'est plus utile, il est nécessaire de démonter le fichier avec la routine MEDfileObjectsUnmount / mfioun.

/* This file is part of MED.
*
* COPYRIGHT (C) 1999 - 2021 EDF R&D, CEA/DEN
* MED is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MED is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with MED. If not, see <http://www.gnu.org/licenses/>.
*/
/******************************************************************************
* - Nom du fichier : test20.c
*
* - Description : montage/demontage de fichiers MED
*
*****************************************************************************/
#include <med.h>
#define MESGERR 1
#include <med_utils.h>
#ifdef DEF_LECT_ECR
#define MODE_ACCES MED_ACC_RDWR
#elif DEF_LECT_AJOUT
#define MODE_ACCES MED_ACC_RDEXT
#else
#define MODE_ACCES MED_ACC_CREAT
#endif
int main (int argc, char **argv)
{
med_idt fid,fid2,fid3,mid,mid2;
med_int ncha, ncomp, nmaa;
med_field_type type;
char comp[3*MED_SNAME_SIZE+1]="",unit[3*MED_SNAME_SIZE+1]="";
char nom [MED_NAME_SIZE+1] ="";
char _meshname [MED_NAME_SIZE+1] ="";
char _dtunit [MED_SNAME_SIZE+1]="";
med_int _ncstp=0;
med_bool _local;
int i;
/*
* Phase 1 : Test de montage de champs dans un fichier contenant des maillages
*/
/* Ouverture du fichier test20-0.med en mode lecture et ajout */
if ((fid = MEDfileOpen("test20-0.med",MED_ACC_RDEXT)) < 0) {
MESSAGE("Erreur a l'ouverture du fichier test20-0.med");
return -1;
}
printf("On ouvre le fichier test20-0.med \n");
/* Lecture du nombre de champs */
if ((ncha = MEDnField(fid)) < 0) {
MESSAGE("Erreur a la lecture du nombre de champs");
return -1;
}
printf("Nombre de champs dans test20-0.med :" IFORMAT " \n",ncha);
/* On fait le montage dans test20-0.med de tous les champs de test10.med */
mid = MEDfileObjectsMount(fid,"test10.med",MED_FIELD);
if (mid < 0) {
MESSAGE("Echec du montage des champs de test10.med");
return -1;
}
printf("On monte les champs du fichier test10.med dans le fichier test20-0.med \n");
/* Combien de champs dans le fichier "test20-0.med" apres le montage */
if ((ncha = MEDnField(fid)) < 0) {
MESSAGE("Erreur a la lecture du nombre de champ");
return -1;
}
printf("Nombre de champs dans test20-0.med apres montage : " IFORMAT " \n",ncha);
/* On s'assure que les champs sont bien accessibles */
for (i=1;i<=ncha;i++) {
/* Combien de composantes dans le champ */
if ((ncomp = MEDfieldnComponent(fid,i)) < 0) {
MESSAGE("Erreur a lecture du nombre de composante du champ");
return -1;
}
/* Lecture des infos sur le champ */
if (MEDfieldInfo(fid,i,nom,_meshname,&_local,&type,comp,unit,_dtunit,&_ncstp) < 0) {
MESSAGE("Erreur a la lecture des informations sur le champ");
return -1;
}
printf("Nom du champ : |%s| de type %d\n",nom,type);
printf("Nom des composantes : |%s|\n",comp);
printf("Unites des composantes : |%s| \n",unit);
printf("Unites des dates : |%s| \n",_dtunit);
printf("Le maillage associé est |%s|\n",_meshname);
}
/* On demonte le fichier */
if (MEDfileObjectsUnmount(fid,mid,MED_FIELD) < 0) {
MESSAGE("Echec du demontage de test10.med");
return -1;
}
printf("On demonte le fichier test10.med dans test20-0.med\n");
/* Combien de champs dans le fichier "test20-0.med" apres le demontage */
if ((ncha = MEDnField(fid)) < 0) {
MESSAGE("Erreur a la lecture du nombre de champ");
return -1;
}
printf("Nombre de champs dans test20-0.med apres demontage: " IFORMAT " \n",ncha);
/* On ferme le fichier test20-0.med */
if (MEDfileClose(fid) < 0) {
MESSAGE("Erreur lors de la fermeture du fichier");
return -1;
}
printf("On ferme le fichier test20-0.med \n");
/*
* Phase 2 : Test de montage de champs et de maillages dans un fichier vierge
*/
/* Creation du fichier test20.med */
if ((fid = MEDfileOpen("test20.med",MODE_ACCES)) < 0) {
MESSAGE("Erreur a la creation du fichier test20.med");
return -1;
}
printf("On cree le fichier test20.med \n");
/* Montage dans test20.med de tous les maillages de test20-0.med */
mid2 = MEDfileObjectsMount(fid,"test20-0.med",MED_MESH);
if (mid2 < 0) {
MESSAGE("Echec du montage de test20-0.med");
return -1;
}
printf("On monte les maillages du fichier test20-0.med dans le fichier test20.med \n");
/* Lecture du nombre de maillages */
nmaa = MEDnMesh(fid);
if (nmaa < 0) {
MESSAGE("Erreur lors de la lecture du nombre de maillage");
return -1;
}
printf("Nombre de maillages apres montage de test20-0.med : " IFORMAT "\n",nmaa);
/* Montage dans test20.med de tous les champs de test10.med */
mid = MEDfileObjectsMount(fid,"test10.med",MED_FIELD);
if (mid < 0) {
MESSAGE("Echec du montage de test10.med");
return -1;
}
printf("On monte les champs du fichier test10.med dans le fichier test20.med \n");
/* Combien de champs dans le fichier "test20.med" apres le montage */
if ((ncha = MEDnField(fid)) < 0) {
MESSAGE("Erreur lors de la lecture du nombre de champ");
return -1;
}
printf("Nombre de champs dans test20.med apres montage : " IFORMAT " \n",ncha);
/* Demontage du fichier test10.med */
if (MEDfileObjectsUnmount(fid,mid,MED_FIELD) < 0) {
MESSAGE("Echec du demontage de test10.med");
return -1;
}
printf("On demonte le fichier test10.med dans test20.med \n");
/* Demontage du fichier test20-0.med */
if (MEDfileObjectsUnmount(fid,mid2,MED_MESH) < 0) {
MESSAGE("Echec du demontage de test20-0.med");
return -1;
}
printf("On demonte le fichier test20-0.med du test20.med\n");
/* Fermeture du fichier test20.med */
if (MEDfileClose(fid) < 0) {
MESSAGE("Erreur de la fermeture du fichier");
return -1;
}
printf("On ferme le fichier test20.med \n");
/*
* Phase 3 : Test de montage de champs et de maillages dans un fichier vierge à
* partir de deux fichiers HDFs contenant une sous arborescence MED avec Champs et Maillages
*/
/* Creation du fichier test20b.med */
if ((fid = MEDfileOpen("test20b.med",MODE_ACCES)) < 0) {
MESSAGE("Erreur a la creation du fichier test20.med");
return -1;
}
printf("On cree le fichier test20b.med \n");
/* Ouverture du fichier HDF test2-med.hdf */
if ((fid2 = MEDfileOpen("test2-med.hdf",MED_ACC_RDONLY)) < 0) {
MESSAGE("Erreur a l'ouverture du fichier test2-med.hdf");
return -1;
}
printf("On ouvre le fichier test2-med.hdf \n");
/* Montage dans test20b.med de tous les maillages de test20-0.med */
mid2 = MEDfileObjectsMountById(fid,fid2,"/byid2",MED_MESH);
if (mid2 < 0) {
MESSAGE("Echec du montage de test2-med.hdf");
return -1;
}
printf("On monte les maillages du fichier test2-med.hdf dans le fichier test20b.med \n");
/* Lecture du nombre de maillages */
nmaa = MEDnMesh(fid);
if (nmaa < 0) {
MESSAGE("Erreur lors de la lecture du nombre de maillage");
return -1;
}
printf("Nombre de maillages apres montage de test2-med.hdf : " IFORMAT "\n",nmaa);
/* Ouverture du fichier HDF test10-med.hdf */
if ((fid3 = MEDfileOpen("test10-med.hdf",MED_ACC_RDONLY)) < 0) {
MESSAGE("Erreur a l'ouverture du fichier test10-med.hdf");
return -1;
}
printf("On ouvre le fichier test10-med.hdf \n");
/* Montage dans test20b.med de tous les champs de test10-med.hdf */
mid = MEDfileObjectsMountById(fid,fid3,"/byid10/",MED_FIELD);
if (mid < 0) {
MESSAGE("Echec du montage de test10-med.hdf");
return -1;
}
printf("On monte les champs du fichier test10-med.hdf dans le fichier test20b.med \n");
/* Combien de champs dans le fichier "test20b.med" apres le montage */
if ((ncha = MEDnField(fid)) < 0) {
MESSAGE("Erreur lors de la lecture du nombre de champ");
return -1;
}
printf("Nombre de champs dans test20b.med apres montage : " IFORMAT " \n",ncha);
/* Demontage du fichier test10-med.hdf */
if (MEDfileObjectsUnmount(fid,mid,MED_FIELD) < 0) {
MESSAGE("Echec du demontage de test10-med.hdf");
return -1;
}
printf("On demonte et on ferme le fichier test10-med.hdf de test20b.med \n");
/* Demontage du fichier test2-med.hdf */
if (MEDfileObjectsUnmount(fid,mid2,MED_MESH) < 0) {
MESSAGE("Echec du demontage de test2-med.hdf");
return -1;
}
printf("On demonte et on ferme le fichier test2-med.hdf de test20b.med\n");
/* Fermeture du fichier test20b.med */
if (MEDfileClose(fid) < 0) {
MESSAGE("Erreur de la fermeture du fichier");
return -1;
}
printf("On ferme le fichier test20b.med \n");
return 0;
}

###

MED_FIELD
Definition: med.h:188
MEDfileOpen
MEDC_EXPORT med_idt MEDfileOpen(const char *const filename, const med_access_mode accessmode)
Ouverture d'un fichier MED.
Definition: MEDfileOpen.c:42
MED_SNAME_SIZE
#define MED_SNAME_SIZE
Definition: med.h:82
MEDnField
MEDC_EXPORT med_int MEDnField(const med_idt fid)
Cette fonction permet de lire le nombre de champs dans un fichier.
Definition: MEDnField.c:35
med_idt
hid_t med_idt
Definition: med.h:331
MEDfileObjectsMountById
MEDC_EXPORT med_idt MEDfileObjectsMountById(const med_idt fid, const med_idt chfid, const char *const chpath, const med_class medclass)
Cette routine permet le montage d'une collection d'objets de type medclass dans le fichier associé à ...
Definition: MEDfileObjectsMountById.c:43
MED_ACC_RDONLY
Definition: med.h:120
MEDfileObjectsUnmount
MEDC_EXPORT med_err MEDfileObjectsUnmount(const med_idt fid, const med_idt mid, const med_class medclass)
Une fois le démontage effectué, les données précédemment montées ne sont plus accessibles.
Definition: MEDfileObjectsUnmount.c:33
MESSAGE
#define MESSAGE(chaine)
Definition: med_utils.h:324
med_int
int med_int
Definition: med.h:342
med_field_type
med_field_type
Definition: med.h:165
med.h
med_bool
med_bool
Definition: med.h:260
IFORMAT
#define IFORMAT
Definition: med_utils.h:145
MEDfileObjectsMount
MEDC_EXPORT med_idt MEDfileObjectsMount(const med_idt fid, const char *const filename, const med_class medclass)
Cette routine permet de monter dans le fichier courant un type de données (exemples les maillages,...
Definition: MEDfileObjectsMount.c:40
MED_MESH
Definition: med.h:188
MODE_ACCES
#define MODE_ACCES
Definition: 3.0.8/test10.c:34
MED_NAME_SIZE
#define MED_NAME_SIZE
Definition: med.h:81
MEDnMesh
MEDC_EXPORT med_int MEDnMesh(const med_idt fid)
Cette routine permet de lire le nombre de maillages dans un fichier.
Definition: MEDnMesh.c:34
MEDfileClose
MEDC_EXPORT med_err MEDfileClose(med_idt fid)
Fermeture d'un fichier MED.
Definition: MEDfileClose.c:30
MED_ACC_RDEXT
Definition: med.h:122
MEDfieldInfo
MEDC_EXPORT med_err MEDfieldInfo(const med_idt fid, const int ind, char *const fieldname, char *const meshname, med_bool *const localmesh, med_field_type *const fieldtype, char *const componentname, char *const componentunit, char *const dtunit, med_int *const ncstp)
Cette fonction permet de lire les informations concernant le champ d'indice ind .
Definition: MEDfieldInfo.c:42
MEDfieldnComponent
MEDC_EXPORT med_int MEDfieldnComponent(const med_idt fid, const int ind)
Cette fonction lit le nombre de composantes d'un champ.
Definition: MEDfieldnComponent.c:34
main
int main(int argc, char **argv)
Definition: 3.0.8/test10.c:50
med_utils.h