99#include " openPMD/auxiliary/Environment.hpp"
1010#include " openPMD/auxiliary/Filesystem.hpp"
1111#include " openPMD/auxiliary/Mpi.hpp"
12+ #include " openPMD/backend/PatchRecordComponent.hpp"
1213#include " openPMD/openPMD.hpp"
1314// @todo change includes
1415#include " openPMD/auxiliary/OneDimensionalBlockSlicer.hpp"
@@ -406,7 +407,7 @@ void available_chunks_test(std::string const &file_ending)
406407 MPI_Comm_size (MPI_COMM_WORLD, &r_mpi_size);
407408 unsigned mpi_rank{static_cast <unsigned >(r_mpi_rank)},
408409 mpi_size{static_cast <unsigned >(r_mpi_size)};
409- std::string name = " ../samples/available_chunks ." + file_ending;
410+ std::string name = " ../samples/parallel_available_chunks ." + file_ending;
410411
411412 /*
412413 * ADIOS2 assigns writerIDs to blocks in a BP file by id of the substream
@@ -419,7 +420,6 @@ void available_chunks_test(std::string const &file_ending)
419420 {
420421 "engine":
421422 {
422- "type": "bp4",
423423 "parameters":
424424 {
425425 "NumAggregators":)END"
@@ -440,6 +440,14 @@ void available_chunks_test(std::string const &file_ending)
440440 E_x.resetDataset ({Datatype::INT, {mpi_size, 4 }});
441441 E_x.storeChunk (data, {mpi_rank, 0 }, {1 , 4 });
442442
443+ /*
444+ * Verify that block decomposition also works in "local value" variable
445+ * shape. That shape instructs the data to participate in ADIOS2
446+ * metadata aggregation, hence there is only one "real" written block,
447+ * the aggregated one. We still need the original logical blocks to be
448+ * present in reading.
449+ */
450+
443451 auto electrons = it0.particles [" e" ].particlePatches ;
444452 auto numParticles = electrons[" numParticles" ];
445453 auto numParticlesOffset = electrons[" numParticlesOffset" ];
@@ -512,12 +520,40 @@ void available_chunks_test(std::string const &file_ending)
512520 {
513521 REQUIRE (ranks[i] == i);
514522 }
523+
524+ auto electrons = it0.particles [" e" ].particlePatches ;
525+ for (PatchRecordComponent *prc :
526+ {static_cast <PatchRecordComponent *>(&electrons[" numParticles" ]),
527+ static_cast <PatchRecordComponent *>(
528+ &electrons[" numParticlesOffset" ]),
529+ &electrons[" offset" ][" x" ],
530+ &electrons[" offset" ][" y" ],
531+ &electrons[" extent" ][" z" ],
532+ &electrons[" offset" ][" x" ],
533+ &electrons[" extent" ][" y" ],
534+ &electrons[" extent" ][" z" ]})
535+ {
536+ auto available_chunks = prc->availableChunks ();
537+ REQUIRE (size_t (r_mpi_size) == available_chunks.size ());
538+ for (size_t i = 0 ; i < available_chunks.size (); ++i)
539+ {
540+ auto const &chunk = available_chunks[i];
541+ REQUIRE (chunk.extent == Extent{1 });
542+ REQUIRE (chunk.offset == Offset{i});
543+ REQUIRE (chunk.sourceID == i);
544+ }
545+ }
515546 }
516547}
517548
518549TEST_CASE (" available_chunks_test" , " [parallel][adios]" )
519550{
551+ #if HAS_ADIOS_2_9
552+ available_chunks_test (" bp4" );
553+ available_chunks_test (" bp5" );
554+ #else
520555 available_chunks_test (" bp" );
556+ #endif
521557}
522558#endif
523559
0 commit comments