Ejemplo n.º 1
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;
}
void MAJ_21_22_elements_maillage(med_idt mid, med_int dimension)
{
  med_idt eid,gid,did,tid;
  med_err ret;
  int i,j;
  med_geometrie_element typmai[MED_NBR_GEOMETRIE_MAILLE] = {MED_POINT1,MED_SEG2, 
							    MED_SEG3,MED_TRIA3,
							    MED_TRIA6,MED_QUAD4,
							    MED_QUAD8,MED_TETRA4,
							    MED_TETRA10,MED_HEXA8,
							    MED_HEXA20,MED_PENTA6,
							    MED_PENTA15,MED_PYRA5,
							    MED_PYRA13};
  int taille, edim;
  char *nom, *nouvelle_chaine;
  char nomgroup[MED_TAILLE_NOM_ENTITE+1];
  med_int n;
  med_size dimd[1];
  med_int *old_conn,*conn;
  
  /* On ne regarde que les mailles et la connectivité nodale */
  eid = _MEDdatagroupOuvrir(mid,(char *)(MED_NOM_MAI));
  EXIT_IF(eid < 0,"Ouverture du groupe HDF MED_NOM_MAI",NULL);

  /* On normalise selon tous les types geometriques */
  for (i=0;i<MED_NBR_GEOMETRIE_MAILLE;i++) {
    
    /* On recupere le nom du groupe HDF */
    _MEDnomGeometrie(nomgroup,typmai[i]);

    /* On accède au type s'il existe dans le fichier */
    gid = _MEDdatagroupOuvrir(eid,nomgroup);
    if (gid < 0)
      continue;

    /* Nombre d'element ? */
    did = _MEDdatasetOuvrir(gid,(char *)(MED_NOM_NOD));
    EXIT_IF(did < 0,"Ouverture du dataset HDF MED_NOM_NOD",NULL);
    ret = _MEDattrEntierLire(did,(char *)(MED_NOM_NBR),&n);
    EXIT_IF(ret < 0,"Lecture du nombre d'elements",NULL);
    ret = _MEDdatasetFermer(did);
    EXIT_IF(ret < 0,"Fermeture du dataset HDF MED_NOM_NOD",NULL);

    /* on normalise la connectivité si edim < dimension */
    edim = typmai[i] / 100;
    if (edim < dimension) {
      taille = typmai[i]%100 + 1;
      old_conn = (med_int *) malloc(sizeof(med_int)*taille*n);
      EXIT_IF(old_conn == NULL,NULL,NULL);
#if defined(HAVE_F77INT64)
      ret = _MED21datasetNumLire(gid,(char *)(MED_NOM_NOD),MED_INT64,
				  MED_NO_INTERLACE,(med_size)taille,MED_ALL,
				  0,NULL,MED_NOPG,
				  (unsigned char*) old_conn,H5T_NATIVE_INT);
#else
      ret = _MED21datasetNumLire(gid,(char *)(MED_NOM_NOD),MED_INT32,
				  MED_NO_INTERLACE,(med_size) taille,MED_ALL,
				  0,NULL,MED_NOPG,
				  (unsigned char*) old_conn,H5T_NATIVE_INT);
#endif 
      /* On recopie dans le bon tableau */
      taille --;
      conn = (med_int *) malloc(sizeof(med_int)*taille*n);
      EXIT_IF(conn == NULL,NULL,NULL);
      for (j=0;j<n*taille;j++)
	*(conn+j) = *(old_conn+j);
      dimd[0] = n*taille;
#if defined(HAVE_F77INT64)
      ret = _MED231datasetNumEcrire(gid,(char *) "TMP",MED_INT64,MED_NO_INTERLACE,
				    taille,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,MED_NOPG,dimd,
				 (unsigned char*) conn);
#else
      ret = _MED231datasetNumEcrire(gid,(char *) "TMP",MED_INT32,MED_NO_INTERLACE,
				    taille,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,MED_NOPG,dimd,
				 (unsigned char*) conn);
#endif
      EXIT_IF(ret < 0,"Ecriture de la nouvelle connectivité des mailles",NULL);
      
      /* Ecriture du nombre de mailles dans le dataset HDF TMP */
      tid = _MEDdatasetOuvrir(gid,"TMP");
      EXIT_IF(tid < 0,"Ouverture du dataset HDF TMP",NULL);
      ret = _MEDattrEntierEcrire(tid,(char *)(MED_NOM_NBR),&n);
      EXIT_IF(ret < 0,"Ecriture du nombre de noeuds dans le dataset HDF TMP",NULL);
      ret = _MEDdatasetFermer(tid);
      EXIT_IF(ret < 0,"Fermeture du dataset HDF TMP",NULL);

      /* Fermeture de l'accès aux connectivites */
      ret = H5Gunlink(gid,(char *)(MED_NOM_NOD));
      EXIT_IF(ret < 0,"Suppression des anciennes connectivités",NULL);
      ret = H5Gmove(gid,"TMP",(char *)(MED_NOM_NOD));
      EXIT_IF(ret < 0,"Mise en place des nouvelles connectivités",NULL);

      /* on libere la memoire */
      free(old_conn);
      free(conn);
    }
     
    /* Mise a niveau des noms */
    nom = (char *) malloc(n*ANCIEN_MED_TAILLE_PNOM+1);
    EXIT_IF(nom == NULL,NULL,NULL);
    nouvelle_chaine = (char *) malloc(n*MED_TAILLE_PNOM+1);
    EXIT_IF(nouvelle_chaine == NULL,NULL,NULL);
    ret = _MEDdatasetStringLire(gid,(char *)(MED_NOM_NOM),nom);
    if (ret == 0) {
      _MED23v30stringConvert(nouvelle_chaine, MED_TAILLE_PNOM,
			     nom, ANCIEN_MED_TAILLE_PNOM, n );
/*       MAJ_21_22_chaine(nom,nouvelle_chaine,n); */
      H5Gunlink(gid,(char *)(MED_NOM_NOM));
      dimd[0] = n*MED_TAILLE_PNOM+1;
      ret = _MEDdatasetStringEcrire(gid,(char *)(MED_NOM_NOM),dimd,nouvelle_chaine);  
      EXIT_IF(ret < 0,"Ecriture des nouveaux noms des éléments",NULL);  
      did = _MEDdatasetOuvrir(gid,(char *)(MED_NOM_NOM));
      ret = _MEDattrEntierEcrire(did,(char *)(MED_NOM_NBR),&n);
      ret = _MEDdatasetFermer(did);
    }
    free(nom);
    free(nouvelle_chaine);

    /* on ferme avant de passer au type geometrique suivant */
    ret = _MEDdatagroupFermer(gid);
    EXIT_IF(ret < 0,"Fermeture de l'accès aux mailles",NULL);
  }

  /* On ferme tout */
  ret = _MEDdatagroupFermer(eid);
  EXIT_IF(ret < 0,"Fermeture de l'accès aux mailles",NULL);
}
Ejemplo n.º 3
0
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;
}