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 : _MEDdatasetNumLire
26 * - Description : lecture 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
31 * - interlace (IN) : Choix du type d'entrelacement demandé 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 à partir de 1..oo
34 * - psize (IN) : Taille du profil à utiliser, MED_NOPF si pas de profil
35 * - pfltab (IN) : Tableau contenant les n° déléments à traiter (1....oo)
36 * - pflmod (IN) : PARAMETRE A AJOUTER : Indique comment lire les informations en mémoire { MED_COMPACT, MED_GLOBALE }.
37 * - ngauss (IN) : Nombre de points de GAUSS par élément
38 * - val (OUT) : valeurs du tableau
39 * - Resultat : 0 en cas de succes, -1 sinon
40 * Equivalent à l'ancienne routine si .....,MED_NO_INTERLACE,1,MED_ALL,MED_NOPF,0,1 (peu importe),....
46 _MEDdatasetNumLire(med_idt pere,char *nom,med_type_champ type,
47 med_mode_switch interlace, med_size nbdim, med_size fixdim,
48 med_size psize, med_ssize * pfltab, med_int ngauss,
51 med_idt dataset, dataspace = 0, memspace = 0;
53 med_size start_mem[1],start_data[1],*pflmem=0,*pfldsk=0;
55 med_ssize start_mem[1],start_data[1],*pflmem=0,*pfldsk=0;
57 med_size stride[1],count[1],pcount[1],size[1],pflsize[1];
59 int i,j,index,type_hdf;
62 int dim, firstdim, dimutil, lastdim;
63 med_mode_profil pflmod;
65 /* Verify fixdim is between [0, nbdim] ( 0 is MED_ALL ) */
66 if ( ( fixdim < 0 ) || ( fixdim > nbdim ) )
69 /* block pflmod to MED_COMPACT (until med2.2) */
75 /* 1) IA32 is LE but due to an (?HDF convertion BUG?) when using H5T_NATIVE_DOUBLE/MED_REEL64? under PCLINUX
76 the file read under SGI is incorrect
77 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
78 REM : Be careful of compatibility between MED files when changing this (med2.2)
79 3) PPRO_NT is added for med2.1.6 support under Win32 */
80 #if defined(PCLINUX) || defined(OSF1) || defined(PPRO_NT) || defined(PCLINUX64) || defined(PCLINUX64_32)
81 type_hdf = H5T_IEEE_F64BE;
83 type_hdf = H5T_IEEE_F64LE;
88 type_hdf = H5T_NATIVE_INT;
92 type_hdf = H5T_NATIVE_LONG;
99 /* Ouverture du Dataset à lire */
100 if ((dataset = H5Dopen(pere,nom)) < 0)
103 /* Interrogation de la taille du dataset */
104 if ( (datatype = H5Dget_type(dataset )) < 0) return -1;
105 if ( (typesize = H5Tget_size(datatype)) < 0) return -1;
106 size[0] = H5Dget_storage_size(dataset) / typesize;
107 if ( H5Tclose(datatype) < 0) return -1;
109 /* Create dataspace */
110 if ((dataspace = H5Screate_simple(1,size,NULL)) < 0)
115 case MED_FULL_INTERLACE :
117 /*Initialisation des indices de boucle du traitement de l'entrelacement en fonction de la dimension fixee*/
118 if ( fixdim != MED_ALL)
120 firstdim = (int)fixdim-1;
121 lastdim = (int)fixdim;
125 lastdim = (int)nbdim;
126 dimutil = (int)nbdim;
129 count [0] = (*size)/(nbdim);
132 /*rem: Pas de vérification de l'assertion (*size)=n*nbdim */
133 if ( psize == MED_NOPF ) {
135 /* Creation d'un data space mémoire de dimension 1, de longeur size, et de longeur maxi size */
136 if ( (memspace = H5Screate_simple (1, size, NULL)) <0)
141 for (dim=firstdim; dim < lastdim; dim++) {
144 if ( (ret = H5Sselect_hyperslab (memspace, H5S_SELECT_SET, start_mem, stride,
148 start_data[0] = dim*count[0];
149 if ( (ret = H5Sselect_hyperslab (dataspace, H5S_SELECT_SET, start_data, NULL,
153 if ((ret = H5Dread(dataset,type_hdf,memspace,dataspace,
154 H5P_DEFAULT, val)) < 0)
160 pflsize [0] = psize*ngauss*nbdim;
161 pcount [0] = psize*ngauss*dimutil;
163 pflmem = (med_size *) malloc (sizeof(med_size)*(size_t)pcount[0]);
164 pfldsk = (med_size *) malloc (sizeof(med_size)*(size_t)pcount[0]);
166 pflmem = (med_ssize *) malloc (sizeof(med_ssize)*(size_t)pcount[0]);
167 pfldsk = (med_ssize *) malloc (sizeof(med_ssize)*(size_t)pcount[0]);
171 { /* switch pflmod pour FULL_INTERLACE*/
174 /* Creation d'un data space mémoire de dimension 1, de longeur size, et de longeur maxi size */
175 if ( (memspace = H5Screate_simple (1, size, NULL)) <0)
178 for (dim=firstdim; dim < lastdim; dim++) {
180 for (i=0; i < psize; i++) /* i balaye les élements du profil */
181 for (j=0; j < ngauss; j++) {
182 index = i*ngauss+j + (dim-firstdim)*((int)psize*ngauss);
183 pflmem[index] = (pfltab[i]-1)*ngauss*nbdim + j*nbdim+dim;
184 pfldsk[index] = dim*count[0] + (pfltab[i]-1)*ngauss+j;
189 if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET, (size_t)pcount[0], (const hsize_t *) pflmem ) ) <0)
192 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET, (size_t)pcount[0], (const hsize_t *) pfldsk ) ) <0)
194 #elif defined HDF_NEW_API
195 if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET, (size_t)pcount[0], (const hsize_t **) pflmem ) ) <0)
198 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET, (size_t)pcount[0], (const hsize_t **) pfldsk ) ) <0)
201 if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET, (size_t)pcount[0], (const hssize_t **) pflmem ) ) <0)
204 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET, (size_t)pcount[0], (const hssize_t **) pfldsk ) ) <0)
212 /* Creation d'un data space mémoire de dimension 1, de la longeur du profil */
213 /* La dimension utilisée est ici nbdim, même pour un profil compact on suppose */
214 /* que l'utilisateur a toutes les coordonées stockées, même si il en demande qu'une */
216 if ( (memspace = H5Screate_simple (1, pflsize, NULL)) <0)
219 for (dim=firstdim; dim < lastdim; dim++) {
221 for (i=0; i < psize; i++) /* i balaye les élements du profil */
222 for (j=0; j < ngauss; j++) {
223 index = i*ngauss+j + (dim-firstdim)*((int)psize*ngauss);
224 pflmem[index] = i*ngauss*nbdim + j*nbdim+dim;
225 pfldsk[index] = dim*count[0] + (pfltab[i]-1)*ngauss+j;
230 if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET, (size_t)pcount[0], (const hsize_t *) pflmem ) ) <0)
233 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET, (size_t)pcount[0], (const hsize_t *) pfldsk ) ) <0)
235 #elif defined HDF_NEW_API
236 if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET, (size_t)pcount[0], (const hsize_t **) pflmem ) ) <0)
239 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET, (size_t)pcount[0], (const hsize_t **) pfldsk ) ) <0)
242 if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET, (size_t)pcount[0], (const hssize_t **) pflmem ) ) <0)
245 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET, (size_t)pcount[0], (const hssize_t **) pfldsk ) ) <0)
255 if ((ret = H5Dread(dataset,type_hdf,memspace,dataspace,H5P_DEFAULT, val)) < 0)
264 case MED_NO_INTERLACE :
266 /*Initialisation des indices de boucle du traitement de l'entrelacement en fonction de la dimension fixee*/
268 count[0] = (*size)/nbdim;
270 if ( psize == MED_NOPF ) {
272 if ( fixdim != MED_ALL)
273 start_data[0] = (fixdim-1)*count[0];
279 if ( (ret = H5Sselect_hyperslab (dataspace, H5S_SELECT_SET, start_data, NULL,
283 if ((ret = H5Dread(dataset,type_hdf,dataspace,dataspace,
284 H5P_DEFAULT, val)) < 0)
289 if ( fixdim != MED_ALL)
291 firstdim = (int)fixdim-1;
292 lastdim = (int)fixdim;
296 lastdim = (int)nbdim;
297 dimutil = (int)nbdim;
300 pflsize [0] = psize*ngauss*nbdim;
301 pcount [0] = psize*ngauss*dimutil; /* nom pas très coherent avec count !!! A revoir */
303 pfldsk = (med_size *) malloc(sizeof(med_size)*(size_t)pcount[0]);
305 pfldsk = (med_ssize *) malloc(sizeof(med_ssize)*(size_t)pcount[0]);
309 { /*switch plfmod pour NO_INTERLACE */
312 for (dim=firstdim; dim < lastdim; dim++) {
314 for (i=0; i < psize; i++) /* i balaye le nbre d'élements du profil */
315 for (j=0; j < ngauss; j++) {
316 index = i*ngauss+j + (dim-firstdim)*((int)psize*ngauss);
317 pfldsk[index] = dim*count[0]+(pfltab[i]-1)*ngauss+j;
322 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,(size_t)pcount[0], (const hsize_t *) pfldsk ) ) <0)
324 #elif defined HDF_NEW_API
325 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,(size_t)pcount[0], (const hsize_t **) pfldsk ) ) <0)
328 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,(size_t)pcount[0], (const hssize_t **) pfldsk ) ) <0)
332 if ((ret = H5Dread(dataset,type_hdf,dataspace,dataspace,H5P_DEFAULT, val)) < 0)
339 /* Creation d'un data space mémoire de dimension 1, de la longeur du profil */
340 /* La dimension utilisée est ici nbdim, même pour un profil compact on suppose */
341 /* que l'utilisateur a toutes les coordonées stockées, même si il en demande qu'une */
343 if ( (memspace = H5Screate_simple (1, pflsize, NULL)) <0)
347 pflmem = (med_size *) malloc (sizeof(med_size)*(size_t)pcount[0]);
349 pflmem = (med_ssize *) malloc (sizeof(med_ssize)*(size_t)pcount[0]);
352 /* Le profil COMPACT est contigüe, mais il est possible que l'on selectionne uniquemenent une dimension*/
355 for (dim=firstdim; dim < lastdim; dim++) {
357 for (i=0; i < psize; i++) /* i balaye le nbre d'élements du profil */
358 for (j=0; j < ngauss; j++) {
359 // index = i*ngauss+j + (dim-firstdim)*(psize*ngauss);
360 // pflmem[index] = dim*(psize*ngauss) + (pfltab[i]-1)*ngauss+j;
361 // pfldsk[index] = dim*count[0] + (pfltab[i]-1)*ngauss+j;
362 pflmem[index] = ( (dim*psize) + i )*ngauss + j;
363 pfldsk[index] = dim*count[0] + (pfltab[i]-1)*ngauss+j;
369 if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET, (size_t)pcount[0], (const hsize_t *) pflmem ) ) <0)
372 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,(size_t)pcount[0], (const hsize_t *) pfldsk ) ) <0)
374 #elif defined HDF_NEW_API
375 if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET, (size_t)pcount[0], (const hsize_t **) pflmem ) ) <0)
378 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,(size_t)pcount[0], (const hsize_t **) pfldsk ) ) <0)
381 if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET, (size_t)pcount[0], (const hssize_t **) pflmem ) ) <0)
384 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,(size_t)pcount[0], (const hssize_t **) pfldsk ) ) <0)
388 if ((ret = H5Dread(dataset,type_hdf,memspace,dataspace,H5P_DEFAULT, val)) < 0)
411 if ((ret = H5Sclose(memspace)) < 0)
414 if ((ret = H5Sclose(dataspace)) < 0)
417 if ((ret = H5Dclose(dataset)) < 0)