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
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 void MEDchampEcr231(int dummy,...) {
00054
00055
00056 med_idt fid ;
00057 char * maa ;
00058 char * cha ;
00059 unsigned char * val ;
00060 med_mode_switch interlace ;
00061 med_int nbelem ;
00062 char * locname ;
00063 med_int numco ;
00064 char * profil ;
00065 med_mode_profil pflmod ;
00066 med_entite_maillage type_ent ;
00067 med_geometrie_element type_geo ;
00068 med_int numdt ;
00069 char * dt_unit ;
00070 med_float dt ;
00071 med_int numo ;
00072 med_err * fret ;
00073
00074 med_err ret=-1;
00075 med_idt gid=0,datagroup1=0,datagroup2=0,datagroup3=0,attr=0,gid_loc=0;
00076 med_int ncomp=0, chtype=0, i=0, ngauss=0, pfluse=0;
00077 char nomdatagroup1[2*MED_TAILLE_NOM_ENTITE+2]="";
00078 char nomdatagroup2[2*MED_MAX_PARA+1]="";
00079
00080 char pflname [MED_TAILLE_NOM+1]="";
00081 char locname_i [MED_TAILLE_NOM+1]="";
00082 char maillage[MED_TAILLE_NOM+1]="";
00083 char tmp1[MED_TAILLE_NOM_ENTITE+1]="";
00084 med_size dimd[1],psize=0,lsize=0;
00085 med_int *pfltabtmp=0;
00086 med_size *pfltab=0;
00087 char chemin[MED_TAILLE_CHA+MED_TAILLE_NOM+1]="";
00088 char chemin_loc[MED_TAILLE_GAUSS+MED_TAILLE_NOM+1]="";
00089 med_geometrie_element type_geo_g;
00090 med_mode_acces MED_MODE_ACCES;
00091
00092 va_list params;
00093 va_start(params,dummy);
00094
00095 fid = va_arg(params,med_idt);
00096 maa = va_arg(params,char *);
00097 cha = va_arg(params,char *);
00098 val = va_arg(params, unsigned char *);
00099 interlace = va_arg(params,med_mode_switch);
00100 nbelem = va_arg(params,med_int);
00101 locname = va_arg(params,char *);
00102 numco = va_arg(params,med_int);
00103 profil = va_arg(params,char *);
00104 pflmod = va_arg(params,med_mode_profil);
00105 type_ent = va_arg(params,med_entite_maillage);
00106 type_geo = va_arg(params,med_geometrie_element);
00107 numdt = va_arg(params,med_int);
00108 dt_unit = va_arg(params,char *);
00109 dt = va_arg(params,med_float);
00110 numo = va_arg(params,med_int);
00111 fret = va_arg(params,med_err *);
00112
00113
00114
00115
00116 _MEDmodeErreurVerrouiller();
00117 if (MEDcheckVersion(fid) < 0) {*fret=-1;return;}
00118
00119
00120 if ( (MED_MODE_ACCES = _MEDmodeAcces(fid) ) == MED_UNDEF_MODE_ACCES ) {
00121 MESSAGE("Impossible de déterminer le mode d'acces au fichier ");
00122 goto ERROR;
00123 }
00124
00125 if ( MED_MODE_ACCES == MED_LECTURE) {
00126 MESSAGE("Impossible d'écrire un champ en mode MED_LECTURE : ");
00127 goto ERROR;
00128 };
00129
00130
00131
00132
00133
00134 strcpy(chemin,MED_CHA);
00135 strcat(chemin,cha);
00136 if ((gid = _MEDdatagroupOuvrir(fid,chemin)) < 0)
00137 goto ERROR;
00138
00139
00140 if (_MEDattrEntierLire(gid,MED_NOM_NCO,&ncomp) < 0)
00141 goto ERROR;
00142
00143
00144 if ( _MEDattrEntierLire(gid,MED_NOM_TYP,&chtype) < 0)
00145 goto ERROR;
00146
00147
00148
00149
00150
00151
00152 if ( type_ent == MED_NOEUD_MAILLE ) {
00153 SSCRUTE("L'écriture aux noeuds des éléments n'est pas disponible.");
00154 goto ERROR;
00155 }
00156
00157 if (_MEDnomEntite(nomdatagroup1,type_ent) < 0)
00158 goto ERROR;
00159
00160 if ( type_ent != MED_NOEUD ) {
00161 if ( _MEDnomGeometrie(tmp1,type_geo) < 0)
00162 goto ERROR;
00163 strcat(nomdatagroup1,".");
00164 strcat(nomdatagroup1,tmp1);
00165 }
00166 datagroup1 = 0;
00167 if ( (datagroup1 = _MEDdatagroupOuvrir(gid,nomdatagroup1)) < 0)
00168 if ((datagroup1 = _MEDdatagroupCreer(gid,nomdatagroup1)) < 0)
00169 goto ERROR;
00170
00171
00172
00173
00174
00175
00176 sprintf(nomdatagroup2,"%*li%*li",MED_MAX_PARA,(long ) numdt,MED_MAX_PARA,(long ) numo);
00177
00178 datagroup2 = 0;
00179 if ( (datagroup2 = _MEDdatagroupOuvrir(datagroup1,nomdatagroup2)) < 0 )
00180 if ((datagroup2 = _MEDdatagroupCreer(datagroup1,nomdatagroup2)) < 0 )
00181 goto ERROR;
00182
00183
00184 if ( _MEDattrEntierEcrire(datagroup2,MED_NOM_NDT,&numdt) < 0)
00185 goto ERROR;
00186
00187
00188 if ( _MEDattrFloatEcrire(datagroup2,MED_NOM_PDT,&dt) < 0)
00189 goto ERROR;
00190
00191
00192 if (_MEDattrEntierEcrire(datagroup2,MED_NOM_NOR,&numo) < 0)
00193 goto ERROR;
00194
00195
00196 if ( numdt == MED_NOPDT ) {
00197 if ( _MEDattrStringEcrire(datagroup2,MED_NOM_UNI,MED_TAILLE_PNOM,MED_PNOM_BLANC) < 0)
00198 goto ERROR;
00199 } else
00200 if ( _MEDattrStringEcrire(datagroup2,MED_NOM_UNI,MED_TAILLE_PNOM,dt_unit) < 0)
00201 goto ERROR;
00202
00203
00204
00205
00206
00207 if ((attr = _MEDattrOuvrir(datagroup2,MED_NOM_MAI)) < 0 ) {
00208 if (_MEDattrStringEcrire(datagroup2,MED_NOM_MAI,MED_TAILLE_NOM,maa) < 0)
00209 goto ERROR;
00210 } else {
00211 if ( _MEDattrFermer(attr) < 0) goto ERROR;
00212 }
00213
00214
00215
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 pfluse = 0;
00242 if ( strlen(profil) == 0)
00243
00244 strncpy(pflname,MED_NOPFLi,MED_TAILLE_NOM+1);
00245 else {
00246 strncpy(pflname,profil,MED_TAILLE_NOM);
00247 pflname[MED_TAILLE_NOM]='\0';
00248 pfluse = 1;
00249 }
00250 if ( _MEDattrStringEcrire(datagroup3,MED_NOM_PFL,MED_TAILLE_NOM,pflname) < 0){
00251 MESSAGE("Erreur d'écriture de l'attribut pflname : ");
00252 SSCRUTE(chemin); goto ERROR;
00253 }
00254
00255
00256
00257
00258 if ( strlen(locname) == 0 ) {
00259
00260 strcpy(locname_i,MED_NOGAUSSi);
00261 ngauss = MED_NOPG ;
00262 } else if (! strcmp(locname,MED_GAUSS_ELNO)) {
00263
00264
00265 ngauss = type_geo % 100;
00266 strcpy(locname_i,locname);
00267
00268 } else {
00269 strcpy(locname_i,locname);
00270
00271 strcpy(chemin_loc,MED_GAUSS);
00272 strcat(chemin_loc,locname_i);
00273
00274 if ((gid_loc = _MEDdatagroupOuvrir(fid,chemin_loc)) < 0) {
00275 MESSAGE("Ouverture du datagroup : ");
00276 SSCRUTE(chemin_loc); goto ERROR;
00277 }
00278
00279 if (_MEDattrEntierLire(gid_loc,MED_NOM_NBR,&ngauss) < 0) {
00280 MESSAGE("Erreur à la lecture de l'attribut MED_NOM_NBR : ");
00281 ISCRUTE(ngauss);goto ERROR;
00282 };
00283
00284
00285 if (_MEDattrEntierLire(gid_loc,MED_NOM_GEO,&type_geo_g) < 0) {
00286 MESSAGE("Erreur à la lecture de l'attribut MED_NOM_GEO : ");
00287 ISCRUTE(type_geo);goto ERROR;
00288 };
00289
00290 if ( type_geo_g != type_geo ) {
00291 MESSAGE("Erreur, la localisation ne porte pas sur le meme type géométrique : ");
00292 SSCRUTE(locname);ISCRUTE(type_geo);ISCRUTE(type_geo_g);goto ERROR;
00293 };
00294
00295 }
00296
00297
00298
00299 if ( _MEDattrStringEcrire(datagroup3,MED_NOM_GAU,MED_TAILLE_NOM,locname_i) < 0) {
00300 MESSAGE("Erreur d'écriture de l'attribut MED_NOM_GAU : ");
00301 SSCRUTE(locname); goto ERROR;
00302 }
00303
00304
00305
00306 if ( _MEDattrEntierEcrire(datagroup3,MED_NOM_NGA,&ngauss) < 0) {
00307 MESSAGE("Erreur d'écriture de l'attribut MED_NOM_NGA : ");
00308 ISCRUTE(ngauss); goto ERROR;
00309 }
00310
00311
00312 dimd[0] = nbelem*ncomp;
00313
00314
00315 if ( pfluse ) {
00316
00317 if ( ( i = MEDnValProfil(fid,pflname) ) < 0 ) {
00318 MESSAGE("Erreur à la lecture du nombre de valeurs sur le profil : ");
00319 SSCRUTE(pflname);
00320 goto ERROR;
00321 } else
00322 psize = i;
00323
00324 pfltabtmp = (med_int *) malloc (sizeof(med_int)*psize);
00325 pfltab = (med_size *) malloc (sizeof(med_size)*psize);
00326 if (MEDprofilLire(fid,pfltabtmp,pflname) < 0) {
00327 MESSAGE("Erreur à la lecture du profil : ");
00328 SSCRUTE(pflname);goto ERROR;
00329 };
00330 for (i=0;i<psize;i++)
00331 pfltab[i] = (med_size) pfltabtmp[i];
00332
00333 }
00334 else
00335 psize = MED_NOPF;
00336
00337
00338
00339
00340
00341
00342 switch(chtype)
00343 {
00344 case MED_FLOAT64 :
00345 if ( _MEDdatasetNumEcrire(datagroup3,MED_NOM_CO,MED_FLOAT64,interlace,
00346 ncomp,numco,psize,pflmod,0,pfltab,ngauss,dimd,val) < 0) {
00347 MESSAGE("Impossible d'ecrire le dataset : ");
00348 SSCRUTE(MED_NOM_CO);ISCRUTE((int)(dimd[0])); goto ERROR;
00349 }
00350 break;
00351
00352 case MED_INT32 :
00353 #if defined(HAVE_F77INT64)
00354 if ( _MEDdatasetNumEcrire(datagroup3,MED_NOM_CO,MED_INT64,interlace,
00355 ncomp,numco,psize,pflmod,0,pfltab,ngauss,dimd,val) < 0) {
00356 MESSAGE("Impossible d'ecrire le dataset : ");
00357 SSCRUTE(MED_NOM_CO);ISCRUTE((int)(dimd[0])); goto ERROR;
00358 }
00359 #else
00360 if ( _MEDdatasetNumEcrire(datagroup3,MED_NOM_CO,MED_INT32,interlace,
00361 ncomp,numco,psize,pflmod,0,pfltab,ngauss,dimd,val) < 0){
00362 MESSAGE("Impossible d'ecrire le dataset : ");
00363 SSCRUTE(MED_NOM_CO);ISCRUTE((int)(dimd[0])); goto ERROR;
00364 }
00365 #endif
00366 break;
00367
00368 case MED_INT64 :
00369 #if defined(HAVE_F77INT64)
00370 if ( _MEDdatasetNumEcrire(datagroup3,MED_NOM_CO,MED_INT64,interlace,
00371 ncomp,numco,psize,pflmod,0,pfltab,ngauss,dimd,val) < 0){
00372 MESSAGE("Impossible d'ecrire le dataset : ");
00373 SSCRUTE(MED_NOM_CO);ISCRUTE(dimd); goto ERROR;
00374 }
00375 #else
00376 MESSAGE("Impossible d'ecrire le dataset de type MED_INT64 sur une plateforme autre que IRIX64 et OSF1 !");
00377 goto ERROR;
00378 #endif
00379 break;
00380
00381 default :
00382 goto ERROR;
00383 }
00384
00385
00386
00387
00388
00389 ret = 0;
00390
00391 ERROR:
00392
00393 if ( pfluse ) { free(pfltab); free(pfltabtmp);}
00394
00395 if (datagroup3>0) if (_MEDdatagroupFermer(datagroup3) < 0) {
00396 MESSAGE("Impossible de fermer le datagroup : ");
00397 ISCRUTE_int(datagroup3); ret = -1;
00398 }
00399
00400 if (datagroup2>0) if (_MEDdatagroupFermer(datagroup2) < 0) {
00401 MESSAGE("Impossible de fermer le datagroup : ");
00402 ISCRUTE_int(datagroup2); ret = -1;
00403 }
00404
00405 if (datagroup1>0) if (_MEDdatagroupFermer(datagroup1) < 0) {
00406 MESSAGE("Impossible de fermer le datagroup : ");
00407 ISCRUTE_int(datagroup1); ret = -1;
00408 }
00409
00410 if (gid>0) if (_MEDdatagroupFermer(gid) < 0) {
00411 MESSAGE("Impossible de fermer le datagroup : ");
00412 ISCRUTE_id(gid); ret = -1;
00413 }
00414
00415 if (gid_loc>0) if (_MEDdatagroupFermer(gid_loc) < 0) {
00416 MESSAGE("Impossible de fermer le datagroup : ");
00417 ISCRUTE_id(gid_loc); ret = -1;
00418 }
00419
00420 va_end(params);
00421 *fret = ret;
00422 return;
00423 }
00424