static bool read_sparse(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo* _pInfo) { int iRet = 0; int iRows = 0; int iCols = 0; int iNbItem = 0; int iComplex = 0; iRet = getSparseDimension(_iDatasetId, &iRows, &iCols, &iNbItem); if (iRet) { return false; } iComplex = isComplexData(_iDatasetId); _pInfo->iDims = 2; _pInfo->piDims[0] = iRows; _pInfo->piDims[1] = iCols; _pInfo->iSize = 20 + iRows * 4 + iNbItem * 4 + (iNbItem * (iComplex + 1) * 8); generateInfo(_pInfo, "sparse"); closeDataSet(_iDatasetId); return true; }
static bool import_sparse(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname) { int iRet = 0; int iRows = 0; int iCols = 0; int iComplex = 0; double *pdblReal = NULL; double *pdblImg = NULL; int iNbItem = 0; int *piNbItemRow = NULL; int *piColPos = NULL; SciErr sciErr; iRet = getSparseDimension(_iDatasetId, &iRows, &iCols, &iNbItem); if (iRet) { return false; } iComplex = isComplexData(_iDatasetId); if (iComplex) { piNbItemRow = (int *)MALLOC(iRows * sizeof(int)); piColPos = (int *)MALLOC(iNbItem * sizeof(int)); pdblReal = (double *)MALLOC(iNbItem * sizeof(double)); pdblImg = (double *)MALLOC(iNbItem * sizeof(double)); iRet = readSparseComplexMatrix(_iDatasetId, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal, pdblImg); } else { piNbItemRow = (int *)MALLOC(iRows * sizeof(int)); piColPos = (int *)MALLOC(iNbItem * sizeof(int)); pdblReal = (double *)MALLOC(iNbItem * sizeof(double)); iRet = readSparseMatrix(_iDatasetId, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal); } if (iRet) { FREE(piNbItemRow); FREE(piColPos); FREE(pdblReal); if (iComplex) { FREE(pdblImg); } return false; } if (_piAddress == NULL) { if (iComplex) { sciErr = createNamedComplexSparseMatrix(pvCtx, _pstVarname, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal, pdblImg); } else { sciErr = createNamedSparseMatrix(pvCtx, _pstVarname, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal); } } else //if not null this variable is in a list { if (iComplex) { sciErr = createComplexSparseMatrixInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal, pdblImg); } else { sciErr = createSparseMatrixInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal); } } FREE(piNbItemRow); FREE(piColPos); FREE(pdblReal); if (iComplex) { FREE(pdblImg); } if (sciErr.iErr) { printError(&sciErr, 0); return false; } return true; }
int getDatasetInfo(int _iDatasetId, int* _iComplex, int* _iDims, int* _piDims) { int iSize = 1; hid_t data_type; H5T_class_t data_class; hid_t space = H5Dget_space(_iDatasetId); if (space < 0) { return -1; } data_type = H5Dget_type(_iDatasetId); data_class = H5Tget_class(data_type); if (data_class == H5T_COMPOUND) { *_iComplex = 1; } else if (data_class == H5T_REFERENCE) { *_iComplex = isComplexData(_iDatasetId); } else { *_iComplex = 0; } *_iDims = H5Sget_simple_extent_ndims(space); if (*_iDims < 0) { H5Sclose(space); return -1; } if (_piDims != 0 && *_iDims != 0) { int i = 0; hsize_t* dims = (hsize_t*)MALLOC(sizeof(hsize_t) **_iDims); if (H5Sget_simple_extent_dims(space, dims, NULL) < 0) { FREE(dims); return -1; } //reverse dimensions for (i = 0 ; i < *_iDims ; i++) { //reverse dimensions to improve rendering in external tools _piDims[i] = (int)dims[*_iDims - 1 - i]; iSize *= _piDims[i]; } FREE(dims); } else { iSize = 0; } H5Sclose(space); return iSize; }