Changeset 1762


Ignore:
Timestamp:
16/11/11 18:42:27 (6 months ago)
Author:
Freddie Akeroyd
Message:

Fix bug in handling of unlimited dimensions. Refs #303

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/napi5.c

    r1756 r1762  
    897897    pNexusFile5 pFile; 
    898898    herr_t iRet; 
     899    int64_t myStart[H5S_MAX_RANK]; 
     900    int64_t mySize[H5S_MAX_RANK]; 
     901    hsize_t thedims[H5S_MAX_RANK],maxdims[H5S_MAX_RANK]; 
     902    int i, rank, unlimiteddim = 0; 
    899903     
    900904    char pError[512] = ""; 
    901905       
    902906    pFile = NXI5assert (fid); 
    903      
    904     /* actually write */ 
    905     iRet = H5Dwrite (pFile->iCurrentD, pFile->iCurrentT, H5S_ALL, H5S_ALL,  
     907    rank = H5Sget_simple_extent_ndims(pFile->iCurrentS);     
     908    if (rank < 0) 
     909    { 
     910        NXReportError("ERROR: Cannot determine dataset rank"); 
     911        return NX_ERROR; 
     912    } 
     913    iRet = H5Sget_simple_extent_dims(pFile->iCurrentS, thedims, maxdims); 
     914    if (iRet < 0) 
     915    { 
     916        NXReportError("ERROR: Cannot determine dataset dimensions"); 
     917        return NX_ERROR; 
     918    } 
     919    for(i=0; i<rank; ++i) 
     920    { 
     921        myStart[i] = 0; 
     922        mySize[i] = thedims[i]; 
     923        if (maxdims[i] == H5S_UNLIMITED) 
     924        { 
     925            unlimiteddim = 1; 
     926            myStart[i] = thedims[i] + 1; 
     927            mySize[i] = 1; 
     928        } 
     929    } 
     930    /* If we are using putdata on an unlimied dimesnion dataset, assume we want to append one single new slab */ 
     931    if ( unlimiteddim ) 
     932    { 
     933        return NX5putslab64(fid, data, myStart, mySize); 
     934    } 
     935    else 
     936    { 
     937        iRet = H5Dwrite (pFile->iCurrentD, pFile->iCurrentT, H5S_ALL, H5S_ALL,  
    906938                     H5P_DEFAULT, data); 
    907     if (iRet < 0) { 
    908       snprintf (pError,511, "ERROR: failure to write data"); 
    909       NXReportError( pError); 
    910       return NX_ERROR; 
     939        if (iRet < 0) { 
     940          snprintf (pError,sizeof(pError)-1, "ERROR: failure to write data"); 
     941          NXReportError( pError); 
     942          return NX_ERROR; 
     943        } 
    911944    } 
    912945    return NX_OK; 
     
    9911024  { 
    9921025    pNexusFile5 pFile; 
    993     int iRet, i; 
    994     int rank; 
     1026    int iRet, rank, i; 
    9951027    hsize_t myStart[H5S_MAX_RANK]; 
    9961028    hsize_t mySize[H5S_MAX_RANK]; 
     
    10061038    } 
    10071039    rank = H5Sget_simple_extent_ndims(pFile->iCurrentS);     
     1040    if (rank < 0) { 
     1041      NXReportError( "ERROR: cannot get rank"); 
     1042      return NX_ERROR; 
     1043    } 
    10081044    iRet = H5Sget_simple_extent_dims(pFile->iCurrentS, thedims, maxdims); 
     1045    if (iRet < 0) { 
     1046      NXReportError( "ERROR: cannot get dimensions"); 
     1047      return NX_ERROR; 
     1048    } 
     1049 
    10091050    for(i = 0; i < rank; i++) 
    10101051    { 
    10111052       myStart[i] = iStart[i]; 
    10121053       mySize[i]  = iSize[i]; 
    1013        size[i]    = iSize[i]; 
     1054       size[i]    =  iStart[i] + iSize[i]; 
    10141055       if (maxdims[i] == H5S_UNLIMITED) { 
    10151056        unlimiteddim = 1; 
    1016         size[i] = iStart[i] + iSize[i]; 
    10171057       } 
    10181058    } 
     
    10571097           NXReportError( "ERROR: writing slab failed"); 
    10581098       } 
    1059        iRet = H5Sclose(filespace);              
     1099       /* update with new size */ 
     1100       iRet = H5Sclose(pFile->iCurrentS);              
     1101       pFile->iCurrentS = filespace; 
    10601102   } else { 
    10611103       /* define slab */ 
Note: See TracChangeset for help on using the changeset viewer.