@@ -90,8 +90,7 @@ TEST_CASE( "parallel_multi_series_test", "[parallel]" )
90
90
allSeries.clear ();
91
91
}
92
92
93
- void write_test_zero_extent ( bool fileBased, std::string file_ending, bool writeAllChunks )
94
- {
93
+ void write_test_zero_extent ( bool fileBased, std::string file_ending, bool writeAllChunks, bool declareFromAll ) {
95
94
int mpi_s{-1 };
96
95
int mpi_r{-1 };
97
96
MPI_Comm_size (MPI_COMM_WORLD, &mpi_s);
@@ -110,45 +109,47 @@ void write_test_zero_extent( bool fileBased, std::string file_ending, bool write
110
109
Iteration it = o.iterations [step];
111
110
it.setAttribute (" yolo" , " yo" );
112
111
113
- ParticleSpecies e = it.particles [" e" ];
114
-
115
- /* every rank n writes n consecutive cells, increasing values
116
- * rank 0 does a zero-extent write
117
- * two ranks will result in {1}
118
- * three ranks will result in {1, 2, 3}
119
- * four ranks will result in {1, 2, 3, 4, 5, 6} */
120
- uint64_t num_cells = ((size - 1 ) * (size - 1 ) + (size - 1 )) / 2 ; /* (n^2 + n) / 2 */
121
- if (num_cells == 0u ) {
122
- std::cerr << " Test can only be run with at least two ranks" << std::endl;
123
- return ;
124
- }
125
-
126
- std::vector<double > position_global (num_cells);
127
- double pos{1 .};
128
- std::generate (position_global.begin (), position_global.end (), [&pos] { return pos++; });
129
- std::shared_ptr<double > position_local (new double [rank], [](double const *p) { delete[] p; });
130
- uint64_t offset;
131
- if (rank != 0 )
132
- offset = ((rank - 1 ) * (rank - 1 ) + (rank - 1 )) / 2 ;
133
- else
134
- offset = 0 ;
135
-
136
- e[" position" ][" x" ].resetDataset (Dataset (determineDatatype (position_local), {num_cells}));
137
-
138
- std::vector<uint64_t > positionOffset_global (num_cells);
139
- uint64_t posOff{1 };
140
- std::generate (positionOffset_global.begin (), positionOffset_global.end (), [&posOff] { return posOff++; });
141
- std::shared_ptr<uint64_t > positionOffset_local (new uint64_t [rank], [](uint64_t const *p) { delete[] p; });
142
-
143
- e[" positionOffset" ][" x" ].resetDataset (Dataset (determineDatatype (positionOffset_local), {num_cells}));
144
-
145
- for (uint64_t i = 0 ; i < rank; ++i) {
146
- position_local.get ()[i] = position_global[offset + i];
147
- positionOffset_local.get ()[i] = positionOffset_global[offset + i];
148
- }
149
- if (rank != 0 || writeAllChunks) {
150
- e[" position" ][" x" ].storeChunk (position_local, {offset}, {rank});
151
- e[" positionOffset" ][" x" ].storeChunk (positionOffset_local, {offset}, {rank});
112
+ if ( rank != 0 || declareFromAll ) {
113
+ ParticleSpecies e = it.particles [" e" ];
114
+
115
+ /* every rank n writes n consecutive cells, increasing values
116
+ * rank 0 does a zero-extent write
117
+ * two ranks will result in {1}
118
+ * three ranks will result in {1, 2, 3}
119
+ * four ranks will result in {1, 2, 3, 4, 5, 6} */
120
+ uint64_t num_cells = ((size - 1 ) * (size - 1 ) + (size - 1 )) / 2 ; /* (n^2 + n) / 2 */
121
+ if (num_cells == 0u ) {
122
+ std::cerr << " Test can only be run with at least two ranks" << std::endl;
123
+ return ;
124
+ }
125
+
126
+ std::vector<double > position_global (num_cells);
127
+ double pos{1 .};
128
+ std::generate (position_global.begin (), position_global.end (), [&pos] { return pos++; });
129
+ std::shared_ptr<double > position_local (new double [rank], [](double const *p) { delete[] p; });
130
+ uint64_t offset;
131
+ if (rank != 0 )
132
+ offset = ((rank - 1 ) * (rank - 1 ) + (rank - 1 )) / 2 ;
133
+ else
134
+ offset = 0 ;
135
+
136
+ e[" position" ][" x" ].resetDataset (Dataset (determineDatatype (position_local), {num_cells}));
137
+
138
+ std::vector<uint64_t > positionOffset_global (num_cells);
139
+ uint64_t posOff{1 };
140
+ std::generate (positionOffset_global.begin (), positionOffset_global.end (), [&posOff] { return posOff++; });
141
+ std::shared_ptr<uint64_t > positionOffset_local (new uint64_t [rank], [](uint64_t const *p) { delete[] p; });
142
+
143
+ e[" positionOffset" ][" x" ].resetDataset (Dataset (determineDatatype (positionOffset_local), {num_cells}));
144
+
145
+ for (uint64_t i = 0 ; i < rank; ++i) {
146
+ position_local.get ()[i] = position_global[offset + i];
147
+ positionOffset_local.get ()[i] = positionOffset_global[offset + i];
148
+ }
149
+ if (rank != 0 || writeAllChunks) {
150
+ e[" position" ][" x" ].storeChunk (position_local, {offset}, {rank});
151
+ e[" positionOffset" ][" x" ].storeChunk (positionOffset_local, {offset}, {rank});
152
+ }
152
153
}
153
154
o.flush ();
154
155
}
@@ -247,8 +248,8 @@ TEST_CASE( "hdf5_write_test", "[parallel][hdf5]" )
247
248
248
249
TEST_CASE ( " hdf5_write_test_zero_extent" , " [parallel][hdf5]" )
249
250
{
250
- write_test_zero_extent ( false , " h5" , true );
251
- write_test_zero_extent ( true , " h5" , true );
251
+ write_test_zero_extent ( false , " h5" , true , true );
252
+ write_test_zero_extent ( true , " h5" , true , true );
252
253
}
253
254
254
255
TEST_CASE ( " hdf5_write_test_skip_chunk" , " [parallel][hdf5]" )
@@ -257,8 +258,21 @@ TEST_CASE( "hdf5_write_test_skip_chunk", "[parallel][hdf5]" )
257
258
auto const hdf5_collective = auxiliary::getEnvString ( " OPENPMD_HDF5_INDEPENDENT" , " ON" );
258
259
if ( hdf5_collective == " ON" )
259
260
{
260
- write_test_zero_extent ( false , " h5" , false );
261
- write_test_zero_extent ( true , " h5" , false );
261
+ write_test_zero_extent ( false , " h5" , false , true );
262
+ write_test_zero_extent ( true , " h5" , false , true );
263
+ }
264
+ else
265
+ REQUIRE (true );
266
+ }
267
+
268
+ TEST_CASE ( " hdf5_write_test_skip_declare" , " [parallel][hdf5]" )
269
+ {
270
+ // ! @todo add via JSON option instead of environment read
271
+ auto const hdf5_collective = auxiliary::getEnvString ( " OPENPMD_HDF5_INDEPENDENT" , " OFF" );
272
+ if ( hdf5_collective == " ON" )
273
+ {
274
+ write_test_zero_extent ( false , " h5" , false , false );
275
+ write_test_zero_extent ( true , " h5" , false , false );
262
276
}
263
277
else
264
278
REQUIRE (true );
@@ -311,14 +325,20 @@ TEST_CASE( "adios_write_test", "[parallel][adios]" )
311
325
312
326
TEST_CASE ( " adios_write_test_zero_extent" , " [parallel][adios]" )
313
327
{
314
- write_test_zero_extent ( false , " bp" , true );
315
- write_test_zero_extent ( true , " bp" , true );
328
+ write_test_zero_extent ( false , " bp" , true , true );
329
+ write_test_zero_extent ( true , " bp" , true , true );
316
330
}
317
331
318
332
TEST_CASE ( " adios_write_test_skip_chunk" , " [parallel][adios]" )
319
333
{
320
- write_test_zero_extent ( false , " bp" , false );
321
- write_test_zero_extent ( true , " bp" , false );
334
+ write_test_zero_extent ( false , " bp" , false , true );
335
+ write_test_zero_extent ( true , " bp" , false , true );
336
+ }
337
+
338
+ TEST_CASE ( " adios_write_test_skip_declare" , " [parallel][adios]" )
339
+ {
340
+ write_test_zero_extent ( false , " bp" , false , false );
341
+ write_test_zero_extent ( true , " bp" , false , false );
322
342
}
323
343
324
344
TEST_CASE ( " hzdr_adios_sample_content_test" , " [parallel][adios1]" )
0 commit comments