diff --git a/IO/netcdf.cpp b/IO/netcdf.cpp index a49042a6..c6952058 100644 --- a/IO/netcdf.cpp +++ b/IO/netcdf.cpp @@ -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 defDim( int fid, const std::vector& names, const s return dimid; } template -int nc_put_vars_TYPE( int, int, const size_t*, const size_t*, const ptrdiff_t*, const TYPE* ); -template<> -int nc_put_vars_TYPE( 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 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( 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( 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 void write( int fid, const std::string& var, const std::vector& dimids, - const Array& data, const std::vector& start, - const std::vector& count, const std::vector& stride ) + const Array& 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& 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( fid, varid, start.data(), count.data(), (const ptrdiff_t*) stride.data(), x.data() ); + std::vector count = data.size(); + std::vector 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( int fid, const std::string& var, const std::vector& dimids, - const Array& data, const std::vector& start, - const std::vector& count, const std::vector& stride ); -template void write( int fid, const std::string& var, const std::vector& dimids, - const Array& data, const std::vector& start, - const std::vector& count, const std::vector& stride ); -template void write( int fid, const std::string& var, const std::vector& dimids, - const Array& data, const std::vector& start, - const std::vector& count, const std::vector& stride ); -template void write( int fid, const std::string& var, const std::vector& dimids, - const Array& data, const std::vector& start, - const std::vector& count, const std::vector& stride ); +template void write( int fid, const std::string& var, const std::vector& dimids, const Array& data, const RankInfoStruct& info ); +template void write( int fid, const std::string& var, const std::vector& dimids, const Array& data, const RankInfoStruct& info ); +template void write( int fid, const std::string& var, const std::vector& dimids, const Array& data, const RankInfoStruct& info ); +template void write( int fid, const std::string& var, const std::vector& dimids, const Array& data, const RankInfoStruct& info ); diff --git a/IO/netcdf.h b/IO/netcdf.h index 6bf38f36..657747bf 100644 --- a/IO/netcdf.h +++ b/IO/netcdf.h @@ -6,6 +6,7 @@ #include "common/Array.h" #include "common/MPI_Helpers.h" +#include "common/Communication.h" @@ -133,8 +134,7 @@ std::vector defDim( int fid, const std::vector& names, const s * @param fid Handle to the open file */ template -void write( int fid, const std::string& var, const std::vector& dimids, const Array& data, - const std::vector& start, const std::vector& count, const std::vector& stride ); +void write( int fid, const std::string& var, const std::vector& dimids, const Array& data, const RankInfoStruct& rank_info ); }; // netcdf namespace diff --git a/tests/TestNetcdf.cpp b/tests/TestNetcdf.cpp index 65d2255c..fe438e78 100644 --- a/tests/TestNetcdf.cpp +++ b/tests/TestNetcdf.cpp @@ -21,15 +21,15 @@ void test_NETCDF( UnitTest& ut ) RankInfoStruct info( rank, nprocx, nprocy, nprocz ); Array data( 4, 5, 6 ); for (size_t i=0; i dim = { 4*nprocx, 5*nprocy, 6*nprocz }; + std::vector 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 diff --git a/tests/lbpm_uCT_maskfilter.cpp b/tests/lbpm_uCT_maskfilter.cpp index 90306bf9..f5e857b6 100644 --- a/tests/lbpm_uCT_maskfilter.cpp +++ b/tests/lbpm_uCT_maskfilter.cpp @@ -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 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 ); } diff --git a/tests/lbpm_uCT_pp.cpp b/tests/lbpm_uCT_pp.cpp index ad0ecd61..29a04339 100644 --- a/tests/lbpm_uCT_pp.cpp +++ b/tests/lbpm_uCT_pp.cpp @@ -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 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 data(Nx[0],Ny[0],Nz[0]); + fillFloat[0]->copy( Dist[0], data ); + netcdf::write( fid, "Distance", dims, data, info ); netcdf::close( fid ); }