med_err MEDcoordLire(med_idt fid, char *maa, med_int mdim, med_float *coo, med_mode_switch mode_coo,med_int numco, med_int * pfltabtmp, med_size psize, med_repere *type_rep, char *nom, char *unit) { med_idt maaid, noeid, dataset; med_err ret; char chemin[MED_TAILLE_MAA+MED_TAILLE_NOM+1]; int i,j; med_float *new_coo; med_int type_rep_int; med_size * pfltab; /* * On inhibe le gestionnaire d'erreur */ _MEDmodeErreurVerrouiller(); if (MEDcheckVersion(fid) < 0) return -1; /* * Si le maillage n'existe pas => erreur * Sinon on recupere sa dimension au passage */ strcpy(chemin,MED_MAA); strcat(chemin,maa); if ((maaid = _MEDdatagroupOuvrir(fid,chemin)) < 0) return -1; /* * Si le Data Group "NOE" n'existe pas => erreur */ if ((noeid = _MEDdatagroupOuvrir(maaid,MED_NOM_NOE)) < 0) return -1; /* * Convertion de med_int en med_size */ if ( psize != MED_NOPF ) { pfltab = (med_size *) malloc (sizeof(med_size)*psize); for (i=0;i<psize;i++) pfltab[i] = (med_size) pfltabtmp[i]; } /* * Lecture du Data Set "COO" */ if ((ret = _MEDdatasetNumLire(noeid,MED_NOM_COO,MED_FLOAT64, mode_coo,mdim,numco, psize,MED_COMPACT,MED_PFL_NON_COMPACT,pfltab,MED_NOPG,0, (unsigned char*) coo)) < 0) return -1; /* * On re-ouvre le Data Set "COO" pour y lire des attributs */ if ((dataset = _MEDdatasetOuvrir(noeid,MED_NOM_COO)) < 0) return -1; /* * L'attribut "REP" */ if ((ret = _MEDattrEntierLire(dataset,MED_NOM_REP,&type_rep_int)) < 0) return -1; else *type_rep = (med_repere) type_rep_int; /* * Attribut "NOM" */ if ((ret = _MEDattrStringLire(dataset,MED_NOM_NOM,mdim*MED_TAILLE_PNOM, nom)) < 0) return -1; /* * Attribut "UNI" */ if ((ret = _MEDattrStringLire(dataset,MED_NOM_UNI,mdim*MED_TAILLE_PNOM, unit)) < 0) return -1; /* * On ferme tout */ if ( psize != MED_NOPF ) free(pfltab); if ((ret = _MEDdatasetFermer(dataset)) < 0) return -1; if ((ret = _MEDdatagroupFermer(noeid)) < 0) return -1; if ((ret = _MEDdatagroupFermer(maaid)) < 0) return -1; return 0; }
med_err MEDindicesCoordLire(med_idt fid,char *maillage,med_int mdim,med_float *indices, med_int n,med_int axe,char *comp,char *unit) { med_idt maaid, noeid, dataset; med_err ret; char chemin[MED_TAILLE_MAA+MED_TAILLE_NOM+1]; char nom_dataset[MED_TAILLE_NOM_ENTITE+1]; med_int att; med_maillage maillage_type; med_type_grille type; /* * Si axe > mdim => erreur */ if (axe > mdim) return -1; /* * On inhibe le gestionnaire d'erreur HDF */ _MEDmodeErreurVerrouiller(); if (MEDcheckVersion(fid) < 0) return -1; /* * Si le maillage n'existe pas => erreur */ strcpy(chemin,MED_MAA); strcat(chemin,maillage); if ((maaid = _MEDdatagroupOuvrir(fid,chemin)) < 0) return -1; /* * Si le maillage est de type MED_NON_STRUCTURE => erreur */ if ((ret = _MEDattrEntierLire(maaid,MED_NOM_TYP,&att)) < 0) return -1; maillage_type = (med_maillage) att; if (maillage_type == MED_NON_STRUCTURE) return -1; /* * Si la grille n'est pas de type MED_GRILLE_CARTESIENNE ou * MED_GRILLE_POLAIRE => erreur */ if ((ret = _MEDattrEntierLire(maaid,MED_NOM_GTY,&att)) < 0) return -1; type = (med_type_grille) att; if ((type != MED_GRILLE_CARTESIENNE) && (type != MED_GRILLE_POLAIRE)) return -1; /* * Si le groupe HDF "NOE" n'existe pas => erreur */ if ((noeid = _MEDdatagroupOuvrir(maaid,MED_NOM_NOE)) < 0) return -1; /* * On ecrit le tableau d'indice dans un dataset HDF */ switch(axe) { case 1 : strcpy(nom_dataset,MED_NOM_IN1); break; case 2 : strcpy(nom_dataset,MED_NOM_IN2); break; case 3 : strcpy(nom_dataset,MED_NOM_IN3); break; default : return -1; } if ((ret = _MEDdatasetNumLire(noeid,nom_dataset,MED_FLOAT64,MED_FULL_INTERLACE,1,MED_ALL,MED_NOPF,MED_NO_PFLMOD,MED_PFL_NON_COMPACT,0, MED_NOPG,0,(unsigned char*) indices)) < 0) return -1; /* * On re-ouvre le dataset HDF pour y placer des attributs */ if ((dataset = _MEDdatasetOuvrir(noeid,nom_dataset)) < 0) return -1; /* * Attribut "NOM" (nom de la composante) */ if ((ret = _MEDattrStringLire(dataset,MED_NOM_NOM,MED_TAILLE_PNOM,comp)) < 0) return -1; /* * Attribut "UNI" (unite de la composante) */ if ((ret = _MEDattrStringLire(dataset,MED_NOM_UNI,MED_TAILLE_PNOM,unit)) < 0) return -1; /* * On ferme tout */ if ((ret = _MEDdatasetFermer(dataset)) < 0) return -1; if ((ret = _MEDdatagroupFermer(noeid)) < 0) return -1; if ((ret = _MEDdatagroupFermer(maaid)) < 0) return -1; return 0; }
med_err MEDfamLire(med_idt fid,char *maa, med_int *fam, med_int n, med_entite_maillage type_ent,med_geometrie_element type_geo) { med_idt root; med_idt maaid = 0; med_idt entid = 0; med_idt geoid = 0; med_err ret = -1; char chemin[MED_TAILLE_MAA+MED_TAILLE_NOM+1]; char nom_ent[MED_TAILLE_NOM_ENTITE+1]; char nom_geo[MED_TAILLE_NOM_ENTITE+1]; med_int i; med_entite_maillage _type_ent=type_ent; if ( type_ent == MED_NOEUD_MAILLE ) _type_ent=MED_NOEUD ; /* * On inhibe le gestionnaire d'erreur HDF 5 */ _MEDmodeErreurVerrouiller(); if (MEDcheckVersion(fid) < 0) return -1; /* * Si le maillage n'existe pas => erreur */ strcpy(chemin,MED_MAA); strcat(chemin,maa); if ((maaid = _MEDdatagroupOuvrir(fid,chemin)) < 0) { MESSAGE("Impossible d'acceder au maillage"); SSCRUTE(chemin); goto ERREUR; } /* * On met a jour le nom du Data Group representant * le type des entites */ if (_MEDnomEntite(nom_ent,_type_ent) < 0) { MESSAGE("L'entité demandée n'est pas une entité <med_entite_maillage> : "); SSCRUTE(nom_ent); ISCRUTE(_type_ent); goto ERREUR; } /* * Si le "Data Group" des entites n'existe pas => erreur */ if ((entid = _MEDdatagroupOuvrir(maaid,nom_ent)) < 0) { MESSAGE("Impossible d'accéder au groupe des entités : "); SSCRUTE(nom_ent); ISCRUTE(_type_ent); goto ERREUR; } /* * Pour les mailles, les faces et le aretes, on cree * si le "Data Group" du type geometrique => erreur */ if ((_type_ent==MED_MAILLE)||(_type_ent==MED_FACE)||(_type_ent==MED_ARETE)) { if (_MEDnomGeometrie30(nom_geo,type_geo) < 0) { MESSAGE("L'entité demandée n'est pas un élément <med_geometrie_element> : "); SSCRUTE(nom_geo); ISCRUTE(type_geo); goto ERREUR; } if ((geoid = _MEDdatagroupOuvrir(entid,nom_geo)) < 0) { MESSAGE("Impossible d'accéder au groupe des éléments géométriques : "); SSCRUTE(nom_geo); ISCRUTE(type_geo); goto ERREUR; } } else geoid = -1; /* * lecture du Data Set "FAM" * - En cas d'erreur, pas de message car la presence des * numeros est optionnelle dans un fichier MED (à partir de la V2.2) * Dans ce cas de figure, on considère que tous les numéros sont à 0 */ if (geoid == -1) root = entid; else root = geoid; #if defined(HAVE_F77INT64) if (_MEDdatasetNumLire(root,MED_NOM_FAM,MED_INT64, MED_NO_INTERLACE,1,MED_ALL, MED_NOPF,MED_NO_PFLMOD,MED_PFL_NON_COMPACT,0,MED_NOPG,0, (unsigned char *)fam) < 0) for (i=0; i<n; i++) *(fam+i) = 0; #else if (_MEDdatasetNumLire(root,MED_NOM_FAM,MED_INT32, MED_NO_INTERLACE,1,MED_ALL, MED_NOPF,MED_NO_PFLMOD,MED_PFL_NON_COMPACT,0,MED_NOPG,0, (unsigned char *)fam) < 0) for (i=0; i<n; i++) *(fam+i) = 0; #endif /* * Tout s'est bien passé si on est parvenu jusqu'ici */ ret = 0; /* * On ferme tout */ ERREUR: if (geoid > 0) if (_MEDdatagroupFermer(geoid) < 0) return -1; if (entid > 0) if (_MEDdatagroupFermer(entid) < 0) return -1; if (maaid > 0) if (_MEDdatagroupFermer(maaid) < 0) return -1; /* Code retour : * - ret == 0 en cas de succès * - ret == -1 en cas d'échec */ return (ret); }
med_err MEDconnLire(med_idt fid,char *maa,med_int mdim,med_int *connectivite,med_mode_switch mode_switch, med_int * pfltabtmp, med_size psizetmp, med_entite_maillage type_ent, med_geometrie_element type_geo,med_connectivite type_conn) { med_idt maaid,entid,geoid; med_err ret; char chemin[MED_TAILLE_MAA+MED_TAILLE_NOM+1]; char nom_ent[MED_TAILLE_NOM_ENTITE+1]; char nom_geo[MED_TAILLE_NOM_ENTITE+1]; char nom_dataset[MED_TAILLE_NOM_ENTITE+1]; med_size * pfltab=NULL; med_size psize; int dim,nnoe,ndes; int taille; int i,j; med_entite_maillage _type_ent=type_ent; if ( type_ent == MED_NOEUD_MAILLE ) _type_ent=MED_NOEUD ; /* * On inhibe le gestionnaire d'erreur HDF 5 */ _MEDmodeErreurVerrouiller(); if (MEDcheckVersion(fid) < 0) return -1; /* * Si le maillage n'existe pas => erreur */ strcpy(chemin,MED_MAA); strcat(chemin,maa); if ((maaid = _MEDdatagroupOuvrir(fid,chemin)) < 0) return -1; /* * On met a jour le nom du Data Group representant * le type des entites */ if ((ret = _MEDnomEntite(nom_ent,_type_ent)) < 0) return -1; /* * Si le Data Group des entites n'existe pas => erreur */ if ((entid = _MEDdatagroupOuvrir(maaid,nom_ent)) < 0) return -1; /* * si le Data Group du type geometrique n'existe pas => erreur */ if ((ret = _MEDnomGeometrie30(nom_geo,type_geo)) < 0) return -1; if ((geoid = _MEDdatagroupOuvrir(entid,nom_geo)) < 0) return -1; /* * Si le Data Set de la connectivite n'existe pas => erreur * Si oui => on le lit */ if ((ret=_MEDparametresGeometrie(_type_ent,type_geo,&dim,&nnoe,&ndes))<0) return -1; psize = psizetmp; switch(type_conn) { case MED_NOD : strcpy(nom_dataset,MED_NOM_NOD); taille = nnoe; break; case MED_DESC : strcpy(nom_dataset,MED_NOM_DES); taille = ndes; if ( psizetmp != MED_NOPF ) { psize = psizetmp; pfltab = (med_size *) malloc (sizeof(med_size)*psize); for (i=0;i<psizetmp;i++) pfltab[i] = (med_size) (pfltabtmp[i]); }; break; default : return -1; } #if defined(HAVE_F77INT64) if ((ret = _MEDdatasetNumLire(geoid,nom_dataset,MED_INT64, mode_switch,(med_size)taille,MED_ALL, psize,MED_COMPACT,MED_PFL_NON_COMPACT,pfltab,MED_NOPG,0, (unsigned char*) connectivite)) < 0) return -1; #else if ((ret = _MEDdatasetNumLire(geoid,nom_dataset,MED_INT32, mode_switch,(med_size) taille,MED_ALL, psize,MED_COMPACT,MED_PFL_NON_COMPACT,pfltab,MED_NOPG,0, (unsigned char*) connectivite)) < 0) return -1; #endif /* * On ferme tout */ if ( (psize != MED_NOPF) && (type_conn == MED_DESC) ) free(pfltab); if ((ret = _MEDdatagroupFermer(geoid)) < 0) return -1; if ((ret = _MEDdatagroupFermer(entid)) < 0) return -1; if ((ret = _MEDdatagroupFermer(maaid)) < 0) return -1; return 0; }