4 #ifndef DUNE_GRID_IO_FILE_VTK_BASICWRITER_HH
5 #define DUNE_GRID_IO_FILE_VTK_BASICWRITER_HH
14 #include <dune/common/parallel/mpiguard.hh>
15 #include <dune/common/path.hh>
16 #include <dune/common/shared_ptr.hh>
18 #include <dune/geometry/referenceelements.hh>
32 template<
typename IteratorFactory>
34 typedef typename IteratorFactory::CellIterator CellIterator;
35 typedef typename IteratorFactory::CornerIterator CornerIterator;
36 typedef typename IteratorFactory::PointIterator PointIterator;
38 typedef typename IteratorFactory::Cell Cell;
44 typedef std::list<shared_ptr<FunctionWriter> > WriterList;
45 typedef typename WriterList::const_iterator WIterator;
47 typedef typename Cell::Geometry::ctype ctype;
48 static const unsigned celldim = Cell::mydimension;
49 typedef ReferenceElements<ctype, celldim> Refelems;
51 static const FileType fileType = celldim == 1
54 const IteratorFactory& factory;
60 typename IteratorFactory::ConnectivityWriter connectivity;
66 : factory(factory_), connectivity(factory.makeConnectivity())
75 cellData.push_back(writer);
79 pointData.push_back(writer);
95 unsigned ncells)
const
97 if(functionWriter.
beginWrite(vtuWriter, ncells)) {
99 for(
CellIterator cellit = factory.beginCells(); cellit != cellend;
101 functionWriter.
write(*cellit, Refelems::general(cellit->type()).
109 unsigned npoints)
const
111 if(functionWriter.
beginWrite(vtuWriter, npoints)) {
113 for(
PointIterator pit = factory.beginPoints(); pit != pend; ++pit)
114 functionWriter.
write(pit->cell(), pit->duneIndex());
121 unsigned ncorners)
const
123 if(functionWriter.
beginWrite(vtuWriter, ncorners)) {
125 for(
CornerIterator cit = factory.beginCorners(); cit != cend; ++cit)
126 functionWriter.
write(cit->cell(), cit->duneIndex());
137 const WIterator& wend = data.end();
138 for(WIterator wit = data.begin(); wit != wend; ++wit)
139 if((*wit)->ncomps() == 1)
140 return (*wit)->name();
145 const WIterator& wend = data.end();
146 for(WIterator wit = data.begin(); wit != wend; ++wit)
147 if((*wit)->ncomps() == 3)
148 return (*wit)->name();
153 if(cellData.empty())
return;
157 const WIterator& wend = cellData.end();
158 for(WIterator wit = cellData.begin(); wit != wend; ++wit)
164 if(pointData.empty())
return;
168 const WIterator& wend = pointData.end();
169 for(WIterator wit = pointData.begin(); wit != wend; ++wit)
192 writeGrid(vtuWriter, ncells, npoints, ncorners);
197 std::ofstream stream;
198 stream.exceptions(std::ios_base::badbit | std::ios_base::failbit |
199 std::ios_base::eofbit);
200 stream.open(filename.c_str(), std::ios::binary);
202 VTUWriter vtuWriter(stream, outputType, fileType);
204 unsigned ncells = std::distance(factory.beginCells(),
206 unsigned npoints = std::distance(factory.beginPoints(),
207 factory.endPoints());
208 unsigned ncorners = std::distance(factory.beginCorners(),
209 factory.endCorners());
212 writeAll(vtuWriter, ncells, npoints, ncorners);
216 writeAll(vtuWriter, ncells, npoints, ncorners);
239 const std::string& piecename,
240 const std::string& piecepath)
242 std::ofstream stream;
243 stream.exceptions(std::ios_base::badbit | std::ios_base::failbit |
244 std::ios_base::eofbit);
245 stream.open(name.c_str(), std::ios::binary);
254 for(WIterator it=pointData.begin(); it!=pointData.end(); ++it)
255 (*it)->addArray(writer);
261 for(WIterator it=cellData.begin(); it!=cellData.end(); ++it)
262 (*it)->addArray(writer);
267 coords.addArray(writer);
271 for(
int i = 0; i < factory.comm().size(); ++i )
294 const std::string& path,
int rank)
const
296 std::ostringstream s;
297 if(path.size() > 0) {
299 if(path[path.size()-1] !=
'/')
302 s <<
's' << std::setw(4) << std::setfill(
'0') << factory.comm().size()
304 s <<
'p' << std::setw(4) << std::setfill(
'0') << rank <<
':';
324 const std::string& path)
const
326 std::ostringstream s;
327 if(path.size() > 0) {
329 if(path[path.size()-1] !=
'/')
332 s <<
's' << std::setw(4) << std::setfill(
'0') << factory.comm().size()
336 case polyData : s <<
".pvtp";
break;
356 const std::string& path)
const
359 case polyData :
return concatPaths(path, name+
".vtp");
392 std::string
pwrite(
const std::string& name,
const std::string& path,
393 const std::string& extendpath,
OutputType outputType)
395 MPIGuard guard(factory.comm());
400 file.exceptions(std::ios_base::badbit | std::ios_base::failbit |
401 std::ios_base::eofbit);
402 std::string piecepath = concatPaths(path, extendpath);
403 std::string relpiecepath = relativePath(path, piecepath);
407 factory.comm().rank());
412 if(factory.comm().rank() == 0)
437 if(factory.comm().size() > 1)
438 return pwrite(name,
"",
"", outputType);
456 #endif // DUNE_GRID_IO_FILE_VTK_BASICWRITER_HH
void endCellData()
finish CellData section
Definition: vtuwriter.hh:218
writer for the offsets array
Definition: functionwriter.hh:290
void beginCellData(const std::string &scalars="", const std::string &vectors="")
start CellData section
Definition: vtuwriter.hh:203
Common stuff for the VTKWriter.
void beginPoints()
start section for the point coordinates
Definition: pvtuwriter.hh:164
virtual bool beginWrite(VTUWriter &writer, std::size_t nitems)=0
start writing with the given writer
static std::string getFirstVector(const WriterList &data)
Definition: basicwriter.hh:144
virtual void write(const Cell &cell, const Domain &xl)
write at the given position
Definition: functionwriter.hh:57
void beginMain(unsigned ghostLevel=0)
start the main PPolyData/PUnstructuredGrid section
Definition: pvtuwriter.hh:187
void endMain()
finish the main PolyData/UnstructuredGrid section
Definition: pvtuwriter.hh:193
void beginCells()
start section for the grid cells/PolyData lines
Definition: vtuwriter.hh:272
void endAppended()
finish the appended data section
Definition: vtuwriter.hh:357
std::string getSerialPieceName(const std::string &name, const std::string &path) const
return name of a serial piece file
Definition: basicwriter.hh:355
for .vtu files (UnstructuredGrid)
Definition: common.hh:294
std::string write(const std::string &name, OutputType outputType)
write output (interface might change later)
Definition: basicwriter.hh:433
void writeAll(VTUWriter &vtuWriter, unsigned ncells, unsigned npoints, unsigned ncorners)
Definition: basicwriter.hh:188
Definition: basicwriter.hh:33
void writePiece(const std::string &filename, OutputType outputType)
Definition: basicwriter.hh:196
writer for the Coordinates array
Definition: functionwriter.hh:141
BasicWriter(const IteratorFactory &factory_)
Definition: basicwriter.hh:65
void endPointData()
finish PointData section
Definition: pvtuwriter.hh:127
std::string getParallelHeaderName(const std::string &name, const std::string &path) const
return name of a parallel header file
Definition: basicwriter.hh:323
void writePointFunction(VTUWriter &vtuWriter, FunctionWriter &functionWriter, unsigned npoints) const
Definition: basicwriter.hh:107
FileType
which type of VTK file to write
Definition: common.hh:290
void clear()
Definition: basicwriter.hh:82
void endPoints()
finish section for the point coordinates
Definition: pvtuwriter.hh:169
void beginPointData(const std::string &scalars="", const std::string &vectors="")
start PointData section
Definition: pvtuwriter.hh:118
void endPointData()
finish PointData section
Definition: vtuwriter.hh:180
void addPointData(const shared_ptr< FunctionWriter > &writer)
Definition: basicwriter.hh:78
FunctionWriterBase< Cell > FunctionWriter
Definition: basicwriter.hh:41
Dump a .vtu/.vtp files contents to a stream.
Definition: vtuwriter.hh:96
virtual void endWrite()=0
signal end of writing
void writeCornerFunction(VTUWriter &vtuWriter, FunctionWriter &functionWriter, unsigned ncorners) const
Definition: basicwriter.hh:119
void writeCellFunction(VTUWriter &vtuWriter, FunctionWriter &functionWriter, unsigned ncells) const
Definition: basicwriter.hh:93
std::string getParallelPieceName(const std::string &name, const std::string &path, int rank) const
return name of a parallel piece file
Definition: basicwriter.hh:293
void endMain()
finish the main PolyData/UnstructuredGrid section
Definition: vtuwriter.hh:318
void endCellData()
finish CellData section
Definition: pvtuwriter.hh:153
void beginPoints()
start section for the point coordinates
Definition: vtuwriter.hh:236
void beginMain(unsigned ncells, unsigned npoints)
start the main PolyData/UnstructuredGrid section
Definition: vtuwriter.hh:308
bool beginAppended()
start the appended data section
Definition: vtuwriter.hh:343
static std::string getFirstScalar(const WriterList &data)
Definition: basicwriter.hh:136
void writePointData(VTUWriter &vtuWriter, unsigned npoints) const
Definition: basicwriter.hh:163
void addCellData(const shared_ptr< FunctionWriter > &writer)
Definition: basicwriter.hh:74
iterate over the corners of some cell range
Definition: corneriterator.hh:29
void beginPointData(const std::string &scalars="", const std::string &vectors="")
start PointData section
Definition: vtuwriter.hh:165
void addPiece(const std::string &filename)
Add a serial piece to the output file.
Definition: pvtuwriter.hh:214
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:392
iterate over the GridViews boundary intersections
Definition: boundaryiterators.hh:34
Dump a .vtu/.vtp files contents to a stream.
Definition: pvtuwriter.hh:60
for .vtp files (PolyData)
Definition: common.hh:292
void writeGrid(VTUWriter &vtuWriter, unsigned ncells, unsigned npoints, unsigned ncorners)
Definition: basicwriter.hh:174
void writeCellData(VTUWriter &vtuWriter, unsigned ncells) const
Definition: basicwriter.hh:152
OutputType
How the bulk data should be stored in the file.
Definition: common.hh:40
writer for the types array
Definition: functionwriter.hh:330
void endPoints()
finish section for the point coordinates
Definition: vtuwriter.hh:247
void beginCellData(const std::string &scalars="", const std::string &vectors="")
start CellData section
Definition: pvtuwriter.hh:144
void endCells()
start section for the grid cells/PolyData lines
Definition: vtuwriter.hh:283
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:238