# MEDchampEcr233.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 #include <string.h>
    00023 #include <stdlib.h>
    00024
    00025
    00026 #ifdef TRACEPFL
    00027 #define tracepfl(x) x
    00028 #else
    00029 #define tracepfl(x)
    00030 #endif
    00031
    00032 /*
    00033  * - Nom de la fonction : MEDchampEcr
    00034  * - Description : ecriture d'un Champ Résultat
    00035  * - Parametres :
    00036  *     - fid      (IN)  : ID du fichier HDF courant
    00037  *     - maa      (IN)  : le nom du maillage sur lequel s'applique le champ (eventuellement distant)
    00038  *     - cha      (IN)  : le nom du champ
    00039  *     - val      (IN)  : valeurs du champ à stocker
    00040  *     - interlace(IN)  : entrelacement utilisé en mémoire {MED_FULL_INTERLACE,MED_NO_INTERLACE}
    00041  *     - nbelem   (IN)  : nombre d'éléments (prend en compte le nbre
    00042  *                         de points de Gauss (c'est demandé à l'utilisateur ds la doc)
    00043                            mais pas le nbre de composantes)
    00044  *     - locname  (IN)  : clé utilisée pour la définition de la localisation
    00045                           des points de GAUSS (MED_NOGAUSS si aucun, MED_GAUSS_ELNO si les points de Gauss
    00046  *                        portent sur les noeuds de l'element). La localisation doit exister
    00047  *                        avant l'appel à MEDchampEcr.
    00048  *     - numco    (IN)  : n° de la composante à stocker (MED_ALL si toutes)
    00049  *     - profil   (IN)  : nom du profil utilisé (MED_NOPFL si inutilisé)
    00050  *     - pflmod   (IN)  : Indique comment lire les informations en mémoire { MED_COMPACT, MED_GLOBAL }.
    00051  *     - type_ent (IN)  : entité concerné par le champ {MED_NOEUD,MED_ARETE,MED_FACE,MED_MAILLE}
    00052  *     - type_geo (IN)  : type géométrique de l'entité concerné {MED_POINT,MED_SEG2 ......}
    00053  *     - numdt    (IN)  : n° du pas de temps (MED_NOPDT si aucun)
    00054  *     - dt_unit  (IN)  : chaine de taille MED_NOMP indiquant l'unité du champ
    00055  *     - dt       (IN)  : valeur du pas de temps
    00056  *     - numo     (IN)  : n° d'ordre utilisé MED_NONOR si inutile
    00057  * - Resultat : 0 en cas de succes, -1 sinon
    00058  */
    00059
    00060 void  MEDchampEcr233(int dummy,...) {
    00061
    00062
    00063   med_idt                    fid ;
    00064   char *                     maa ;
    00065   char *                     cha ;
    00066   unsigned char *            val ;
    00067   med_mode_switch      interlace ;
    00068   med_int                 nbelem ;
    00069   char *                 locname ;
    00070   med_int                  numco ;
    00071   char *                  profil ;
    00072   med_mode_profil         pflmod ;
    00073   med_entite_maillage   type_ent ;
    00074   med_geometrie_element type_geo ;
    00075   med_int                  numdt ;
    00076   char *                 dt_unit ;
    00077   med_float                   dt ;
    00078   med_int                   numo ;
    00079   med_err *                 fret ;
    00080
    00081   med_err ret=-1;
    00082   med_idt gid=0,datagroup1=0,datagroup2=0,datagroup3=0,attr=0,gid_loc=0;
    00083   med_int ncomp=0, chtype=0, i=0, ngauss=0, pfluse=0;
    00084   char nomdatagroup1[2*MED_TAILLE_NOM_ENTITE+2]="";
    00085   char nomdatagroup2[2*MED_MAX_PARA+1]="";
    00086   char pflname   [MED_TAILLE_NOM+1]="";
    00087   char locname_i [MED_TAILLE_NOM+1]="";
    00088   char maillage[MED_TAILLE_NOM+1]="";
    00089   char tmp1[MED_TAILLE_NOM_ENTITE+1]="";
    00090   med_size dimd[1],psize=0,lsize=0;
    00091   med_int   *pfltabtmp=0;
    00092   med_size *pfltab=0;
    00093   char chemin[MED_TAILLE_CHA+MED_TAILLE_NOM+1]="";
    00094   char chemin_loc[MED_TAILLE_GAUSS+MED_TAILLE_NOM+1]="";
    00095   med_geometrie_element type_geo_g;
    00096   char oldpflname   [MED_TAILLE_NOM+1]=MED_NOPFLi;
    00097   med_int maj, pfluseold, modifpfl;
    00098   med_mode_acces MED_MODE_ACCES;
    00099
    00100   va_list params;
    00101   va_start(params,dummy);
    00102
    00103   fid = va_arg(params,med_idt);
    00104   maa = va_arg(params,char *);
    00105   cha = va_arg(params,char *);
    00106   val = va_arg(params,  unsigned char *);
    00107   interlace = va_arg(params,med_mode_switch);
    00108   nbelem = va_arg(params,med_int);
    00109   locname = va_arg(params,char *);
    00110   numco = va_arg(params,med_int);
    00111   profil = va_arg(params,char *);
    00112   pflmod = va_arg(params,med_mode_profil);
    00113   type_ent = va_arg(params,med_entite_maillage);
    00114   type_geo = va_arg(params,med_geometrie_element);
    00115   numdt = va_arg(params,med_int);
    00116   dt_unit = va_arg(params,char *);
    00117   dt = va_arg(params,med_float);
    00118   numo = va_arg(params,med_int);
    00119   fret = va_arg(params,med_err *);
    00120
    00121
    00122   /*
    00123    * On inhibe le gestionnaire d'erreur HDF 5
    00124    */
    00125   _MEDmodeErreurVerrouiller();
    00126 if (MEDcheckVersion(fid) < 0) {*fret=-1;return;}
    00127
    00128
    00129   if ( (MED_MODE_ACCES = _MEDmodeAcces(fid) ) == MED_UNDEF_MODE_ACCES ) {
    00130     MESSAGE("Impossible de déterminer le mode d'acces au fichier ");
    00131     goto ERROR;
    00132   }
    00133
    00134   if ( MED_MODE_ACCES == MED_LECTURE) {
    00135     MESSAGE("Impossible d'écrire un champ en mode MED_LECTURE : ");
    00136     goto ERROR;
    00137   };
    00138
    00139
    00140   /*
    00141    * Si le Data Group CHA n'existe pas => erreur
    00142    */
    00143   strcpy(chemin,MED_CHA);
    00144   strcat(chemin,cha);
    00145   if ((gid = _MEDdatagroupOuvrir(fid,chemin)) < 0)
    00146     goto ERROR;
    00147
    00148   /* Lecture de l'attribut MED_NOM_NCO */
    00149   if (_MEDattrEntierLire(gid,MED_NOM_NCO,&ncomp) < 0)
    00150     goto ERROR;
    00151
    00152   /* Lecture de l'attribut MED_NOM_TYP */
    00153   if ( _MEDattrEntierLire(gid,MED_NOM_TYP,&chtype) < 0)
    00154     goto ERROR;
    00155
    00156
    00157
    00158   /*
    00159    *  Creation/Ouverture du datagroup de niveau 1 <type_ent>[.<type_geo>]
    00160    */
    00161
    00162   if (_MEDnomEntite(nomdatagroup1,type_ent) < 0)
    00163     goto ERROR;
    00164   if ( type_ent != MED_NOEUD ) {
    00165       if ( _MEDnomGeometrie(tmp1,type_geo) < 0)
    00166         goto ERROR;
    00167       strcat(nomdatagroup1,".");
    00168       strcat(nomdatagroup1,tmp1);
    00169   }
    00170   datagroup1 = 0;
    00171   if ( (datagroup1 = _MEDdatagroupOuvrir(gid,nomdatagroup1)) < 0)
    00172     if ((datagroup1 = _MEDdatagroupCreer(gid,nomdatagroup1)) < 0)
    00173       goto ERROR;
    00174
    00175
    00176   /*
    00177    * Creation/Ouverture du datagroup de niveau 2 <numdt>.<numoo>
    00178    */
    00179
    00180   sprintf(nomdatagroup2,"%*li%*li",MED_MAX_PARA,(long ) numdt,MED_MAX_PARA,(long ) numo);
    00181
    00182   datagroup2 = 0;
    00183   if ( (datagroup2 = _MEDdatagroupOuvrir(datagroup1,nomdatagroup2)) < 0 )
    00184     if ((datagroup2 = _MEDdatagroupCreer(datagroup1,nomdatagroup2)) < 0 )
    00185       goto ERROR;
    00186
    00187   /*Cree ou ouvre l'attribut MED_NOM_NDT pour écriture */
    00188   if ( _MEDattrEntierEcrire(datagroup2,MED_NOM_NDT,&numdt) < 0)
    00189     goto ERROR;
    00190
    00191   /*Cree ou ouvre l'attribut MED_NOM_PDT pour écriture */
    00192   if ( _MEDattrFloatEcrire(datagroup2,MED_NOM_PDT,&dt) < 0)
    00193     goto ERROR;
    00194
    00195   /*Cree ou ouvre l'attribut MED_NOM_NOR pour écriture */
    00196   if (_MEDattrEntierEcrire(datagroup2,MED_NOM_NOR,&numo) < 0)
    00197     goto ERROR;
    00198
    00199   /*Cree ou ouvre l'attribut  MED_NOM_UNI pour écriture */
    00200   if ( numdt == MED_NOPDT ) {
    00201     if ( _MEDattrStringEcrire(datagroup2,MED_NOM_UNI,MED_TAILLE_PNOM,MED_PNOM_BLANC) < 0)
    00202       goto ERROR;
    00203   } else
    00204     if ( _MEDattrStringEcrire(datagroup2,MED_NOM_UNI,MED_TAILLE_PNOM,dt_unit) < 0)
    00205       goto ERROR;
    00206
    00207
    00208   /*
    00209    * Si c'est la première référence à un maillage, initialise l'attribut MED_MAA à ce maillage
    00210    */
    00211   if ((attr = _MEDattrOuvrir(datagroup2,MED_NOM_MAI)) < 0 ) {
    00212     if (_MEDattrStringEcrire(datagroup2,MED_NOM_MAI,MED_TAILLE_NOM,maa) < 0)
    00213       goto ERROR;
    00214   } else {
    00215     if ( _MEDattrFermer(attr) < 0) goto ERROR;
    00216   }
    00217
    00218
    00219
    00220   /*
    00221    * Cree ou ouvre le datagroup de niveau 3 <maa>
    00222    */
    00223
    00224   NOFINALBLANK(maa,ERROR)
    00225
    00226   datagroup3 = 0;
    00227   if (((datagroup3 = _MEDdatagroupOuvrir(datagroup2,maa)) > 0)
    00228       && ( MED_MODE_ACCES == MED_LECTURE_AJOUT )) {
    00229     MESSAGE("Impossible de créer une reference à un maillage existant en mode MED_LECTURE_AJOUT :");
    00230     goto ERROR;
    00231   } else
    00232     if (datagroup3 < 0)
    00233       if ((datagroup3 = _MEDdatagroupCreer(datagroup2,maa)) < 0)
    00234         goto ERROR;
    00235
    00236   /*Cree ou ouvre l'attribut MED_NOM_NBR */
    00237   if ( _MEDattrEntierEcrire(datagroup3,MED_NOM_NBR,&nbelem) < 0)
    00238     goto ERROR;
    00239
    00240   /* Lit le nom du profil associé s'il en existe déjà un */
    00241   if ( _MEDattrStringLire(datagroup3,MED_NOM_PFL,MED_TAILLE_NOM,oldpflname) < 0 ) {
    00242     strncpy(oldpflname,MED_NOPFLi,MED_TAILLE_NOM);
    00243   }
    00244
    00245   /*Cree ou ouvre  l'attribut MED_NOM_PFL   */
    00246   pfluse = 0;
    00247   if ( strlen(profil) == 0)   /* idem MED_NOPFL*/
    00248     /* Ecriture de MED_NOPFLi car MED_NOM_PFL est forcément de taille MED_TAILLE_NOM*/
    00249     /*strncpy(pflname,MED_NOPFLi,MED_TAILLE_NOM+1);    erreur ??? */
    00250     strncpy(pflname,MED_NOPFLi,MED_TAILLE_NOM);
    00251   else {
    00252     strncpy(pflname,profil,MED_TAILLE_NOM);
    00253     pflname[MED_TAILLE_NOM]='\0';
    00254     pfluse = 1;
    00255   }
    00256
    00257   /* on reporte à la fin l'ecriture du nouveau profil pour ne pas avoir une taille de dataset */
    00258   /* incompatible avec le profil en cas d'ereur d'ecriture du champ */
    00259
    00260
    00261   /* Lit le nombre de points de gauss et vérifie   */
    00262   /* que la localisation porte sur le meme type géométrique  */
    00263
    00264   /* Dans le cas de champs aux noeuds par element, on  stocke
    00265    * une localisation vide, et le nombre de noeuds dans l'attribut NGA
    00266    */
    00267
    00268   if (type_ent == MED_NOEUD_MAILLE ) {
    00269     strcpy(locname_i,MED_NOGAUSSi);
    00270     ngauss = type_geo % 100;
    00271   } else if ( strlen(locname) == 0) {
    00272     /* Ecriture de MED_NOGAUSSi car MED_NOM_GAUSS est forcément de taille MED_TAILLE_NOM*/
    00273     strcpy(locname_i,MED_NOGAUSSi);
    00274     ngauss = MED_NOPG ;
    00275   } else if (! strcmp(locname,MED_GAUSS_ELNO)) {
    00276     /* Les points de Gauss sont définis sur les noeuds de l'element (mot cle) */
    00277     /* le nombre de points de Gauss est egal au nombre de noeuds de l'element */
    00278     ngauss = type_geo % 100;
    00279     strcpy(locname_i,locname);
    00280   } else {
    00281     strcpy(locname_i,locname);
    00282
    00283     strcpy(chemin_loc,MED_GAUSS);
    00284     strcat(chemin_loc,locname_i);
    00285
    00286     if ((gid_loc = _MEDdatagroupOuvrir(fid,chemin_loc)) < 0) {
    00287       MESSAGE("Ouverture du datagroup : ");
    00288       SSCRUTE(chemin_loc); goto ERROR;
    00289     }
    00290
    00291     if (_MEDattrEntierLire(gid_loc,MED_NOM_NBR,&ngauss) < 0) {
    00292       MESSAGE("Erreur à la lecture de l'attribut MED_NOM_NBR : ");
    00293       ISCRUTE(ngauss);goto ERROR;
    00294     };
    00295
    00296     if (_MEDattrEntierLire(gid_loc,MED_NOM_GEO,&type_geo_g) < 0) {
    00297       MESSAGE("Erreur à la lecture de l'attribut MED_NOM_GEO : ");
    00298       ISCRUTE(type_geo);goto ERROR;
    00299     };
    00300
    00301     if ( type_geo_g != type_geo ) {
    00302       MESSAGE("Erreur, la localisation ne porte pas sur le meme type géométrique : ");
    00303       SSCRUTE(locname);ISCRUTE(type_geo);ISCRUTE(type_geo_g);goto ERROR;
    00304     };
    00305
    00306   }
    00307
    00308   /* Cree ou ouvre l'attribut MED_NOM_GAU         */
    00309   /* Ecriture de la localisation des pts de gauss  */
    00310   if ( _MEDattrStringEcrire(datagroup3,MED_NOM_GAU,MED_TAILLE_NOM,locname_i) < 0) {
    00311     MESSAGE("Erreur d'écriture de l'attribut MED_NOM_GAU : ");
    00312     SSCRUTE(locname); goto ERROR;
    00313   }
    00314
    00315   /* Cree ou ouvre l'attribut MED_NOM_NGA         */
    00316   /* Ecriture de l'attribut portant le nombre de points de gauss  */
    00317   if ( _MEDattrEntierEcrire(datagroup3,MED_NOM_NGA,&ngauss) < 0) {
    00318     MESSAGE("Erreur d'écriture de l'attribut MED_NOM_NGA : ");
    00319     ISCRUTE(ngauss); goto ERROR;
    00320   }
    00321
    00322   /*Determination de la taille dimd[0] du dataset à stocker*/
    00323   dimd[0] = nbelem*ncomp;
    00324
    00325   /* Gestion des profils*/
    00326   if ( pfluse ) {
    00327
    00328     if ( ( i = MEDnValProfil(fid,pflname) ) < 0 ) {
    00329       MESSAGE("Erreur à la lecture du nombre de valeurs sur le profil : ");
    00330       SSCRUTE(pflname);
    00331       goto ERROR;
    00332     } else
    00333       psize = i;
    00334
    00335     pfltabtmp = (med_int *)   malloc (sizeof(med_int)*psize);
    00336     pfltab    = (med_size *)  malloc (sizeof(med_size)*psize);
    00337     if (MEDprofilLire(fid,pfltabtmp,pflname) < 0) {
    00338       MESSAGE("Erreur à la lecture du profil : ");
    00339       SSCRUTE(pflname);goto ERROR;
    00340     };
    00341     for (i=0;i<psize;i++)
    00342       pfltab[i] = (med_size) pfltabtmp[i];
    00343
    00344   }
    00345   else {
    00346     psize = MED_NOPF;
    00347   }
    00348
    00349
    00350   /* Vérifie si le profil a changé (l'API MED ne permet pas de modifier un profil existant) */
    00351   if (strcmp(pflname, oldpflname))
    00352     modifpfl = 1;              /* le profil a changé */
    00353   else
    00354     modifpfl = 0;              /* le profil n'a pas changé */
    00355
    00356
    00357   /*
    00358    * Ecriture du champ
    00359    */
    00360
    00361   switch(chtype)
    00362     {
    00363     case MED_FLOAT64 :
    00364       if ( _MEDdatasetNumEcrire(datagroup3,MED_NOM_CO,MED_FLOAT64,interlace,
    00365                                 ncomp,numco,psize,pflmod,modifpfl,pfltab,ngauss,dimd,val) < 0) {
    00366         MESSAGE("Impossible d'ecrire le dataset : ");
    00367         SSCRUTE(MED_NOM_CO);ISCRUTE((int)(dimd[0])); goto ERROR;
    00368       }
    00369       break;
    00370
    00371     case MED_INT32 :
    00372 #if defined(HAVE_F77INT64)
    00373       if ( _MEDdatasetNumEcrire(datagroup3,MED_NOM_CO,MED_INT64,interlace,
    00374                                 ncomp,numco,psize,pflmod,modifpfl,pfltab,ngauss,dimd,val) < 0) {
    00375         MESSAGE("Impossible d'ecrire le dataset : ");
    00376         SSCRUTE(MED_NOM_CO);ISCRUTE((int)(dimd[0])); goto ERROR;
    00377       }
    00378 #else
    00379       if ( _MEDdatasetNumEcrire(datagroup3,MED_NOM_CO,MED_INT32,interlace,
    00380                                 ncomp,numco,psize,pflmod,modifpfl,pfltab,ngauss,dimd,val) < 0){
    00381         MESSAGE("Impossible d'ecrire le dataset : ");
    00382         SSCRUTE(MED_NOM_CO);ISCRUTE((int)(dimd[0])); goto ERROR;
    00383       }
    00384 #endif
    00385       break;
    00386
    00387     case MED_INT64 :
    00388 #if defined(HAVE_F77INT64)
    00389       if ( _MEDdatasetNumEcrire(datagroup3,MED_NOM_CO,MED_INT64,interlace,
    00390                                 ncomp,numco,psize,pflmod,modifpfl,pfltab,ngauss,dimd,val) < 0){
    00391         MESSAGE("Impossible d'ecrire le dataset : ");
    00392         SSCRUTE(MED_NOM_CO);ISCRUTE(dimd); goto ERROR;
    00393       }
    00394 #else
    00395       MESSAGE("Impossible d'ecrire le dataset de type MED_INT64 sur une plateforme autre que IRIX64 et OSF1 !");
    00396       goto ERROR;
    00397 #endif
    00398       break;
    00399
    00400     default :
    00401       goto ERROR;
    00402     }
    00403
    00404   if ( _MEDattrStringEcrire(datagroup3,MED_NOM_PFL,MED_TAILLE_NOM,pflname) < 0) {
    00405     MESSAGE("Erreur d'écriture de l'attribut pflname : ");
    00406     SSCRUTE(chemin); goto ERROR;
    00407   }
    00408
    00409   /*
    00410    * On ferme tout
    00411    */
    00412
    00413   ret = 0;
    00414
    00415  ERROR:
    00416
    00417   if ( pfluse ) { free(pfltab); free(pfltabtmp);}
    00418
    00419   if (datagroup3>0)     if (_MEDdatagroupFermer(datagroup3) < 0) {
    00420     MESSAGE("Impossible de fermer le datagroup : ");
    00421     ISCRUTE_int(datagroup3); ret = -1;
    00422   }
    00423
    00424   if (datagroup2>0)     if (_MEDdatagroupFermer(datagroup2) < 0) {
    00425     MESSAGE("Impossible de fermer le datagroup : ");
    00426     ISCRUTE_int(datagroup2); ret = -1;
    00427   }
    00428
    00429   if (datagroup1>0)     if (_MEDdatagroupFermer(datagroup1) < 0) {
    00430     MESSAGE("Impossible de fermer le datagroup : ");
    00431     ISCRUTE_int(datagroup1); ret = -1;
    00432   }
    00433
    00434   if (gid>0)     if (_MEDdatagroupFermer(gid) < 0) {
    00435     MESSAGE("Impossible de fermer le datagroup : ");
    00436     ISCRUTE_id(gid); ret = -1;
    00437   }
    00438
    00439   if (gid_loc>0)     if (_MEDdatagroupFermer(gid_loc) < 0) {
    00440     MESSAGE("Impossible de fermer le datagroup : ");
    00441     ISCRUTE_id(gid_loc); ret = -1;
    00442   }
    00443
    00444   va_end(params);
    00445   *fret = ret;
    00446   return;
    00447 }
    00448