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 <hdf5.h>
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 void _MEDdatasetNumEcrire231(int dummy,...) {
00047
00048 va_list params;
00049
00050 med_idt pere;
00051 char * nom;
00052 med_type_champ type;
00053 med_mode_switch interlace;
00054 med_size nbdim, fixdim, psize, * pfltab, *size;
00055 med_mode_profil pflmod;
00056 med_int ngauss;
00057 unsigned char *val;
00058 med_int modifpfl;
00059 med_err * fret;
00060
00061 med_idt dataset, dataspace = 0, memspace = 0;
00062 med_size start_mem[1],start_data[1],*pflmem,*pfldsk;
00063 med_size stride[1],count[1],pcount[1],pflsize[1];
00064 med_err ret;
00065 int i,j,index,type_hdf;
00066 int dim, firstdim, dimutil, lastdim ;
00067 med_mode_acces MED_MODE_ACCES;
00068
00069 va_start(params,dummy);
00070 pere = va_arg(params,med_idt);
00071 nom = va_arg(params,char *);
00072 type = va_arg(params,med_type_champ);
00073 interlace = va_arg(params,med_mode_switch);
00074 nbdim = va_arg(params,med_size);
00075 fixdim = va_arg(params,med_size);
00076 psize = va_arg(params,med_size);
00077 pflmod = va_arg(params,med_mode_profil);
00078 modifpfl = va_arg(params,med_int);
00079 pfltab = va_arg(params,med_size *);
00080 ngauss = va_arg(params,med_int);
00081 size = va_arg(params,med_size *);
00082 val = va_arg(params, unsigned char *);
00083 fret = va_arg(params, med_err *);
00084
00085
00086 if ( fixdim > nbdim )
00087 goto Fail;
00088
00089 switch(type)
00090 {
00091 case MED_FLOAT64 :
00092 type_hdf = H5T_NATIVE_DOUBLE;
00093 break;
00094
00095 case MED_INT32 :
00096 type_hdf = H5T_NATIVE_INT;
00097 break;
00098
00099 case MED_INT64 :
00100 type_hdf = H5T_NATIVE_LONG;
00101 break;
00102
00103 default :
00104 goto Fail;
00105 }
00106
00107 if ( (MED_MODE_ACCES = _MEDmodeAcces(pere) ) == MED_UNDEF_MODE_ACCES ) {
00108 MESSAGE("Impossible de déterminer le mode d'acces au fichier ");
00109 goto Fail;
00110 }
00111
00112 if ((dataset = H5Dopen(pere,nom)) < 0)
00113 {
00114
00115
00116
00117
00118 if ((dataspace = H5Screate_simple(1,size,NULL)) < 0)
00119 goto Fail;
00120 if ((dataset = H5Dcreate(pere,nom,type_hdf,dataspace,
00121 H5P_DEFAULT)) < 0)
00122 goto Fail;
00123 }
00124 else
00125 if ( MED_MODE_ACCES == MED_LECTURE_AJOUT )
00126 {
00127 H5Dclose(dataset);
00128 goto Fail;
00129 }
00130 else
00131 if ((dataspace = H5Dget_space(dataset)) <0)
00132 goto Fail;
00133
00134
00135 switch(interlace)
00136 {
00137 case MED_FULL_INTERLACE :
00138
00139
00140 if ( fixdim != MED_ALL)
00141 {
00142 firstdim = fixdim-1;
00143 lastdim = fixdim;
00144 dimutil = 1;
00145 } else {
00146 firstdim = 0;
00147 lastdim = nbdim;
00148 dimutil = nbdim;
00149 }
00150
00151 count [0] = (*size)/(nbdim);
00152
00153
00154 if ( psize == MED_NOPF ) {
00155
00156
00157 if ( (memspace = H5Screate_simple (1, size, NULL)) <0)
00158 goto Fail;
00159
00160 stride[0] = nbdim;
00161
00162 for (dim=firstdim; dim < lastdim; dim++) {
00163
00164 start_mem[0] = dim;
00165 if ( (ret = H5Sselect_hyperslab (memspace, H5S_SELECT_SET, start_mem, stride,
00166 count, NULL)) <0)
00167 goto Fail;
00168
00169 start_data[0] = dim*count[0];
00170 if ( (ret = H5Sselect_hyperslab (dataspace, H5S_SELECT_SET, start_data, NULL,
00171 count, NULL)) <0)
00172 goto Fail;
00173
00174 if ((ret = H5Dwrite(dataset,type_hdf,memspace,dataspace,
00175 H5P_DEFAULT, val)) < 0)
00176 goto Fail;
00177 }
00178
00179 } else {
00180
00181 pflsize [0] = psize*ngauss*nbdim;
00182 pcount [0] = psize*ngauss*dimutil;
00183 pflmem = (med_size *) malloc (sizeof(med_size)*pcount[0]);
00184 pfldsk = (med_size *) malloc (sizeof(med_size)*pcount[0]);
00185
00186 switch(pflmod)
00187 {
00188 case MED_GLOBAL :
00189
00190
00191 if ( (memspace = H5Screate_simple (1, size, NULL)) <0)
00192 goto Fail;
00193
00194 for (dim=firstdim; dim < lastdim; dim++) {
00195
00196 for (i=0; i < psize; i++)
00197 for (j=0; j < ngauss; j++) {
00198 index = i*ngauss+j + (dim-firstdim)*(psize*ngauss);
00199 pflmem[index] = (pfltab[i]-1)*ngauss*nbdim + j*nbdim+dim;
00200 pfldsk[index] = dim*count[0] + (pfltab[i]-1)*ngauss+j;
00201 }
00202 }
00203
00204 if ( (ret = H5Sselect_elements(memspace,H5S_SELECT_SET, pcount[0], HDF5_SELECT_BUG pflmem ) ) <0)
00205 goto Fail;
00206
00207 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET, pcount[0], HDF5_SELECT_BUG pfldsk ) ) <0)
00208 goto Fail;
00209
00210 break;
00211
00212 case MED_COMPACT :
00213
00214
00215
00216
00217
00218 if ( (memspace = H5Screate_simple (1, pflsize, NULL)) <0)
00219 goto Fail;
00220
00221 for (dim=firstdim; dim < lastdim; dim++) {
00222
00223 for (i=0; i < psize; i++)
00224 for (j=0; j < ngauss; j++) {
00225 index = i*ngauss+j + (dim-firstdim)*(psize*ngauss);
00226 pflmem[index] = i*ngauss*nbdim + j*nbdim+dim;
00227 pfldsk[index] = dim*count[0] + (pfltab[i]-1)*ngauss+j;
00228 }
00229 }
00230
00231 if ( (ret = H5Sselect_elements(memspace,H5S_SELECT_SET, pcount[0], HDF5_SELECT_BUG pflmem ) ) <0)
00232 goto Fail;
00233
00234 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET, pcount[0], HDF5_SELECT_BUG pfldsk ) ) <0)
00235 goto Fail;
00236
00237 break;
00238
00239 default :
00240 goto Fail;
00241 }
00242
00243 if ((ret = H5Dwrite(dataset,type_hdf,memspace,dataspace,H5P_DEFAULT, val)) < 0)
00244 goto Fail;
00245
00246 free(pflmem);
00247 free(pfldsk);
00248 }
00249
00250
00251 break;
00252
00253 case MED_NO_INTERLACE :
00254
00255
00256
00257 count[0] = (*size)/nbdim;
00258
00259 if ( psize == MED_NOPF ) {
00260
00261 if ( fixdim != MED_ALL)
00262 start_data[0] = (fixdim-1)*count[0];
00263 else {
00264 count[0] = *size;
00265 start_data[0] = 0;
00266 };
00267
00268 if ( (ret = H5Sselect_hyperslab (dataspace, H5S_SELECT_SET, start_data, NULL,
00269 count, NULL)) <0)
00270 goto Fail;
00271
00272 if ((ret = H5Dwrite(dataset,type_hdf,dataspace,dataspace,
00273 H5P_DEFAULT, val)) < 0)
00274 goto Fail;
00275
00276 } else {
00277
00278 if ( fixdim != MED_ALL)
00279 {
00280 firstdim = fixdim-1;
00281 lastdim = fixdim;
00282 dimutil = 1;
00283 } else {
00284 firstdim = 0;
00285 lastdim = nbdim;
00286 dimutil = nbdim;
00287 }
00288
00289 pflsize [0] = psize*ngauss*nbdim;
00290 pcount [0] = psize*ngauss*dimutil;
00291 pfldsk = (med_size *) malloc(sizeof(med_size)*pcount[0]);
00292
00293 switch(pflmod)
00294 {
00295 case MED_GLOBAL :
00296
00297 for (dim=firstdim; dim < lastdim; dim++) {
00298
00299 for (i=0; i < psize; i++)
00300 for (j=0; j < ngauss; j++) {
00301 index = i*ngauss+j + (dim-firstdim)*(psize*ngauss);
00302 pfldsk[index] = dim*count[0]+(pfltab[i]-1)*ngauss+j;
00303 }
00304 }
00305
00306 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,pcount[0], HDF5_SELECT_BUG pfldsk ) ) <0)
00307 goto Fail;
00308
00309 if ((ret = H5Dwrite(dataset,type_hdf,dataspace,dataspace,H5P_DEFAULT, val)) < 0)
00310 goto Fail;
00311
00312 break;
00313
00314 case MED_COMPACT :
00315
00316
00317
00318
00319
00320 if ( (memspace = H5Screate_simple (1, pflsize, NULL)) <0)
00321 goto Fail;
00322
00323 pflmem = (med_size *) malloc (sizeof(med_size)*pcount[0]);
00324
00325
00326
00327 index = 0;
00328 for (dim=firstdim; dim < lastdim; dim++) {
00329
00330 for (i=0; i < psize; i++)
00331 for (j=0; j < ngauss; j++) {
00332
00333
00334 pflmem[index] = ( (dim*psize) + i )*ngauss + j;
00335 pfldsk[index] = dim*count[0] + (pfltab[i]-1)*ngauss+j;
00336 index++;
00337 }
00338 }
00339
00340 if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET,pcount[0], HDF5_SELECT_BUG pflmem ) ) <0)
00341 goto Fail;
00342
00343 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,pcount[0], HDF5_SELECT_BUG pfldsk ) ) <0)
00344 goto Fail;
00345
00346 if ((ret = H5Dwrite(dataset,type_hdf,memspace,dataspace,H5P_DEFAULT, val)) < 0)
00347 goto Fail;
00348
00349 free(pflmem);
00350
00351 break;
00352
00353 default :
00354 goto Fail;
00355
00356 }
00357
00358 free(pfldsk);
00359
00360 };
00361
00362 break;
00363
00364 default :
00365 goto Fail;
00366 }
00367
00368
00369 if (memspace)
00370 if ((ret = H5Sclose(memspace)) < 0)
00371 goto Fail;
00372
00373 if ((ret = H5Sclose(dataspace)) < 0)
00374 goto Fail;
00375
00376 if ((ret = H5Dclose(dataset)) < 0)
00377 goto Fail;
00378
00379 Success:
00380 va_end(params);
00381 *fret=0;
00382 return;
00383
00384 Fail:
00385 va_end(params);
00386 *fret = -1;
00387 return;
00388 }