# MEDfamCr231.c

Aller à la documentation de ce fichier.

    00001 /*  This file is part of MED.
    00002  *
    00003  *  COPYRIGHT (C) 1999 - 2012  EDF R&D, CEA/DEN
    00004  *  MED is free software: you can redistribute it and/or modify
    00005  *  it under the terms of the GNU Lesser General Public License as published by
    00006  *  the Free Software Foundation, either version 3 of the License, or
    00007  *  (at your option) any later version.
    00008  *
    00009  *  MED is distributed in the hope that it will be useful,
    00010  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
    00011  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    00012  *  GNU Lesser General Public License for more details.
    00013  *
    00014  *  You should have received a copy of the GNU Lesser General Public License
    00015  *  along with MED.  If not, see <http://www.gnu.org/licenses/>.
    00016  */
    00017
    00018
    00019 #include <med.h>
    00020 #include <med_config.h>
    00021 #include <med_outils.h>
    00022
    00023 #include <string.h>
    00024 #include <stdlib.h>
    00025
    00026 void
    00027 MEDfamCr231(int dummy,...)
    00028 {
    00029
    00030   med_idt fid;
    00031   char    *maa;
    00032   char    *famille;
    00033   med_int numero;
    00034   med_int *attr_ident;
    00035   med_int *attr_val;
    00036   char    *attr_desc;
    00037   med_int n_attr;
    00038   char    *groupe;
    00039   med_int n_groupe;
    00040   med_err *fret ;
    00041
    00042   med_idt root=0, datagroup=0, famid=0;
    00043   med_err ret=-1;
    00044   med_size dimd[1];
    00045   char chemin[MED_TAILLE_MAA+MED_TAILLE_FAS+MED_TAILLE_FAS_ENTITE+MED_TAILLE_NOM+1];
    00046   char tmp[MED_TAILLE_FAS+1];
    00047   char stockage[MED_TAILLE_FAS_ENTITE+1] = "NONE";
    00048   med_mode_acces MED_MODE_ACCES;
    00049
    00050   va_list params;
    00051   va_start(params,dummy);
    00052
    00053   fid        = va_arg(params,  med_idt );
    00054   maa        = va_arg(params,  char*   );
    00055   famille    = va_arg(params,  char*   );
    00056   numero     = va_arg(params,  med_int );
    00057   attr_ident = va_arg(params,  med_int*);
    00058   attr_val   = va_arg(params,  med_int*);
    00059   attr_desc  = va_arg(params,  char*   );
    00060   n_attr     = va_arg(params,  med_int );
    00061   groupe     = va_arg(params,  char*   );
    00062   n_groupe   = va_arg(params,  med_int );
    00063   fret       = va_arg(params,  med_err*);
    00064
    00065   /*
    00066    * On inhibe le gestionnaire d'erreur HDF 5
    00067    */
    00068   _MEDmodeErreurVerrouiller();
    00069 if (MEDcheckVersion(fid) < 0) {*fret=-1;return;}
    00070
    00071
    00072   if ( (MED_MODE_ACCES = _MEDmodeAcces(fid) ) == MED_UNDEF_MODE_ACCES ) {
    00073     MESSAGE("Impossible de déterminer le mode d'acces au fichier.");
    00074     goto ERROR;
    00075   }
    00076
    00077   if ( MED_MODE_ACCES == MED_LECTURE) {
    00078     MESSAGE("Impossible de créer une famille en mode MED_LECTURE.");
    00079     goto ERROR;
    00080   };
    00081
    00082   /*
    00083    * Si le Data Group FAS n'existe pas, on le cree
    00084    */
    00085   strcpy(chemin,MED_MAA);
    00086   /*  BUG NON CORRIGE en 2.3.1 à cause
    00087       des noms de familles crées en F77
    00088       NOFINALBLANK(maa,ERROR);*/
    00089   strcat(chemin,maa);
    00090   strncpy(tmp,MED_FAS,MED_TAILLE_FAS-1);
    00091   tmp[MED_TAILLE_FAS-1] = '\0';
    00092   strcat(chemin,tmp);
    00093
    00094   if ((root = _MEDdatagroupOuvrir(fid,chemin)) < 0)
    00095     if ((root = _MEDdatagroupCreer(fid,chemin)) < 0) {
    00096       MESSAGE("Erreur à la création du datagroup : ");
    00097       SSCRUTE(chemin);
    00098       goto ERROR;
    00099     }
    00100
    00101
    00102   /*
    00103    * Le lieu de stockage varie selon le signe du "numero"
    00104    * de famille
    00105    * = 0 => FAMILLE NEUTRE
    00106    * > 0 => FAMILLE DE NOEUD
    00107    * < 0 => FAMILLE DE MAILLE/FACE/ARETE
    00108    */
    00109
    00110   if (numero != 0) {
    00111    if ((ret = _MEDdatagroupFermer(root)) < 0) {
    00112     MESSAGE("Impossible de fermer le datagroup : ");
    00113     ISCRUTE_id(root);ret = -1;
    00114     goto ERROR;
    00115    }
    00116
    00117     if (numero > 0)
    00118       strncpy(stockage,MED_FAS_NOEUD,MED_TAILLE_FAS_ENTITE-1);
    00119
    00120     if (numero < 0)
    00121       strncpy(stockage,MED_FAS_ELEME,MED_TAILLE_FAS_ENTITE-1);
    00122
    00123     stockage[MED_TAILLE_FAS_ENTITE-1] = '\0';
    00124     strcat(chemin,stockage);
    00125
    00126     if ((root = _MEDdatagroupOuvrir(fid,chemin)) < 0)
    00127       if ((root = _MEDdatagroupCreer(fid,chemin)) < 0) {
    00128         MESSAGE("Erreur à la création du datagroup : ");
    00129         SSCRUTE(chemin);
    00130         goto ERROR;
    00131       }
    00132   }
    00133
    00134
    00135   /*
    00136    * Si le Data Group de meme nom que famille existe => erreur
    00137    * Sinon on le cree
    00138    */
    00139
    00140   /*
    00141    * POUR LA FAMILLE DE NUMERO 0, ON FORCE LE NOM
    00142    */
    00143   if (numero == 0)
    00144     strcpy(famille,FAMILLE_ZERO);
    00145
    00146   /*
    00147    * Création de la famille
    00148    */
    00149   if ((famid = _MEDdatagroupCreer(root,famille)) < 0) {
    00150     MESSAGE("Erreur à la création du famille : ");
    00151     SSCRUTE(famille);
    00152     goto ERROR;
    00153   }
    00154
    00155
    00156   /*
    00157    * L'attribut NUM
    00158    */
    00159   if ((ret = _MEDattrEntierEcrire(famid,MED_NOM_NUM,&numero)) < 0) {
    00160     MESSAGE("Erreur à l'écriture du numéro de famille : ");
    00161     ISCRUTE(numero);
    00162     goto ERROR;
    00163   }
    00164
    00165
    00166   /*
    00167    * Le Data Group "GRO"
    00168    */
    00169   if (n_groupe > 0)  {
    00170
    00171     /*
    00172      * On cree le Data Group
    00173      */
    00174     if ((datagroup = _MEDdatagroupCreer(famid,MED_NOM_GRO)) < 0) {
    00175       MESSAGE("Erreur à la création du datagroup : ");
    00176       SSCRUTE(MED_NOM_GRO);
    00177       goto ERROR;
    00178     }
    00179     /*
    00180      * L'attribut "NBR"
    00181      */
    00182     if ((ret = _MEDattrEntierEcrire(datagroup,MED_NOM_NBR,&n_groupe)) < 0) {
    00183       MESSAGE("Erreur à l'écriture du nombre de groupe : ");
    00184       ISCRUTE(n_groupe);
    00185       goto ERROR;
    00186     }
    00187     /*
    00188      * Data Set des noms des groupes "NOM"
    00189      */
    00190     dimd[0] = n_groupe*MED_TAILLE_LNOM+1;
    00191     if ((ret = _MEDdatasetStringEcrire(datagroup,MED_NOM_NOM,dimd,groupe))<0) {
    00192       MESSAGE("Erreur à l'écriture des noms des groupes : ");
    00193       SSCRUTE(groupe);
    00194       goto ERROR;
    00195     }
    00196     /*
    00197      * On ferme le Data Group
    00198      */
    00199     if ((ret = _MEDdatagroupFermer(datagroup)) < 0) {
    00200       MESSAGE("Impossible de fermer le datagroup : ");
    00201       ISCRUTE_int(datagroup);
    00202       goto ERROR;
    00203     }
    00204
    00205   }
    00206
    00207
    00208   /*
    00209    * Le Data Group "ATT"
    00210    */
    00211
    00212   if (n_attr > 0) {
    00213
    00214     if ((datagroup = _MEDdatagroupCreer(famid,MED_NOM_ATT)) < 0) {
    00215       MESSAGE("Erreur à la création du datagroup : ");
    00216       SSCRUTE(MED_NOM_ATT);
    00217       goto ERROR;
    00218     }
    00219     /*
    00220      * L'attribut "NBR"
    00221      */
    00222     if ((ret = _MEDattrEntierEcrire(datagroup,MED_NOM_NBR,&n_attr)) < 0) {
    00223       MESSAGE("Erreur à l'écriture du nombre d'attributs : ");
    00224       ISCRUTE(n_attr);
    00225       goto ERROR;
    00226     }
    00227     /*
    00228      * Le Data Set "IDE"
    00229      */
    00230     dimd[0] = n_attr;
    00231 #if defined(HAVE_F77INT64)
    00232     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,
    00233                                     (unsigned char *)attr_ident)) < 0) {
    00234       MESSAGE("Erreur à l'écriture du dataset : ");
    00235       SSCRUTE(MED_NOM_IDE);
    00236       goto ERROR;
    00237     }
    00238 #else
    00239     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,
    00240                                     (unsigned char *)attr_ident)) < 0) {
    00241       MESSAGE("Erreur à l'écriture du dataset : ");
    00242       SSCRUTE(MED_NOM_IDE);
    00243       goto ERROR;
    00244     }
    00245 #endif
    00246     /*
    00247      * Le Data Set "VAL"
    00248      */
    00249     dimd[0] = n_attr;
    00250 #if defined(HAVE_F77INT64)
    00251     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,
    00252                                     (unsigned char*)attr_val)) < 0) {
    00253       MESSAGE("Erreur à l'écriture du dataset : ");
    00254       SSCRUTE(MED_NOM_VAL);
    00255       goto ERROR;
    00256     }
    00257 #else
    00258     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,
    00259                                     (unsigned char*)attr_val)) < 0) {
    00260       MESSAGE("Erreur à l'écriture du dataset : ");
    00261       SSCRUTE(MED_NOM_VAL);
    00262       goto ERROR;
    00263     }
    00264 #endif
    00265     /*
    00266      * Le Data Set "DES"
    00267      */
    00268     dimd[0] = n_attr*MED_TAILLE_DESC+1;
    00269     if ((ret = _MEDdatasetStringEcrire(datagroup,MED_NOM_DES,dimd,attr_desc)) < 0) {
    00270       MESSAGE("Erreur à l'écriture du dataset : ");
    00271       SSCRUTE(MED_NOM_DES);
    00272       goto ERROR;
    00273     }
    00274     /*
    00275      * On ferme le Data Group
    00276      */
    00277     if ((ret = _MEDdatagroupFermer(datagroup)) < 0) {
    00278       MESSAGE("Impossible de fermer le datagroup : ");
    00279       ISCRUTE_int(datagroup);
    00280       goto ERROR;
    00281     }
    00282   }
    00283
    00284
    00285   /*
    00286    * On ferme tout
    00287    */
    00288   ret=0;
    00289  ERROR:
    00290   if (famid>0)     if (_MEDdatagroupFermer(famid) < 0) {
    00291     MESSAGE("Impossible de fermer le datagroup : ");
    00292     ISCRUTE_id(famid);ret = -1;
    00293   }
    00294
    00295   if (root>0)     if (_MEDdatagroupFermer(root) < 0) {
    00296     MESSAGE("Impossible de fermer le datagroup : ");
    00297     ISCRUTE_id(root); ret = -1;
    00298   }
    00299
    00300   va_end(params);
    00301   *fret = ret;
    00302   return;
    00303 }