Fixing bug with netcdf writer
This commit is contained in:
parent
f0aa2724bc
commit
a00979dd4d
@ -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 );
|
||||
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 );
|
||||
}
|
||||
|
||||
|
@ -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 );
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user