<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>
<div>
<div style="color: rgb(0, 0, 0);">While looking through the parallel-netcdf-1.7.0 tests, I stumbled across the press_temp_wr.c file.  I think the logic in this file is failed.</div>
<div style="color: rgb(0, 0, 0);"><br>
</div>
<ul style="color: rgb(0, 0, 0);">
<li>Each processor has the exact same view of the 3D pressure and temperature data.  This is OK for a test.</li><li>The code below is used for each processor to write out a portion of the pressure and temperature data to the file:</li></ul>
<blockquote style="color: rgb(0, 0, 0); margin: 0px 0px 0px 40px; border: none; padding: 0px;">
<blockquote style="margin:0 0 0 40px; border:none; padding:0px;">
<div>   /* These settings tell netcdf to write one timestep of data. (The</div>
<div>     setting of start[0] inside the loop below tells netCDF which</div>
<div>                    &data[0][0][0]);</div>
<div>     timestep to write.) */</div>
<div>   count[0] = 1;</div>
<div>   count[1] = NLVL/nprocs;</div>
<div>   count[2] = NLAT;</div>
<div>   count[3] = NLON;</div>
<div>   start[1] = 0;</div>
<div>   start[2] = 0;</div>
<div>   start[3] = 0;</div>
<div><br>
</div>
<div>   /* Write the pretend data. This will write our surface pressure and</div>
<div>      surface temperature data. The arrays only hold one timestep worth</div>
<div>      of data. We will just rewrite the same data for each timestep. In</div>
<div>      a real application, the data would change between timesteps. */</div>
<div><br>
</div>
<div>   for (rec = 0; rec < NREC; rec++)</div>
<div>   {</div>
<div>      start[0] = rec;</div>
<div>      err = ncmpi_put_vara_float_all(ncid, pres_varid, start, count, &pres_out[0]][0][0]);</div>
<div>      CHECK_ERR</div>
<div>      err = ncmpi_put_vara_float_all(ncid, temp_varid, start, count, &temp_out[0][0][0]);</div>
<div>      CHECK_ERR</div>
<div>   }</div>
</blockquote>
</blockquote>
<ul style="color: rgb(0, 0, 0);">
<li>I think that the start[1] value and the first dimension of the pres_out and temp_out array in the calls to ncmpi_put_vara_float are incorrect.  With these values, only 1/nprocs portion of the array is written and the remainder is zero-filled.  
<ul>
<li>This is verified by running press_temp_wr on 1, 2, and 4 processors and doing an ncdump of the file.</li><li>All runs should give the same file, but they don’t.</li></ul>
</li><li>I think that the correct code should be something similar to:</li></ul>
<div>
<blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;">
<blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;">
<div style="color: rgb(0, 0, 0);">   /* These settings tell netcdf to write one timestep of data. (The</div>
<div style="color: rgb(0, 0, 0);">     setting of start[0] inside the loop below tells netCDF which</div>
<div style="color: rgb(0, 0, 0);">                    &data[0][0][0]);</div>
<div style="color: rgb(0, 0, 0);">     timestep to write.) */</div>
<div style="color: rgb(0, 0, 0);">   count[0] = 1;</div>
<div style="color: rgb(0, 0, 0);">   count[1] = NLVL/nprocs;</div>
<div style="color: rgb(0, 0, 0);">   count[2] = NLAT;</div>
<div style="color: rgb(0, 0, 0);">   count[3] = NLON;</div>
<div>   start[1] = <font color="#ff0000">rank*(NLVL/nprocs)</font>;</div>
<div style="color: rgb(0, 0, 0);">   start[2] = 0;</div>
<div style="color: rgb(0, 0, 0);">   start[3] = 0;</div>
<div style="color: rgb(0, 0, 0);"><br>
</div>
<div style="color: rgb(0, 0, 0);">   /* Write the pretend data. This will write our surface pressure and</div>
<div style="color: rgb(0, 0, 0);">      surface temperature data. The arrays only hold one timestep worth</div>
<div style="color: rgb(0, 0, 0);">      of data. We will just rewrite the same data for each timestep. In</div>
<div style="color: rgb(0, 0, 0);">      a real application, the data would change between timesteps. */</div>
<div style="color: rgb(0, 0, 0);"><br>
</div>
<div style="color: rgb(0, 0, 0);">   for (rec = 0; rec < NREC; rec++)</div>
<div style="color: rgb(0, 0, 0);">   {</div>
<div style="color: rgb(0, 0, 0);">      start[0] = rec;</div>
<div><span style="color: rgb(0, 0, 0);">      err = ncmpi_put_vara_float_all(ncid, pres_varid, start, count, &pres_out[</span><font color="#ff0000">start[1</font>]][0][0]);</div>
<div style="color: rgb(0, 0, 0);">      CHECK_ERR</div>
<div><span style="color: rgb(0, 0, 0);">      err = ncmpi_put_vara_float_all(ncid, temp_varid, start, count, &temp_out[</span><font color="#ff0000">start[1</font>]][0][0]);</div>
<div style="color: rgb(0, 0, 0);">      CHECK_ERR</div>
<div style="color: rgb(0, 0, 0);">   }</div>
</blockquote>
</blockquote>
<div style="color: rgb(0, 0, 0);"><br>
</div>
</div>
</div>
<ul>
<li>With these changes, the exact same file is written for 1, 2, and 4 processors.</li><li>Similar changes are needed for the press_temp_rd.c </li><li>Note that a “real” application would probably not replicate the pres_out and temp_out arrays on all processes and instead each process would have its own portion of the array; however, for this test in which the arrays are replicated on all processors,
 I think the changes shown above are needed to give correct results.</li></ul>
<div>..Greg</div>
<div><br>
</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>
</div>
</div>
</body>
</html>