Fixing bug with netcdf writer

This commit is contained in:
Mark Berrill 2016-06-28 16:00:30 -04:00
parent f0aa2724bc
commit a00979dd4d
5 changed files with 20 additions and 53 deletions

View File

@ -140,7 +140,7 @@ int open( const std::string& filename, FileMode mode, MPI_Comm comm )
int err = nc_open_par( filename.c_str(), NC_WRITE|NC_MPIPOSIX, comm, MPI_INFO_NULL, &fid );
CHECK_NC_ERR( err );
} else if ( mode == CREATE ) {
int err = nc_create_par( filename.c_str(), NC_MPIPOSIX, comm, MPI_INFO_NULL, &fid );
int err = nc_create_par( filename.c_str(), NC_NETCDF4|NC_MPIIO, comm, MPI_INFO_NULL, &fid );
CHECK_NC_ERR( err );
} else {
ERROR("Unknown file mode");
@ -436,31 +436,8 @@ std::vector<int> defDim( int fid, const std::vector<std::string>& names, const s
return dimid;
}
template<class TYPE>
int nc_put_vars_TYPE( int, int, const size_t*, const size_t*, const ptrdiff_t*, const TYPE* );
template<>
int nc_put_vars_TYPE<short>( int fid, int varid, const size_t* start, const size_t* count, const ptrdiff_t* stride, const short* data )
{
return nc_put_vars_short( fid, varid, start, count, stride, data );
}
template<>
int nc_put_vars_TYPE<int>( int fid, int varid, const size_t* start, const size_t* count, const ptrdiff_t* stride, const int* data )
{
return nc_put_vars_int( fid, varid, start, count, stride, data );
}
template<>
int nc_put_vars_TYPE<float>( int fid, int varid, const size_t* start, const size_t* count, const ptrdiff_t* stride, const float* data )
{
return nc_put_vars_float( fid, varid, start, count, stride, data );
}
template<>
int nc_put_vars_TYPE<double>( int fid, int varid, const size_t* start, const size_t* count, const ptrdiff_t* stride, const double* data )
{
return nc_put_vars_double( fid, varid, start, count, stride, data );
}
template<class TYPE>
void write( int fid, const std::string& var, const std::vector<int>& dimids,
const Array<TYPE>& data, const std::vector<size_t>& start,
const std::vector<size_t>& count, const std::vector<size_t>& stride )
const Array<TYPE>& data, const RankInfoStruct& info )
{
// Define the variable
int varid = 0;
@ -470,24 +447,18 @@ void write( int fid, const std::string& var, const std::vector<int>& dimids,
err = nc_enddef( fid );
CHECK_NC_ERR( err );
// set the access method to use MPI/PnetCDF collective I/O
err = nc_var_par_access( fid, varid, NC_COLLECTIVE );
err = nc_var_par_access( fid, varid, NC_INDEPENDENT );
CHECK_NC_ERR( err );
// parallel write: each process writes its subarray to the file
auto x = data.reverseDim();
nc_put_vars_TYPE<TYPE>( fid, varid, start.data(), count.data(), (const ptrdiff_t*) stride.data(), x.data() );
std::vector<size_t> count = data.size();
std::vector<size_t> start = { info.ix*data.size(0), info.jy*data.size(1), info.kz*data.size(2) };
nc_put_vara( fid, varid, start.data(), count.data(), x.data() );
}
template void write<short>( int fid, const std::string& var, const std::vector<int>& dimids,
const Array<short>& data, const std::vector<size_t>& start,
const std::vector<size_t>& count, const std::vector<size_t>& stride );
template void write<int>( int fid, const std::string& var, const std::vector<int>& dimids,
const Array<int>& data, const std::vector<size_t>& start,
const std::vector<size_t>& count, const std::vector<size_t>& stride );
template void write<float>( int fid, const std::string& var, const std::vector<int>& dimids,
const Array<float>& data, const std::vector<size_t>& start,
const std::vector<size_t>& count, const std::vector<size_t>& stride );
template void write<double>( int fid, const std::string& var, const std::vector<int>& dimids,
const Array<double>& data, const std::vector<size_t>& start,
const std::vector<size_t>& count, const std::vector<size_t>& stride );
template void write<short>( int fid, const std::string& var, const std::vector<int>& dimids, const Array<short>& data, const RankInfoStruct& info );
template void write<int>( int fid, const std::string& var, const std::vector<int>& dimids, const Array<int>& data, const RankInfoStruct& info );
template void write<float>( int fid, const std::string& var, const std::vector<int>& dimids, const Array<float>& data, const RankInfoStruct& info );
template void write<double>( int fid, const std::string& var, const std::vector<int>& dimids, const Array<double>& data, const RankInfoStruct& info );

View File

@ -6,6 +6,7 @@
#include "common/Array.h"
#include "common/MPI_Helpers.h"
#include "common/Communication.h"
@ -133,8 +134,7 @@ std::vector<int> defDim( int fid, const std::vector<std::string>& names, const s
* @param fid Handle to the open file
*/
template<class TYPE>
void write( int fid, const std::string& var, const std::vector<int>& dimids, const Array<TYPE>& data,
const std::vector<size_t>& start, const std::vector<size_t>& count, const std::vector<size_t>& stride );
void write( int fid, const std::string& var, const std::vector<int>& dimids, const Array<TYPE>& data, const RankInfoStruct& rank_info );
}; // netcdf namespace

View File

@ -21,15 +21,15 @@ void test_NETCDF( UnitTest& ut )
RankInfoStruct info( rank, nprocx, nprocy, nprocz );
Array<float> data( 4, 5, 6 );
for (size_t i=0; i<data.length(); i++)
data(i) = i;
data(i) = 120*rank + i;
size_t x = info.ix*data.size(0);
size_t y = info.jy*data.size(1);
size_t z = info.kz*data.size(2);
const char* filename = "test.nc";
std::vector<int> dim = { 4*nprocx, 5*nprocy, 6*nprocz };
std::vector<int> dim = { data.size(0)*nprocx, data.size(1)*nprocy, data.size(2)*nprocz };
int fid = netcdf::open( filename, netcdf::CREATE, MPI_COMM_WORLD );
auto dims = netcdf::defDim( fid, {"X", "Y", "Z"}, dim );
netcdf::write( fid, "tmp", dims, data, {x,y,z}, data.size(), {1,1,1} );
netcdf::write( fid, "tmp", dims, data, info );
netcdf::close( fid );
MPI_Barrier( MPI_COMM_WORLD );
// Read the contents of the file we created

View File

@ -134,7 +134,7 @@ int main(int argc, char **argv)
printf(" dims = %i x %i x %i \n",int(dim[0]),int(dim[1]),int(dim[2]));
}
{
RankInfoStruct info( rank, nprocx, nprocy, nprocz );
RankInfoStruct info( rank, nprocx, nprocy, nprocz );
size_t x = info.ix*nx;
size_t y = info.jy*ny;
size_t z = info.kz*nz;
@ -301,13 +301,10 @@ int main(int argc, char **argv)
const char* netcdf_filename = "Distance.nc";
{
RankInfoStruct info( rank, nprocx, nprocy, nprocz );
size_t x = info.ix*nx;
size_t y = info.jy*ny;
size_t z = info.kz*nz;
std::vector<int> dim = { Nx[0]*nprocx, Ny[0]*nprocy, Nz[0]*nprocz };
int fid = netcdf::open( netcdf_filename, netcdf::CREATE, MPI_COMM_WORLD );
auto dims = netcdf::defDim( fid, {"X", "Y", "Z"}, dim );
netcdf::write( fid, "Distance", dims, Dist[0], {x,y,z}, Dist[0].size(), {1,1,1} );
netcdf::write( fid, "Distance", dims, Dist[0], info );
netcdf::close( fid );
}

View File

@ -271,13 +271,12 @@ int main(int argc, char **argv)
const char* netcdf_filename = "Distance.nc";
{
RankInfoStruct info( rank, nprocx, nprocy, nprocz );
size_t x = info.ix*nx;
size_t y = info.jy*ny;
size_t z = info.kz*nz;
std::vector<int> dim = { Nx[0]*nprocx, Ny[0]*nprocy, Nz[0]*nprocz };
int fid = netcdf::open( netcdf_filename, netcdf::CREATE, MPI_COMM_WORLD );
auto dims = netcdf::defDim( fid, {"X", "Y", "Z"}, dim );
netcdf::write( fid, "Distance", dims, Dist[0], {x,y,z}, Dist[0].size(), {1,1,1} );
Array<float> data(Nx[0],Ny[0],Nz[0]);
fillFloat[0]->copy( Dist[0], data );
netcdf::write( fid, "Distance", dims, data, info );
netcdf::close( fid );
}