00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 #include "med_config.h"
00021 #include "med_outils.h"
00022 
00023 
00024 
00025 
00026 
00027 #include "med_hdfi21.h"
00028 #include "med21.h"
00029 #include "med_hdfi231.h"
00030 #include "MAJ_21_22.h"
00031 
00032 void MAJ_21_22_noeuds_maillage(med_idt mid, med_int dimension)
00033 {
00034   med_idt nid, gid, tid;
00035   med_float *coo;
00036   char *nom, *unit;
00037   char tmp[MED_TAILLE_PNOM+1];
00038   char *nouvelle_chaine;
00039   med_int n;
00040   med_size dimd[1];
00041   med_err ret;
00042   int i;
00043   hid_t hdf_type;
00044   med_repere repere;
00045 
00046   
00047   nid = _MEDdatagroupOuvrir(mid,(char *)(MED_NOM_NOE));
00048   EXIT_IF(nid < 0,"Ouverture du groupe HDF MED_NOM_NOE",NULL);
00049 
00050   
00051   
00052   
00053   gid = _MEDdatasetOuvrir(nid,(char *)(MED_NOM_COO));
00054   if (gid > 0) 
00055      ret = _MEDattrEntierLire(gid,(char *)(MED_NOM_NBR),&n);
00056   EXIT_IF(gid < 0,"Lecture du nombre de noeuds",NULL);
00057   
00058   
00059   
00060   
00061   hdf_type = H5Dget_type(gid);
00062   EXIT_IF(hdf_type < 0,"Lecture du type HDF de stockage des coordonnées",NULL);
00063   coo = (med_float *) malloc(sizeof(med_float)*n*dimension);
00064   EXIT_IF(coo == NULL,NULL,NULL);
00065   ret = _MED21datasetNumLire(nid,(char *)(MED_NOM_COO),MED_FLOAT64, 
00066                               MED_FULL_INTERLACE,dimension,MED_ALL, 
00067                               0,NULL,MED_NOPG, 
00068                               (unsigned char*) coo,hdf_type); 
00069   EXIT_IF(ret < 0,"Lecture des coordonnées des noeuds",NULL);
00070   dimd[0] = n*dimension;
00071   
00072   
00073   if (! H5Tequal(hdf_type,H5T_NATIVE_DOUBLE)) {
00074     ret = H5Tconvert(hdf_type,H5T_NATIVE_DOUBLE,(hsize_t)*dimd,(void *)coo,NULL,0);
00075     
00076     EXIT_IF(ret < 0,"Conversion des coordonnées des noeuds",NULL);
00077   }
00078   ret = H5Tclose(hdf_type);
00079   EXIT_IF(ret < 0,"Fermeture du data type HDF",NULL);
00080   
00081   ret = _MED231datasetNumEcrire(nid,"TMP",MED_FLOAT64,MED_FULL_INTERLACE,
00082                                 dimension,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,MED_NOPG,dimd,
00083                                 (unsigned char*) coo);
00084   EXIT_IF(ret < 0,"Ecriture des coordonnées des noeuds après conversion",NULL);
00085   free(coo);
00086 
00087   
00088   tid = _MEDdatasetOuvrir(nid,"TMP");
00089   EXIT_IF(tid < 0,"Ouverture du dataset HDF TMP",NULL);
00090   ret = _MEDattrEntierEcrire(tid,(char *)(MED_NOM_NBR),&n);
00091   EXIT_IF(ret < 0,"Ecriture du nombre de noeuds dans le dataset HDF TMP",NULL);
00092   ret = _MEDattrEntierLire(gid,(char *)(MED_NOM_REP),&repere);
00093   EXIT_IF(ret < 0,"Lecture du type de repere des coordonnées", NULL);
00094   ret = _MEDattrEntierEcrire(tid,(char *)(MED_NOM_REP),&repere);
00095   EXIT_IF(ret < 0,"Ecriture du type de répertoire dans le dataset HDF TMP",NULL);
00096 
00097   
00098   nom = (char *) malloc(dimension*ANCIEN_MED_TAILLE_PNOM+1);
00099   EXIT_IF(nom == NULL,NULL,NULL);
00100   unit = (char *) malloc(dimension*ANCIEN_MED_TAILLE_PNOM+1);
00101   EXIT_IF(unit == NULL,NULL,NULL);
00102   nouvelle_chaine = (char *) malloc(dimension*MED_TAILLE_PNOM+1);
00103   EXIT_IF(nouvelle_chaine == NULL,NULL,NULL);
00104   ret = _MEDattrStringLire(gid,(char *)(MED_NOM_NOM),dimension*ANCIEN_MED_TAILLE_PNOM,nom);
00105   EXIT_IF(ret < 0,"Lecture des noms des coordonnées des noeuds",NULL);
00106   ret = _MEDattrStringLire(gid,(char *)(MED_NOM_UNI),dimension*ANCIEN_MED_TAILLE_PNOM,unit);
00107   EXIT_IF(ret < 0,"Lecture des unités des coordonnées des noeuds",NULL);
00108 
00109 
00110   _MED23v30stringConvert(nouvelle_chaine, MED_TAILLE_PNOM,
00111                          nom, ANCIEN_MED_TAILLE_PNOM, dimension );
00112   ret = _MEDattrStringEcrire(tid,(char *)(MED_NOM_NOM),dimension*MED_TAILLE_PNOM,nouvelle_chaine);
00113   EXIT_IF(ret < 0,"Ecriture des nouveaux noms des coordonnées des noeuds",NULL);
00114   _MED23v30stringConvert(nouvelle_chaine, MED_TAILLE_PNOM,
00115                          unit, ANCIEN_MED_TAILLE_PNOM, dimension );
00116 
00117   ret = _MEDattrStringEcrire(tid,(char *)(MED_NOM_UNI),dimension*MED_TAILLE_PNOM,nouvelle_chaine);
00118   EXIT_IF(ret < 0,"Ecriture des nouvelles unités des coordonnées des noeuds",NULL);
00119   free(nom);
00120   free(unit);
00121   free(nouvelle_chaine);
00122 
00123   
00124   ret = _MEDdatasetFermer(gid);
00125   EXIT_IF(ret < 0,"Fermeture du dataset HDF MED_NOM_COO",NULL);
00126   ret = H5Gunlink(nid,(char *)(MED_NOM_COO));
00127   EXIT_IF(ret < 0,"Suppression des anciennes coordonnées",NULL);
00128   ret = _MEDdatasetFermer(tid);
00129   EXIT_IF(ret < 0,"Fermeture du dataset HDF TMP",NULL);
00130   ret = H5Gmove(nid,"TMP",(char *)(MED_NOM_COO));
00131   EXIT_IF(ret < 0,"Mise en place des nouvelles coordonnées",NULL);
00132 
00133   
00134   nom = (char *) malloc(n*ANCIEN_MED_TAILLE_PNOM+1);
00135   EXIT_IF(nom == NULL,NULL,NULL);
00136   nouvelle_chaine = (char *) malloc(n*MED_TAILLE_PNOM+1);
00137   EXIT_IF(nouvelle_chaine == NULL,NULL,NULL);
00138   ret = _MEDdatasetStringLire(nid,(char *)(MED_NOM_NOM),nom);
00139   if (ret == 0) {
00140     MAJ_21_22_chaine(nom,nouvelle_chaine,n);
00141     H5Gunlink(nid,(char *)(MED_NOM_NOM));
00142     dimd[0] = n*MED_TAILLE_PNOM+1;
00143     ret = _MEDdatasetStringEcrire(nid,(char *)(MED_NOM_NOM),dimd,nouvelle_chaine);  
00144     EXIT_IF(ret < 0,"Ecriture des nouveaux noms des noeuds",NULL);  
00145     gid = _MEDdatasetOuvrir(nid,(char *)(MED_NOM_NOM));
00146     ret = _MEDattrEntierEcrire(gid,(char *)(MED_NOM_NBR),&n);
00147     ret = _MEDdatasetFermer(gid);
00148   }
00149   free(nom);
00150   free(nouvelle_chaine);
00151 
00152   
00153   ret = _MEDdatagroupFermer(nid);
00154   EXIT_IF(ret < 0,"Fermeture de l'accès aux noeuds",NULL);
00155 }