<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; font-size: 14px; font-family: Calibri, sans-serif;">
<div>
<div style="color: rgb(0, 0, 0);">The following code is in filetype.c, function `NC_start_count_stride_ck`</div>
<div style="color: rgb(0, 0, 0);"><br>
</div>
<blockquote style="margin:0 0 0 40px; border:none; padding:0px;">
<div style="color: rgb(0, 0, 0);">    for (; i<varp->ndims; i++) {</div>
<div>        if (start[i] < 0 ||<font color="#ff0000"> start[i] >= varp->shape[i]</font>)</div>
<div style="color: rgb(0, 0, 0);">            DEBUG_RETURN_ERROR(NC_EINVALCOORDS)</div>
<div style="color: rgb(0, 0, 0);"><br>
</div>
<div style="color: rgb(0, 0, 0);">        if (varp->shape[i] < 0) DEBUG_RETURN_ERROR(NC_EEDGE)</div>
<div style="color: rgb(0, 0, 0);"><br>
</div>
<div style="color: rgb(0, 0, 0);">        if (count != NULL) {</div>
<div style="color: rgb(0, 0, 0);">            if (count[i] < 0) /* no negative count[] */</div>
<div style="color: rgb(0, 0, 0);">                DEBUG_RETURN_ERROR(NC_ENEGATIVECNT)</div>
<div style="color: rgb(0, 0, 0);"><br>
</div>
<div style="color: rgb(0, 0, 0);">            if (stride == NULL) { /* for vara APIs */</div>
<div style="color: rgb(0, 0, 0);">                if (count[i] > varp->shape[i] ||</div>
<div style="color: rgb(0, 0, 0);">                    start[i] + count[i] > varp->shape[i])</div>
<div style="color: rgb(0, 0, 0);">                    DEBUG_RETURN_ERROR(NC_EEDGE)</div>
<div style="color: rgb(0, 0, 0);">            }</div>
<div style="color: rgb(0, 0, 0);">            else { /* for vars APIs */</div>
<div style="color: rgb(0, 0, 0);">                if (count[i] > 0 &&</div>
<div style="color: rgb(0, 0, 0);">                    start[i] + (count[i]-1) * stride[i] >= varp->shape[i])</div>
<div style="color: rgb(0, 0, 0);">                    DEBUG_RETURN_ERROR(NC_EEDGE)</div>
<div style="color: rgb(0, 0, 0);">                if (stride[i] == 0) DEBUG_RETURN_ERROR(NC_ESTRIDE)</div>
<div style="color: rgb(0, 0, 0);">            }</div>
<div style="color: rgb(0, 0, 0);">        }</div>
<div style="color: rgb(0, 0, 0);">        /* else is for var1 APIs */</div>
<div style="color: rgb(0, 0, 0);"><br>
</div>
</blockquote>
<div style="color: rgb(0, 0, 0);">There is an issue when the process with the highest rank has zero items to output.  As an example, if I have 4 mpi processes which are each writing the following amount of data:</div>
<div style="color: rgb(0, 0, 0);"> * rank 0: 0 items</div>
<div style="color: rgb(0, 0, 0);"> * rank 1: 2548 items</div>
<div style="color: rgb(0, 0, 0);"> * rank 2: 4352 items</div>
<div style="color: rgb(0, 0, 0);"> * rank 3: 0 items.</div>
<div style="color: rgb(0, 0, 0);"><br>
</div>
<div style="color: rgb(0, 0, 0);">I will define the variable to have a length of 6900 items (0 + 2548 + 4352 + 0).  When I am outputting data to the variable, each rank will call nc_put_vara_longlong with the following start and count values:</div>
<div style="color: rgb(0, 0, 0);"> * rank 0: start = 0, count = 0</div>
<div style="color: rgb(0, 0, 0);"> * rank 1: start = 0, count = 2548</div>
<div style="color: rgb(0, 0, 0);"> * rank 2: start = 2548, count = 4352</div>
<div style="color: rgb(0, 0, 0);"> * rank 3: start = 6900, count = 0.</div>
<div style="color: rgb(0, 0, 0);"><br>
</div>
<div style="color: rgb(0, 0, 0);">In each case, the `start` for rank N is equal to `start` for rank N-1 + `count` for rank N-1.  This all works ok until the highest rank is writing 0 items.  In that case, the `start` value for that rank is equal to the total
 size of the variable and the check in the code fragment shown above fails since `start[i] == varp->shape[i]`.</div>
<div style="color: rgb(0, 0, 0);"><br>
</div>
<div style="color: rgb(0, 0, 0);">This could be fixed in the application code by checking whether the `count` is zero and if so, then set `start` to 0 also, but I think that is a kluge that should not be required. </div>
<div style="color: rgb(0, 0, 0);"><br>
</div>
<div style="color: rgb(0, 0, 0);">My suggestion is to make the test be:</div>
<div style="color: rgb(0, 0, 0);">```</div>
<div>  if (start[i] < 0 || (start[i] >= varp->shape[i] <font color="#ff0000">&& count[i] > 0</font><span style="color: rgb(0, 0, 0);">))</span></div>
<div style="color: rgb(0, 0, 0);">```</div>
<div style="color: rgb(0, 0, 0);">This is in version 1.7.0.  It also appears in 1.6.1 in the function Nccoordck.</div>
<div style="color: rgb(0, 0, 0);"><br>
</div>
<div style="color: rgb(0, 0, 0);">..Greg</div>
<div style="color: rgb(0, 0, 0);"><br>
</div>
</div>
<div style="color: rgb(0, 0, 0);">
<div id="MAC_OUTLOOK_SIGNATURE">
<div>-- </div>
<div>"A supercomputer is a device for turning compute-bound problems into I/O-bound problems”</div>
</div>
</div>
</body>
</html>