1 /*************************************************************************
2 * COPYRIGHT (C) 1999 - 2002 EDF R&D
3 * THIS LIBRARY IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
4 * IT UNDER THE TERMS OF THE GNU LESSER GENERAL PUBLIC LICENSE
5 * AS PUBLISHED BY THE FREE SOFTWARE FOUNDATION;
6 * EITHER VERSION 2.1 OF THE LICENSE, OR (AT YOUR OPTION) ANY LATER VERSION.
8 * THIS LIBRARY IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
9 * WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
11 * LESSER GENERAL PUBLIC LICENSE FOR MORE DETAILS.
13 * YOU SHOULD HAVE RECEIVED A COPY OF THE GNU LESSER GENERAL PUBLIC LICENSE
14 * ALONG WITH THIS LIBRARY; IF NOT, WRITE TO THE FREE SOFTWARE FOUNDATION,
15 * INC., 59 TEMPLE PLACE, SUITE 330, BOSTON, MA 02111-1307 USA
17 *************************************************************************/
20 #include "med_outils.hxx"
22 #include "hdf5_version2api.hxx"
25 * - Nom de la fonction : _MEDdatasetNumEcrire
26 * - Description : ecriture d'un dataset tableau numerique
28 * - pere (IN) : l'ID de l'objet HDF pere ou placer l'attribut
29 * - nom (IN) : le nom du dataset
30 * - type (IN) : type numerique MED { MED_REEL64 , MED_INT32 , MED_INT64 }
31 * - interlace (IN) : Choix du type d'entrelacement utilisé par l'appelant { MED_FULL_INTERLACE(x1,y1,z1,x2,...)) , MED_NO_INTERLACE(x1,x2,y1,y2,z1,z2) }
32 * - nbdim (IN) : Dimension des éléments
33 * - fixdim (IN) : MED_ALL ou n° de la dimension a enregistrer
34 * - psize (IN) : Taille du profil à utiliser, MED_NOPF si pas de profil
35 * (référence les élements, cette taille ne prend pas en compte le nombre de pts de gauss ni la dimension )
36 * - pfltab (IN) : Tableau contenant les n° déléments à traiter (1....oo)
37 * - pflmod (IN) : PARAMETRE A AJOUTER : Indique comment lire les informations en mémoire { MED_COMPACT, MED_GLOBALE }.
38 * - ngauss (IN) : Nombre de points de GAUSS par élément
39 * - size (IN) : Taille du tableau de valeurs
40 * (référence tous les élements, cette taille prend en compte le nombre de pts de gauss et la dimension )
41 * - val (IN) : valeurs du tableau
42 * - mode (IN) : mode d'ecriture MED (MED_ECRI | MED_REMP)
43 * - Resultat : 0 en cas de succes, -1 sinon
49 _MEDdatasetNumEcrire(med_idt pere,char *nom, med_type_champ type,
50 med_mode_switch interlace, med_size nbdim, med_size fixdim,
51 med_size psize, med_ssize * pfltab, med_int ngauss,
52 med_size *size, unsigned char *val, med_mode_acces mode)
54 med_idt dataset, dataspace = 0, memspace = 0;
56 med_size start_mem[1],start_data[1],*pflmem,*pfldsk;
58 med_ssize start_mem[1],start_data[1],*pflmem,*pfldsk;
60 med_size stride[1],count[1],pcount[1],pflsize[1];
62 int i,j,index,type_hdf;
63 int dim, firstdim, dimutil, lastdim ;
64 med_mode_profil pflmod;
66 /* Verify fixdim is between [0, nbdim] ( 0 is MED_ALL ) */
67 if ( ( fixdim < 0 ) || ( fixdim > nbdim ) )
70 /* block pflmod to MED_COMPACT (until med2.2) */
76 /* 1) IA32 is LE but due to an (?HDF convertion BUG?) when using H5T_NATIVE_DOUBLE/MED_REEL64? under PCLINUX
77 the file read under SGI is incorrect
78 2) Compaq OSF/1 is LE, since we force SGI64,SUN4SOL2,HP to write double in LE even if they are BE, mips OSF/1 must be BE
79 REM : Be careful of compatibility between MED files when changing this (med2.2) */
80 #if defined(PCLINUX) || defined(PCLINUX64) || defined(PCLINUX64_32) || defined(OSF1) || defined( PPRO_NT )
81 type_hdf = H5T_IEEE_F64BE;
83 type_hdf = H5T_IEEE_F64LE;
88 #if defined(PCLINUX) || defined(PCLINUX64) || defined(PCLINUX64_32)
89 type_hdf = H5T_STD_I32BE;
90 if ((H5Tconvert(H5T_NATIVE_INT,H5T_STD_I32BE,(hsize_t)*size,(void *)val,NULL,(hid_t)0)) < 0)
93 type_hdf = H5T_NATIVE_INT;
98 type_hdf = H5T_NATIVE_LONG;
106 if ((dataset = H5Dopen(pere,nom)) < 0)
108 /* Whatever the size of the profil is we create a dataset with the size of the value array */
109 /* Then if we used the MED_REMP mode we can append a new dimension to a previous one in the dataset */
110 /* When we'll use the compression mode, the space used by unused values would be easily compressed */
112 if ((dataspace = H5Screate_simple(1,size,NULL)) < 0)
114 if ((dataset = H5Dcreate(pere,nom,type_hdf,dataspace,
119 if (mode != MED_REMP)
125 if ((dataspace = H5Dget_space(dataset)) <0)
130 { /* switch Interlace */
131 case MED_FULL_INTERLACE :
133 /*Initialisation des indices de boucle du traitement de l'entrelacement en fonction de la dimension fixee*/
134 if ( fixdim != MED_ALL)
136 firstdim = (int)fixdim-1;
137 lastdim = (int)fixdim;
141 lastdim = (int)nbdim;
142 dimutil = (int)nbdim;
145 count [0] = (*size)/(nbdim);
148 if ( psize == MED_NOPF ) {
150 /* Creation d'un data space mémoire de dimension 1, de longeur size, et de longeur maxi size */
151 if ( (memspace = H5Screate_simple (1, size, NULL)) <0)
156 for (dim=firstdim; dim < lastdim; dim++) {
159 if ( (ret = H5Sselect_hyperslab (memspace, H5S_SELECT_SET, start_mem, stride,
163 start_data[0] = dim*count[0];
164 if ( (ret = H5Sselect_hyperslab (dataspace, H5S_SELECT_SET, start_data, NULL,
168 if ((ret = H5Dwrite(dataset,type_hdf,memspace,dataspace,
169 H5P_DEFAULT, val)) < 0)
173 } else { /* psize != MED_NOPF */
175 pflsize [0] = psize*ngauss*nbdim;
176 pcount [0] = psize*ngauss*dimutil;
178 pflmem = (med_size *) malloc (sizeof(med_size)*(size_t)pcount[0]);
179 pfldsk = (med_size *) malloc (sizeof(med_size)*(size_t)pcount[0]);
181 pflmem = (med_ssize *) malloc (sizeof(med_ssize)*(size_t)pcount[0]);
182 pfldsk = (med_ssize *) malloc (sizeof(med_ssize)*(size_t)pcount[0]);
186 { /* switch pflmod pout FULL_INTERLACE*/
189 /* Creation d'un data space mémoire de dimension 1, de longeur size, et de longeur maxi size */
190 if ( (memspace = H5Screate_simple (1, size, NULL)) <0)
193 for (dim=firstdim; dim < lastdim; dim++) {
195 for (i=0; i < psize; i++) /* i balaye les élements du profil */
196 for (j=0; j < ngauss; j++) {
197 index = i*ngauss+j + (dim-firstdim)*((int)psize*ngauss);
198 pflmem[index] = (pfltab[i]-1)*ngauss*nbdim + j*nbdim+dim;
199 pfldsk[index] = dim*count[0] + (pfltab[i]-1)*ngauss+j;
204 if ( (ret = H5Sselect_elements(memspace,H5S_SELECT_SET, (size_t)pcount[0], (const hsize_t *) pflmem ) ) <0)
207 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET, (size_t)pcount[0], (const hsize_t *) pfldsk ) ) <0)
209 #elif defined HDF_NEW_API
210 if ( (ret = H5Sselect_elements(memspace,H5S_SELECT_SET, (size_t)pcount[0], (const hsize_t **) pflmem ) ) <0)
213 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET, (size_t)pcount[0], (const hsize_t **) pfldsk ) ) <0)
216 if ( (ret = H5Sselect_elements(memspace,H5S_SELECT_SET, (size_t)pcount[0], (const hssize_t **) pflmem ) ) <0)
219 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET, (size_t)pcount[0], (const hssize_t **) pfldsk ) ) <0)
227 /* Creation d'un data space mémoire de dimension 1, de la longeur du profil */
228 /* La dimension utilisée est ici nbdim, même pour un profil compact on suppose */
229 /* que l'utilisateur a toutes les coordonées stockées, même si il en demande qu'une */
231 if ( (memspace = H5Screate_simple (1, pflsize, NULL)) <0)
234 for (dim=firstdim; dim < lastdim; dim++) {
236 for (i=0; i < psize; i++) /* i balaye les élements du profil */
237 for (j=0; j < ngauss; j++) {
238 index = i*ngauss+j + (dim-firstdim)*((int)psize*ngauss);
239 pflmem[index] = i*ngauss*nbdim + j*nbdim+dim;
240 pfldsk[index] = dim*count[0] + (pfltab[i]-1)*ngauss+j;
245 if ( (ret = H5Sselect_elements(memspace,H5S_SELECT_SET, (size_t)pcount[0], (const hsize_t *) pflmem ) ) <0)
248 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET, (size_t)pcount[0], (const hsize_t *) pfldsk ) ) <0)
250 #elif defined HDF_NEW_API
251 if ( (ret = H5Sselect_elements(memspace,H5S_SELECT_SET, (size_t)pcount[0], (const hsize_t **) pflmem ) ) <0)
254 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET, (size_t)pcount[0], (const hsize_t **) pfldsk ) ) <0)
257 if ( (ret = H5Sselect_elements(memspace,H5S_SELECT_SET, (size_t)pcount[0], (const hssize_t **) pflmem ) ) <0)
260 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET, (size_t)pcount[0], (const hssize_t **) pfldsk ) ) <0)
270 if ((ret = H5Dwrite(dataset,type_hdf,memspace,dataspace,H5P_DEFAULT, val)) < 0)
280 case MED_NO_INTERLACE :
282 /*Initialisation des indices de boucle du traitement de l'entrelacement en fonction de la dimension fixee*/
284 count[0] = (*size)/nbdim;
286 if ( psize == MED_NOPF ) {
288 if ( fixdim != MED_ALL)
289 start_data[0] = (fixdim-1)*count[0];
295 if ( (ret = H5Sselect_hyperslab (dataspace, H5S_SELECT_SET, start_data, NULL,
299 if ((ret = H5Dwrite(dataset,type_hdf,dataspace,dataspace,
300 H5P_DEFAULT, val)) < 0)
305 if ( fixdim != MED_ALL)
307 firstdim = (int)fixdim-1;
308 lastdim = (int)fixdim;
312 lastdim = (int)nbdim;
313 dimutil = (int)nbdim;
316 pflsize [0] = psize*ngauss*nbdim;
317 pcount [0] = psize*ngauss*dimutil; /* nom pas très coherent avec count !!! A revoir */
319 pfldsk = (med_size *) malloc(sizeof(med_size)*(size_t)pcount[0]);
321 pfldsk = (med_ssize *) malloc(sizeof(med_ssize)*(size_t)pcount[0]);
325 { /*switch plfmod pour NO_INTERLACE */
328 for (dim=firstdim; dim < lastdim; dim++) {
330 for (i=0; i < psize; i++) /* i balaye le nbre d'élements du profil */
331 for (j=0; j < ngauss; j++) {
332 index = i*ngauss+j + (dim-firstdim)*((int)psize*ngauss);
333 pfldsk[index] = dim*count[0]+(pfltab[i]-1)*ngauss+j;
338 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,(size_t)pcount[0], (const hsize_t *) pfldsk ) ) <0)
340 #elif defined HDF_NEW_API
341 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,(size_t)pcount[0], (const hsize_t **) pfldsk ) ) <0)
344 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,(size_t)pcount[0], (const hssize_t **) pfldsk ) ) <0)
348 if ((ret = H5Dwrite(dataset,type_hdf,dataspace,dataspace,H5P_DEFAULT, val)) < 0)
355 /* Creation d'un data space mémoire de dimension 1, de la longeur du profil */
356 /* La dimension utilisée est ici nbdim, même pour un profil compact on suppose */
357 /* que l'utilisateur a toutes les coordonées stockées, même si il en demande qu'une */
359 if ( (memspace = H5Screate_simple (1, pflsize, NULL)) <0)
363 pflmem = (med_size *) malloc (sizeof(med_size)*(size_t)pcount[0]);
365 pflmem = (med_ssize *) malloc (sizeof(med_ssize)*(size_t)pcount[0]);
368 /* Le profil COMPACT est contigüe, mais il est possible que l'on selectionne uniquemenent une dimension*/
370 for (dim=firstdim; dim < lastdim; dim++) {
372 for (i=0; i < psize; i++) /* i balaye le nbre d'élements du profil */
373 for (j=0; j < ngauss; j++) {
374 index = i*ngauss+j + (dim-firstdim)*((int)psize*ngauss);
375 pflmem[index] = dim*(psize*ngauss) + (pfltab[i]-1)*ngauss+j;
376 pfldsk[index] = dim*count[0] + (pfltab[i]-1)*ngauss+j;
381 if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET,(size_t)pcount[0], (const hsize_t *) pflmem ) ) <0)
384 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,(size_t)pcount[0], (const hsize_t *) pfldsk ) ) <0)
386 #elif defined HDF_NEW_API
387 if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET,(size_t)pcount[0], (const hsize_t **) pflmem ) ) <0)
390 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,(size_t)pcount[0], (const hsize_t **) pfldsk ) ) <0)
393 if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET,(size_t)pcount[0], (const hssize_t **) pflmem ) ) <0)
396 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,(size_t)pcount[0], (const hssize_t **) pfldsk ) ) <0)
400 if ((ret = H5Dwrite(dataset,type_hdf,memspace,dataspace,H5P_DEFAULT, val)) < 0)
424 if ((ret = H5Sclose(memspace)) < 0)
427 if ((ret = H5Sclose(dataspace)) < 0)
430 if ((ret = H5Dclose(dataset)) < 0)
433 #if defined(PCLINUX) || defined(PCLINUX64) || defined(PCLINUX64_32)
434 if (type == MED_INT32)
435 if ((H5Tconvert(H5T_STD_I32BE,H5T_NATIVE_INT,(hsize_t)*size,(void *)val,NULL,(hid_t)0)) < 0)