# 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 }