MED fichier
test20.c
Aller à la documentation de ce fichier.
1 /* This file is part of MED.
2  *
3  * COPYRIGHT (C) 1999 - 2021 EDF R&D, CEA/DEN
4  * MED is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * MED is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public License
15  * along with MED. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 /******************************************************************************
19  * - Nom du fichier : test20.c
20  *
21  * - Description : montage/demontage de fichiers MED
22  *
23  *****************************************************************************/
24 
25 #include <med.h>
26 #define MESGERR 1
27 #include <med_utils.h>
28 
29 #ifdef DEF_LECT_ECR
30 #define MODE_ACCES MED_ACC_RDWR
31 #elif DEF_LECT_AJOUT
32 #define MODE_ACCES MED_ACC_RDEXT
33 #else
34 #define MODE_ACCES MED_ACC_CREAT
35 #endif
36 
37 int main (int argc, char **argv)
38 
39 
40 {
41  med_idt fid,fid2,fid3,mid,mid2;
42  med_int ncha, ncomp, nmaa;
43  med_field_type type;
44  char comp[3*MED_SNAME_SIZE+1]="",unit[3*MED_SNAME_SIZE+1]="";
45  char nom [MED_NAME_SIZE+1] ="";
46  char _meshname [MED_NAME_SIZE+1] ="";
47  char _dtunit [MED_SNAME_SIZE+1]="";
48  med_int _ncstp=0;
49  med_bool _local;
50  int i;
51 
52  /*
53  * Phase 1 : Test de montage de champs dans un fichier contenant des maillages
54  */
55 
56  /* Ouverture du fichier test20-0.med en mode lecture et ajout */
57  if ((fid = MEDfileOpen("test20-0.med",MED_ACC_RDEXT)) < 0) {
58  MESSAGE("Erreur a l'ouverture du fichier test20-0.med");
59  return -1;
60  }
61  printf("On ouvre le fichier test20-0.med \n");
62 
63  /* Lecture du nombre de champs */
64  if ((ncha = MEDnField(fid)) < 0) {
65  MESSAGE("Erreur a la lecture du nombre de champs");
66  return -1;
67  }
68  printf("Nombre de champs dans test20-0.med :"IFORMAT" \n",ncha);
69 
70  /* On fait le montage dans test20-0.med de tous les champs de test10.med */
71  mid = MEDfileObjectsMount(fid,"test10.med",MED_FIELD);
72  if (mid < 0) {
73  MESSAGE("Echec du montage des champs de test10.med");
74  return -1;
75  }
76  printf("On monte les champs du fichier test10.med dans le fichier test20-0.med \n");
77 
78  /* Combien de champs dans le fichier "test20-0.med" apres le montage */
79  if ((ncha = MEDnField(fid)) < 0) {
80  MESSAGE("Erreur a la lecture du nombre de champ");
81  return -1;
82  }
83  printf("Nombre de champs dans test20-0.med apres montage : "IFORMAT" \n",ncha);
84 
85  /* On s'assure que les champs sont bien accessibles */
86  for (i=1;i<=ncha;i++) {
87 
88  /* Combien de composantes dans le champ */
89  if ((ncomp = MEDfieldnComponent(fid,i)) < 0) {
90  MESSAGE("Erreur a lecture du nombre de composante du champ");
91  return -1;
92  }
93 
94  /* Lecture des infos sur le champ */
95  if (MEDfieldInfo(fid,i,nom,_meshname,&_local,&type,comp,unit,_dtunit,&_ncstp) < 0) {
96  MESSAGE("Erreur a la lecture des informations sur le champ");
97  return -1;
98  }
99 
100  printf("Nom du champ : |%s| de type %d\n",nom,type);
101  printf("Nom des composantes : |%s|\n",comp);
102  printf("Unites des composantes : |%s| \n",unit);
103  printf("Unites des dates : |%s| \n",_dtunit);
104  printf("Le maillage associé est |%s|\n",_meshname);
105 
106  }
107 
108  /* On demonte le fichier */
109  if (MEDfileObjectsUnmount(fid,mid,MED_FIELD) < 0) {
110  MESSAGE("Echec du demontage de test10.med");
111  return -1;
112  }
113  printf("On demonte le fichier test10.med dans test20-0.med\n");
114 
115  /* Combien de champs dans le fichier "test20-0.med" apres le demontage */
116  if ((ncha = MEDnField(fid)) < 0) {
117  MESSAGE("Erreur a la lecture du nombre de champ");
118  return -1;
119  }
120  printf("Nombre de champs dans test20-0.med apres demontage: "IFORMAT" \n",ncha);
121 
122  /* On ferme le fichier test20-0.med */
123  if (MEDfileClose(fid) < 0) {
124  MESSAGE("Erreur lors de la fermeture du fichier");
125  return -1;
126  }
127  printf("On ferme le fichier test20-0.med \n");
128 
129 
130  /*
131  * Phase 2 : Test de montage de champs et de maillages dans un fichier vierge
132  */
133 
134 
135  /* Creation du fichier test20.med */
136  if ((fid = MEDfileOpen("test20.med",MODE_ACCES)) < 0) {
137  MESSAGE("Erreur a la creation du fichier test20.med");
138  return -1;
139  }
140  printf("On cree le fichier test20.med \n");
141 
142  /* Montage dans test20.med de tous les maillages de test20-0.med */
143  mid2 = MEDfileObjectsMount(fid,"test20-0.med",MED_MESH);
144  if (mid2 < 0) {
145  MESSAGE("Echec du montage de test20-0.med");
146  return -1;
147  }
148  printf("On monte les maillages du fichier test20-0.med dans le fichier test20.med \n");
149 
150  /* Lecture du nombre de maillages */
151  nmaa = MEDnMesh(fid);
152  if (nmaa < 0) {
153  MESSAGE("Erreur lors de la lecture du nombre de maillage");
154  return -1;
155  }
156  printf("Nombre de maillages apres montage de test20-0.med : "IFORMAT"\n",nmaa);
157 
158  /* Montage dans test20.med de tous les champs de test10.med */
159  mid = MEDfileObjectsMount(fid,"test10.med",MED_FIELD);
160  if (mid < 0) {
161  MESSAGE("Echec du montage de test10.med");
162  return -1;
163  }
164  printf("On monte les champs du fichier test10.med dans le fichier test20.med \n");
165 
166  /* Combien de champs dans le fichier "test20.med" apres le montage */
167  if ((ncha = MEDnField(fid)) < 0) {
168  MESSAGE("Erreur lors de la lecture du nombre de champ");
169  return -1;
170  }
171  printf("Nombre de champs dans test20.med apres montage : "IFORMAT" \n",ncha);
172 
173  /* Demontage du fichier test10.med */
174  if (MEDfileObjectsUnmount(fid,mid,MED_FIELD) < 0) {
175  MESSAGE("Echec du demontage de test10.med");
176  return -1;
177  }
178  printf("On demonte le fichier test10.med dans test20.med \n");
179 
180  /* Demontage du fichier test20-0.med */
181  if (MEDfileObjectsUnmount(fid,mid2,MED_MESH) < 0) {
182  MESSAGE("Echec du demontage de test20-0.med");
183  return -1;
184  }
185  printf("On demonte le fichier test20-0.med du test20.med\n");
186 
187  /* Fermeture du fichier test20.med */
188  if (MEDfileClose(fid) < 0) {
189  MESSAGE("Erreur de la fermeture du fichier");
190  return -1;
191  }
192  printf("On ferme le fichier test20.med \n");
193 
194  /*
195  * Phase 3 : Test de montage de champs et de maillages dans un fichier vierge à
196  * partir de deux fichiers HDFs contenant une sous arborescence MED avec Champs et Maillages
197  */
198 
199  /* Creation du fichier test20b.med */
200  if ((fid = MEDfileOpen("test20b.med",MODE_ACCES)) < 0) {
201  MESSAGE("Erreur a la creation du fichier test20.med");
202  return -1;
203  }
204  printf("On cree le fichier test20b.med \n");
205 
206  /* Ouverture du fichier HDF test2-med.hdf */
207  if ((fid2 = MEDfileOpen("test2-med.hdf",MED_ACC_RDONLY)) < 0) {
208  MESSAGE("Erreur a l'ouverture du fichier test2-med.hdf");
209  return -1;
210  }
211  printf("On ouvre le fichier test2-med.hdf \n");
212 
213  /* Montage dans test20b.med de tous les maillages de test20-0.med */
214  mid2 = MEDfileObjectsMountById(fid,fid2,"/byid2",MED_MESH);
215  if (mid2 < 0) {
216  MESSAGE("Echec du montage de test2-med.hdf");
217  return -1;
218  }
219  printf("On monte les maillages du fichier test2-med.hdf dans le fichier test20b.med \n");
220 
221  /* Lecture du nombre de maillages */
222  nmaa = MEDnMesh(fid);
223  if (nmaa < 0) {
224  MESSAGE("Erreur lors de la lecture du nombre de maillage");
225  return -1;
226  }
227  printf("Nombre de maillages apres montage de test2-med.hdf : "IFORMAT"\n",nmaa);
228 
229  /* Ouverture du fichier HDF test10-med.hdf */
230  if ((fid3 = MEDfileOpen("test10-med.hdf",MED_ACC_RDONLY)) < 0) {
231  MESSAGE("Erreur a l'ouverture du fichier test10-med.hdf");
232  return -1;
233  }
234  printf("On ouvre le fichier test10-med.hdf \n");
235 
236  /* Montage dans test20b.med de tous les champs de test10-med.hdf */
237  mid = MEDfileObjectsMountById(fid,fid3,"/byid10/",MED_FIELD);
238  if (mid < 0) {
239  MESSAGE("Echec du montage de test10-med.hdf");
240  return -1;
241  }
242  printf("On monte les champs du fichier test10-med.hdf dans le fichier test20b.med \n");
243 
244  /* Combien de champs dans le fichier "test20b.med" apres le montage */
245  if ((ncha = MEDnField(fid)) < 0) {
246  MESSAGE("Erreur lors de la lecture du nombre de champ");
247  return -1;
248  }
249  printf("Nombre de champs dans test20b.med apres montage : "IFORMAT" \n",ncha);
250 
251  /* Demontage du fichier test10-med.hdf */
252  if (MEDfileObjectsUnmount(fid,mid,MED_FIELD) < 0) {
253  MESSAGE("Echec du demontage de test10-med.hdf");
254  return -1;
255  }
256  printf("On demonte et on ferme le fichier test10-med.hdf de test20b.med \n");
257 
258  /* Demontage du fichier test2-med.hdf */
259  if (MEDfileObjectsUnmount(fid,mid2,MED_MESH) < 0) {
260  MESSAGE("Echec du demontage de test2-med.hdf");
261  return -1;
262  }
263  printf("On demonte et on ferme le fichier test2-med.hdf de test20b.med\n");
264 
265  /* Fermeture du fichier test20b.med */
266  if (MEDfileClose(fid) < 0) {
267  MESSAGE("Erreur de la fermeture du fichier");
268  return -1;
269  }
270  printf("On ferme le fichier test20b.med \n");
271 
272 
273  return 0;
274 }
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
main
int main(int argc, char **argv)
Definition: test20.c:36
MED_MESH
Definition: med.h:188
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
MODE_ACCES
#define MODE_ACCES
Definition: test20.c:33
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
med_utils.h