MAJ_21_22_elements_maillage.c

Aller à la documentation de ce fichier.
00001 /*  This file is part of MED.
00002  *
00003  *  COPYRIGHT (C) 1999 - 2015  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 
00020 #include "med_config.h"
00021 #include "med_outils.h"
00022 
00023 /* #ifdef __cplusplus */
00024 /* } */
00025 /* #endif */
00026 
00027 #include "med_hdfi21.h"
00028 #include "med_hdfi231.h"
00029 #include "med21.h"
00030 #include "MAJ_21_22.h"
00031 
00032 void MAJ_21_22_elements_maillage(med_idt mid, med_int dimension)
00033 {
00034   med_idt eid,gid,did,tid;
00035   med_err ret;
00036   int i,j;
00037   med_geometrie_element typmai[MED_NBR_GEOMETRIE_MAILLE] = {MED_POINT1,MED_SEG2, 
00038                                                             MED_SEG3,MED_TRIA3,
00039                                                             MED_TRIA6,MED_QUAD4,
00040                                                             MED_QUAD8,MED_TETRA4,
00041                                                             MED_TETRA10,MED_HEXA8,
00042                                                             MED_HEXA20,MED_PENTA6,
00043                                                             MED_PENTA15,MED_PYRA5,
00044                                                             MED_PYRA13};
00045   int taille, edim;
00046   char *nom, *nouvelle_chaine;
00047   char nomgroup[MED_TAILLE_NOM_ENTITE+1];
00048   med_int n;
00049   med_size dimd[1];
00050   med_int *old_conn,*conn;
00051   
00052   /* On ne regarde que les mailles et la connectivité nodale */
00053   eid = _MEDdatagroupOuvrir(mid,(char *)(MED_NOM_MAI));
00054   EXIT_IF(eid < 0,"Ouverture du groupe HDF MED_NOM_MAI",NULL);
00055 
00056   /* On normalise selon tous les types geometriques */
00057   for (i=0;i<MED_NBR_GEOMETRIE_MAILLE;i++) {
00058     
00059     /* On recupere le nom du groupe HDF */
00060     _MEDnomGeometrie(nomgroup,typmai[i]);
00061 
00062     /* On accède au type s'il existe dans le fichier */
00063     gid = _MEDdatagroupOuvrir(eid,nomgroup);
00064     if (gid < 0)
00065       continue;
00066 
00067     /* Nombre d'element ? */
00068     did = _MEDdatasetOuvrir(gid,(char *)(MED_NOM_NOD));
00069     EXIT_IF(did < 0,"Ouverture du dataset HDF MED_NOM_NOD",NULL);
00070     ret = _MEDattrEntierLire(did,(char *)(MED_NOM_NBR),&n);
00071     EXIT_IF(ret < 0,"Lecture du nombre d'elements",NULL);
00072     ret = _MEDdatasetFermer(did);
00073     EXIT_IF(ret < 0,"Fermeture du dataset HDF MED_NOM_NOD",NULL);
00074 
00075     /* on normalise la connectivité si edim < dimension */
00076     edim = typmai[i] / 100;
00077     if (edim < dimension) {
00078       taille = typmai[i]%100 + 1;
00079       old_conn = (med_int *) malloc(sizeof(med_int)*taille*n);
00080       EXIT_IF(old_conn == NULL,NULL,NULL);
00081 #if defined(HAVE_F77INT64)
00082       ret = _MED21datasetNumLire(gid,(char *)(MED_NOM_NOD),MED_INT64,
00083                                   MED_NO_INTERLACE,(med_size)taille,MED_ALL,
00084                                   0,NULL,MED_NOPG,
00085                                   (unsigned char*) old_conn,H5T_NATIVE_INT);
00086 #else
00087       ret = _MED21datasetNumLire(gid,(char *)(MED_NOM_NOD),MED_INT32,
00088                                   MED_NO_INTERLACE,(med_size) taille,MED_ALL,
00089                                   0,NULL,MED_NOPG,
00090                                   (unsigned char*) old_conn,H5T_NATIVE_INT);
00091 #endif 
00092       /* On recopie dans le bon tableau */
00093       taille --;
00094       conn = (med_int *) malloc(sizeof(med_int)*taille*n);
00095       EXIT_IF(conn == NULL,NULL,NULL);
00096       for (j=0;j<n*taille;j++)
00097         *(conn+j) = *(old_conn+j);
00098       dimd[0] = n*taille;
00099 #if defined(HAVE_F77INT64)
00100       ret = _MED231datasetNumEcrire(gid,(char *) "TMP",MED_INT64,MED_NO_INTERLACE,
00101                                     taille,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,MED_NOPG,dimd,
00102                                  (unsigned char*) conn);
00103 #else
00104       ret = _MED231datasetNumEcrire(gid,(char *) "TMP",MED_INT32,MED_NO_INTERLACE,
00105                                     taille,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,MED_NOPG,dimd,
00106                                  (unsigned char*) conn);
00107 #endif
00108       EXIT_IF(ret < 0,"Ecriture de la nouvelle connectivité des mailles",NULL);
00109       
00110       /* Ecriture du nombre de mailles dans le dataset HDF TMP */
00111       tid = _MEDdatasetOuvrir(gid,"TMP");
00112       EXIT_IF(tid < 0,"Ouverture du dataset HDF TMP",NULL);
00113       ret = _MEDattrEntierEcrire(tid,(char *)(MED_NOM_NBR),&n);
00114       EXIT_IF(ret < 0,"Ecriture du nombre de noeuds dans le dataset HDF TMP",NULL);
00115       ret = _MEDdatasetFermer(tid);
00116       EXIT_IF(ret < 0,"Fermeture du dataset HDF TMP",NULL);
00117 
00118       /* Fermeture de l'accès aux connectivites */
00119       ret = H5Gunlink(gid,(char *)(MED_NOM_NOD));
00120       EXIT_IF(ret < 0,"Suppression des anciennes connectivités",NULL);
00121       ret = H5Gmove(gid,"TMP",(char *)(MED_NOM_NOD));
00122       EXIT_IF(ret < 0,"Mise en place des nouvelles connectivités",NULL);
00123 
00124       /* on libere la memoire */
00125       free(old_conn);
00126       free(conn);
00127     }
00128      
00129     /* Mise a niveau des noms */
00130     nom = (char *) malloc(n*ANCIEN_MED_TAILLE_PNOM+1);
00131     EXIT_IF(nom == NULL,NULL,NULL);
00132     nouvelle_chaine = (char *) malloc(n*MED_TAILLE_PNOM+1);
00133     EXIT_IF(nouvelle_chaine == NULL,NULL,NULL);
00134     ret = _MEDdatasetStringLire(gid,(char *)(MED_NOM_NOM),nom);
00135     if (ret == 0) {
00136       _MED23v30stringConvert(nouvelle_chaine, MED_TAILLE_PNOM,
00137                              nom, ANCIEN_MED_TAILLE_PNOM, n );
00138 /*       MAJ_21_22_chaine(nom,nouvelle_chaine,n); */
00139       H5Gunlink(gid,(char *)(MED_NOM_NOM));
00140       dimd[0] = n*MED_TAILLE_PNOM+1;
00141       ret = _MEDdatasetStringEcrire(gid,(char *)(MED_NOM_NOM),dimd,nouvelle_chaine);  
00142       EXIT_IF(ret < 0,"Ecriture des nouveaux noms des éléments",NULL);  
00143       did = _MEDdatasetOuvrir(gid,(char *)(MED_NOM_NOM));
00144       ret = _MEDattrEntierEcrire(did,(char *)(MED_NOM_NBR),&n);
00145       ret = _MEDdatasetFermer(did);
00146     }
00147     free(nom);
00148     free(nouvelle_chaine);
00149 
00150     /* on ferme avant de passer au type geometrique suivant */
00151     ret = _MEDdatagroupFermer(gid);
00152     EXIT_IF(ret < 0,"Fermeture de l'accès aux mailles",NULL);
00153   }
00154 
00155   /* On ferme tout */
00156   ret = _MEDdatagroupFermer(eid);
00157   EXIT_IF(ret < 0,"Fermeture de l'accès aux mailles",NULL);
00158 }

Généré le Thu Oct 8 14:26:16 2015 pour MED fichier par  doxygen 1.6.1