med_int MEDnValProfil(med_idt fid, char *nom) { med_int n = 0; med_idt gid; char chemin[MED_TAILLE_PROFILS+MED_TAILLE_NOM+1]; med_err ret; /* * On inhibe le gestionnaire d'erreur HDF 5 */ _MEDmodeErreurVerrouiller(); if (MEDcheckVersion(fid) < 0) return -1; /* * ouverture du groupe /PROFILS/<nom> */ strcpy(chemin,MED_PROFILS); strcat(chemin,nom); if ((gid = _MEDdatagroupOuvrir(fid,chemin)) < 0){ MESSAGE("Impossible d'ouvrir le groupe MED_PROFILS : "); SSCRUTE(chemin); return -1; } if ((ret = _MEDattrEntierLire(gid,MED_NOM_NBR,&n)) < 0) { MESSAGE("Erreur à la lecture de l'attribut MED_NOM_NBR : "); ISCRUTE(n); return -1; } /* * On ferme tout */ if ((ret = _MEDdatagroupFermer(gid)) < 0) return -1; return n; }
med_err MEDfermer(med_idt fid) { #ifdef _DEBUG_ _MEDobjetsOuverts(fid); #endif /* * On inhibe le gestionnaire d'erreur */ _MEDmodeErreurVerrouiller(); if (MEDcheckVersion(fid) < 0) return -1; /* * On ferme le fichier MED */ if (_MEDfichierFermer(fid) < 0) return -1; else return 0; }
med_int MEDnbnomaLire(med_idt fid,char *nom_maillage) { med_idt maaid; med_err ret; char chemin[MED_TAILLE_MAA+MED_TAILLE_NOM+1]; med_int n; /* * On inhibe le gestionnaire d'erreur HDF */ _MEDmodeErreurVerrouiller(); if (MEDcheckVersion(fid) < 0) return -1; /* * On regarde si le maillage existe => erreur si non */ strcpy(chemin,MED_MAA); strcat(chemin,nom_maillage); if ((maaid = _MEDdatagroupOuvrir(fid,chemin)) < 0) return -1; /* * On va lire l'attribut "NNM" */ if ((ret = _MEDattrEntierLire(maaid,MED_NOM_NNM,&n)) < 0) return -1; /* * Fermetures des objets HDF */ if ((ret = _MEDdatagroupFermer(maaid)) < 0) return -1; return n; }
med_err MEDnbnosoEcr(med_idt fid, char *nom_maillage,med_int n) { med_idt maaid; char chemin[MED_TAILLE_MAA+MED_TAILLE_NOM+1]; med_err ret; /* * 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,nom_maillage); if ((maaid = _MEDdatagroupOuvrir(fid,chemin)) < 0) return -1; /* * Creation de l'attribut "Nombre de Noeuds Sommets" */ if ((ret = _MEDattrEntierEcrire(maaid,MED_NOM_NNS,&n)) < 0) return -1; /* * Fermetures */ if ((ret = _MEDdatagroupFermer(maaid)) < 0) return -1; return 0; }
med_err MEDmaaCr(med_idt fid, char *maillage, med_int dim, med_maillage type,char *desc) { med_idt maaid=0, root=0, entid=0, geoid=0 ; char chemin[MED_TAILLE_MAA+1]; char nom_ent[MED_TAILLE_NOM_ENTITE+1]; char nom_geo[MED_TAILLE_NOM_ENTITE+1]; med_err ret=-1; med_int tmp; med_mode_acces MED_MODE_ACCES; /* * On inhibe le gestionnaire d'erreur */ _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."); goto ERROR; } if ( MED_MODE_ACCES == MED_LECTURE ) { MESSAGE("Impossible de créer un maillage en mode MED_LECTURE."); goto ERROR; }; /* * Si la racine n'existe pas on la cree */ strncpy(chemin,MED_MAA,strlen(MED_MAA)-1); chemin[MED_TAILLE_MAA-1] = '\0'; if ((root = _MEDdatagroupOuvrir(fid,chemin)) < 0) if ((root = _MEDdatagroupCreer(fid,chemin)) < 0) { MESSAGE("Erreur à la création du datagroup : "); SSCRUTE(chemin); goto ERROR; } /* * Création du maillage */ NOFINALBLANK(maillage,ERROR); if ( (maaid = _MEDdatagroupCreer(root,maillage)) < 0) { MESSAGE("Erreur à la création du maillage : "); SSCRUTE(maillage); goto ERROR; } /* * Creation de l'attribut dimension */ if ((ret = _MEDattrEntierEcrire(maaid,MED_NOM_DIM,&dim)) < 0) { MESSAGE("Erreur à l'écriture de la dimension du maillage : "); ISCRUTE(dim); goto ERROR; } /* * La description associee au maillage */ if ((ret = _MEDattrStringEcrire(maaid,MED_NOM_DES,MED_TAILLE_DESC,desc)) < 0) { MESSAGE("Erreur à l'écriture de la description du maillage : "); SSCRUTE(desc); goto ERROR; } /* * Creation de l'attribut correspondant au type du maillage (MED_STRUCTURE, MED_NON_STRUCTURE) */ tmp = (med_int) type; if ((ret = _MEDattrEntierEcrire(maaid,MED_NOM_TYP,&tmp)) < 0) { MESSAGE("Erreur à l'écriture du type de maillage : "); ISCRUTE(tmp); goto ERROR; } if ( type == MED_STRUCTURE ) { strcpy(nom_ent,MED_NOM_MAI); if ((entid = _MEDdatagroupCreer(maaid,nom_ent)) < 0) { MESSAGE("Impossible de Cr\351er le datagroup :"); SSCRUTE(nom_ent); MESSAGE("pour le maillage structur\351 :"); SSCRUTE(maillage); goto ERROR; } switch ( dim ) { case 1 : strcpy(nom_geo,MED_NOM_SE2); break; case 2 : strcpy(nom_geo,MED_NOM_QU4); break; case 3 : strcpy(nom_geo,MED_NOM_HE8); break; case 0 : strcpy(nom_geo,MED_NOM_PO1); break; default : MESSAGE("La dimension doit être comprise entre 0 et 3"); goto ERROR; } if ((geoid = _MEDdatagroupCreer(entid,nom_geo)) < 0) { MESSAGE("Impossible de Créer le datagroup :"); SSCRUTE(nom_geo); MESSAGE("pour le maillage structuré :"); SSCRUTE(maillage); goto ERROR; } } /* * Nettoyages divers */ ret = 0; ERROR: if (geoid>0) if (_MEDdatagroupFermer(geoid) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_id(geoid);ret = -1; } if (entid>0) if (_MEDdatagroupFermer(entid) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_id(entid);ret = -1; } if (maaid>0) if (_MEDdatagroupFermer(maaid) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_id(maaid);ret = -1; } if (root>0) if (_MEDdatagroupFermer(root) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_id(root); ret = -1; } return ret; }
med_idt MEDouvrir(char *nom, med_mode_acces mode_acces) { med_idt fid=0; /* * On inhibe le gestionnaire d'erreur HDF */ _MEDmodeErreurVerrouiller(); /* * On ouvre le fichier MED sous HDF */ switch(mode_acces) { case MED_LECTURE : if (access(nom,F_OK)) { MESSAGE("Impossible d'accéder aux fichier :"); SSCRUTE(nom); return -1; } else { if ((fid = _MEDfichierOuvrir(nom,mode_acces)) < 0) return -1; /*_MEDsetModeAcces(fid,MED_LECTURE);*/ }; break; case MED_LECTURE_ECRITURE : if (access(nom,F_OK)) { if ((fid = _MEDfichierCreer(nom,mode_acces)) < 0) return -1; } else if ((fid = _MEDfichierOuvrir(nom,mode_acces)) < 0) return -1; break; case MED_LECTURE_AJOUT : if (access(nom,F_OK)) { if ((fid = _MEDfichierCreer(nom,mode_acces)) < 0) return -1; } else if ((fid = _MEDfichierOuvrir(nom,mode_acces)) < 0) return -1; break; case MED_CREATION : if ((fid = _MEDfichierCreer(nom,MED_LECTURE_ECRITURE)) < 0) return -1; break; default : return -1; } if (MEDcheckVersion(fid) < 0) { if (fid >0) _MEDfichierFermer(fid); return -1; } return fid; }
med_err MEDdimEspaceCr(med_idt fid, char *maillage, med_int dim) { med_idt maaid=0; med_err ret=-1; char chemin[MED_TAILLE_MAA+MED_TAILLE_NOM+1]; med_int maadim; med_mode_acces MED_MODE_ACCES; /* * On inhibe le gestionnaire d'erreur */ _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."); goto ERROR; } if ( MED_MODE_ACCES == MED_LECTURE ) { MESSAGE("Impossible de créer un maillage en mode MED_LECTURE."); goto ERROR; }; /* * On regarde si le groupe existe => erreur si non */ strcpy(chemin,MED_MAA); strcat(chemin,maillage); if ((maaid = _MEDdatagroupOuvrir(fid,chemin)) < 0) { MESSAGE("Erreur à l'ouverture du maillage : "); SSCRUTE(chemin); goto ERROR; } /* * On va lire l'attribut dimension du maillage et on controle * la coherence */ if ((ret = _MEDattrEntierLire(maaid,MED_NOM_DIM,&maadim)) < 0) { MESSAGE("Erreur à la lecture de la dimension du maillage : "); ISCRUTE(maadim); goto ERROR; } if (maadim > dim) { MESSAGE("La dimension de l'espace : "); ISCRUTE(dim); MESSAGE("doit être supérieur à la dimension du maillage : "); ISCRUTE(maadim); goto ERROR; } /* * On ecrit la dimension de l'espace */ if ((ret = _MEDattrEntierEcrire(maaid,MED_NOM_ESP,&dim)) < 0) { MESSAGE("Erreur à l'écriture de la dimension de l'espace : "); ISCRUTE(dim); goto ERROR; } /* * Fermetures des objets HDF */ ret = 0; ERROR: if (maaid>0) if (_MEDdatagroupFermer(maaid) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_id(maaid);ret = -1; } return ret; }
void MEDjointCr231(int dummy,...) { med_idt fid ; char * maa_lcl ; char * jn ; char * desc ; med_int dom ; char * maa_dist ; med_err * fret ; med_idt root=0,jntid=0; med_err ret=-1; char chemin[MED_TAILLE_MAA+MED_TAILLE_JNT+MED_TAILLE_NOM+1]; char tmp[MED_TAILLE_JNT+1]; med_int nbc=0; med_mode_acces MED_MODE_ACCES; va_list params; va_start(params,dummy); fid = va_arg(params,med_idt); maa_lcl = va_arg(params,char *); jn = va_arg(params,char *); desc = va_arg(params,char *); dom = va_arg(params,med_int); maa_dist = va_arg(params,char*); fret = va_arg(params,med_err *); /* * On inhibe le gestionnaire d'erreur */ _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 un joint en mode MED_LECTURE."); goto ERROR; }; /* * Si le Data Group "JNT" n'existe pas, on le cree */ strcpy(chemin,MED_MAA); NOFINALBLANK(maa_lcl,ERROR); strcat(chemin,maa_lcl); strncpy(tmp,MED_JNT,MED_TAILLE_JNT-1); tmp[MED_TAILLE_JNT-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; } /* * Si un joint du meme nom existe => erreur * Sinon on le cree */ NOFINALBLANK(jn,ERROR); if ((jntid = _MEDdatagroupCreer(root,jn)) < 0) { MESSAGE("Erreur à la création du joint : "); SSCRUTE(jn); goto ERROR; } /* * L'attribut "DES" */ if ((ret = _MEDattrStringEcrire(jntid,MED_NOM_DES,MED_TAILLE_DESC,desc)) < 0) { MESSAGE("Erreur à l'écriture de la description du joint : "); SSCRUTE(desc); goto ERROR; } /* * L'attribut "MAI" */ /* BUG CORRIGE EN 232 MED_TAILLE_NOM au lieu de MED_TAILLE_MAA */ /* conservé ici pour éviter de reprendre en lib2.3.2 un fichier 2.3.1 en écrivant l'attribut avec une taille plus grande que celle des fichiers 2.3.1 */ if ((ret = _MEDattrStringEcrire(jntid,MED_NOM_MAI,MED_TAILLE_MAA,maa_dist)) < 0) { MESSAGE("Erreur à l'écriture du nom du maillage distant : "); SSCRUTE(maa_dist); goto ERROR; } /* * L'attribut "DOM" */ if ((ret = _MEDattrEntierEcrire(jntid,MED_NOM_DOM,&dom)) < 0) { MESSAGE("Erreur à l'écriture du domaine : "); ISCRUTE(dom); goto ERROR; } /* * On ferme tout */ ret=0; ERROR: if (jntid>0) if (_MEDdatagroupFermer(jntid) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_id(jntid);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; }
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_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 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 MEDchampCr( med_idt fid, char * champ, med_type_champ type, char * comp, char * unit, med_int ncomp) { med_err ret=-1; med_idt root=0,gid=0; char chemin[MED_TAILLE_CHA+1]; med_size dimd[1]; med_int _type = (med_int) type; med_mode_acces MED_MODE_ACCES; /* * 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."); goto ERROR; } if ( MED_MODE_ACCES == MED_LECTURE ) { MESSAGE("Impossible de créer un champ en mode MED_LECTURE."); goto ERROR; }; /* * Si le Data Group "/CHA/" n'existe pas, on le cree */ strncpy(chemin,MED_CHA,MED_TAILLE_CHA-1); chemin[MED_TAILLE_CHA-1] = '\0'; 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 cha n'existe pas, on le cree * Sinon => erreur */ NOFINALBLANK(champ,ERROR); if ((gid = _MEDdatagroupCreer(root,champ)) < 0) { MESSAGE("Erreur à la création du champ : "); SSCRUTE(champ); goto ERROR; } /* * Les infos sur les composants du champ */ if ( _MEDattrEntierEcrire(gid,MED_NOM_NCO,&ncomp) < 0 ) { MESSAGE("Erreur à l'écriture du nombre de composantes : "); ISCRUTE(ncomp); goto ERROR; } if ( _MEDattrEntierEcrire(gid,MED_NOM_TYP,&_type) < 0) { MESSAGE("Erreur à l'écriture du type du champ : "); ISCRUTE(_type); goto ERROR; } if ( _MEDattrStringEcrire(gid,MED_NOM_NOM,MED_TAILLE_PNOM*ncomp,comp) < 0) { MESSAGE("Erreur à l'écriture des noms des composantes : "); SSCRUTE(comp); goto ERROR; } if ( _MEDattrStringEcrire(gid,MED_NOM_UNI,MED_TAILLE_PNOM*ncomp,unit) < 0) { MESSAGE("Erreur à l'écriture des unités : "); SSCRUTE(unit); goto ERROR; } /* * On ferme tout */ ret=0; ERROR: if (gid>0) if (_MEDdatagroupFermer(gid) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_id(gid);ret = -1; } if (root>0) if (_MEDdatagroupFermer(root) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_id(root); ret = -1; } return ret; }
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 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; }
med_idt MEDmonter(med_idt fid, const char *acces,med_type_donnee type) { med_err ret; med_idt root,id, did; char chemin[MED_TAILLE_NOM+1]; char acces_montage[2*MED_TAILLE_NOM+1]; med_mode_acces MED_MODE_ACCES; /* * On inhibe le gestionnaire d'erreur HDF */ _MEDmodeErreurVerrouiller(); if (MEDcheckVersion(fid) < 0) return -1; /* * On regarde si le fichier de nom "acces" existe * Si ce n'est pas le cas => erreur */ if (access(acces,F_OK)) 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; } /* * On ouvre le fichier "acces" selon le mode d'acces MED_MODE_ACCES */ if ((id = _MEDfichierOuvrir((char *)acces,MED_MODE_ACCES)) < 0) return -1; /* * Si le point de montage n'existe pas dans le fichier local, on le cree */ root = _MEDdatagroupOuvrir(fid,MED_MNT); if (root < 0) if ((root = _MEDdatagroupCreer(fid,MED_MNT)) < 0) return -1; if ((ret = _MEDdatagroupFermer(root)) < 0) return -1; /* * Montage du fichier (id) sur le point de montage local (fid) */ strncpy(acces_montage,MED_MNT,strlen(MED_MNT)-1); acces_montage[strlen(MED_MNT)-1] = '\0'; if ((ret = _MEDfichierMonter(fid,acces_montage,id)) < 0) return -1; /* * On cree un lien vers le point de montage * selon qu'on l'on veuille acceder aux champs * ou aux maillages du fichier "acces" que l'on vient * de monter sur le fichier local "fid" */ switch(type) { case MED_MAILLAGE : strcpy(chemin,MED_MAA); break; case MED_CHAMP : strcpy(chemin,MED_CHA); break; default : return -1; } /* * Creation du lien HDF vers le(s) champ(s) ou le(s) maillage(s) * dans le fichier local : * - Si ce type de donnee existe deja en local => erreur * - Sinon on le cree le lien vers le point de montage */ strcat(acces_montage,chemin); acces_montage[strlen(acces_montage)-1] = '\0'; chemin[strlen(chemin)-1] = '\0'; if ((ret = _MEDdatagroupLienCreer(fid,acces_montage,chemin)) < 0) return -1; /* * On renvoie l'ID du fichier "acces" que l'on vient de monter */ return id; }
med_err MEDindicesCoordEcr(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; med_size dimd[1]; 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; /* sizeof(enum) tjrs = sizeof(int) en C, or sur machines 64 bits par défaut med_int==long (normalement 64bits), du coup sur machines 64 bits _MEDattrEntierLire utilise le type hdf NATIVE_LONG, ce genere parfois un warning */ 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) if ((noeid = _MEDdatagroupCreer(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; } dimd[0] = n; if ((ret = _MEDdatasetNumEcrire(noeid,nom_dataset,MED_FLOAT64,MED_FULL_INTERLACE,1,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,0, MED_NOPG,dimd,(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 NBR (taille du tableau d'indices) */ if ((ret = _MEDattrEntierEcrire(dataset,MED_NOM_NBR,&n)) < 0) return -1; /* * Attribut "NOM" (nom de la composante) */ if ((ret = _MEDattrStringEcrire(dataset,MED_NOM_NOM,MED_TAILLE_PNOM,comp)) < 0) return -1; /* * Attribut "UNI" (unite de la composante) */ if ((ret = _MEDattrStringEcrire(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 MEDgaussEcr(med_idt fid, med_geometrie_element type_geo, med_float *refcoo, med_mode_switch mode_coo, med_int ngauss, med_float *gscoo, med_float * wg, char * locname ) { med_idt gid=0, chid=0; med_size dimd[1]; med_err ret = -1; med_int typegeo = -1; char chemin[MED_TAILLE_GAUSS+1]=""; med_mode_acces MED_MODE_ACCES; /* * 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 "); goto ERROR; } /* * MED_GAUSS_ELNO est un mot cle reserve */ if (! strcmp(locname,MED_GAUSS_ELNO)) { MESSAGE("MED_GAUSS_ELNO est un mot cle reserve : points Gauss sur les noeuds de l'element"); goto ERROR; } /* * Si le groupe "GAUSS" n'existe pas, on le cree */ strncpy(chemin,MED_GAUSS,MED_TAILLE_GAUSS-1); chemin[MED_TAILLE_GAUSS-1] = '\0'; if ((gid = _MEDdatagroupOuvrir(fid,chemin)) < 0) if ((gid = _MEDdatagroupCreer(fid,chemin)) < 0) { MESSAGE("Impossible de creer le groupe MED_GAUSS : "); SSCRUTE(chemin); goto ERROR; } /* * Si le groupe <locname> n'existe pas, on le cree * Sinon => erreur */ NOFINALBLANK(locname,ERROR); if ((chid = _MEDdatagroupOuvrir(gid,locname)) >= 0) { if ( MED_MODE_ACCES != MED_LECTURE_ECRITURE ) { MESSAGE("Le nom de localisation existe déjà : "); SSCRUTE(locname); goto ERROR; } } else if ((chid = _MEDdatagroupCreer(gid,locname)) < 0) goto ERROR; /* * On stocke <ngauss> sous forme d'attribut */ if (_MEDattrEntierEcrire(chid,MED_NOM_NBR,&ngauss) < 0) { MESSAGE("Erreur à l'écriture de l'attribut MED_NOM_NBR : "); ISCRUTE(ngauss);goto ERROR; }; /* * On stocke <type_geo> sous forme d'attribut */ typegeo = (med_int) type_geo; /* sizeof(enum) tjrs = sizeof(int) en C, or sur machines 64 bits par défaut med_int==long, du coup sur machines 64 bits _MEDattrEntierEcrire utilise le type hdf NATIVE_LONG, ce qui pose un problème qd on passe un enum. */ if (_MEDattrEntierEcrire(chid,MED_NOM_GEO,&typegeo) < 0) { MESSAGE("Erreur à l'écriture de l'attribut MED_NOM_GEO : "); ISCRUTE(type_geo);goto ERROR; }; /* * On stocke les coordonnées de référence dans un dataset */ dimd[0] = (type_geo%100)*(type_geo/100); if ( _MEDdatasetNumEcrire(chid,MED_NOM_COO,MED_FLOAT64,mode_coo,(type_geo/100),MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,0,MED_NOPG,dimd, (unsigned char*) refcoo) < 0 ) { MESSAGE("Impossible d'ecrire le dataset : ");SSCRUTE(MED_NOM_COO); ISCRUTE_size(dimd[0]); goto ERROR; } /* * On stocke les points d'intégration dans un dataset */ dimd[0] = ngauss*(type_geo/100); if ( _MEDdatasetNumEcrire(chid,MED_NOM_GAU,MED_FLOAT64,mode_coo,(type_geo/100),MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,0,MED_NOPG,dimd, (unsigned char*) gscoo) < 0 ) { MESSAGE("Impossible d'ecrire le dataset : ");SSCRUTE(MED_NOM_GAU); ISCRUTE_size(dimd[0]); goto ERROR; } /* * On stocke les poids dans un dataset */ dimd[0] = ngauss; if ( _MEDdatasetNumEcrire(chid,MED_NOM_VAL,MED_FLOAT64,mode_coo,1,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,0,MED_NOPG,dimd, (unsigned char*) wg) < 0 ) { MESSAGE("Impossible d'ecrire le dataset : ");SSCRUTE(MED_NOM_VAL); ISCRUTE_size(dimd[0]); goto ERROR; } ret = 0; ERROR: /* * On ferme tout */ 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; }
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 MEDprofilEcr(med_idt fid,med_int *pflval,med_int n,char *profilname) { med_idt gid, chid; med_size dimd[1]; med_err ret=-1; char chemin[MED_TAILLE_PROFILS+1]; med_mode_acces MED_MODE_ACCES; /* * 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 "); goto ERROR; } /* * Si le groupe "PROFILS" n'existe pas, on le cree */ strncpy(chemin,MED_PROFILS,MED_TAILLE_PROFILS-1); chemin[MED_TAILLE_PROFILS-1] = '\0'; if ((gid = _MEDdatagroupOuvrir(fid,chemin)) < 0) if ((gid = _MEDdatagroupCreer(fid,chemin)) < 0) { MESSAGE("Impossible de creer le groupe MED_PROFILS : "); SSCRUTE(chemin); goto ERROR; } /* * Si le groupe "profilname" n'existe pas, on le cree * Sinon => erreur */ NOFINALBLANK(profilname,ERROR); if ((chid = _MEDdatagroupOuvrir(gid,profilname)) >= 0) { if ( MED_MODE_ACCES != MED_LECTURE_ECRITURE ) { MESSAGE("Le profil existe déjà : "); SSCRUTE(profilname); goto ERROR; } } else if ((chid = _MEDdatagroupCreer(gid,profilname)) < 0) goto ERROR; /* * On stocke "n" sous forme d'attribut */ if ((ret = _MEDattrEntierEcrire(chid,MED_NOM_NBR,&n)) < 0) { MESSAGE("Erreur à l'écriture de l'attribut MED_NOM_NBR : "); ISCRUTE(n); goto ERROR; }; /* * On stocke le profil dans un dataset */ dimd[0] = n; #if defined(HAVE_F77INT64) ret = _MEDdatasetNumEcrire(chid,MED_NOM_PFL,MED_INT64,MED_NO_INTERLACE,MED_DIM1,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,0,MED_NOPG,dimd, (unsigned char*) pflval); #else ret = _MEDdatasetNumEcrire(chid,MED_NOM_PFL,MED_INT32,MED_NO_INTERLACE,MED_DIM1,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,0,MED_NOPG,dimd, (unsigned char*) pflval); #endif if (ret < 0 ) { MESSAGE("Impossible d'ecrire le dataset pflval de taille : "); ISCRUTE(n); goto ERROR; } ret = 0; ERROR: /* * On ferme tout */ 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; }
med_err MEDscalaireEntierEcr(med_idt fid, char *scalaire,med_int val, med_int numdt, char *dt_unit, med_float dt, med_int numo) { med_err ret = 0; med_idt gid,datagroup; char nomdatagroup[2*MED_MAX_PARA+1]; char chemin[MED_TAILLE_NUM_DATA+MED_TAILLE_NOM+1]; med_int type; med_mode_acces MED_MODE_ACCES; /* * 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 groupe HDF "scalaire" n'existe pas => erreur */ strcpy(chemin,MED_NUM_DATA); strcat(chemin,scalaire); if ((gid = _MEDdatagroupOuvrir(fid,chemin)) < 0) return -1; /* Creation du groupe HDF correspondant au couple <numdt>.<numoo> */ sprintf(nomdatagroup,"%*li%*li",MED_MAX_PARA,(long ) numdt,MED_MAX_PARA,(long ) numo); /* Cree ou ouvre le datagroup nomdatagroup */ datagroup = 0; if (((datagroup = _MEDdatagroupOuvrir(gid,nomdatagroup)) > 0) && ( MED_MODE_ACCES == MED_LECTURE_AJOUT )) return -1; else if (datagroup < 0) if ((datagroup = _MEDdatagroupCreer(gid,nomdatagroup)) < 0) return -1; /* Cree ou ouvre l'attribut MED_NOM_NDT */ if ((ret = _MEDattrEntierEcrire(datagroup,MED_NOM_NDT,&numdt)) < 0) return -1; /* Cree ou ouvre l'attribut MED_NOM_PDT */ if ((ret = _MEDattrFloatEcrire(datagroup,MED_NOM_PDT,&dt)) < 0) return -1; /* Cree ou ouvre l'attribut MED_NOM_NOR */ if ((ret = _MEDattrEntierEcrire(datagroup,MED_NOM_NOR,&numo)) < 0) return -1; /* Cree ou ouvre l'attribut MED_NOM_UNI */ if ( numdt == MED_NOPDT ) { if ((ret = _MEDattrStringEcrire(datagroup,MED_NOM_UNI,MED_TAILLE_PNOM,MED_PNOM_BLANC)) < 0) return -1; } else if ((ret = _MEDattrStringEcrire(datagroup,MED_NOM_UNI,MED_TAILLE_PNOM,dt_unit)) < 0) return -1; /* * Ecriture de la valeur scalaire */ if ((ret = _MEDattrEntierLire(gid,MED_NOM_TYP,&type)) < 0) return -1; switch(type) { case MED_INT : case MED_INT32 : case MED_INT64 : if ((ret = _MEDattrEntierEcrire(datagroup,MED_NOM_VAL,&val)) < 0) return -1; break; default : return -1; } /* * On ferme tout */ if ((ret = _MEDdatagroupFermer(datagroup)) < 0) return -1; if ((ret = _MEDdatagroupFermer(gid)) < 0) return -1; return ret; }
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; }
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; }
med_int MEDnGroupe(med_idt fid,char *maa, int indice) { med_idt datagroup,famid; med_err ret; char chemin[MED_TAILLE_MAA+MED_TAILLE_FAS+MED_TAILLE_FAS_ENTITE+2*MED_TAILLE_NOM+1]; char stockage[MED_TAILLE_MAA+MED_TAILLE_FAS+MED_TAILLE_FAS_ENTITE+2*MED_TAILLE_NOM+1]; med_int n; int n_tmp; int num; char famille[MED_TAILLE_NOM+1]; int nfamnoe,nfammai; /* * On inhibe le gestionnaire d'erreur HDF */ _MEDmodeErreurVerrouiller(); if (MEDcheckVersion(fid) < 0) return -1; strcpy(chemin,MED_MAA); strcat(chemin,maa); strcat(chemin,MED_FAS); num = indice - 1; /* Acces a la famille : * nfam = nfamnoe + 1 + nfammai * Repartition selon l'indice "num" dans le datagroup : * - 0..nfammai - 1 : familles des mailles/faces/aretes * - nfamai : famille 0 * - (nfamai + 1)..(nfammai+nfamnoe) : familles de noeuds */ /* On va compter les familles de mailles/faces/aretes */ strcpy(stockage,chemin); strcat(stockage,MED_FAS_ELEME_NOM); nfammai = 0; n_tmp = 0; if ((ret =_MEDnObjets(fid,stockage,&n_tmp)) == 0) nfammai = (med_int ) n_tmp; strcat(stockage,"/"); /* Pour la famille 0 */ if (num == nfammai) return 0; if (num > nfammai) { /* C'est une famille de noeuds */ strcpy(stockage,chemin); strcat(stockage,MED_FAS_NOEUD_NOM); strcat(stockage,"/"); num = num - nfammai - 1; } /* * Si le Data Group de la famille n'existe pas => erreur */ if ((ret = _MEDobjetIdentifier(fid,stockage,num, famille)) < 0) return -1; strcat(stockage,famille); if ((famid = _MEDdatagroupOuvrir(fid,stockage)) < 0) return -1; if ((datagroup = _MEDdatagroupOuvrir(famid,MED_NOM_GRO)) < 0) n = 0; else { if ((ret = _MEDattrEntierLire(datagroup,MED_NOM_NBR,&n)) < 0) return -1; if ((ret = _MEDdatagroupFermer(datagroup)) < 0) return -1; } if ((ret = _MEDdatagroupFermer(famid)) < 0) return -1; return (med_int) n; }
med_err MEDscalaireCr(med_idt fid,char *scalaire, med_type_champ type, char *desc) { med_err ret=-1; med_idt root=0,gid=0; char chemin[MED_TAILLE_NUM_DATA+1]; med_int _type = (med_int) type; med_mode_acces MED_MODE_ACCES; /* * On inhibe le gestionnaire d'erreur */ _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."); goto ERROR; } if ( MED_MODE_ACCES == MED_LECTURE ) { MESSAGE("Impossible de créer une variable scalaire en mode MED_LECTURE."); goto ERROR; }; /* * Si le Groupe HDF "/NUM_DATA" n'existe pas, on le cree */ strncpy(chemin,MED_NUM_DATA,MED_TAILLE_NUM_DATA-1); chemin[MED_TAILLE_NUM_DATA-1] = '\0'; 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 groupe HDF "scalaire" n'existe pas, on le cree * Sinon => erreur */ NOFINALBLANK(scalaire,ERROR); if ((gid = _MEDdatagroupCreer(root,scalaire)) < 0) { MESSAGE("Erreur à la création de la variable scalaire : "); SSCRUTE(scalaire); goto ERROR; } /* * On stocke l'unite, et le type de la valeur scalaire */ if ((ret = _MEDattrEntierEcrire(gid,MED_NOM_TYP,&_type)) < 0) { MESSAGE("Erreur à l'écriture du type de la varaible scalaire : "); ISCRUTE(_type); goto ERROR; } if ((ret = _MEDattrStringEcrire(gid,MED_NOM_DES,MED_TAILLE_DESC,desc)) < 0) { MESSAGE("Erreur à l'écriture de la description de la variable scalaire : "); SSCRUTE(desc); goto ERROR; } /* * On ferme tout */ ret = 0; ERROR: if (gid>0) if (_MEDdatagroupFermer(gid) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_id(gid);ret=-1; } if (root>0) if (_MEDdatagroupFermer(root) < 0) { MESSAGE("Impossible de fermer le datagroup : "); ISCRUTE_id(root);ret=-1; } 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 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_int MEDnChamp(med_idt fid, int indice) { int n1; med_int n2; med_idt datagroup; med_err ret; char nomdatagroup[MED_TAILLE_NOM+1]; int num; char chemin[MED_TAILLE_CHA+MED_TAILLE_NOM+1]; if (indice < 0) return -1; /* * On inhibe le gestionnaire d'erreur HDF */ _MEDmodeErreurVerrouiller(); if (MEDcheckVersion(fid) < 0) return -1; /* * Si le Data Group cha n'existe pas et indice == 0 => 0 * sinon erreur => erreur */ strcpy(chemin,MED_CHA); /* * Si indice == 0 => nombre de champs */ if (indice == 0) { n1 = 0; _MEDnObjets(fid,chemin,&n1); n2 = n1; } /* * Si indice > 0 => nbre de composants */ if (indice > 0) { /* * On recupere le nom du champ */ num = indice-1; if ((ret = _MEDobjetIdentifier(fid,chemin,num,nomdatagroup)) < 0) return -1; strcat(chemin,nomdatagroup); /* * On recupere le nombre de composants */ if ((datagroup = _MEDdatagroupOuvrir(fid,chemin)) < 0) return -1; if ((ret = _MEDattrEntierLire(datagroup,MED_NOM_NCO,&n2)) < 0) return -1; if ((ret = _MEDdatagroupFermer(datagroup)) < 0) return -1; } return n2; }
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 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; }