4 #ifndef DUNE_GRID_IO_FILE_VTK_BASICWRITER_HH
5 #define DUNE_GRID_IO_FILE_VTK_BASICWRITER_HH
14 #include <dune/common/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::ctype ctype;
48 static const unsigned celldim = Cell::mydimension;
49 typedef GenericReferenceElements<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(filename.c_str(), std::ios::binary);
198 stream.exceptions(std::ios_base::badbit | std::ios_base::failbit |
199 std::ios_base::eofbit);
201 VTUWriter vtuWriter(stream, outputType, fileType);
203 unsigned ncells = std::distance(factory.beginCells(),
205 unsigned npoints = std::distance(factory.beginPoints(),
206 factory.endPoints());
207 unsigned ncorners = std::distance(factory.beginCorners(),
208 factory.endCorners());
211 writeAll(vtuWriter, ncells, npoints, ncorners);
215 writeAll(vtuWriter, ncells, npoints, ncorners);
238 const std::string& piecename,
239 const std::string& piecepath)
241 std::ofstream stream(name.c_str(), std::ios::binary);
242 stream.exceptions(std::ios_base::badbit | std::ios_base::failbit |
243 std::ios_base::eofbit);
251 for(WIterator it=pointData.begin(); it!=pointData.end(); ++it)
252 (*it)->addArray(writer);
258 for(WIterator it=cellData.begin(); it!=cellData.end(); ++it)
259 (*it)->addArray(writer);
264 coords.addArray(writer);
268 for(
int i = 0; i < factory.comm().size(); ++i )
291 const std::string& path,
int rank)
const
293 std::ostringstream s;
294 if(path.size() > 0) {
296 if(path[path.size()-1] !=
'/')
299 s <<
's' << std::setw(4) << std::setfill(
'0') << factory.comm().size()
301 s <<
'p' << std::setw(4) << std::setfill(
'0') << rank <<
':';
321 const std::string& path)
const
323 std::ostringstream s;
324 if(path.size() > 0) {
326 if(path[path.size()-1] !=
'/')
329 s <<
's' << std::setw(4) << std::setfill(
'0') << factory.comm().size()
353 const std::string& path)
const
356 case polyData:
return concatPaths(path, name+
".vtp");
389 std::string
pwrite(
const std::string& name,
const std::string& path,
390 const std::string& extendpath,
OutputType outputType)
392 MPIGuard guard(factory.comm());
397 std::string piecepath = concatPaths(path, extendpath);
398 std::string relpiecepath = relativePath(path, piecepath);
402 factory.comm().rank());
407 if(factory.comm().rank() == 0)
432 if(factory.comm().size() > 1)
433 return pwrite(name,
"",
"", outputType);
451 #endif // DUNE_GRID_IO_FILE_VTK_BASICWRITER_HH