From 6215538105cef29b780b64366ab92f97d6b654a8 Mon Sep 17 00:00:00 2001
From: Simon Praetorius <simon.praetorius@tu-dresden.de>
Date: Mon, 24 Jun 2019 11:21:30 +0200
Subject: [PATCH] added vtksequencewriter

---
 src/amdis/CMakeLists.txt           |   1 +
 src/amdis/io/CMakeLists.txt        |   3 +
 src/amdis/io/VtkSequenceWriter.hpp | 137 +++++++++++++++++++++++++++++
 3 files changed, 141 insertions(+)
 create mode 100644 src/amdis/io/CMakeLists.txt
 create mode 100644 src/amdis/io/VtkSequenceWriter.hpp

diff --git a/src/amdis/CMakeLists.txt b/src/amdis/CMakeLists.txt
index 1237bbc9..261e70af 100644
--- a/src/amdis/CMakeLists.txt
+++ b/src/amdis/CMakeLists.txt
@@ -71,6 +71,7 @@ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/amdis)
 add_subdirectory("common")
 add_subdirectory("functions")
 add_subdirectory("gridfunctions")
+add_subdirectory("io")
 add_subdirectory("linearalgebra")
 add_subdirectory("localoperators")
 add_subdirectory("operations")
diff --git a/src/amdis/io/CMakeLists.txt b/src/amdis/io/CMakeLists.txt
new file mode 100644
index 00000000..09203370
--- /dev/null
+++ b/src/amdis/io/CMakeLists.txt
@@ -0,0 +1,3 @@
+install(FILES
+    VtkSequenceWriter.hpp
+DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/amdis/io)
diff --git a/src/amdis/io/VtkSequenceWriter.hpp b/src/amdis/io/VtkSequenceWriter.hpp
new file mode 100644
index 00000000..32a91e1e
--- /dev/null
+++ b/src/amdis/io/VtkSequenceWriter.hpp
@@ -0,0 +1,137 @@
+#pragma once
+
+#include <vector>
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include <iomanip>
+#include <memory>
+
+#include <dune/grid/io/file/vtk/common.hh>
+#include <dune/common/path.hh>
+
+#include <dune/grid/io/file/vtk/vtkwriter.hh>
+
+namespace AMDiS
+{
+  /// \brief class to write pvd-files which contains a list of all collected vtk-files
+  /**
+   * Write pvd-file suitable for easy visualization with
+   * <a href="http://www.vtk.org/">The Visualization Toolkit (VTK)</a>.
+   *
+   * \tparam GridView Grid view of the grid we are writing
+   */
+  template <class GridView>
+  class VTKSequenceWriter
+  {
+    using VTKWriter = Dune::VTKWriter<GridView>;
+
+  public:
+    /// \brief Set up the VTKSequenceWriter class
+    /**
+     * \param vtkWriter Writer object used to write the individual time step data files
+     */
+    VTKSequenceWriter(std::shared_ptr<VTKWriter> vtkWriter)
+      : vtkWriter_(std::move(vtkWriter))
+    {}
+
+    /// \brief Set up the VTKSequenceWriter class by creating a timestep writer of type \ref VTKWriter
+    /**
+     * \param gridView  GridView object passed to the constructor of the VTKWriter
+     * \param args...   Additional arguments forwarded to the VTKWriter constructor.
+     */
+    template <class... Args>
+    VTKSequenceWriter(GridView const& gridView, Args&&... args)
+      : VTKSequenceWriter<GridView>(std::make_shared<VTKWriter>(gridView, FWD(args)...))
+    {}
+
+
+    /// accessor for the underlying VTKWriter instance
+    std::shared_ptr<VTKWriter> const& vtkWriter() const
+    {
+      return vtkWriter_;
+    }
+
+    /// \brief Adds a field of cell data to the VTK file
+    template <class... Args>
+    void addCellData(Args&&... args)
+    {
+      vtkWriter_->addCellData(FWD(args)...);
+    }
+
+    /// \brief Adds a field of vertex data to the VTK file
+    template <class... Args>
+    void addVertexData (Args&&... args)
+    {
+      vtkWriter_->addVertexData(FWD(args)...);
+    }
+
+    /// \brief Writes VTK data for the given time,
+    /**
+     * \param time The time(step) for the data to be written.
+     * \param name The basename of the .pvd file (without file extension)
+     * \param type VTK output type.
+     */
+    virtual void write(double time, std::string const& name, Dune::VTK::OutputType type = Dune::VTK::ascii)
+    {
+      pwrite(time, name, ".", "", type);
+    }
+
+    /// \brief Writes VTK data for the given time,
+    /**
+     * \param time The time(step) for the data to be written.
+     * \param name The basename of the .pvd file (without file extension)
+     * \param path The directory where to put the .pvd file
+     * \param extendpath The (relative) subdirectory to path, where to put the timestep files
+     * \param type VTK output type.
+     */
+    virtual void pwrite(double time, std::string const& name, std::string const& path, std::string const& extendpath,
+                        Dune::VTK::OutputType type = Dune::VTK::ascii)
+    {
+      // remember current time step
+      unsigned int count = timesteps_.size();
+      timesteps_.push_back(time);
+
+      // write VTK file
+      vtkWriter_->pwrite(seqName(name, count), concatPaths(path, extendpath), "", type);
+
+      // write pvd file ... only on rank 0
+      if (Environment::mpiRank() == 0) {
+        std::ofstream pvdFile;
+        pvdFile.exceptions(std::ios_base::badbit | std::ios_base::failbit |
+                           std::ios_base::eofbit);
+        std::string pvdname = path + "/" + name + ".pvd";
+        pvdFile.open(pvdname.c_str());
+        pvdFile << "<?xml version=\"1.0\"?> \n"
+                << "<VTKFile type=\"Collection\" version=\"0.1\" byte_order=\"" << VTK::getEndiannessString() << "\"> \n"
+                << "<Collection> \n";
+        for (unsigned int i = 0; i <= count; ++i) {
+          std::string piecepath = concatPaths(path, extendpath);
+          std::string fullname = vtkWriter_->getParallelHeaderName(seqName(name,i), piecepath, Environment::mpiSize());
+          pvdFile << "<DataSet timestep=\"" << timesteps_[i]
+                  << "\" group=\"\" part=\"0\" name=\"\" file=\""
+                  << fullname << "\"/> \n";
+        }
+        pvdFile << "</Collection> \n"
+                << "</VTKFile> \n" << std::flush;
+        pvdFile.close();
+      }
+    }
+
+  private:
+    // create sequence name
+    std::string seqName(std::string const& name, unsigned int count) const
+    {
+      std::stringstream n;
+      n.fill('0');
+      n << name << "-" << std::setw(5) << count;
+      return n.str();
+    }
+
+  private:
+    std::shared_ptr<VTKWriter> vtkWriter_;
+    std::vector<double> timesteps_;
+  };
+
+} // end namespace AMDiS
+
-- 
GitLab