3 #ifndef DUNE_DGFWRITER_HH
4 #define DUNE_DGFWRITER_HH
15 #include <dune/geometry/referenceelements.hh>
45 typedef typename GridView::template Codim< 0 >::Iterator ElementIterator;
47 typedef typename GridView::template Codim< dimGrid >::EntityPointer VertexPointer;
49 typedef typename ElementIterator :: Entity Element ;
50 typedef typename Element :: EntityPointer ElementPointer;
51 typedef typename Element :: EntitySeed ElementSeed ;
55 typedef ReferenceElement< typename Grid::ctype, dimGrid > RefElement;
56 typedef ReferenceElements< typename Grid::ctype, dimGrid > RefElements;
74 void write ( std::ostream &gridout,
75 const std::vector< Index >& newElemOrder,
76 const std::stringstream& addParams = std::stringstream() )
const;
82 void write ( std::ostream &gridout )
const;
90 void write ( std::ostream &gridout,
91 const std::stringstream& addParams )
const;
97 void write (
const std::string &fileName )
const;
109 const IndexSet& indexSet,
111 const std::vector< Index >& vertexIndex,
112 std::ostream &gridout )
const
114 if( elementSeeds.size() > 0 )
117 typedef typename std::vector<ElementSeed> :: const_iterator iterator ;
118 const iterator end = elementSeeds.end();
119 for( iterator it = elementSeeds.begin(); it != end ; ++ it )
122 const ElementPointer ep =
gridView_.grid().entityPointer( *it );
124 writeElement( *ep, indexSet, elementType, vertexIndex, gridout );
130 const ElementIterator end =
gridView_.template end< 0 >();
131 for( ElementIterator it =
gridView_.template begin< 0 >(); it != end; ++it )
134 writeElement( *it, indexSet, elementType, vertexIndex, gridout );
141 const IndexSet& indexSet,
143 const std::vector< Index >& vertexIndex,
144 std::ostream &gridout )
const
147 if( element.type() != elementType )
151 const size_t vxSize = element.template count< Element::dimension > ();
152 std::vector<Index> vertices(vxSize);
153 for(
size_t i = 0; i < vxSize; ++i )
154 vertices[ i ] = vertexIndex[ indexSet.subIndex( element, i,
dimGrid ) ];
156 gridout << vertices[ 0 ];
157 for(
size_t i = 1; i < vxSize; ++i )
158 gridout <<
" " << vertices[ i ];
159 gridout << std::endl;
167 const std::vector< Index >& newElemOrder,
168 const std::stringstream& addParams )
const
171 gridout.setf( std::ios_base::scientific, std::ios_base::floatfield );
172 gridout.precision( 16 );
174 const IndexSet &indexSet = gridView_.indexSet();
177 std::vector< ElementSeed > elementSeeds;
180 const size_t orderSize = newElemOrder.size() ;
181 if( orderSize == indexSet.size( 0 ) )
183 const ElementIterator end = gridView_.template end< 0 >();
184 ElementIterator it = gridView_.template begin< 0 >();
188 elementSeeds.resize( orderSize, (*it).seed() ) ;
189 size_t countElements = 0 ;
190 for( ; it != end; ++it, ++countElements )
192 const Element& element = *it ;
193 assert( newElemOrder[ indexSet.index( element ) ] < orderSize );
194 elementSeeds[ newElemOrder[ indexSet.index( element ) ] ] = element.seed();
199 if( countElements != orderSize )
200 DUNE_THROW(InvalidStateException,
"DGFWriter::write: IndexSet not consecutive");
205 gridout <<
"DGF" << std::endl;
207 const Index vxSize = indexSet.size( dimGrid );
208 std::vector< Index > vertexIndex( vxSize, vxSize );
210 gridout <<
"%" <<
" Elements = " << indexSet.size( 0 ) <<
" | Vertices = " << vxSize << std::endl;
213 gridout << std::endl <<
"VERTEX" << std::endl;
214 Index vertexCount = 0;
215 const ElementIterator end = gridView_.template end< 0 >();
216 for( ElementIterator it = gridView_.template begin< 0 >(); it != end; ++it )
218 const Element& element = *it ;
219 const int numCorners = element.template count< dimGrid > ();
220 for(
int i=0; i<numCorners; ++i )
222 const Index vxIndex = indexSet.subIndex( element, i, dimGrid );
223 assert( vxIndex < vxSize );
224 if( vertexIndex[ vxIndex ] == vxSize )
226 vertexIndex[ vxIndex ] = vertexCount++;
227 gridout << element.geometry().corner( i ) << std::endl;
231 gridout <<
"#" << std::endl;
232 if( vertexCount != vxSize )
233 DUNE_THROW(
GridError,
"Index set reports wrong number of vertices." );
241 if( indexSet.size( simplex ) > 0 )
244 gridout << std::endl <<
"SIMPLEX" << std::endl;
247 writeAllElements( elementSeeds, indexSet, simplex, vertexIndex, gridout );
250 gridout <<
"#" << std::endl;
259 if( indexSet.size( cube ) > 0 )
262 gridout << std::endl <<
"CUBE" << std::endl;
265 writeAllElements( elementSeeds, indexSet, cube, vertexIndex, gridout );
268 gridout <<
"#" << std::endl;
273 #if DUNE_GRID_EXPERIMENTAL_GRID_EXTENSIONS
274 gridout << std::endl <<
"BOUNDARYSEGMENTS" << std::endl;
275 for( ElementIterator it = gridView_.template begin< 0 >(); it != end; ++it )
277 const Element& element = *it ;
278 if( !it->hasBoundaryIntersections() )
281 const RefElement &refElement = RefElements::general( element.type() );
283 const IntersectionIterator iend = gridView_.iend( element ) ;
284 for( IntersectionIterator iit = gridView_.ibegin( element ); iit != iend; ++iit )
286 if( !iit->boundary() )
289 const int boundaryId = iit->boundaryId();
290 if( boundaryId <= 0 )
292 std::cerr <<
"Warning: Ignoring nonpositive boundary id: "
293 << boundaryId <<
"." << std::endl;
297 const int faceNumber = iit->indexInInside();
298 const unsigned int faceSize = refElement.size( faceNumber, 1, dimGrid );
299 std::vector< Index > vertices( faceSize );
300 for(
unsigned int i = 0; i < faceSize; ++i )
302 const int j = refElement.subEntity( faceNumber, 1, i, dimGrid );
303 vertices[ i ] = vertexIndex[ indexSet.subIndex( element, j, dimGrid ) ];
305 gridout << boundaryId <<
" " << vertices[ 0 ];
306 for(
unsigned int i = 1; i < faceSize; ++i )
307 gridout <<
" " << vertices[ i ];
308 gridout << std::endl;
311 gridout <<
"#" << std::endl << std::endl;
312 #endif // #if DUNE_GRID_EXPERIMENTAL_GRID_EXTENSIONS
315 gridout << addParams.str() << std::endl;
317 gridout << std::endl <<
"#" << std::endl;
322 write ( std::ostream &gridout)
const
325 std::vector< Index > noNewOrdering ;
326 std::stringstream addParams;
327 write( gridout, noNewOrdering, addParams );
332 write ( std::ostream &gridout,
const std::stringstream& addParams )
const
335 std::vector< Index > noNewOrdering ;
336 write( gridout, noNewOrdering, addParams );
342 std::ofstream gridout( fileName.c_str() );
346 std::cerr <<
"Couldn't open file `"<< fileName <<
"'!"<< std::endl;
351 #endif // #ifndef DUNE_DGFWRITER_HH