1 /*  This file is part of MED.
2  *
3  *  COPYRIGHT (C) 1999 - 2019  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 
main(int argc,char ** argv)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 }
275