# MAJ_21_22_elements_maillage.c

Aller à la documentation de ce fichier.

    00001 /*  This file is part of MED.
    00002  *
    00003  *  COPYRIGHT (C) 1999 - 2012  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 }