med_err MEDconnEcr(med_idt fid,char *maa, med_int mdim, med_int *connectivite,med_mode_switch mode_switch, med_int nbre, med_entite_maillage type_ent, med_geometrie_element type_geo,med_connectivite type_conn) { med_idt maaid, entid, geoid, dataset; med_err ret; med_size dimd[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]; char nom_dataset[MED_TAILLE_NOM_ENTITE+1]; int dim, nnoe, ndes; int taille; 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 on le cree */ if ((entid = _MEDdatagroupOuvrir(maaid,nom_ent)) < 0) if ((entid = _MEDdatagroupCreer(maaid,nom_ent)) < 0) return -1; /* * On cree s'il n'existe pas le Data Group du type geometrique */ if ((ret = _MEDnomGeometrie(nom_geo,type_geo)) < 0) return -1; if ((geoid = _MEDdatagroupOuvrir(entid,nom_geo)) < 0) if ((geoid = _MEDdatagroupCreer(entid,nom_geo)) < 0) return -1; /* * On regarde si le Data Set existe et on le cree sinon */ if ((ret=_MEDparametresGeometrie(_type_ent,type_geo,&dim,&nnoe,&ndes))<0) return -1; 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; break; default : return -1; } dimd[0] = nbre*taille; #if defined(HAVE_F77INT64) ret = _MEDdatasetNumEcrire(geoid,nom_dataset,MED_INT64,mode_switch,(med_size)taille,MED_ALL, MED_NOPF,MED_NO_PFLMOD,0,0,MED_NOPG,dimd, (unsigned char*) connectivite); #else ret = _MEDdatasetNumEcrire(geoid,nom_dataset,MED_INT32,mode_switch,(med_size)taille,MED_ALL, MED_NOPF,MED_NO_PFLMOD,0,0,MED_NOPG,dimd, (unsigned char*) connectivite); #endif if (ret < 0 ) { MESSAGE("Impossible d'ecrire le dataset coon de taille : "); ISCRUTE_int(taille); return -1; } /* * Attribut NBR (nombre de noeuds ou d'elements) */ if ((dataset = _MEDdatasetOuvrir(geoid,nom_dataset)) < 0) return -1; if ((ret = _MEDattrEntierEcrire(dataset,MED_NOM_NBR,&nbre)) < 0) return -1; /* * On ferme tout */ if ((ret = _MEDdatasetFermer(dataset)) < 0) return -1; if ((ret = _MEDdatagroupFermer(geoid)) < 0) return -1; if ((ret = _MEDdatagroupFermer(entid)) < 0) return -1; if ((ret = _MEDdatagroupFermer(maaid)) < 0) return -1; return 0; }
med_int MEDjointnCorres (med_idt fid, char *maa, char *jn, med_entite_maillage type_ent_local, med_geometrie_element typ_geo_local, med_entite_maillage type_ent_distant, med_geometrie_element typ_geo_distant) { med_entite_maillage _type_ent_local = (med_entite_maillage) ( (int)(type_ent_local) % 10 ); med_entite_maillage _type_ent_distant = (med_entite_maillage) ( (int)(type_ent_distant) % 10 ); med_idt datagroup1=0,datagroup2=0; med_int n=0, ret=-1; char chemin[MED_TAILLE_MAA+MED_TAILLE_JNT+2*MED_TAILLE_NOM+1]; char nomdatagroup[MED_TAILLE_NOM_ENTITE*4+3+1]; char tmp[MED_TAILLE_NOM_ENTITE+1]; med_size dimd[1]; /* if (typ_geo_local == MED_TETRA4 || typ_geo_local == MED_TETRA10 || */ /* typ_geo_local == MED_HEXA8 || typ_geo_local == MED_HEXA20 || */ /* typ_geo_local == MED_PENTA6 || typ_geo_local == MED_PENTA15 || */ /* typ_geo_local == MED_PYRA5 || typ_geo_local == MED_PYRA13 || */ /* typ_geo_distant == MED_TETRA4 || typ_geo_distant == MED_TETRA10 || */ /* typ_geo_distant == MED_HEXA8 || typ_geo_distant == MED_HEXA20 || */ /* typ_geo_distant == MED_PENTA6 || typ_geo_distant == MED_PENTA15 || */ /* typ_geo_distant == MED_PYRA5 || typ_geo_distant == MED_PYRA13) */ /* return -1; */ /* * On inhibe le gestionnaire d'erreur HDF 5 */ _MEDmodeErreurVerrouiller(); if (MEDcheckVersion(fid) < 0) return -1; /* * Si le Data Group de "JNT/Corres" n'existe pas => erreur */ strcpy(chemin,MED_MAA); strcat(chemin,maa); strcat(chemin,MED_JNT); strcat(chemin,jn); if ((datagroup1 = _MEDdatagroupOuvrir(fid,chemin)) < 0) { MESSAGE("Impossible d'ouvrir le datagroup : "); SSCRUTE(chemin); goto ERREUR; } /* * Ecriture de la correspondance * construction du tag HDF "reperant" la correspondance * */ if ( _MEDnomEntite(nomdatagroup,_type_ent_local) < 0) goto ERREUR; if ((_type_ent_local != MED_NOEUD)) { if ( _MEDnomGeometrie30(tmp,typ_geo_local) < 0) goto ERREUR; strcat(nomdatagroup,"."); strcat(nomdatagroup,tmp); } if ( _MEDnomEntite(tmp,_type_ent_distant) < 0) goto ERREUR; strcat(nomdatagroup,"."); strcat(nomdatagroup,tmp); if ((_type_ent_distant != MED_NOEUD)) { if ( _MEDnomGeometrie30(tmp,typ_geo_distant) < 0) goto ERREUR; strcat(nomdatagroup,"."); strcat(nomdatagroup,tmp); } /* le couple d'entite n'existe pas, on renvoie 0 */ if ((datagroup2 = _MEDdatagroupOuvrir(datagroup1,nomdatagroup)) < 0 ) goto SORTIE; /* erreur : le couple d'entite existe mais on ne peut lire l'attribut NBR */ if ( _MEDattrEntierLire(datagroup2,MED_NOM_NBR,&n) < 0) { MESSAGE("Impossible de lire l'attribut NBR : "); SSCRUTE(chemin);SSCRUTE(MED_NOM_NBR); goto ERREUR; } /* * On ferme tout */ SORTIE: ret= n; ERREUR: if (datagroup2 > 0 ) if ( _MEDdatagroupFermer(datagroup2) < 0) { MESSAGE("Impossible de fermer le groupe : "); SSCRUTE(chemin);SSCRUTE(nomdatagroup);ret=-1; } if (datagroup1 > 0 ) if ( _MEDdatagroupFermer(datagroup1) < 0) { MESSAGE("Impossible de fermer le groupe : "); SSCRUTE(chemin);ret= -1; } return (med_int) ret; }
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_int MEDnEntMaa(med_idt fid, char *maa, med_table quoi, med_entite_maillage type_ent, med_geometrie_element type_geo, med_connectivite type_conn) { med_idt root=0, maaid=0, entid=0,geoid=0, dataset=0; med_int 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]; char nom_dataset[MED_TAILLE_NOM_ENTITE+1]; med_int res = 0; 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) goto ERROR; /* * On met a jour le nom du Data Group representant * le type des entites */ if ( _MEDnomEntite(nom_ent,_type_ent) < 0) goto ERROR; /* * Si le Data Group des entites n'existe pas => res = 0 */ entid = _MEDdatagroupOuvrir(maaid,nom_ent); /* * Pour les mailles, les faces et le aretes * si le Data Group du type geometrique n'existe pas => res = 0 */ if ((_type_ent==MED_MAILLE)||(_type_ent==MED_FACE)||(_type_ent==MED_ARETE)) { if ( _MEDnomGeometrie30(nom_geo,type_geo) < 0) goto ERROR; geoid = _MEDdatagroupOuvrir(entid,nom_geo); } else geoid = -1; /* * Ouverture du Data Set renvoye par _MEDnomDataset() * S'il n'existe pas => erreur * Sinon lecture de l'attribut NBR */ if (geoid == -1) root = entid; else root = geoid; if ( _MEDnomDataset(nom_dataset,quoi,type_conn) < 0) goto ERROR; dataset = _MEDdatasetOuvrir(root,nom_dataset); if (dataset > 0) if ( _MEDattrEntierLire(dataset,MED_NOM_NBR,&res) < 0) goto ERROR; /* * On ferme tout */ ret=res; ERROR : if (dataset > 0) if ( _MEDdatasetFermer(dataset) < 0) ret=-1; if (geoid > 0) if ( _MEDdatagroupFermer(geoid) < 0) ret=-1; if (entid > 0) if ( _MEDdatagroupFermer(entid) < 0) ret=-1; if (maaid > 0) if ( _MEDdatagroupFermer(maaid) < 0) ret=-1; /*ICI;_MEDobjetsOuverts(fid);*/ return ret; }
med_err MEDjointEcr (med_idt fid, char *maa, char *jn, med_int *corrtab, med_int n, med_entite_maillage type_ent_local, med_geometrie_element typ_geo_local, med_entite_maillage type_ent_distant, med_geometrie_element typ_geo_distant) { med_entite_maillage _type_ent_local = (med_entite_maillage) ( (int)(type_ent_local) % 10 ); med_entite_maillage _type_ent_distant = (med_entite_maillage) ( (int)(type_ent_distant) % 10 ); med_idt corrid, datagroup; med_err ret; char chemin[MED_TAILLE_MAA+MED_TAILLE_JNT+2*MED_TAILLE_NOM+1]; char nomdatagroup[MED_TAILLE_NOM+1+MED_TAILLE_NOM+1]; char tmp[MED_TAILLE_NOM_ENTITE+1]; med_size dimd[1]; med_mode_acces MED_MODE_ACCES; /* if (typ_geo_local == MED_TETRA4 || typ_geo_local == MED_TETRA10 || */ /* typ_geo_local == MED_HEXA8 || typ_geo_local == MED_HEXA20 || */ /* typ_geo_local == MED_PENTA6 || typ_geo_local == MED_PENTA15 || */ /* typ_geo_local == MED_PYRA5 || typ_geo_local == MED_PYRA13 || */ /* typ_geo_distant == MED_TETRA4 || typ_geo_distant == MED_TETRA10 || */ /* typ_geo_distant == MED_HEXA8 || typ_geo_distant == MED_HEXA20 || */ /* typ_geo_distant == MED_PENTA6 || typ_geo_distant == MED_PENTA15 || */ /* typ_geo_distant == MED_PYRA5 || typ_geo_distant == MED_PYRA13) */ /* return -1; */ /* * On inhibe le gestionnaire d'erreur HDF 5 */ _MEDmodeErreurVerrouiller(); if (MEDcheckVersion(fid) < 0) return -1; if ( (MED_MODE_ACCES = _MEDmodeAcces(fid) ) == MED_UNDEF_MODE_ACCES ) { MESSAGE("Impossible de déterminer le mode d'acces au fichier "); return -1; } /* * Si le Data Group de "JNT" n'existe pas => erreur */ strcpy(chemin,MED_MAA); strcat(chemin,maa); strcat(chemin,MED_JNT); strcat(chemin,jn); if ((corrid = _MEDdatagroupOuvrir(fid,chemin)) < 0) { MESSAGE(chemin); return -1; } /* * Ecriture de la correspondance * construction du tag HDF "reperant" la correspondance * */ if ((ret = _MEDnomEntite(nomdatagroup,_type_ent_local)) < 0) return -1; if ((_type_ent_local != MED_NOEUD)) { if ((ret = _MEDnomGeometrie(tmp,typ_geo_local)) < 0) return -1; strcat(nomdatagroup,"."); strcat(nomdatagroup,tmp); } if ((ret = _MEDnomEntite(tmp,_type_ent_distant)) < 0) return -1; strcat(nomdatagroup,"."); strcat(nomdatagroup,tmp); if ((_type_ent_distant != MED_NOEUD)) { if ((ret = _MEDnomGeometrie(tmp,typ_geo_distant)) < 0) return -1; strcat(nomdatagroup,"."); strcat(nomdatagroup,tmp); } datagroup = 0; /* * Si la correspondance existe, on passe en mode * ajout ????????? */ if (((datagroup = _MEDdatagroupOuvrir(corrid,nomdatagroup)) > 0) && ( MED_MODE_ACCES == MED_LECTURE_AJOUT)) return -1; else if (datagroup > 0) _MEDdatagroupFermer(datagroup); if ((datagroup = _MEDdatagroupCreer(corrid,nomdatagroup)) < 0) return -1; /* * L'attribut "NBR" */ if ((ret = _MEDattrEntierEcrire(datagroup,MED_NOM_NBR,&n)) < 0) return -1; dimd[0] = 2*n; #if defined(HAVE_F77INT64) if ((ret = _MEDdatasetNumEcrire(datagroup,MED_NOM_COR,MED_INT64,MED_NO_INTERLACE,MED_DIM1,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,0,MED_NOPG,dimd, (unsigned char*) corrtab)) < 0) return -1; #else if ((ret = _MEDdatasetNumEcrire(datagroup,MED_NOM_COR,MED_INT32,MED_NO_INTERLACE,MED_DIM1,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,0,MED_NOPG,dimd, (unsigned char*) corrtab)) < 0) return -1; #endif /* * On ferme tout */ if ((ret = _MEDdatagroupFermer(datagroup)) < 0) return -1; if ((ret = _MEDdatagroupFermer(corrid)) < 0) return -1; return 0; }
med_err MED231champRefInfoEtRenMaa(med_idt fid,char *champ, med_entite_maillage type_ent, med_geometrie_element type_geo, int indice, med_int numdt, med_int numo, char * maa, med_booleen * local, med_int *ngauss) { med_err ret=-1; int num; med_idt datagroup2=0,datagroup3=0,gid_maa=0,gid_lien=0; char chemin[(MED_TAILLE_CHA+MED_TAILLE_NOM+1)+(2*MED_TAILLE_NOM_ENTITE+2)+(2*MED_MAX_PARA+1)+(MED_TAILLE_NOM)+1]=""; char chemini[(MED_TAILLE_CHA+MED_TAILLE_NOM+1)+(2*MED_TAILLE_NOM_ENTITE+2)+(2*MED_MAX_PARA+1)+(MED_TAILLE_NOM)+1]=""; char chemin_maa[MED_TAILLE_MAA+MED_TAILLE_NOM+1]=""; char chemin_lien[MED_TAILLE_LIENS+MED_TAILLE_NOM+1]=""; char nomdatagroup1[2*MED_TAILLE_NOM_ENTITE+2]=""; char nomdatagroup2[2*MED_MAX_PARA+1]=""; char tmp1 [MED_TAILLE_NOM_ENTITE+1]=""; char maai [MED_TAILLE_NOM+1]; char maaf [MED_TAILLE_NOM+1]=""; /* * On inhibe le gestionnaire d'erreur HDF 5 */ _MEDmodeErreurVerrouiller(); /* * On construit le nom du datagroup */ strcpy(chemin,MED_CHA); strcat(chemin,champ); strcat(chemin,"/"); /* * Si le Data Group de niveau 1 <type_ent>[.<type_geo>] n'existe pas => erreur */ /* modif pour la version 2.3.3 */ if (_MEDnomEntite(nomdatagroup1,type_ent) < 0) goto ERROR; if ((type_ent != MED_NOEUD)) { if (_MEDnomGeometrie(tmp1,type_geo) < 0) goto ERROR; strcat(nomdatagroup1,"."); strcat(nomdatagroup1,tmp1); } strcat(chemin,nomdatagroup1); strcat(chemin,"/"); /* * Si le Data Group de niveau 2 <numdtt>.<numoo> n'existe pas => erreur */ sprintf(nomdatagroup2,"%*li%*li",MED_MAX_PARA,(long ) numdt,MED_MAX_PARA,(long ) numo); strcat(chemin,nomdatagroup2); /* * Modifie le nom de la première référence à un maillage * si besoin est */ if ( (datagroup2 = _MEDdatagroupOuvrir(fid,chemin)) < 0 ) { MESSAGE("Erreur à l'ouverture du datagroup : "); SSCRUTE(chemin); goto ERROR; } if ( _MEDattrStringLire(datagroup2,MED_NOM_MAI,MED_TAILLE_NOM,maai) < 0 ) { MESSAGE("Erreur de lecture de l'attribut MED_NOM_MAI : "); SSCRUTE(maai); goto ERROR; } if ( MAJ_231_232_chaine(maai,maaf) ) { fprintf(stdout," >>> Normalisation du nom de maillage par défaut [%s] associé au champ [%s] pour (n°dt,n°it) ("IFORMAT","IFORMAT")\n",maai,champ,numdt,numo); ret = _MEDattrStringEcrire(datagroup2,MED_NOM_MAI,MED_TAILLE_NOM,maaf); EXIT_IF(ret < 0,"Renommage du maillage en",maaf); fprintf(stdout," >>> Normalisation du nom du maillage par défaut [%s] ... OK ... \n",maaf); } if (_MEDdatagroupFermer(datagroup2) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_int(datagroup2); goto ERROR; } strcat(chemin,"/"); /* * Cherche le datagroup de niveau 3 <maa> correspondant à l'indice <num> */ num = indice - 1; if (_MEDobjetIdentifier(fid,chemin,num,maa) < 0) { MESSAGE("Impossible de trouver un groupe à l'indice spécifié : "); SSCRUTE(chemin); ISCRUTE_int(num); goto ERROR; }; if ( MAJ_231_232_chaine(maa,maaf) ) { fprintf(stdout," >>> Normalisation du nom de maillage [%s] associé au champ [%s] pour (n°dt,n°it) ("IFORMAT","IFORMAT")\n",maa,champ,numdt,numo); /* on accede au maillage */ strcpy(chemini,chemin); strcat(chemini,maa); strcat(chemin,maaf); ret = H5Gmove(fid, chemini, chemin ); EXIT_IF(ret < 0,"Renommage du maillage en",maaf); fprintf(stdout," >>> Normalisation du nom du maillage [%s] ... OK ... \n",maaf); } else strcat(chemin,maa); /* * Si le Data Group de niveau 3 <maa> n'existe pas => erreur */ if ((datagroup3 = _MEDdatagroupOuvrir(fid,chemin)) < 0) { MESSAGE("Erreur d'ouverture du datagroup lien au maillage : "); SSCRUTE(chemin); goto ERROR; }; /* Lire le nbre des points de GAUSS*/ if (_MEDattrEntierLire(datagroup3,MED_NOM_NGA,ngauss) < 0) { MESSAGE("Erreur à la lecture de l'attribut MED_NOM_NGA : "); ISCRUTE(*ngauss);goto ERROR; }; /* Maillage local ou distant */ /* Les noms de maillages n'ayant pas encore été mis à jour on garde l'ancien nom pour le test local/distant */ strcpy(chemin_maa,MED_MAA); strcat(chemin_maa,maa); /* Le maillage est il distant */ if ( (gid_maa = _MEDdatagroupOuvrir(fid,chemin_maa)) < 0) { /* Verifie que le maillage est bien référencé comme distant */ strcpy(chemin_lien,MED_LIENS); strcat(chemin_lien,maa); if ((gid_lien = _MEDdatagroupOuvrir(fid,chemin_lien)) < 0) { /* MESSAGE("Le maillage n'est ni local, ni distant : "); */ /* SSCRUTE(chemin_maa);SSCRUTE(chemin_lien); goto ERROR; */ *local = MED_FAUX; } *local = MED_FAUX; } else *local = MED_VRAI; /*On retourne le nouveau nom de maillage*/ if ( strlen(maaf) ) strcpy(maa,maaf); /* * On ferme tout */ ret = 0; ERROR: if (datagroup3>0) if (_MEDdatagroupFermer(datagroup3) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_int(datagroup3); ret = -1; } if (gid_maa>0) if (_MEDdatagroupFermer(gid_maa) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_id(gid_maa); ret = -1; } if (gid_lien>0) if (_MEDdatagroupFermer(gid_lien) < 0) { MESSAGE("Impossible de fermer le datagroup : "); SSCRUTE(chemin_lien); ret = -1; } return ret; }
void _MEDfieldnProfile236(int dummy, ...) { med_int _ret=-1,_err=-1; med_idt _gid=0,_datagroup1=0; char _path[(MED_TAILLE_CHA+MED_NAME_SIZE+1)+(2*MED_MAX_PARA+1)+1]=MED_CHA; char _datagroupname1 [2*MED_TAILLE_NOM_ENTITE+2]=""; char _nomdatagroup2 [2*MED_MAX_PARA+1] =""; char _geotype [MED_TAILLE_NOM_ENTITE+1] =""; char _profilename [MED_NAME_SIZE+1] =""; char _meshname [MED_NAME_SIZE+1] =""; char _localizationname[MED_NAME_SIZE+1] =""; med_int _numdt=0, _numit=0; med_size _n=0,_ncpst=0; med_bool _checkmultiplemesh=MED_TRUE, _multiplemesh =MED_FALSE; med_bool _checkmeshname =MED_TRUE, _samedefaultmeshname=MED_FALSE; char _tmp1 [MED_TAILLE_NOM_ENTITE+1]=""; /* med_size _rank; */ MED_VARGS_DECL(const, med_idt , , fid ); MED_VARGS_DECL(const, char * , const , fieldname ); MED_VARGS_DECL(const, med_int , , numdt ); MED_VARGS_DECL(const, med_int , , numit ); MED_VARGS_DECL(const, med_entity_type , , entitype ); MED_VARGS_DECL(const, med_geometry_type , , geotype ); MED_VARGS_DECL(, char *, const , defaultprofilename ); MED_VARGS_DECL(, char *, const , defaultlocalizationname ); MED_VARGS_DECL(, med_int * ,, fret ); va_list params; va_start(params,dummy); MED_VARGS_DEF(const, med_idt , , fid ); MED_VARGS_DEF(const, char * , const , fieldname ); MED_VARGS_DEF(const, med_int , , numdt ); MED_VARGS_DEF(const, med_int , , numit ); MED_VARGS_DEF(const, med_entity_type , , entitype ); MED_VARGS_DEF(const, med_geometry_type , , geotype ); MED_VARGS_DEF(, char *, const , defaultprofilename ); MED_VARGS_DEF(, char *, const , defaultlocalizationname ); MED_VARGS_DEF(, med_int * ,, fret ); /* * On inhibe le gestionnaire d'erreur HDF 5 */ _MEDmodeErreurVerrouiller(); NOFINALBLANK(fieldname,ERROR); /* * Autorise la lecture du profile et de la localisation des points d'intégration * s'il n'y a qu'un même maillage sur tous les pas de temps de tous les couples * (typent,typgeo) */ #if ! defined(MED_CHECK_23FORMAT) #error "Data model objects version checking must be either activated or deactivated, hence MED_CHECK_23FORMAT macro must be defined." #error "Verify that you include med_config.h, thanks." #endif # if MED_CHECK_23FORMAT == 1 if ( _MEDfieldComputingStepCheck236(fid, fieldname, &_ncpst, _checkmultiplemesh, &_multiplemesh, _checkmeshname, &_samedefaultmeshname) < 0) { MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_FIELD,fieldname); goto ERROR; } # endif strcat(_path,fieldname); strcat(_path,"/"); if (_MEDnomEntite(_datagroupname1,entitype) < 0) { MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_ENTITY,MED_ERR_VALUE_MSG); ISCRUTE_int(entitype);SSCRUTE(_path);goto ERROR; }; if ((entitype != MED_NOEUD)) { if (_MEDnomGeometrie30(_tmp1,geotype) < 0) { MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_GEOMETRIC,MED_ERR_VALUE_MSG); ISCRUTE_int(geotype);SSCRUTE(_path);goto ERROR; } strcat(_datagroupname1,"."); strcat(_datagroupname1,_tmp1); } strcat(_path,_datagroupname1); if ((_datagroup1 = _MEDdatagroupOuvrir(fid,_path)) < 0) { _ret = 0; goto ERROR; } strcat(_path,"/"); /*TODO : Vérifier IFORMAT */ sprintf(_nomdatagroup2,"%*li%*li",MED_MAX_PARA,(long ) numdt,MED_MAX_PARA,(long ) numit); strcat(_path,_nomdatagroup2); /* if ( _MEDobjectGetRank(fid, */ /* _path, */ /* _rank ) < 0 ) { */ /* MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDobjectGetRank"); */ /* goto ERROR; */ /* } */ if ((_gid = _MEDdatagroupOuvrir(fid,_path)) < 0) { _ret = 0; goto ERROR; } strcat(_path,"/"); /*Lit l'attribut MED_NOM_NDT */ if ( _MEDattrEntierLire(_gid,MED_NOM_NDT, &_numdt) < 0) { MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_FIELD_MSG); SSCRUTE(fieldname);SSCRUTE(_path);SSCRUTE(MED_NOM_NDT); ISCRUTE(_numdt);goto ERROR; } if ( _numdt != numdt) { MED_ERR_(_ret,MED_ERR_NOTEQUAL,MED_ERR_ATTRIBUTE,MED_ERR_FIELD_MSG); SSCRUTE(fieldname);ISCRUTE(_numdt);ISCRUTE(numdt);goto ERROR; } /*Lit l'attribut MED_NOM_NOR */ if ( _MEDattrEntierLire(_gid,MED_NOM_NOR, &_numit) < 0) { MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_FIELD_MSG); SSCRUTE(fieldname);SSCRUTE(_path);SSCRUTE(MED_NOM_NOR); ISCRUTE(_numit); goto ERROR; } if ( _numit != numit) { MED_ERR_(_ret,MED_ERR_NOTEQUAL,MED_ERR_ATTRIBUTE,MED_ERR_FIELD_MSG); SSCRUTE(fieldname);ISCRUTE(_numit);ISCRUTE(numit);goto ERROR; } /*Pas d'info maillage local ou distant*/ if (_MEDattrStringLire(_gid,MED_NOM_MAI,MED_TAILLE_NOM,_meshname) < 0) { MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_FIELD_MSG); SSCRUTE(fieldname);SSCRUTE(_path);SSCRUTE(MED_NOM_MAI); SSCRUTE(_meshname); goto ERROR; }; strcat(_path,_meshname); if ( _MEDattributeStringRdByName(fid, _path, MED_NOM_GAU, MED_TAILLE_NOM, _localizationname) < 0 ) { MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_ATTRIBUTE, MED_ERR_NAME_MSG ); SSCRUTE(MED_NOM_GAU);SSCRUTE(_localizationname);goto ERROR; } if ( ! strcmp(_localizationname,MED_NOGAUSSi)) strcpy(defaultlocalizationname,MED_NO_LOCALIZATION); else strcpy(defaultlocalizationname,_localizationname); if ( _MEDattributeStringRdByName(fid, _path, MED_NOM_PFL, MED_TAILLE_NOM, _profilename) < 0 ) { MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_ATTRIBUTE, MED_ERR_NAME_MSG ); SSCRUTE(MED_NOM_PFL);SSCRUTE(_profilename);goto ERROR; } if ( strcmp(_profilename,MED_NOPFLi) && strcmp(_profilename,"") ) /* le test MED_NOPFLi pour des raisons de compatibilité */ { strcpy(defaultprofilename,_profilename); } else { strcpy(defaultprofilename, MED_NO_PROFILE); } _ret = (med_int) 1; ERROR: if (_datagroup1>0) if (_MEDdatagroupFermer(_datagroup1) < 0) { MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_path); SSCRUTE(_datagroupname1); ISCRUTE_id(_datagroup1); } if (_gid>0) if (_MEDdatagroupFermer(_gid) < 0) { MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_path); ISCRUTE_id(_gid); } va_end(params); *fret = _ret; return; }
med_err MEDnomLire(med_idt fid,char *maa, char *nom, 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_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 ouvre le "Data Group" du type geometrique correspondant */ 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 /* pour les noeuds */ geoid = -1; /* * Lecture du "Data Set" "NOM" : * - En cas d'erreur, pas de message car la presence des * noms est optionnelle dans un maillage MED */ if (geoid == -1) root = entid; else root = geoid; if (_MEDdatasetStringLire(root,MED_NOM_NOM,nom) < 0) goto ERREUR; /* * Tout s'est bien passé si on est parvenu jusqu'ici */ ret = 0; /* * On ferme tout y compris en cas d'erreur */ 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; }
med_err MEDchampRefInfo(med_idt fid,char *champ, med_entite_maillage type_ent, med_geometrie_element type_geo, int indice, med_int numdt, med_int numo, char * maa, med_booleen * local, med_int *ngauss) { med_err ret=-1; int num; med_idt datagroup3=0,gid_maa=0,gid_lien=0; char chemin[(MED_TAILLE_CHA+MED_TAILLE_NOM+1)+(2*MED_TAILLE_NOM_ENTITE+2)+(2*MED_MAX_PARA+1)+(MED_TAILLE_NOM)+1]=""; char chemin_maa[MED_TAILLE_MAA+MED_TAILLE_NOM+1]=""; char chemin_lien[MED_TAILLE_LIENS+MED_TAILLE_NOM+1]=""; char nomdatagroup1[2*MED_TAILLE_NOM_ENTITE+2]=""; char nomdatagroup2[2*MED_MAX_PARA+1]=""; char tmp1 [MED_TAILLE_NOM_ENTITE+1]=""; /* * On inhibe le gestionnaire d'erreur HDF 5 */ _MEDmodeErreurVerrouiller(); if (MEDcheckVersion(fid) < 0) return -1; /* * On construit le nom du datagroup */ strcpy(chemin,MED_CHA); strcat(chemin,champ); strcat(chemin,"/"); /* * Si le Data Group de niveau 1 <type_ent>[.<type_geo>] n'existe pas => erreur */ /* modif pour la version 2.3.3 */ if (_MEDnomEntite(nomdatagroup1,type_ent) < 0) goto ERROR; if ((type_ent != MED_NOEUD)) { if (_MEDnomGeometrie30(tmp1,type_geo) < 0) goto ERROR; strcat(nomdatagroup1,"."); strcat(nomdatagroup1,tmp1); } strcat(chemin,nomdatagroup1); strcat(chemin,"/"); /* * Si le Data Group de niveau 2 <numdtt>.<numoo> n'existe pas => erreur */ sprintf(nomdatagroup2,"%*li%*li",MED_MAX_PARA,(long ) numdt,MED_MAX_PARA,(long ) numo); strcat(chemin,nomdatagroup2); strcat(chemin,"/"); /* * Cherche le datagroup de niveau 3 <maa> correspondant à l'indice <num> */ num = indice - 1; if (_MEDobjetIdentifier(fid,chemin,num,maa) < 0) { MESSAGE("Impossible de trouver un groupe à l'indice spécifié : "); SSCRUTE(chemin); ISCRUTE_int(num); goto ERROR; }; strcat(chemin,maa); /* * Si le Data Group de niveau 3 <maa> n'existe pas => erreur */ if ((datagroup3 = _MEDdatagroupOuvrir(fid,chemin)) < 0) { MESSAGE("Erreur d'ouverture du datagroup lien au maillage : "); SSCRUTE(chemin); goto ERROR; }; /* Lire le nbre des points de GAUSS*/ if (_MEDattrEntierLire(datagroup3,MED_NOM_NGA,ngauss) < 0) { MESSAGE("Erreur à la lecture de l'attribut MED_NOM_NGA : "); ISCRUTE(*ngauss);goto ERROR; }; /* Maillage local ou distant */ strcpy(chemin_maa,MED_MAA); strcat(chemin_maa,maa); /* Le maillage est il distant */ if ( (gid_maa = _MEDdatagroupOuvrir(fid,chemin_maa)) < 0) { /* Verifie que le maillage est bien référencé comme distant */ strcpy(chemin_lien,MED_LIENS); strcat(chemin_lien,maa); if ((gid_lien = _MEDdatagroupOuvrir(fid,chemin_lien)) < 0) { /* MESSAGE("Le maillage n'est ni local, ni distant : "); */ /* SSCRUTE(chemin_maa);SSCRUTE(chemin_lien); goto ERROR; */ *local = MED_FAUX; } *local = MED_FAUX; } else *local = MED_VRAI; /* * On ferme tout */ ret = 0; ERROR: if (datagroup3>0) if (_MEDdatagroupFermer(datagroup3) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_int(datagroup3); ret = -1; } if (gid_maa>0) if (_MEDdatagroupFermer(gid_maa) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_id(gid_maa); ret = -1; } if (gid_lien>0) if (_MEDdatagroupFermer(gid_lien) < 0) { MESSAGE("Impossible de fermer le datagroup : "); SSCRUTE(chemin_lien); ret = -1; } return ret; }
med_err MEDnumEcr(med_idt fid,char *maa, med_int *num, med_int n, med_entite_maillage type_ent,med_geometrie_element type_geo) { med_idt root, maaid, entid, geoid, dataset; med_err ret; med_size dimd[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_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 on le cree */ if ((entid = _MEDdatagroupOuvrir(maaid,nom_ent)) < 0) if ((root = _MEDdatagroupCreer(maaid,nom_ent)) < 0) return -1; /* * Pour les mailles, les faces et le aretes, on cree * s'il n'existe pas le Data Group du type geometrique */ if ((_type_ent==MED_MAILLE)||(_type_ent==MED_FACE)||(_type_ent==MED_ARETE)) { if ((ret = _MEDnomGeometrie(nom_geo,type_geo)) < 0) return -1; if ((geoid = _MEDdatagroupOuvrir(entid,nom_geo)) < 0) if ((geoid = _MEDdatagroupCreer(entid,nom_geo)) < 0) return -1; } else geoid = -1; /* * Creation du Data Set "NUM" */ if (geoid == -1) root = entid; else root = geoid; dimd[0] = n; #if defined(HAVE_F77INT64) if ((ret = _MEDdatasetNumEcrire(root,MED_NOM_NUM,MED_INT64,MED_NO_INTERLACE,MED_DIM1,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,0,MED_NOPG,dimd, (unsigned char*) num)) < 0) return -1; #else if ((ret = _MEDdatasetNumEcrire(root,MED_NOM_NUM,MED_INT32,MED_NO_INTERLACE,MED_DIM1,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,0,MED_NOPG,dimd, (unsigned char*) num)) < 0) return -1; #endif /* * Attribut NBR (nombre de noeuds) */ if ((dataset = _MEDdatasetOuvrir(root,MED_NOM_NUM)) < 0) return -1; if ((ret = _MEDattrEntierEcrire(dataset,MED_NOM_NBR,&n)) < 0) return -1; /* * On ferme tout */ if ((ret = _MEDdatasetFermer(dataset)) < 0) return -1; if (geoid != -1) if ((ret = _MEDdatagroupFermer(geoid)) < 0) return -1; if ((ret = _MEDdatagroupFermer(entid)) < 0) return -1; if ((ret = _MEDdatagroupFermer(maaid)) < 0) return -1; return 0; }