00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
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 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
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 
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 
00142 
00143   strcpy(chemin,MED_CHA);
00144   strcat(chemin,cha);
00145   if ((gid = _MEDdatagroupOuvrir(fid,chemin)) < 0)
00146     goto ERROR;
00147 
00148   
00149   if (_MEDattrEntierLire(gid,MED_NOM_NCO,&ncomp) < 0)
00150     goto ERROR;
00151 
00152   
00153   if ( _MEDattrEntierLire(gid,MED_NOM_TYP,&chtype) < 0)
00154     goto ERROR;
00155  
00156 
00157   
00158   
00159 
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 
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   
00188   if ( _MEDattrEntierEcrire(datagroup2,MED_NOM_NDT,&numdt) < 0)
00189     goto ERROR;
00190   
00191   
00192   if ( _MEDattrFloatEcrire(datagroup2,MED_NOM_PDT,&dt) < 0)
00193     goto ERROR;
00194     
00195   
00196   if (_MEDattrEntierEcrire(datagroup2,MED_NOM_NOR,&numo) < 0)
00197     goto ERROR;
00198   
00199    
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 
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 
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   
00237   if ( _MEDattrEntierEcrire(datagroup3,MED_NOM_NBR,&nbelem) < 0)
00238     goto ERROR;
00239   
00240   
00241   if ( _MEDattrStringLire(datagroup3,MED_NOM_PFL,MED_TAILLE_NOM,oldpflname) < 0 ) {
00242     strncpy(oldpflname,MED_NOPFLi,MED_TAILLE_NOM);
00243   }
00244   
00245   
00246   pfluse = 0;
00247   if ( strlen(profil) == 0)   
00248     
00249     
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   
00258   
00259 
00260 
00261   
00262   
00263   
00264   
00265 
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     
00273     strcpy(locname_i,MED_NOGAUSSi);
00274     ngauss = MED_NOPG ;
00275   } else if (! strcmp(locname,MED_GAUSS_ELNO)) {
00276     
00277     
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    
00309   
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    
00316   
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   
00323   dimd[0] = nbelem*ncomp;
00324 
00325   
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   
00351   if (strcmp(pflname, oldpflname))
00352     modifpfl = 1;              
00353   else
00354     modifpfl = 0;              
00355 
00356 
00357   
00358 
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 
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