void MEDfamCr231(int dummy,...) { med_idt fid; char *maa; char *famille; med_int numero; med_int *attr_ident; med_int *attr_val; char *attr_desc; med_int n_attr; char *groupe; med_int n_groupe; med_err *fret ; med_idt root=0, datagroup=0, famid=0; med_err ret=-1; med_size dimd[1]; char chemin[MED_TAILLE_MAA+MED_TAILLE_FAS+MED_TAILLE_FAS_ENTITE+MED_TAILLE_NOM+1]; char tmp[MED_TAILLE_FAS+1]; char stockage[MED_TAILLE_FAS_ENTITE+1] = "NONE"; med_mode_acces MED_MODE_ACCES; va_list params; va_start(params,dummy); fid = va_arg(params, med_idt ); maa = va_arg(params, char* ); famille = va_arg(params, char* ); numero = va_arg(params, med_int ); attr_ident = va_arg(params, med_int*); attr_val = va_arg(params, med_int*); attr_desc = va_arg(params, char* ); n_attr = va_arg(params, med_int ); groupe = va_arg(params, char* ); n_groupe = va_arg(params, med_int ); fret = va_arg(params, med_err*); /* * On inhibe le gestionnaire d'erreur HDF 5 */ _MEDmodeErreurVerrouiller(); if (MEDcheckVersion(fid) < 0) {*fret=-1;return;} if ( (MED_MODE_ACCES = _MEDmodeAcces(fid) ) == MED_UNDEF_MODE_ACCES ) { MESSAGE("Impossible de déterminer le mode d'acces au fichier."); goto ERROR; } if ( MED_MODE_ACCES == MED_LECTURE) { MESSAGE("Impossible de créer une famille en mode MED_LECTURE."); goto ERROR; }; /* * Si le Data Group FAS n'existe pas, on le cree */ strcpy(chemin,MED_MAA); /* BUG NON CORRIGE en 2.3.1 à cause des noms de familles crées en F77 NOFINALBLANK(maa,ERROR);*/ strcat(chemin,maa); strncpy(tmp,MED_FAS,MED_TAILLE_FAS-1); tmp[MED_TAILLE_FAS-1] = '\0'; strcat(chemin,tmp); if ((root = _MEDdatagroupOuvrir(fid,chemin)) < 0) if ((root = _MEDdatagroupCreer(fid,chemin)) < 0) { MESSAGE("Erreur à la création du datagroup : "); SSCRUTE(chemin); goto ERROR; } /* * Le lieu de stockage varie selon le signe du "numero" * de famille * = 0 => FAMILLE NEUTRE * > 0 => FAMILLE DE NOEUD * < 0 => FAMILLE DE MAILLE/FACE/ARETE */ if (numero != 0) { if ((ret = _MEDdatagroupFermer(root)) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_id(root);ret = -1; goto ERROR; } if (numero > 0) strncpy(stockage,MED_FAS_NOEUD,MED_TAILLE_FAS_ENTITE-1); if (numero < 0) strncpy(stockage,MED_FAS_ELEME,MED_TAILLE_FAS_ENTITE-1); stockage[MED_TAILLE_FAS_ENTITE-1] = '\0'; strcat(chemin,stockage); if ((root = _MEDdatagroupOuvrir(fid,chemin)) < 0) if ((root = _MEDdatagroupCreer(fid,chemin)) < 0) { MESSAGE("Erreur à la création du datagroup : "); SSCRUTE(chemin); goto ERROR; } } /* * Si le Data Group de meme nom que famille existe => erreur * Sinon on le cree */ /* * POUR LA FAMILLE DE NUMERO 0, ON FORCE LE NOM */ if (numero == 0) strcpy(famille,FAMILLE_ZERO); /* * Création de la famille */ if ((famid = _MEDdatagroupCreer(root,famille)) < 0) { MESSAGE("Erreur à la création du famille : "); SSCRUTE(famille); goto ERROR; } /* * L'attribut NUM */ if ((ret = _MEDattrEntierEcrire(famid,MED_NOM_NUM,&numero)) < 0) { MESSAGE("Erreur à l'écriture du numéro de famille : "); ISCRUTE(numero); goto ERROR; } /* * Le Data Group "GRO" */ if (n_groupe > 0) { /* * On cree le Data Group */ if ((datagroup = _MEDdatagroupCreer(famid,MED_NOM_GRO)) < 0) { MESSAGE("Erreur à la création du datagroup : "); SSCRUTE(MED_NOM_GRO); goto ERROR; } /* * L'attribut "NBR" */ if ((ret = _MEDattrEntierEcrire(datagroup,MED_NOM_NBR,&n_groupe)) < 0) { MESSAGE("Erreur à l'écriture du nombre de groupe : "); ISCRUTE(n_groupe); goto ERROR; } /* * Data Set des noms des groupes "NOM" */ dimd[0] = n_groupe*MED_TAILLE_LNOM+1; if ((ret = _MEDdatasetStringEcrire(datagroup,MED_NOM_NOM,dimd,groupe))<0) { MESSAGE("Erreur à l'écriture des noms des groupes : "); SSCRUTE(groupe); goto ERROR; } /* * On ferme le Data Group */ if ((ret = _MEDdatagroupFermer(datagroup)) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_int(datagroup); goto ERROR; } } /* * Le Data Group "ATT" */ if (n_attr > 0) { if ((datagroup = _MEDdatagroupCreer(famid,MED_NOM_ATT)) < 0) { MESSAGE("Erreur à la création du datagroup : "); SSCRUTE(MED_NOM_ATT); goto ERROR; } /* * L'attribut "NBR" */ if ((ret = _MEDattrEntierEcrire(datagroup,MED_NOM_NBR,&n_attr)) < 0) { MESSAGE("Erreur à l'écriture du nombre d'attributs : "); ISCRUTE(n_attr); goto ERROR; } /* * Le Data Set "IDE" */ dimd[0] = n_attr; #if defined(HAVE_F77INT64) if ((ret = _MEDdatasetNumEcrire(datagroup,MED_NOM_IDE,MED_INT64,MED_NO_INTERLACE,MED_DIM1,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,0,MED_NOPG,dimd, (unsigned char *)attr_ident)) < 0) { MESSAGE("Erreur à l'écriture du dataset : "); SSCRUTE(MED_NOM_IDE); goto ERROR; } #else if ((ret = _MEDdatasetNumEcrire(datagroup,MED_NOM_IDE,MED_INT32,MED_NO_INTERLACE,MED_DIM1,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,0,MED_NOPG,dimd, (unsigned char *)attr_ident)) < 0) { MESSAGE("Erreur à l'écriture du dataset : "); SSCRUTE(MED_NOM_IDE); goto ERROR; } #endif /* * Le Data Set "VAL" */ dimd[0] = n_attr; #if defined(HAVE_F77INT64) if ((ret = _MEDdatasetNumEcrire(datagroup,MED_NOM_VAL,MED_INT64,MED_NO_INTERLACE,MED_DIM1,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,0,MED_NOPG,dimd, (unsigned char*)attr_val)) < 0) { MESSAGE("Erreur à l'écriture du dataset : "); SSCRUTE(MED_NOM_VAL); goto ERROR; } #else if ((ret = _MEDdatasetNumEcrire(datagroup,MED_NOM_VAL,MED_INT32,MED_NO_INTERLACE,MED_DIM1,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,0,MED_NOPG,dimd, (unsigned char*)attr_val)) < 0) { MESSAGE("Erreur à l'écriture du dataset : "); SSCRUTE(MED_NOM_VAL); goto ERROR; } #endif /* * Le Data Set "DES" */ dimd[0] = n_attr*MED_TAILLE_DESC+1; if ((ret = _MEDdatasetStringEcrire(datagroup,MED_NOM_DES,dimd,attr_desc)) < 0) { MESSAGE("Erreur à l'écriture du dataset : "); SSCRUTE(MED_NOM_DES); goto ERROR; } /* * On ferme le Data Group */ if ((ret = _MEDdatagroupFermer(datagroup)) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_int(datagroup); goto ERROR; } } /* * On ferme tout */ ret=0; ERROR: if (famid>0) if (_MEDdatagroupFermer(famid) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_id(famid);ret = -1; } if (root>0) if (_MEDdatagroupFermer(root) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_id(root); ret = -1; } va_end(params); *fret = ret; return; }
void MAJ_21_22_elements_maillage(med_idt mid, med_int dimension) { med_idt eid,gid,did,tid; med_err ret; int i,j; med_geometrie_element typmai[MED_NBR_GEOMETRIE_MAILLE] = {MED_POINT1,MED_SEG2, MED_SEG3,MED_TRIA3, MED_TRIA6,MED_QUAD4, MED_QUAD8,MED_TETRA4, MED_TETRA10,MED_HEXA8, MED_HEXA20,MED_PENTA6, MED_PENTA15,MED_PYRA5, MED_PYRA13}; int taille, edim; char *nom, *nouvelle_chaine; char nomgroup[MED_TAILLE_NOM_ENTITE+1]; med_int n; med_size dimd[1]; med_int *old_conn,*conn; /* On ne regarde que les mailles et la connectivité nodale */ eid = _MEDdatagroupOuvrir(mid,(char *)(MED_NOM_MAI)); EXIT_IF(eid < 0,"Ouverture du groupe HDF MED_NOM_MAI",NULL); /* On normalise selon tous les types geometriques */ for (i=0;i<MED_NBR_GEOMETRIE_MAILLE;i++) { /* On recupere le nom du groupe HDF */ _MEDnomGeometrie(nomgroup,typmai[i]); /* On accède au type s'il existe dans le fichier */ gid = _MEDdatagroupOuvrir(eid,nomgroup); if (gid < 0) continue; /* Nombre d'element ? */ did = _MEDdatasetOuvrir(gid,(char *)(MED_NOM_NOD)); EXIT_IF(did < 0,"Ouverture du dataset HDF MED_NOM_NOD",NULL); ret = _MEDattrEntierLire(did,(char *)(MED_NOM_NBR),&n); EXIT_IF(ret < 0,"Lecture du nombre d'elements",NULL); ret = _MEDdatasetFermer(did); EXIT_IF(ret < 0,"Fermeture du dataset HDF MED_NOM_NOD",NULL); /* on normalise la connectivité si edim < dimension */ edim = typmai[i] / 100; if (edim < dimension) { taille = typmai[i]%100 + 1; old_conn = (med_int *) malloc(sizeof(med_int)*taille*n); EXIT_IF(old_conn == NULL,NULL,NULL); #if defined(HAVE_F77INT64) ret = _MED21datasetNumLire(gid,(char *)(MED_NOM_NOD),MED_INT64, MED_NO_INTERLACE,(med_size)taille,MED_ALL, 0,NULL,MED_NOPG, (unsigned char*) old_conn,H5T_NATIVE_INT); #else ret = _MED21datasetNumLire(gid,(char *)(MED_NOM_NOD),MED_INT32, MED_NO_INTERLACE,(med_size) taille,MED_ALL, 0,NULL,MED_NOPG, (unsigned char*) old_conn,H5T_NATIVE_INT); #endif /* On recopie dans le bon tableau */ taille --; conn = (med_int *) malloc(sizeof(med_int)*taille*n); EXIT_IF(conn == NULL,NULL,NULL); for (j=0;j<n*taille;j++) *(conn+j) = *(old_conn+j); dimd[0] = n*taille; #if defined(HAVE_F77INT64) ret = _MED231datasetNumEcrire(gid,(char *) "TMP",MED_INT64,MED_NO_INTERLACE, taille,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,MED_NOPG,dimd, (unsigned char*) conn); #else ret = _MED231datasetNumEcrire(gid,(char *) "TMP",MED_INT32,MED_NO_INTERLACE, taille,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,MED_NOPG,dimd, (unsigned char*) conn); #endif EXIT_IF(ret < 0,"Ecriture de la nouvelle connectivité des mailles",NULL); /* Ecriture du nombre de mailles dans le dataset HDF TMP */ tid = _MEDdatasetOuvrir(gid,"TMP"); EXIT_IF(tid < 0,"Ouverture du dataset HDF TMP",NULL); ret = _MEDattrEntierEcrire(tid,(char *)(MED_NOM_NBR),&n); EXIT_IF(ret < 0,"Ecriture du nombre de noeuds dans le dataset HDF TMP",NULL); ret = _MEDdatasetFermer(tid); EXIT_IF(ret < 0,"Fermeture du dataset HDF TMP",NULL); /* Fermeture de l'accès aux connectivites */ ret = H5Gunlink(gid,(char *)(MED_NOM_NOD)); EXIT_IF(ret < 0,"Suppression des anciennes connectivités",NULL); ret = H5Gmove(gid,"TMP",(char *)(MED_NOM_NOD)); EXIT_IF(ret < 0,"Mise en place des nouvelles connectivités",NULL); /* on libere la memoire */ free(old_conn); free(conn); } /* Mise a niveau des noms */ nom = (char *) malloc(n*ANCIEN_MED_TAILLE_PNOM+1); EXIT_IF(nom == NULL,NULL,NULL); nouvelle_chaine = (char *) malloc(n*MED_TAILLE_PNOM+1); EXIT_IF(nouvelle_chaine == NULL,NULL,NULL); ret = _MEDdatasetStringLire(gid,(char *)(MED_NOM_NOM),nom); if (ret == 0) { _MED23v30stringConvert(nouvelle_chaine, MED_TAILLE_PNOM, nom, ANCIEN_MED_TAILLE_PNOM, n ); /* MAJ_21_22_chaine(nom,nouvelle_chaine,n); */ H5Gunlink(gid,(char *)(MED_NOM_NOM)); dimd[0] = n*MED_TAILLE_PNOM+1; ret = _MEDdatasetStringEcrire(gid,(char *)(MED_NOM_NOM),dimd,nouvelle_chaine); EXIT_IF(ret < 0,"Ecriture des nouveaux noms des éléments",NULL); did = _MEDdatasetOuvrir(gid,(char *)(MED_NOM_NOM)); ret = _MEDattrEntierEcrire(did,(char *)(MED_NOM_NBR),&n); ret = _MEDdatasetFermer(did); } free(nom); free(nouvelle_chaine); /* on ferme avant de passer au type geometrique suivant */ ret = _MEDdatagroupFermer(gid); EXIT_IF(ret < 0,"Fermeture de l'accès aux mailles",NULL); } /* On ferme tout */ ret = _MEDdatagroupFermer(eid); EXIT_IF(ret < 0,"Fermeture de l'accès aux mailles",NULL); }
med_err MEDlienEcr(med_idt fid, char *lienval, char *maa) { med_idt gid=0, chid=0, did=0; med_size dimd[1]; med_err ret=-1; char chemin[MED_TAILLE_LIENS+1]; med_int n ; /* * On inhibe le gestionnaire d'erreur HDF 5 */ _MEDmodeErreurVerrouiller(); if (MEDcheckVersion(fid) < 0) return -1; /* * Si le groupe "LIENS" n'existe pas, on le cree */ strncpy(chemin,MED_LIENS,MED_TAILLE_LIENS-1); chemin[MED_TAILLE_LIENS-1] = '\0'; if ((gid = _MEDdatagroupOuvrir(fid,chemin)) < 0) if ((gid = _MEDdatagroupCreer(fid,chemin)) < 0) { MESSAGE("Impossible de creer le groupe MED_LIENS : "); SSCRUTE(chemin); goto ERROR; } /* * Si le groupe "maa" n'existe pas, on le cree * Sinon => erreur */ NOFINALBLANK(maa,ERROR); if ((chid = _MEDdatagroupOuvrir(gid,maa)) < 0) if ((chid = _MEDdatagroupCreer(gid,maa)) < 0) { MESSAGE("Erreur à la création du lien au maillage : "); SSCRUTE(maa); goto ERROR; } /* * On stocke "n" sous forme d'attribut */ n = strlen(lienval); if ((ret = _MEDattrEntierEcrire(chid,MED_NOM_NBR,&n)) < 0) { MESSAGE("Erreur à l'écriture de l'attribut n : "); ISCRUTE(n); goto ERROR; } /* * On stocke le lienval dans un dataset */ dimd[0] = n; if ((ret = _MEDdatasetStringEcrire(chid,MED_NOM_LIE,dimd,lienval))<0) { MESSAGE("Impossible d'ecrire le dataset lienval de taille : "); ISCRUTE(n); goto ERROR; } /* * On ferme tout */ ret =0; ERROR: if (chid>0) if (_MEDdatagroupFermer(chid) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_id(chid);ret=-1; } if (gid>0) if (_MEDdatagroupFermer(gid) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_id(gid);ret=-1; } return ret; }