MED fichier

libmedimport.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 /* L'utilisation des med_utils n'est pas optionelle
19 dans l'outil medimport, elle revet cependant deux
20 formes :
21 - Si -DWITH_EXCEPTION EXITIF renvoie une exception MEDerreur
22 - Sinon exécute l'instruction return */
23
24
25 #ifdef HAVE_STDBOOL_H
26 # include <stdbool.h>
27 #else
28 # ifndef HAVE__BOOL
29 # ifdef __cplusplus
30 typedef bool _Bool;
31 # else
32 # define _Bool signed char
33 # endif
34 # endif
35 # define bool _Bool
36 # define false 0
37 # define true 1
38 # define __bool_true_false_are_defined 1
39 #endif
40
41 /* #ifdef __cplusplus */
42 /* extern "C" { */
43 /* #endif */
44
45 /* Pour faciliter la detection autotools */
46 int HAVE_MEDimport=1;
47
48 /*Inclusion des .h de la version de la bibliothèque courante*/
49 #include <med_config.h>
50 #include <med.h>
51 #include <med_outils.h>
52
53 #include <stdio.h>
54 #include <string.h>
55
56 /*TODO : En attendant une conversion totale de l'outil libmedimport en 3.0*/
57 #include <2.3.6/med23v30.h>
58 #include <2.3.6/med23v30_proto.h>
59 #include "2.3.6/med23v30_misc.h"
60
61 #ifdef PPRO_NT
62 # include <stdlib.h>
63 #else
64 # include <libgen.h>
65 #endif
66
67 /* #ifdef __cplusplus */
68 /* } */
69 /* #endif */
70
71 /*Inclusion des .h spécifiques à medimport */
72
73 /* Interface publique de l'outil medimport */
74 /* MEDimport.h == MEDimport.hxx */
75 #include "MEDimport.h"
76 #include "MAJ_version.h"
77
78 /* Interfaces privées à l'outil medimport */
79 #include "MAJ_21_22.h"
80 #include "MAJ_231_232.h"
81 #include "MAJ_236_300.h"
82 #include "MAJ_300_310.h"
83 #include "MAJ_310_320.h"
84 #include "MAJ_320_330.h"
85 #include "MAJ_400_410.h"
86
87
88 #ifdef __cplusplus
89 extern "C" void _MEDmodeErreurVerrouiller(void);
90 #endif
91
92
93
94 int MEDimport(char * filein, char * fileout) {
95
96 med_idt fid, gid;
97 med_err ret;
98 med_int majeur, mineur, release;
99 med_bool hdfok=MED_FALSE;
100 med_bool medok=MED_FALSE;
101 char *_fileout,*tmp=NULL;
102 int _fileoutsize;
103 bool hasfileout=false;
104 char *commande;
105 med_int nprofil;
106 char chemin_profils[MED_PROFILE_GRP_SIZE+1];
107 char chemin_liens[MED_TAILLE_LIENS+1];
108 char version[9];
109 int MAJ_21_22 = 0, MAJ_231_232 = 0, MAJ_236_300 = 0, MAJ_300_310 = 0, MAJ_310_320 = 0, MAJ_320_330 = 0, MAJ_400_410 = 0 ;
110 #ifdef PPRO_NT
111 char *drive, *dir, *ext;
112 #endif
113 unsigned char reponse='o';
114 med_bool _noversion=MED_FALSE;
115
116 EXIT_IF(filein == NULL,"Le nom du fichier d'entrée est vide : ", filein);
117
118 hasfileout = strcmp(fileout,"");
119 if ( hasfileout ) {
120 _fileoutsize = strlen(fileout);
121 _fileout = fileout;
122 } else {
123 _fileoutsize = strlen(filein)+strlen(PACKAGE_VERSION);
124 tmp = (char *) malloc(sizeof(char)*(_fileoutsize+1));
125 strcpy(tmp,filein);
126 strcat(tmp,PACKAGE_VERSION);
127 #ifdef PPRO_NT
128 _splitpath( tmp, drive, dir, _fileout, ext );
129 #else
130 _fileout = basename(tmp);
131 #endif
132 _fileoutsize = strlen(_fileout);
133
134 }
135
136 /* Test du format du fichier */
137
138 ret = MEDfileCompatibility(filein,&hdfok,&medok);
139
140 if (ret < 0 ) {
141 fprintf(stdout,">>> Attention le fichier %s ne contient pas de numéro de version. \n",filein);
142 fprintf(stdout,">>> Le fichier %s est supposé être en version 2.1.1. \n",filein);
143 /* Pas d'interactif dans une bibliothèque !*/
144 /* fprintf(stdout,">>> Voulez-vous essayer une conversion d'un fichier < 2.2 (o/n) ? "); */
145 /* scanf("%c",&reponse); */
146 if ( (reponse != 'o') && (reponse != 'O') && (reponse != 'y') && (reponse != 'Y') ) {
147 EXIT_IF(MEDfileCompatibility(filein,&hdfok,&medok) < 0,
148 "Erreur d'appel de MEDfileCompatibility : ", filein);
149 }
150 _noversion = MED_TRUE;
151 }
152 EXIT_IF( !hdfok ,
153 "Le fichier d'entrée n'est pas dans un format HDF compatible : ", filein);
154
155 /* EXIT_IF( !medok , */
156 /* "MEDimport ne gère pas le format MED de ce fichier : ", filein); */
157
158 /* Creation et ouverture du fichier que l'on va convertir au format MED actuel */
159 commande = (char *) malloc(sizeof(char)*(strlen("cp ")+strlen(filein)+
160 strlen(" ")+_fileoutsize + 4 +1 ) );
161 EXIT_IF(commande == NULL,NULL,NULL);
162 strcpy(commande,"cp \"");
163 strcat(commande,filein);
164 strcat(commande,"\" \"");
165 strcat(commande,_fileout);
166 strcat(commande,"\"");
167 fprintf(stdout,">>> Creation du fichier %s : %s \n",_fileout,commande);
168 system(commande);
169 free(commande);
170 commande = (char *) malloc(sizeof(char)*(strlen("chmod u+w \"") + _fileoutsize +1 +1 ) );
171 EXIT_IF(commande == NULL,NULL,NULL);
172 strcpy(commande,"chmod u+w \"");
173 strcat(commande,_fileout);
174 strcat(commande,"\"");
175 fprintf(stdout,">>> Chmod +w du fichier %s : %s \n",_fileout,commande);
176 system(commande);
177 free(commande);
178
179 fid = MEDfileOpen(_fileout,MED_ACC_RDWR);
180 EXIT_IF(fid < 0,"Ouverture du fichier : ", _fileout);
181
182 /* Verification du numero de version */
183 if (! _noversion)
184 ret = MEDfileNumVersionRd(fid,&majeur,&mineur,&release);
185 else {
186 ret=0;
187 majeur=2;
188 mineur=1;
189 release=1;
190 }
191 sprintf(version, IFORMAT"_"IFORMAT"_"IFORMAT, majeur, mineur, release);
192 EXIT_IF(ret < 0,"Lecture du numero de version de MED-fichier",NULL);
193 if (strcmp(version, "2_2_0") < 0)
194 MAJ_21_22 = 1;
195 if (strcmp(version, "2_3_2") < 0)
196 MAJ_231_232 = 1;
197 if (strcmp(version, "3_0_0") < 0)
198 MAJ_236_300 = 1;
199 if (strcmp(version, "3_1_0") < 0)
200 MAJ_300_310 = 1;
201 if (strcmp(version, "3_2_0") < 0)
202 MAJ_310_320 = 1;
203 if (strcmp(version, "3_3_0") < 0)
204 MAJ_320_330 = 1;
205 if (strcmp(version, "4_0_0") < 0)
206 MAJ_400_410 = 1;
207
208 /* Ne pas oublier que la version cible du fichier à convertir est celui de la bibliothèque. */
209 if (MAJ_400_410 == 0) {
210 fprintf(stdout,"Le fichier %s est déjà au bon format !!! \n",_fileout);
211 ret = MEDfileClose(fid);
212 EXIT_IF(ret < 0,"Fermeture du fichier",filein);
213 return 0;
214 }
215
216 /* On avertit qu'on commence la conversion */
217 fprintf(stdout,">>> Lancement de la normalisation du fichier selon le format " PACKAGE_VERSION " ...\n");
218
219 /* On inhibe le gestionnaire d'erreur HDF5 */
220 _MEDmodeErreurVerrouiller();
221
222 /* Mise a jour du numero de version */
223 fprintf(stdout,"- Lancement de la mise à jour du numéro de version ... \n");
224 /* La mise à jour MAJ_version(fid); doit être différée pour que les majs des fichiers anciens
225 fonctionnent correctement*/
226 /* MAJ_version(fid); */
227 MAJ_write_version_num(fid,2,3,6);
228 fprintf(stdout," Numéro de version : ... OK ... \n");
229
230 if (MAJ_21_22) {
231
232 /* Mise a jour des maillages : type = MED_NON_STRUCTURE, description, ... */
233 fprintf(stdout,"- Lancement de la mise à jour des maillages (21_22)... \n");
234 MAJ_21_22_maillages(fid);
235 fprintf(stdout," Maillage(s) : ... OK ...\n");
236
237 /* Mise a jour des champs */
238 fprintf(stdout,"- Lancement de la mise à jour des champs de résultats (21_22)... \n");
239 MAJ_21_22_champs(fid);
240 fprintf(stdout," Champs(s) : ... OK ...\n");
241
242 /* Mise a jour des profils eventuels */
243 nprofil = MEDnProfil(fid);
244 if (nprofil > 0) {
245 fprintf(stdout,"- Lancement de la mise à jour des profils (21_22)... \n");
246 MAJ_21_22_profils(fid,nprofil);
247 fprintf(stdout," Profils(s) : ... OK ...\n");
248 } else {
249 strncpy(chemin_profils,MED_PROFILE_GRP,MED_PROFILE_GRP_SIZE-1);
250 chemin_profils[MED_PROFILE_GRP_SIZE-1] = '\0';
251 gid = _MEDdatagroupCreer(fid,chemin_profils);
252 EXIT_IF(gid < 0,"Creation du groupe HDF sur les profils",chemin_profils);
253 ret = _MEDdatagroupFermer(gid);
254 EXIT_IF(ret < 0,"Fermeture du groupe HDF sur les profils",chemin_profils);
255 }
256
257 /* On cree le groupe HDF pour les liens */
258 strncpy(chemin_liens,MED_LIENS,MED_TAILLE_LIENS-1);
259 chemin_liens[MED_TAILLE_LIENS-1] = '\0';
260 gid = _MEDdatagroupCreer(fid,chemin_liens);
261 EXIT_IF(gid < 0,"Creation du groupe HDF sur les liens",chemin_liens);
262 ret = _MEDdatagroupFermer(gid);
263 EXIT_IF(ret < 0,"Fermeture du groupe HDF sur les liens",chemin_liens);
264 }
265
266 if (MAJ_231_232) {
267 /* Mise a jour des champs */
268 fprintf(stdout,"- Lancement de la mise à jour des champs de résultats (231_232)... \n");
269 MAJ_231_232_champs(fid);
270 fprintf(stdout," Champs(s) : ... OK ...\n");
271 fprintf(stdout,"- Lancement de la mise à jour des noms de maillages (231_232)... \n");
272 MAJ_231_232_maillages(fid);
273 fprintf(stdout," Noms(s) de maillage(s): ... OK ...\n");
274 }
275
276 if (MAJ_236_300) {
277 /* Le système de cache de version a été developpé à partir de la 3.0*/
278 /* Initialise le cache sur une 2.3.6 (cas d'absence d'INFO)*/
279 _MEDfileVersion(fid);
280
281 /* Mise a jour des champs */
282 fprintf(stdout,"- Lancement de la mise à jour des champs de résultats (236_300)... \n");
283 MAJ_236_300_champs(fid);
284 fprintf(stdout," Champs(s) : ... OK ...\n");
285
286 /* MAJ_version(fid); */
287
288 fprintf(stdout,"- Lancement de la mise à jour des maillages (236_300)... \n");
289 MAJ_236_300_maillages(fid);
290 fprintf(stdout," Maillage(s): ... OK ...\n");
291
292 /* MAJ_version(fid); */
293
294 }
295
296 if (MAJ_300_310) {
297 /* Le système de cache de version a été developpé à partir de la 3.0*/
298 /* Initialise le cache sur une 3.0.8 (cas d'absence d'INFO)*/
299 /* s'il n'a pas déjà été instanciée ds les MAJ précédentes */
300 MAJ_write_version_num(fid,3,0,8);
301 _MEDfileVersion(fid);
302 /* Si le cache était dèjà instancié, met à jour le cache */
303 MAJ_version_num(fid,3,0,8);
304
305 /* Mise a jour des champs */
306 fprintf(stdout,"- Lancement de la mise à jour des champs de résultats (300_310) ... \n");
307 MAJ_300_310_champs(fid);
308 fprintf(stdout," Champs(s) : ... OK ...\n");
309
310
311 }
312
313 if (MAJ_310_320) {
314 /* Le système de cache de version a été developpé à partir de la 3.0*/
315 /* Initialise le cache sur une 3.1.0 (cas d'absence d'INFO)*/
316 /* s'il n'a pas été déjà été instanciée ds les MAJ_ précédentes */
317 MAJ_write_version_num(fid,3,1,0);
318 _MEDfileVersion(fid);
319 /* Si le cache était dèjà instancié, met à jour le cache */
320 MAJ_version_num(fid,3,1,0);
321
322 /* Mise a jour des familles/groupes */
323 fprintf(stdout,"- Lancement de la mise à jour des familles/groupes (310_320) ... \n");
324 MAJ_310_320_familles(fid);
325 fprintf(stdout," Famille(s)/Groupe(s) : ... OK ...\n");
326 }
327
328 if (MAJ_320_330) {
329 /* Le système de cache de version a été developpé à partir de la 3.0*/
330 /* Initialise le cache sur une 3.2.1 (cas d'absence d'INFO)*/
331 /* s'il n'a pas été déjà été instanciée ds les MAJ_ précédentes */
332 MAJ_write_version_num(fid,3,2,1);
333 _MEDfileVersion(fid);
334 /* Si le cache était dèjà instancié, met à jour le cache */
335 MAJ_version_num(fid,3,2,1);
336
337 /* Mise a jour des champs */
338 fprintf(stdout,"- Lancement de la mise à jour des champs entiers (321_330) ... \n");
339 MAJ_320_330_champs(fid);
340 fprintf(stdout," Champs entiers : ... OK ...\n");
341 }
342
343 if (MAJ_400_410) {
344 /* Le système de cache de version a été developpé à partir de la 3.0*/
345 /* Initialise le cache sur une 4.0.0 (cas d'absence d'INFO)*/
346 /* s'il n'a pas été déjà été instanciée ds les MAJ_ précédentes */
347 MAJ_write_version_num(fid,4,0,0);
348 _MEDfileVersion(fid);
349 /* Si le cache était dèjà instancié, met à jour le cache */
350 MAJ_version_num(fid,4,0,0);
351
352 /* Mise a jour des champs */
353 fprintf(stdout,"- Lancement de la mise à jour des meta-données sur les champs (400_410) ... \n");
354 MAJ_400_410_champs(fid);
355 fprintf(stdout," Champs meta-data : ... OK ...\n");
356 }
357
358 /* A l'écriture d'une nouvelle version de MAJ ex 310_320,
359 il est necessaire de revisiter les appels à MAJ_version(fid) pour
360 les remplacer par les appels MAJ_version(fid,3,1,Lastest31z) */
361
362 MAJ_version(fid);
363 MAJ_write_version_num(fid,MED_NUM_MAJEUR,MED_NUM_MINEUR,MED_NUM_RELEASE);
364
365 /* Fermeture du fichier */
366 ret = MEDfileClose(fid);
367 EXIT_IF(ret < 0,"Fermeture du fichier",_fileout);
368
369 /* On avertit que c'est fini */
370 fprintf(stdout,">>> Conversion du fichier %s au format MED V" PACKAGE_VERSION " terminée\n",
371 _fileout);
372
373 /* On libere la memoire */
374 if (!hasfileout) free(tmp);
375
376 return 0;
377 }
378
_MEDdatagroupFermer
MEDC_EXPORT med_err _MEDdatagroupFermer(med_idt id)
PACKAGE_VERSION
#define PACKAGE_VERSION
Definition: med_config.h:161
MED_PROFILE_GRP_SIZE
#define MED_PROFILE_GRP_SIZE
Definition: med_outils.h:234
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_idt
hid_t med_idt
Definition: med.h:331
MAJ_300_310.h
MAJ_310_320_familles
void MAJ_310_320_familles(med_idt fid)
MAJ_21_22_champs
void MAJ_21_22_champs(med_idt fid)
MAJ_231_232_maillages
void MAJ_231_232_maillages(med_idt fid)
med_err
herr_t med_err
Definition: med.h:332
MAJ_21_22_maillages
void MAJ_21_22_maillages(med_idt fid)
MAJ_21_22.h
MED_NUM_RELEASE
#define MED_NUM_RELEASE
Definition: med.h:67
MED_TRUE
Definition: med.h:260
MED_FALSE
Definition: med.h:260
MAJ_231_232.h
HAVE_MEDimport
int HAVE_MEDimport
Definition: libmedimport.c:46
MAJ_300_310_champs
void MAJ_300_310_champs(med_idt fid)
med_int
int med_int
Definition: med.h:342
MED_ACC_RDWR
Definition: med.h:121
MAJ_236_300_maillages
void MAJ_236_300_maillages(med_idt fid)
med.h
MAJ_231_232_champs
void MAJ_231_232_champs(med_idt fid)
med_bool
med_bool
Definition: med.h:260
MAJ_version
void MAJ_version(med_idt fid)
Definition: MAJ_version.c:60
MED_LIENS
#define MED_LIENS
Definition: med_outils.h:247
MAJ_400_410.h
MAJ_236_300.h
IFORMAT
#define IFORMAT
Definition: med_utils.h:145
MEDfileNumVersionRd
MEDC_EXPORT med_err MEDfileNumVersionRd(const med_idt fid, med_int *const major, med_int *const minor, med_int *const release)
Lecture du numéro de version de la bibliothèque MED utilisée pour créer le fichier.
Definition: MEDfileNumVersionRd.c:34
_MEDdatagroupCreer
MEDC_EXPORT med_idt _MEDdatagroupCreer(med_idt pid, const char *const nom)
MAJ_310_320.h
MAJ_21_22_profils
void MAJ_21_22_profils(med_idt fid, med_int nprofil)
MAJ_400_410_champs
void MAJ_400_410_champs(med_idt fid)
MEDfileCompatibility
MEDC_EXPORT med_err MEDfileCompatibility(const char *const filename, med_bool *const hdfok, med_bool *const medok)
Vérification de la compatibilité d'un fichier avec HDF et MED.
Definition: MEDfileCompatibility.c:34
MED_TAILLE_LIENS
#define MED_TAILLE_LIENS
Definition: med_outils.h:248
MEDfileClose
MEDC_EXPORT med_err MEDfileClose(med_idt fid)
Fermeture d'un fichier MED.
Definition: MEDfileClose.c:30
med_outils.h
MED_PROFILE_GRP
#define MED_PROFILE_GRP
Definition: med_outils.h:233
MAJ_236_300_champs
void MAJ_236_300_champs(med_idt fid)
med_config.h
EXIT_IF
#define EXIT_IF(expression, message, arg)
Definition: med_utils.h:343
MEDimport.h
MAJ_version.h
_MEDfileVersion
MEDC_EXPORT med_file_version _MEDfileVersion(const med_idt oid)
MEDimport
int MEDimport(char *filein, char *fileout)
Definition: libmedimport.c:94
MAJ_320_330.h
MAJ_320_330_champs
void MAJ_320_330_champs(med_idt fid)
Definition: MAJ_320_330_champs.c:282
MED_NUM_MINEUR
#define MED_NUM_MINEUR
Definition: med.h:66
MAJ_write_version_num
void MAJ_write_version_num(med_idt fid, const int majeur, const int mineur, const int release)
Definition: MAJ_version.c:36
MAJ_version_num
void MAJ_version_num(med_idt fid, const int majeur, const int mineur, const int release)
Definition: MAJ_version.c:23
_Bool
#define _Bool
Definition: libmedimport.c:32
_MEDmodeErreurVerrouiller
MEDC_EXPORT void _MEDmodeErreurVerrouiller(void)
MED_NUM_MAJEUR
#define MED_NUM_MAJEUR
Definition: med.h:65