Commit 62155381 authored by Praetorius, Simon's avatar Praetorius, Simon
Browse files

added vtksequencewriter

parent be2c0161
......@@ -71,6 +71,7 @@ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/amdis)
#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="">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>;
/// \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)
/// \brief Adds a field of vertex data to the VTK file
template <class... Args>
void addVertexData (Args&&... 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();
// 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::string pvdname = path + "/" + name + ".pvd";;
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;
// create sequence name
std::string seqName(std::string const& name, unsigned int count) const
std::stringstream n;
n << name << "-" << std::setw(5) << count;
return n.str();
std::shared_ptr<VTKWriter> vtkWriter_;
std::vector<double> timesteps_;
} // end namespace AMDiS
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment