MED fichier
libmedimport.c
Aller à la documentation de ce fichier.
1 /* This file is part of MED.
2  *
3  * COPYRIGHT (C) 1999 - 2025 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 */
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 #include "MAJ_500_510.h"
87 
88 
89 #ifdef __cplusplus
90 extern "C" void _MEDmodeErreurVerrouiller(void);
91 #endif
92 
93 
94 
95 int MEDimport(const char * filein, const char * fileout) {
96 
97  med_idt fid, gid;
98  med_err ret;
99  med_int majeur, mineur, release;
100  med_bool hdfok=MED_FALSE;
101  med_bool medok=MED_FALSE;
102  const char *_fileout;
103  char *tmp=NULL;
104  int _fileoutsize;
105  bool hasfileout=false;
106  char *commande;
107  med_int nprofil;
108  char chemin_profils[MED_PROFILE_GRP_SIZE+1];
109  char chemin_liens[MED_TAILLE_LIENS+1];
110  char version[9];
111  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, MAJ_500_510 = 0 ;
112 #ifdef PPRO_NT
113  char *drive, *dir, *ext;
114 #endif
115  unsigned char reponse='o';
116  med_bool _noversion=MED_FALSE;
117 
118  EXIT_IF(filein == NULL,"Le nom du fichier d'entrée est vide : ", filein);
119 
120  hasfileout = strcmp(fileout,"");
121  if ( hasfileout ) {
122  _fileoutsize = strlen(fileout);
123  _fileout = fileout;
124  } else {
125  _fileoutsize = strlen(filein)+strlen(PACKAGE_VERSION);
126  tmp = (char *) malloc(sizeof(char)*(_fileoutsize+1));
127  strcpy(tmp,filein);
128  strcat(tmp,PACKAGE_VERSION);
129 #ifdef PPRO_NT
130  _splitpath( tmp, drive, dir, _fileout, ext );
131 #else
132  _fileout = basename(tmp);
133 #endif
134  _fileoutsize = strlen(_fileout);
135 
136  }
137 
138  /* Test du format du fichier */
139 
140  ret = MEDfileCompatibility(filein,&hdfok,&medok);
141 
142  if (ret < 0 ) {
143  fprintf(stdout,">>> Attention le fichier %s ne contient pas de numéro de version. \n",filein);
144  fprintf(stdout,">>> Le fichier %s est supposé être en version 2.1.1. \n",filein);
145  /* Pas d'interactif dans une bibliothèque !*/
146 /* fprintf(stdout,">>> Voulez-vous essayer une conversion d'un fichier < 2.2 (o/n) ? "); */
147 /* scanf("%c",&reponse); */
148  if ( (reponse != 'o') && (reponse != 'O') && (reponse != 'y') && (reponse != 'Y') ) {
149  EXIT_IF(MEDfileCompatibility(filein,&hdfok,&medok) < 0,
150  "Erreur d'appel de MEDfileCompatibility : ", filein);
151  }
152  _noversion = MED_TRUE;
153  }
154  EXIT_IF( !hdfok ,
155  "Le fichier d'entrée n'est pas dans un format HDF compatible : ", filein);
156 
157 /* EXIT_IF( !medok , */
158 /* "MEDimport ne gère pas le format MED de ce fichier : ", filein); */
159 
160  /* Creation et ouverture du fichier que l'on va convertir au format MED actuel */
161  commande = (char *) malloc(sizeof(char)*(strlen("cp ")+strlen(filein)+
162  strlen(" ")+_fileoutsize + 4 +1 ) );
163  EXIT_IF(commande == NULL,NULL,NULL);
164  strcpy(commande,"cp \"");
165  strcat(commande,filein);
166  strcat(commande,"\" \"");
167  strcat(commande,_fileout);
168  strcat(commande,"\"");
169  fprintf(stdout,">>> Creation du fichier %s : %s \n",_fileout,commande);
170  system(commande);
171  free(commande);
172  commande = (char *) malloc(sizeof(char)*(strlen("chmod u+w \"") + _fileoutsize +1 +1 ) );
173  EXIT_IF(commande == NULL,NULL,NULL);
174  strcpy(commande,"chmod u+w \"");
175  strcat(commande,_fileout);
176  strcat(commande,"\"");
177  fprintf(stdout,">>> Chmod +w du fichier %s : %s \n",_fileout,commande);
178  system(commande);
179  free(commande);
180 
181  /*TODO: vérifier le comportement d'ouverture RW de fichier hdf au format 1.6 */
182  fid = MEDfileOpen(_fileout,MED_ACC_RDWR);
183  EXIT_IF(fid < 0,"Ouverture du fichier : ", _fileout);
184 
185  /* Verification du numero de version */
186  if (! _noversion)
187  ret = MEDfileNumVersionRd(fid,&majeur,&mineur,&release);
188  else {
189  ret=0;
190  majeur=2;
191  mineur=1;
192  release=1;
193  }
194  sprintf(version, IFORMAT"_"IFORMAT"_"IFORMAT, majeur, mineur, release);
195  EXIT_IF(ret < 0,"Lecture du numero de version de MED-fichier",NULL);
196  if (strcmp(version, "2_2_0") < 0)
197  MAJ_21_22 = 1;
198  if (strcmp(version, "2_3_2") < 0)
199  MAJ_231_232 = 1;
200  if (strcmp(version, "3_0_0") < 0)
201  MAJ_236_300 = 1;
202  if (strcmp(version, "3_1_0") < 0)
203  MAJ_300_310 = 1;
204  if (strcmp(version, "3_2_0") < 0)
205  MAJ_310_320 = 1;
206  if (strcmp(version, "3_3_0") < 0)
207  MAJ_320_330 = 1;
208  if (strcmp(version, "4_1_0") < 0)
209  MAJ_400_410 = 1;
210  if (strcmp(version, "5_1_0") < 0)
211  MAJ_500_510 = 1;
212 
213  /* Ne pas oublier que la version cible du fichier à convertir est celui de la bibliothèque. */
214  /* if (MAJ_400_410 == 0) { */
215  /* fprintf(stdout,"Le fichier %s est au moins au format 4.1.0. \n",_fileout); */
216  /* /\* Attention si le fichier effectue des maj inférieures le fichier crée sera indiqué avec la version *\/ */
217  /* /\* de la bibliothque en cours *\/ */
218  /* /\* Celà n'a donc pas de sens de l'empêcher de faire une maj *\/ */
219  /* /\* fprintf(stdout,"L'import au format " PACKAGE_VERSION " est à venir... \n",_fileout); *\/ */
220  /* ret = MEDfileClose(fid); */
221  /* EXIT_IF(ret < 0,"Fermeture du fichier",filein); */
222  /* return 0; */
223  /* } */
224 
225  /* On avertit qu'on commence la conversion */
226  fprintf(stdout,">>> Lancement de la normalisation du fichier selon le format " PACKAGE_VERSION " ...\n");
227 
228  /* On inhibe le gestionnaire d'erreur HDF5 */
230 
231  /* Mise a jour du numero de version */
232  fprintf(stdout,"- Lancement de la mise à jour du numéro de version ... \n");
233  /* La mise à jour MAJ_version(fid); doit être différée pour que les majs des fichiers anciens
234  fonctionnent correctement*/
235  /* MAJ_version(fid); */
236  MAJ_write_version_num(fid,2,3,6);
237  fprintf(stdout," Numéro de version : ... OK ... \n");
238 
239  if (MAJ_21_22) {
240 
241  /* Mise a jour des maillages : type = MED_NON_STRUCTURE, description, ... */
242  fprintf(stdout,"- Lancement de la mise à jour des maillages (21_22)... \n");
243  MAJ_21_22_maillages(fid);
244  fprintf(stdout," Maillage(s) : ... OK ...\n");
245 
246  /* Mise a jour des champs */
247  fprintf(stdout,"- Lancement de la mise à jour des champs de résultats (21_22)... \n");
248  MAJ_21_22_champs(fid);
249  fprintf(stdout," Champs(s) : ... OK ...\n");
250 
251  /* Mise a jour des profils eventuels */
252  nprofil = MEDnProfil(fid);
253  if (nprofil > 0) {
254  fprintf(stdout,"- Lancement de la mise à jour des profils (21_22)... \n");
255  MAJ_21_22_profils(fid,nprofil);
256  fprintf(stdout," Profils(s) : ... OK ...\n");
257  } else {
258  strncpy(chemin_profils,MED_PROFILE_GRP,MED_PROFILE_GRP_SIZE-1);
259  chemin_profils[MED_PROFILE_GRP_SIZE-1] = '\0';
260  gid = _MEDdatagroupCreer(fid,chemin_profils);
261  EXIT_IF(gid < 0,"Creation du groupe HDF sur les profils",chemin_profils);
262  ret = _MEDdatagroupFermer(gid);
263  EXIT_IF(ret < 0,"Fermeture du groupe HDF sur les profils",chemin_profils);
264  }
265 
266  /* On cree le groupe HDF pour les liens */
267  strncpy(chemin_liens,MED_LIENS,MED_TAILLE_LIENS-1);
268  chemin_liens[MED_TAILLE_LIENS-1] = '\0';
269  gid = _MEDdatagroupCreer(fid,chemin_liens);
270  EXIT_IF(gid < 0,"Creation du groupe HDF sur les liens",chemin_liens);
271  ret = _MEDdatagroupFermer(gid);
272  EXIT_IF(ret < 0,"Fermeture du groupe HDF sur les liens",chemin_liens);
273  }
274 
275  if (MAJ_231_232) {
276  /* Mise a jour des champs */
277  fprintf(stdout,"- Lancement de la mise à jour des champs de résultats (231_232)... \n");
278  MAJ_231_232_champs(fid);
279  fprintf(stdout," Champs(s) : ... OK ...\n");
280  fprintf(stdout,"- Lancement de la mise à jour des noms de maillages (231_232)... \n");
282  fprintf(stdout," Noms(s) de maillage(s): ... OK ...\n");
283  }
284 
285  if (MAJ_236_300) {
286  /* Le système de cache de version a été developpé à partir de la 3.0*/
287  /* Initialise le cache sur une 2.3.6 (cas d'absence d'INFO)*/
288  _MEDfileVersion(fid);
289 
290  /* Mise a jour des champs */
291  fprintf(stdout,"- Lancement de la mise à jour des champs de résultats (236_300)... \n");
292  MAJ_236_300_champs(fid);
293  fprintf(stdout," Champs(s) : ... OK ...\n");
294 
295  /* MAJ_version(fid); */
296 
297  fprintf(stdout,"- Lancement de la mise à jour des maillages (236_300)... \n");
299  fprintf(stdout," Maillage(s): ... OK ...\n");
300 
301  /* MAJ_version(fid); */
302 
303  }
304 
305  if (MAJ_300_310) {
306  /* Le système de cache de version a été developpé à partir de la 3.0*/
307  /* Initialise le cache sur une 3.0.8 (cas d'absence d'INFO)*/
308  /* s'il n'a pas déjà été instanciée ds les MAJ précédentes */
309  MAJ_write_version_num(fid,3,0,8);
310  _MEDfileVersion(fid);
311  /* Si le cache était dèjà instancié, met à jour le cache */
312  MAJ_version_num(fid,3,0,8);
313 
314  /* Mise a jour des champs */
315  fprintf(stdout,"- Lancement de la mise à jour des champs de résultats (300_310) ... \n");
316  MAJ_300_310_champs(fid);
317  fprintf(stdout," Champs(s) : ... OK ...\n");
318 
319 
320  }
321 
322  if (MAJ_310_320) {
323  /* Le système de cache de version a été developpé à partir de la 3.0*/
324  /* Initialise le cache sur une 3.1.0 (cas d'absence d'INFO)*/
325  /* s'il n'a pas été déjà été instanciée ds les MAJ_ précédentes */
326  MAJ_write_version_num(fid,3,1,0);
327  _MEDfileVersion(fid);
328  /* Si le cache était dèjà instancié, met à jour le cache */
329  MAJ_version_num(fid,3,1,0);
330 
331  /* Mise a jour des familles/groupes */
332  fprintf(stdout,"- Lancement de la mise à jour des familles/groupes (310_320) ... \n");
334  fprintf(stdout," Famille(s)/Groupe(s) : ... OK ...\n");
335  }
336 
337  if (MAJ_320_330) {
338  /* Le système de cache de version a été developpé à partir de la 3.0*/
339  /* Initialise le cache sur une 3.2.1 (cas d'absence d'INFO)*/
340  /* s'il n'a pas été déjà été instanciée ds les MAJ_ précédentes */
341  MAJ_write_version_num(fid,3,2,1);
342  _MEDfileVersion(fid);
343  /* Si le cache était dèjà instancié, met à jour le cache */
344  MAJ_version_num(fid,3,2,1);
345 
346  /* Mise a jour des champs */
347  fprintf(stdout,"- Lancement de la mise à jour des champs entiers (321_330) ... \n");
348  MAJ_320_330_champs(fid);
349  fprintf(stdout," Champs entiers : ... OK ...\n");
350  }
351 
352  if (MAJ_400_410) {
353  /* Le système de cache de version a été developpé à partir de la 3.0*/
354  /* Initialise le cache sur une 4.0.0 (cas d'absence d'INFO)*/
355  /* s'il n'a pas été déjà été instanciée ds les MAJ_ précédentes */
356  MAJ_write_version_num(fid,4,0,0);
357  _MEDfileVersion(fid);
358  /* Si le cache était dèjà instancié, met à jour le cache */
359  MAJ_version_num(fid,4,0,0);
360  /* Mise a jour des champs */
361  fprintf(stdout,"- Lancement de la mise à jour des meta-données sur les champs (400_410) ... \n");
362  MAJ_400_410_champs(fid);
363  fprintf(stdout," Champs meta-data : ... OK ...\n");
364  }
365 
366  if (MAJ_500_510) {
367  /* Le système de cache de version a été developpé à partir de la 3.0*/
368  /* Initialise le cache sur une 5.0.0 (cas d'absence d'INFO)*/
369  /* s'il n'a pas été déjà été instanciée ds les MAJ_ précédentes */
370  MAJ_write_version_num(fid,5,0,0);
371  _MEDfileVersion(fid);
372  /* Si le cache était dèjà instancié, met à jour le cache */
373  MAJ_version_num(fid,5,0,0);
374  /* Mise a jour des champs */
375  fprintf(stdout,"- Lancement de la mise à jour des meta-données sur les datasets (500_510) ... \n");
377  fprintf(stdout," datasets meta-data : ... OK ...\n");
378  }
379 
380  /* A l'écriture d'une nouvelle version de MAJ ex 310_320,
381  il est necessaire de revisiter les appels à MAJ_version(fid) pour
382  les remplacer par les appels MAJ_version(fid,3,1,Lastest31z) */
383 
384  MAJ_version(fid);
386 
387  /* Fermeture du fichier */
388  ret = MEDfileClose(fid);
389  EXIT_IF(ret < 0,"Fermeture du fichier",_fileout);
390 
391  /* On avertit que c'est fini */
392  fprintf(stdout,">>> Conversion du fichier %s au format MED V" PACKAGE_VERSION " terminée\n",
393  _fileout);
394 
395  /* On libere la memoire */
396  if (!hasfileout) free(tmp);
397 
398  return 0;
399 }
400 
_MEDfileVersion
MEDC_EXPORT med_file_version _MEDfileVersion(const med_idt oid)
MAJ_21_22_profils
void MAJ_21_22_profils(med_idt fid, med_int nprofil)
MED_TAILLE_LIENS
#define MED_TAILLE_LIENS
Definition: med_outils.h:281
MED_FALSE
Definition: med.h:271
MED_NUM_MINEUR
#define MED_NUM_MINEUR
Definition: med.h:74
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_21_22.h
MAJ_310_320_familles
void MAJ_310_320_familles(med_idt fid)
MED_TRUE
Definition: med.h:271
MAJ_236_300_champs
void MAJ_236_300_champs(med_idt fid)
MAJ_300_310_champs
void MAJ_300_310_champs(med_idt fid)
PACKAGE_VERSION
#define PACKAGE_VERSION
Definition: med_config.h:161
MAJ_500_510.h
med_int
int med_int
Definition: med.h:361
med_err
herr_t med_err
Definition: med.h:351
MAJ_320_330.h
MAJ_231_232.h
MED_NUM_MAJEUR
#define MED_NUM_MAJEUR
Definition: med.h:73
MED_LIENS
#define MED_LIENS
Definition: med_outils.h:280
MAJ_500_510_dataset_attr_ILC
void MAJ_500_510_dataset_attr_ILC(med_idt fid)
Definition: MAJ_500_510_dataset_attr_ILC.c:113
MED_PROFILE_GRP
#define MED_PROFILE_GRP
Definition: med_outils.h:266
med_idt
hid_t med_idt
Definition: med.h:350
med_config.h
MEDimport.h
MAJ_version.h
MED_ACC_RDWR
Definition: med.h:131
MAJ_300_310.h
MAJ_320_330_champs
void MAJ_320_330_champs(med_idt fid)
Definition: MAJ_320_330_champs.c:282
MEDfileClose
MEDC_EXPORT med_err MEDfileClose(med_idt fid)
Fermeture d'un fichier MED.
Definition: MEDfileClose.c:30
MED_PROFILE_GRP_SIZE
#define MED_PROFILE_GRP_SIZE
Definition: med_outils.h:267
MAJ_version_num
void MAJ_version_num(med_idt fid, const int majeur, const int mineur, const int release)
Definition: MAJ_version.c:23
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
MAJ_21_22_maillages
void MAJ_21_22_maillages(med_idt fid)
MAJ_231_232_champs
void MAJ_231_232_champs(med_idt fid)
_MEDdatagroupFermer
MEDC_EXPORT med_err _MEDdatagroupFermer(med_idt id)
_MEDdatagroupCreer
MEDC_EXPORT med_idt _MEDdatagroupCreer(med_idt pid, const char *const nom)
med_outils.h
med.h
MED_NUM_RELEASE
#define MED_NUM_RELEASE
Definition: med.h:75
HAVE_MEDimport
int HAVE_MEDimport
Definition: libmedimport.c:46
MAJ_400_410_champs
void MAJ_400_410_champs(med_idt fid)
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
MEDimport
int MEDimport(const char *filein, const char *fileout)
Definition: libmedimport.c:95
MAJ_231_232_maillages
void MAJ_231_232_maillages(med_idt fid)
MAJ_21_22_champs
void MAJ_21_22_champs(med_idt fid)
MAJ_236_300_maillages
void MAJ_236_300_maillages(med_idt fid)
MAJ_310_320.h
MEDfileOpen
MEDC_EXPORT med_idt MEDfileOpen(const char *const filename, const med_access_mode accessmode)
Ouverture d'un fichier MED.
Definition: MEDfileOpen.c:42
MAJ_version
void MAJ_version(med_idt fid)
Definition: MAJ_version.c:60
_Bool
#define _Bool
Definition: libmedimport.c:32
med_bool
med_bool
Definition: med.h:271
MAJ_400_410.h
MAJ_236_300.h
IFORMAT
#define IFORMAT
Definition: med_utils.h:145
_MEDmodeErreurVerrouiller
MEDC_EXPORT void _MEDmodeErreurVerrouiller(void)
EXIT_IF
#define EXIT_IF(expression, message, arg)
Definition: med_utils.h:343