MAJ_21_22_elements_maillage.c

Aller à la documentation de ce fichier.
00001 /*  This file is part of MED.
00002  *
00003  *  COPYRIGHT (C) 1999 - 2011  EDF R&D, CEA/DEN
00004  *  MED is free software: you can redistribute it and/or modify
00005  *  it under the terms of the GNU Lesser General Public License as published by
00006  *  the Free Software Foundation, either version 3 of the License, or
00007  *  (at your option) any later version.
00008  *
00009  *  MED is distributed in the hope that it will be useful,
00010  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  *  GNU Lesser General Public License for more details.
00013  *
00014  *  You should have received a copy of the GNU Lesser General Public License
00015  *  along with MED.  If not, see <http://www.gnu.org/licenses/>.
00016  */
00017 
00018 
00019 #ifndef MESGERR
00020 #define MESGERR 1
00021 #endif
00022 
00023 
00024 #include "med_config.h"
00025 #include "med_outils.h"
00026 
00027 /* #ifdef __cplusplus */
00028 /* } */
00029 /* #endif */
00030 
00031 #include "med_hdfi21.h"
00032 #include "med_hdfi231.h"
00033 #include "med21.h"
00034 #include "MAJ_21_22.h"
00035 
00036 void MAJ_21_22_elements_maillage(med_idt mid, med_int dimension)
00037 {
00038   med_idt eid,gid,did,tid;
00039   med_err ret;
00040   int i,j;
00041   med_geometrie_element typmai[MED_NBR_GEOMETRIE_MAILLE] = {MED_POINT1,MED_SEG2, 
00042                                                             MED_SEG3,MED_TRIA3,
00043                                                             MED_TRIA6,MED_QUAD4,
00044                                                             MED_QUAD8,MED_TETRA4,
00045                                                             MED_TETRA10,MED_HEXA8,
00046                                                             MED_HEXA20,MED_PENTA6,
00047                                                             MED_PENTA15,MED_PYRA5,
00048                                                             MED_PYRA13};
00049   int taille, edim;
00050   char *nom, *nouvelle_chaine;
00051   char nomgroup[MED_TAILLE_NOM_ENTITE+1];
00052   med_int n;
00053   med_size dimd[1];
00054   med_int *old_conn,*conn;
00055   
00056   /* On ne regarde que les mailles et la connectivité nodale */
00057   eid = _MEDdatagroupOuvrir(mid,(char *)(MED_NOM_MAI));
00058   EXIT_IF(eid < 0,"Ouverture du groupe HDF MED_NOM_MAI",NULL);
00059 
00060   /* On normalise selon tous les types geometriques */
00061   for (i=0;i<MED_NBR_GEOMETRIE_MAILLE;i++) {
00062     
00063     /* On recupere le nom du groupe HDF */
00064     _MEDnomGeometrie(nomgroup,typmai[i]);
00065 
00066     /* On accède au type s'il existe dans le fichier */
00067     gid = _MEDdatagroupOuvrir(eid,nomgroup);
00068     if (gid < 0)
00069       continue;
00070 
00071     /* Nombre d'element ? */
00072     did = _MEDdatasetOuvrir(gid,(char *)(MED_NOM_NOD));
00073     EXIT_IF(did < 0,"Ouverture du dataset HDF MED_NOM_NOD",NULL);
00074     ret = _MEDattrEntierLire(did,(char *)(MED_NOM_NBR),&n);
00075     EXIT_IF(ret < 0,"Lecture du nombre d'elements",NULL);
00076     ret = _MEDdatasetFermer(did);
00077     EXIT_IF(ret < 0,"Fermeture du dataset HDF MED_NOM_NOD",NULL);
00078 
00079     /* on normalise la connectivité si edim < dimension */
00080     edim = typmai[i] / 100;
00081     if (edim < dimension) {
00082       taille = typmai[i]%100 + 1;
00083       old_conn = (med_int *) malloc(sizeof(med_int)*taille*n);
00084       EXIT_IF(old_conn == NULL,NULL,NULL);
00085 #if defined(HAVE_F77INT64)
00086       ret = _MED21datasetNumLire(gid,(char *)(MED_NOM_NOD),MED_INT64,
00087                                   MED_NO_INTERLACE,(med_size)taille,MED_ALL,
00088                                   0,NULL,MED_NOPG,
00089                                   (unsigned char*) old_conn,H5T_NATIVE_INT);
00090 #else
00091       ret = _MED21datasetNumLire(gid,(char *)(MED_NOM_NOD),MED_INT32,
00092                                   MED_NO_INTERLACE,(med_size) taille,MED_ALL,
00093                                   0,NULL,MED_NOPG,
00094                                   (unsigned char*) old_conn,H5T_NATIVE_INT);
00095 #endif 
00096       /* On recopie dans le bon tableau */
00097       taille --;
00098       conn = (med_int *) malloc(sizeof(med_int)*taille*n);
00099       EXIT_IF(conn == NULL,NULL,NULL);
00100       for (j=0;j<n*taille;j++)
00101         *(conn+j) = *(old_conn+j);
00102       dimd[0] = n*taille;
00103 #if defined(HAVE_F77INT64)
00104       ret = _MED231datasetNumEcrire(gid,(char *) "TMP",MED_INT64,MED_NO_INTERLACE,
00105                                     taille,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,MED_NOPG,dimd,
00106                                  (unsigned char*) conn);
00107 #else
00108       ret = _MED231datasetNumEcrire(gid,(char *) "TMP",MED_INT32,MED_NO_INTERLACE,
00109                                     taille,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,MED_NOPG,dimd,
00110                                  (unsigned char*) conn);
00111 #endif
00112       EXIT_IF(ret < 0,"Ecriture de la nouvelle connectivité des mailles",NULL);
00113       
00114       /* Ecriture du nombre de mailles dans le dataset HDF TMP */
00115       tid = _MEDdatasetOuvrir(gid,"TMP");
00116       EXIT_IF(tid < 0,"Ouverture du dataset HDF TMP",NULL);
00117       ret = _MEDattrEntierEcrire(tid,(char *)(MED_NOM_NBR),&n);
00118       EXIT_IF(ret < 0,"Ecriture du nombre de noeuds dans le dataset HDF TMP",NULL);
00119       ret = _MEDdatasetFermer(tid);
00120       EXIT_IF(ret < 0,"Fermeture du dataset HDF TMP",NULL);
00121 
00122       /* Fermeture de l'accès aux connectivites */
00123       ret = H5Gunlink(gid,(char *)(MED_NOM_NOD));
00124       EXIT_IF(ret < 0,"Suppression des anciennes connectivités",NULL);
00125       ret = H5Gmove(gid,"TMP",(char *)(MED_NOM_NOD));
00126       EXIT_IF(ret < 0,"Mise en place des nouvelles connectivités",NULL);
00127 
00128       /* on libere la memoire */
00129       free(old_conn);
00130       free(conn);
00131     }
00132      
00133     /* Mise a niveau des noms */
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(gid,(char *)(MED_NOM_NOM),nom);
00139     if (ret == 0) {
00140       _MED23v30stringConvert(nouvelle_chaine, MED_TAILLE_PNOM,
00141                              nom, ANCIEN_MED_TAILLE_PNOM, n );
00142 /*       MAJ_21_22_chaine(nom,nouvelle_chaine,n); */
00143       H5Gunlink(gid,(char *)(MED_NOM_NOM));
00144       dimd[0] = n*MED_TAILLE_PNOM+1;
00145       ret = _MEDdatasetStringEcrire(gid,(char *)(MED_NOM_NOM),dimd,nouvelle_chaine);  
00146       EXIT_IF(ret < 0,"Ecriture des nouveaux noms des éléments",NULL);  
00147       did = _MEDdatasetOuvrir(gid,(char *)(MED_NOM_NOM));
00148       ret = _MEDattrEntierEcrire(did,(char *)(MED_NOM_NBR),&n);
00149       ret = _MEDdatasetFermer(did);
00150     }
00151     free(nom);
00152     free(nouvelle_chaine);
00153 
00154     /* on ferme avant de passer au type geometrique suivant */
00155     ret = _MEDdatagroupFermer(gid);
00156     EXIT_IF(ret < 0,"Fermeture de l'accès aux mailles",NULL);
00157   }
00158 
00159   /* On ferme tout */
00160   ret = _MEDdatagroupFermer(eid);
00161   EXIT_IF(ret < 0,"Fermeture de l'accès aux mailles",NULL);
00162 }

Généré le Mon May 16 17:10:23 2011 pour MED fichier par  doxygen 1.6.1