Project

General

Profile

RE: cdo-1.4.7rc2: Setting chunk size ยป patch-chunks.txt

Etienne Tourigny, 2012-11-13 15:34

 
diff -h -r -x '*.o' -x '*~' cdo-1.5.8-orig//libcdi/src/stream_cdf.c cdo-1.5.8/libcdi/src/stream_cdf.c
92a93
> int chunksize[4]; //chunking information
2683a2685,2686
> char* chunkAlgo = 0;
> int xd,yd;
2751a2755
> xd = yd = -1;
2762a2767
> yd = ndims;
2768a2774
> xd = ndims;
2775,2778d2780
< if ( CDI_Debug )
< fprintf(stderr, "chunks %d %d %d %d\n",
< (int)chunks[0], (int)chunks[1], (int)chunks[2], (int)chunks[3]);
<
2800c2802
< while ( checkname )
---
> while ( checkname )
2870c2872,2873
< if ( lchunk && (streamptr->filetype == FILETYPE_NC4 || streamptr->filetype == FILETYPE_NC4C) )
---
> if ( lchunk &&
> (streamptr->filetype == FILETYPE_NC4 || streamptr->filetype == FILETYPE_NC4C) )
2872,2873c2875,2924
< if ( (retval = nc_def_var_chunking(fileID, ncvarid, 0, chunks)) )
< Error("nc_def_var_chunking failed, status = %d", retval);
---
> chunkAlgo = getenv("CDI_CHUNK_ALGO");
> if ( CDI_Debug )
> printf("chunkAlgo: %s\n",chunkAlgo);
> if ( !chunkAlgo || ( strcmp("", chunkAlgo) == 0 )
> || ( strcmp("default", chunkAlgo) == 0 ) )
> {
> if ( xd != -1 ) chunks[xd] = xsize;
> if ( yd != -1 ) chunks[yd] = ysize;
> }
> else if ( strcmp("auto", chunkAlgo) == 0 )
> {
> // noop, will not call nc_def_var_chunking() below
> }
> else if ( strcmp("lines", chunkAlgo) == 0 )
> {
> if ( xd != -1 ) chunks[xd] = xsize;
> if ( yd != -1 ) chunks[yd] = 1;
> }
> else
> {
> // TODO parse widthxheight
> int xchunk,ychunk;
> xchunk=ychunk=-1;
> char * pch = strstr (chunkAlgo,"x");
> if ( pch != 0 )
> {
> xchunk = atoi(chunkAlgo);
> ychunk = atoi(pch+1);
> printf("xchunk: %d ychunk: %d\n",xchunk,ychunk);
> }
> if ( xchunk>0 && ychunk>0 )
> {
> if ( xd != -1 ) chunks[xd] = xchunk;
> if ( yd != -1 ) chunks[yd] = ychunk;
> }
> else
> {
> fprintf(stderr, "ERROR parsing CDI_CHUNK_ALGO=%s\n",chunkAlgo);
> chunkAlgo = 0;
> }
> }
> if ( chunkAlgo!=0 && strcmp("auto", chunkAlgo) != 0 )
> {
> // TODO error checking - make sure that chunks<=size
> if ( CDI_Debug )
> fprintf(stderr, "chunks: %d %d %d %d\n",
> (int)chunks[0], (int)chunks[1], (int)chunks[2], (int)chunks[3]);
> if ( (retval = nc_def_var_chunking(fileID, ncvarid, 0, chunks)) )
> Error("nc_def_var_chunking failed, status = %d", retval);
> }
4416a4468,4476
>
> size_t chunks[4];
> if ( nc_inq_var_chunking(ncid, ncvarid, 0, chunks ) == NC_NOERR )
> {
> for ( int i=0; i<=4; i++ )
> ncvars[ncvarid].chunksize[i] = (int)chunks[i];
> for ( int i=ncvars[ncvarid].ndims; i<=4; i++ )
> ncvars[ncvarid].chunksize[i] = 0;
> }
5964a6025
> vlistDefVarChunksize(vlistID, varID, ncvars[ncvarid].chunksize);
diff -h -r -x '*.o' -x '*~' cdo-1.5.8-orig//libcdi/src/vlist.h cdo-1.5.8/libcdi/src/vlist.h
102a103
> int chunksize[4]; //chunking information
diff -h -r -x '*.o' -x '*~' cdo-1.5.8-orig//libcdi/src/vlist_var.c cdo-1.5.8/libcdi/src/vlist_var.c
55a56,57
> for ( int i=0; i<=4; i++ )
> vlistptr->vars[varID].chunksize[i] = 0;
1687a1690,1718
> void vlistDefVarChunksize(int vlistID, int varID, int* chunksize)
> {
> vlist_t *vlistptr;
>
> if ( reshGetStatus ( vlistID, &vlist_ops ) == CLOSED )
> {
> xwarning("%s", "Operation not executed.");
> return;
> }
>
> vlistptr = vlist_to_pointer(vlistID);
>
> vlistCheckVarID(__func__, vlistID, varID);
>
> for ( int i=0; i<=4; i++ )
> vlistptr->vars[varID].chunksize[i] = chunksize[i];
> }
>
> void vlistInqVarChunksize(int vlistID, int varID, int* chunksize)
> {
> vlist_t *vlistptr;
>
> vlistptr = vlist_to_pointer(vlistID);
>
> vlistCheckVarID(__func__, vlistID, varID);
>
> for ( int i=0; i<=4; i++ )
> chunksize[i] = vlistptr->vars[varID].chunksize[i];
> }
diff -h -r -x '*.o' -x '*~' cdo-1.5.8-orig//src/printinfo.h cdo-1.5.8/src/printinfo.h
383a384,412
>
> void printChunking(int streamID, int vlistID, int varID)
> {
> int filetype;
> filetype = streamInqFiletype(streamID);
>
> if ( filetype == FILETYPE_NC4 || filetype == FILETYPE_NC4C )
> {
> int ndims, nzaxis, taxisID, ntsteps;
> int chunksize[4] = {0,0,0,0};
>
> vlistInqVarChunksize(vlistID, varID, chunksize);
>
> // note: zaxis =1 even if there is no zaxis
> ndims = 2 + vlistNzaxis(vlistID) + vlistNtsteps(vlistID);
> /* printf(" ndims=%d nz=%d nt=%d ",ndims,vlistNzaxis(vlistID),vlistNtsteps(vlistID)); */
> if ( chunksize[0] != 0 )
> {
> printf("chunks: ");
> for( int i=ndims-1; i>0; i-- )
> {
> if ( chunksize[i] != 0 )
> printf("%d X ",chunksize[i]);
> }
> if ( chunksize[0] != 0 )
> printf("%d",chunksize[0]);
> }
> }
> }
diff -h -r -x '*.o' -x '*~' cdo-1.5.8-orig//src/Sinfo.c cdo-1.5.8/src/Sinfo.c
92c92
< "%6d : Institut Source Ttype Einfo Levels Num Gridsize Num Dtype : Parameter name\n", -(indf+1));
---
> "%6d : Institut Source Ttype Einfo Levels Num Gridsize Num Dtype : Parameter name : Extra\n", -(indf+1));
95c95
< "%6d : Institut Source Ttype Einfo Levels Num Gridsize Num Dtype : Table Code\n", -(indf+1));
---
> "%6d : Institut Source Ttype Einfo Levels Num Gridsize Num Dtype : Table Code : Extra\n", -(indf+1));
98c98
< "%6d : Institut Source Ttype Einfo Levels Num Gridsize Num Dtype : Parameter ID\n", -(indf+1));
---
> "%6d : Institut Source Ttype Einfo Levels Num Gridsize Num Dtype : Parameter ID : Extra\n", -(indf+1));
104c104
< "%6d : Institut Source Ttype Levels Num Gridsize Num Dtype : Parameter name\n", -(indf+1));
---
> "%6d : Institut Source Ttype Levels Num Gridsize Num Dtype : Parameter name : Extra\n", -(indf+1));
107c107
< "%6d : Institut Source Ttype Levels Num Gridsize Num Dtype : Table Code\n", -(indf+1));
---
> "%6d : Institut Source Ttype Levels Num Gridsize Num Dtype : Table Code : Extra\n", -(indf+1));
110c110
< "%6d : Institut Source Ttype Levels Num Gridsize Num Dtype : Parameter ID\n", -(indf+1));
---
> "%6d : Institut Source Ttype Levels Num Gridsize Num Dtype : Parameter ID : Extra\n", -(indf+1));
189c189
< fprintf(stdout, "%-11s", varname);
---
> fprintf(stdout, "%-15s", varname);
193c193,197
< fprintf(stdout, "%-11s", paramstr);
---
> fprintf(stdout, "%-15s", paramstr);
>
> /* extra (chunking) */
> fprintf(stdout, " ");
> printChunking(streamID, vlistID, varID);
    (1-1/1)