6#ifndef DUNE_GRID_IO_FILE_VTK_BASICWRITER_HH
7#define DUNE_GRID_IO_FILE_VTK_BASICWRITER_HH
17#include <dune/common/parallel/mpiguard.hh>
18#include <dune/common/path.hh>
20#include <dune/geometry/referenceelements.hh>
34 template<
typename IteratorFactory>
36 typedef typename IteratorFactory::CellIterator CellIterator;
37 typedef typename IteratorFactory::CornerIterator CornerIterator;
38 typedef typename IteratorFactory::PointIterator PointIterator;
40 typedef typename IteratorFactory::Cell Cell;
46 typedef std::list<std::shared_ptr<FunctionWriter> > WriterList;
47 typedef typename WriterList::const_iterator WIterator;
49 typedef typename Cell::Geometry::ctype ctype;
50 static const unsigned celldim = Cell::mydimension;
51 typedef ReferenceElements<ctype, celldim> Refelems;
53 static const FileType fileType = celldim == 1
56 const IteratorFactory& factory;
62 typename IteratorFactory::ConnectivityWriter connectivity;
68 : factory(factory_), connectivity(factory.makeConnectivity())
76 void addCellData(
const std::shared_ptr<FunctionWriter>& writer) {
77 cellData.push_back(writer);
81 pointData.push_back(writer);
97 unsigned ncells)
const
99 if(functionWriter.
beginWrite(vtuWriter, ncells)) {
100 const CellIterator& cellend = factory.endCells();
101 for(CellIterator cellit = factory.beginCells(); cellit != cellend;
103 functionWriter.
write(*cellit, Refelems::general(cellit->type()).
111 unsigned npoints)
const
113 if(functionWriter.
beginWrite(vtuWriter, npoints)) {
114 const PointIterator& pend = factory.endPoints();
115 for(PointIterator pit = factory.beginPoints(); pit != pend; ++pit)
116 functionWriter.
write(pit->cell(), pit->duneIndex());
123 unsigned ncorners)
const
125 if(functionWriter.
beginWrite(vtuWriter, ncorners)) {
126 const CornerIterator& cend = factory.endCorners();
127 for(CornerIterator cit = factory.beginCorners(); cit != cend; ++cit)
128 functionWriter.
write(cit->cell(), cit->duneIndex());
139 const WIterator& wend = data.end();
140 for(WIterator wit = data.begin(); wit != wend; ++wit)
141 if((*wit)->ncomps() == 1)
142 return (*wit)->name();
147 const WIterator& wend = data.end();
148 for(WIterator wit = data.begin(); wit != wend; ++wit)
149 if((*wit)->ncomps() == 3)
150 return (*wit)->name();
155 if(cellData.empty())
return;
159 const WIterator& wend = cellData.end();
160 for(WIterator wit = cellData.begin(); wit != wend; ++wit)
166 if(pointData.empty())
return;
170 const WIterator& wend = pointData.end();
171 for(WIterator wit = pointData.begin(); wit != wend; ++wit)
194 writeGrid(vtuWriter, ncells, npoints, ncorners);
199 std::ofstream stream;
200 stream.exceptions(std::ios_base::badbit | std::ios_base::failbit |
201 std::ios_base::eofbit);
202 stream.open(filename.c_str(), std::ios::binary);
204 VTUWriter vtuWriter(stream, outputType, fileType);
206 unsigned ncells = std::distance(factory.beginCells(),
208 unsigned npoints = std::distance(factory.beginPoints(),
209 factory.endPoints());
210 unsigned ncorners = std::distance(factory.beginCorners(),
211 factory.endCorners());
214 writeAll(vtuWriter, ncells, npoints, ncorners);
218 writeAll(vtuWriter, ncells, npoints, ncorners);
241 const std::string& piecename,
242 const std::string& piecepath)
244 std::ofstream stream;
245 stream.exceptions(std::ios_base::badbit | std::ios_base::failbit |
246 std::ios_base::eofbit);
247 stream.open(name.c_str(), std::ios::binary);
256 for(WIterator it=pointData.begin(); it!=pointData.end(); ++it)
257 (*it)->addArray(writer);
263 for(WIterator it=cellData.begin(); it!=cellData.end(); ++it)
264 (*it)->addArray(writer);
273 for(
int i = 0; i < factory.comm().size(); ++i )
296 const std::string& path,
int rank)
const
298 std::ostringstream s;
299 if(path.size() > 0) {
301 if(path[path.size()-1] !=
'/')
304 s <<
's' << std::setw(4) << std::setfill(
'0') << factory.comm().size()
306 s <<
'p' << std::setw(4) << std::setfill(
'0') << rank <<
':';
326 const std::string& path)
const
328 std::ostringstream s;
329 if(path.size() > 0) {
331 if(path[path.size()-1] !=
'/')
334 s <<
's' << std::setw(4) << std::setfill(
'0') << factory.comm().size()
338 case polyData : s <<
".pvtp";
break;
358 const std::string& path)
const
361 case polyData :
return concatPaths(path, name+
".vtp");
364 return concatPaths(path, name);
395 std::string
pwrite(
const std::string& name,
const std::string& path,
396 const std::string& extendpath,
OutputType outputType)
398 MPIGuard guard(factory.comm());
403 file.exceptions(std::ios_base::badbit | std::ios_base::failbit |
404 std::ios_base::eofbit);
405 std::string piecepath = concatPaths(path, extendpath);
406 std::string relpiecepath = relativePath(path, piecepath);
410 factory.comm().rank());
415 if(factory.comm().rank() == 0)
440 if(factory.comm().size() > 1)
441 return pwrite(name,
"",
"", outputType);
Common stuff for the VTKWriter.
Include standard header files.
Definition: agrid.hh:60
OutputType
How the bulk data should be stored in the file.
Definition: common.hh:43
FileType
which type of VTK file to write
Definition: common.hh:252
@ polyData
for .vtp files (PolyData)
Definition: common.hh:254
@ unstructuredGrid
for .vtu files (UnstructuredGrid)
Definition: common.hh:256
Definition: basicwriter.hh:35
void writeCellData(VTUWriter &vtuWriter, unsigned ncells) const
Definition: basicwriter.hh:154
BasicWriter(const IteratorFactory &factory_)
Definition: basicwriter.hh:67
std::string getSerialPieceName(const std::string &name, const std::string &path) const
return name of a serial piece file
Definition: basicwriter.hh:357
void writeCollection(const std::string name, const std::string &piecename, const std::string &piecepath)
write header file in parallel case to stream
Definition: basicwriter.hh:240
void writeGrid(VTUWriter &vtuWriter, unsigned ncells, unsigned npoints, unsigned ncorners)
Definition: basicwriter.hh:176
void writeAll(VTUWriter &vtuWriter, unsigned ncells, unsigned npoints, unsigned ncorners)
Definition: basicwriter.hh:190
std::string pwrite(const std::string &name, const std::string &path, const std::string &extendpath, OutputType outputType)
write output; interface might change later
Definition: basicwriter.hh:395
void clear()
Definition: basicwriter.hh:84
void writeCellFunction(VTUWriter &vtuWriter, FunctionWriter &functionWriter, unsigned ncells) const
Definition: basicwriter.hh:95
void writeCornerFunction(VTUWriter &vtuWriter, FunctionWriter &functionWriter, unsigned ncorners) const
Definition: basicwriter.hh:121
std::string getParallelHeaderName(const std::string &name, const std::string &path) const
return name of a parallel header file
Definition: basicwriter.hh:325
void writePointData(VTUWriter &vtuWriter, unsigned npoints) const
Definition: basicwriter.hh:165
static std::string getFirstVector(const WriterList &data)
Definition: basicwriter.hh:146
FunctionWriterBase< Cell > FunctionWriter
Definition: basicwriter.hh:43
void writePointFunction(VTUWriter &vtuWriter, FunctionWriter &functionWriter, unsigned npoints) const
Definition: basicwriter.hh:109
void writePiece(const std::string &filename, OutputType outputType)
Definition: basicwriter.hh:198
void addCellData(const std::shared_ptr< FunctionWriter > &writer)
Definition: basicwriter.hh:76
static std::string getFirstScalar(const WriterList &data)
Definition: basicwriter.hh:138
std::string getParallelPieceName(const std::string &name, const std::string &path, int rank) const
return name of a parallel piece file
Definition: basicwriter.hh:295
std::string write(const std::string &name, OutputType outputType)
write output (interface might change later)
Definition: basicwriter.hh:436
void addPointData(const std::shared_ptr< FunctionWriter > &writer)
Definition: basicwriter.hh:80
virtual void write(const Cell &, const Domain &)
write at the given position
Definition: functionwriter.hh:59
virtual void endWrite()=0
signal end of writing
virtual bool beginWrite(VTUWriter &writer, std::size_t nitems)=0
start writing with the given writer
writer for the Coordinates array
Definition: functionwriter.hh:147
virtual void addArray(PVTUWriter &writer)
add this field to the given parallel writer
Definition: functionwriter.hh:165
writer for the offsets array
Definition: functionwriter.hh:300
writer for the types array
Definition: functionwriter.hh:340
Dump a .vtu/.vtp files contents to a stream.
Definition: pvtuwriter.hh:62
void endMain()
finish the main PolyData/UnstructuredGrid section
Definition: pvtuwriter.hh:195
void endCellData()
finish CellData section
Definition: pvtuwriter.hh:155
void beginMain(unsigned ghostLevel=0)
start the main PPolyData/PUnstructuredGrid section
Definition: pvtuwriter.hh:189
void beginCellData(const std::string &scalars="", const std::string &vectors="")
start CellData section
Definition: pvtuwriter.hh:146
void beginPointData(const std::string &scalars="", const std::string &vectors="")
start PointData section
Definition: pvtuwriter.hh:120
void addPiece(const std::string &filename)
Add a serial piece to the output file.
Definition: pvtuwriter.hh:215
void endPointData()
finish PointData section
Definition: pvtuwriter.hh:129
void endPoints()
finish section for the point coordinates
Definition: pvtuwriter.hh:171
void beginPoints()
start section for the point coordinates
Definition: pvtuwriter.hh:166
Dump a .vtu/.vtp files contents to a stream.
Definition: vtuwriter.hh:98
bool beginAppended()
start the appended data section
Definition: vtuwriter.hh:345
void endAppended()
finish the appended data section
Definition: vtuwriter.hh:359
void endCellData()
finish CellData section
Definition: vtuwriter.hh:220
void beginMain(unsigned ncells, unsigned npoints)
start the main PolyData/UnstructuredGrid section
Definition: vtuwriter.hh:310
void beginCells()
start section for the grid cells/PolyData lines
Definition: vtuwriter.hh:274
void endPointData()
finish PointData section
Definition: vtuwriter.hh:182
void beginCellData(const std::string &scalars="", const std::string &vectors="")
start CellData section
Definition: vtuwriter.hh:205
void beginPointData(const std::string &scalars="", const std::string &vectors="")
start PointData section
Definition: vtuwriter.hh:167
void endPoints()
finish section for the point coordinates
Definition: vtuwriter.hh:249
void endCells()
start section for the grid cells/PolyData lines
Definition: vtuwriter.hh:285
void beginPoints()
start section for the point coordinates
Definition: vtuwriter.hh:238
void endMain()
finish the main PolyData/UnstructuredGrid section
Definition: vtuwriter.hh:320