diff --git a/dune/vtk/datacollectors/yaspdatacollector.hh b/dune/vtk/datacollectors/yaspdatacollector.hh index 6d562accd46a9f46d2e3db84259968f6e671ecac..7130dc52e482e8ca520de2c452de3630bae06015 100644 --- a/dune/vtk/datacollectors/yaspdatacollector.hh +++ b/dune/vtk/datacollectors/yaspdatacollector.hh @@ -23,7 +23,7 @@ public: , wholeExtent_(filledArray<6,int>(0)) , origin_(0.0) , spacing_(0.0) - , level_(gridView.template begin<0,Interior_Partition>()->level()) + , level_(gridView.template begin<0,All_Partition>()->level()) {} std::array<int, 6> const& wholeExtentImpl () const @@ -44,6 +44,7 @@ public: void updateImpl () { Super::updateImpl(); + localPieceCalled_ = false; for (int i = 0; i < dim; ++i) { wholeExtent_[2*i] = 0; @@ -52,6 +53,20 @@ public: auto it = gridView_.grid().begin(level_); initGeometry(it->coords); + +#if HAVE_MPI + int rank = -1; + int num_ranks = -1; + MPI_Comm_rank(gridView_.comm(), &rank); + MPI_Comm_size(gridView_.comm(), &num_ranks); + + if (rank == 0) { + extents_.resize(num_ranks); + requests_.resize(num_ranks); + for (int i = 1; i < num_ranks; ++i) + MPI_Irecv(extents_[i].data(), extents_[i].size(), MPI_INT, i, /*tag=*/6, gridView_.comm(), &requests_[i]); + } +#endif } template <class Coords> @@ -92,25 +107,38 @@ public: extent[2*i] = gc.min(i); extent[2*i+1] = gc.max(i)+1; } + +#if HAVE_MPI + if (!localPieceCalled_) { + int rank = -1; + MPI_Comm_rank(gridView_.comm(), &rank); + if (rank != 0) { + MPI_Isend(extent.data(), extent.size(), MPI_INT, 0, /*tag=*/6, gridView_.comm(), &sendRequest_); + } else { + extents_[0] = extent; + } + localPieceCalled_ = true; + } +#endif + writer(extent); } template <class Writer> void writePiecesImpl (Writer const& writer) const { - auto extent = filledArray<6,int>(0); - // for (auto const& part : gridView_.gridLevel().template partition<InteriorEntity>()) - // { - // for (int i = 0; i < dim; ++i) { - // extent[2*i] = part.begin()[i]; - // extent[2*i+1] = part.end()[i]-1; - // } - + assert(localPieceCalled_); +#if HAVE_MPI int num_ranks = -1; - MPI_Comm_size(MPI_COMM_WORLD, &num_ranks); + MPI_Comm_size(gridView_.comm(), &num_ranks); + + std::vector<MPI_Status> status(num_ranks-1); + MPI_Waitall(num_ranks-1, requests_.data()+1, status.data()); + for (int p = 0; p < num_ranks; ++p) { - writer(p, extent, false); + writer(p, extents_[p], true); } +#endif } template <class T> @@ -142,6 +170,11 @@ private: FieldVector<ctype,3> origin_; std::vector<std::size_t> indexMap_; int level_; + + mutable std::vector<std::array<int,6>> extents_; + mutable std::vector<MPI_Request> requests_; + mutable MPI_Request sendRequest_; + mutable bool localPieceCalled_ = false; }; namespace Impl diff --git a/dune/vtk/writers/vtkwriterinterface.impl.hh b/dune/vtk/writers/vtkwriterinterface.impl.hh index 02a4d268b2875fc3822e84f4e116a73eeccc888d..dc16992960399f31da60ee4b696c94a2f63d23dd 100644 --- a/dune/vtk/writers/vtkwriterinterface.impl.hh +++ b/dune/vtk/writers/vtkwriterinterface.impl.hh @@ -51,12 +51,14 @@ void VtkWriterInterface<GV,DC> if (num_ranks > 1) { filename = p.string() + "_p" + std::to_string(rank) + "." + fileExtension(); + writeSerialFile(filename); if (rank == 0) { writeParallelFile(p.string(), num_ranks); } + } else { + writeSerialFile(filename); } #endif - writeSerialFile(filename); } diff --git a/src/test/mixed_element_test.cc b/src/test/mixed_element_test.cc index 56e1104021367d230da06f41970a0a7fe18e679c..8293398ff4c542fb4efa7e2885c8fbfb348eb8e5 100644 --- a/src/test/mixed_element_test.cc +++ b/src/test/mixed_element_test.cc @@ -18,7 +18,7 @@ #include <dune/grid/utility/structuredgridfactory.hh> #include <dune/vtk/vtkreader.hh> -#include <dune/vtk/vtkunstructuredgridwriter.hh> +#include <dune/vtk/writers/vtkunstructuredgridwriter.hh> using namespace Dune; using namespace Dune::experimental; diff --git a/src/test/reader_writer_test.cc b/src/test/reader_writer_test.cc index 3122a5d02c680533863b1b1fdc4b6ea8eb66847c..0bb509e2487ff363fff15193f200feda6ecb3bad 100644 --- a/src/test/reader_writer_test.cc +++ b/src/test/reader_writer_test.cc @@ -18,7 +18,7 @@ #include <dune/grid/utility/structuredgridfactory.hh> #include <dune/vtk/vtkreader.hh> -#include <dune/vtk/vtkunstructuredgridwriter.hh> +#include <dune/vtk/writers/vtkunstructuredgridwriter.hh> using namespace Dune; using namespace Dune::experimental;