Dune Core Modules (2.4.2)

dgfwriter.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 #ifndef DUNE_DGFWRITER_HH
4 #define DUNE_DGFWRITER_HH
5 
11 #include <fstream>
12 #include <vector>
13 
14 #include <dune/grid/common/grid.hh>
15 #include <dune/geometry/referenceelements.hh>
16 
17 namespace Dune
18 {
19 
29  template< class GV >
30  class DGFWriter
31  {
32  typedef DGFWriter< GV > This;
33 
34  public:
36  typedef GV GridView;
38  typedef typename GridView::Grid Grid;
39 
41  static const int dimGrid = GridView::dimension;
42 
43  private:
44  typedef typename GridView::IndexSet IndexSet;
45  typedef typename GridView::template Codim< 0 >::Iterator ElementIterator;
46  typedef typename GridView::IntersectionIterator IntersectionIterator;
47  typedef typename GridView::template Codim< dimGrid >::EntityPointer VertexPointer;
48 
49  typedef typename ElementIterator :: Entity Element ;
50  typedef typename Element :: EntityPointer ElementPointer;
51  typedef typename Element :: EntitySeed ElementSeed ;
52 
53  typedef typename IndexSet::IndexType Index;
54 
57 
58  public:
63  DGFWriter ( const GridView &gridView )
64  : gridView_( gridView )
65  {}
66 
74  void write ( std::ostream &gridout,
75  const std::vector< Index >& newElemOrder,
76  const std::stringstream& addParams = std::stringstream() ) const;
77 
82  void write ( std::ostream &gridout ) const;
83 
90  void write ( std::ostream &gridout,
91  const std::stringstream& addParams ) const;
92 
97  void write ( const std::string &fileName ) const;
98 
99  protected:
100  GridView gridView_;
101 
102  protected:
104  // helper methods
106 
107  // write all elements of type elementType
108  void writeAllElements( const std::vector<ElementSeed>& elementSeeds,
109  const IndexSet& indexSet,
110  const GeometryType& elementType,
111  const std::vector< Index >& vertexIndex,
112  std::ostream &gridout ) const
113  {
114  if( elementSeeds.size() > 0 )
115  {
116  // perform grid traversal based on new element ordering
117  typedef typename std::vector<ElementSeed> :: const_iterator iterator ;
118  const iterator end = elementSeeds.end();
119  for( iterator it = elementSeeds.begin(); it != end ; ++ it )
120  {
121  // convert entity seed into entity pointer
122  const ElementPointer ep = gridView_.grid().entityPointer( *it );
123  // write element
124  writeElement( *ep, indexSet, elementType, vertexIndex, gridout );
125  }
126  }
127  else
128  {
129  // perform default grid traversal
130  const ElementIterator end = gridView_.template end< 0 >();
131  for( ElementIterator it = gridView_.template begin< 0 >(); it != end; ++it )
132  {
133  // write element
134  writeElement( *it, indexSet, elementType, vertexIndex, gridout );
135  }
136  }
137  }
138 
139  // write one element
140  void writeElement( const Element& element,
141  const IndexSet& indexSet,
142  const GeometryType& elementType,
143  const std::vector< Index >& vertexIndex,
144  std::ostream &gridout ) const
145  {
146  // if element's type is not the same as the type to write the return
147  if( element.type() != elementType )
148  return ;
149 
150  // get vertex numbers of the element
151  const size_t vxSize = element.subEntities( 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 ) ];
155 
156  gridout << vertices[ 0 ];
157  for( size_t i = 1; i < vxSize; ++i )
158  gridout << " " << vertices[ i ];
159  gridout << std::endl;
160  }
161  };
162 
163 
164  template< class GV >
165  inline void DGFWriter< GV >::
166  write ( std::ostream &gridout,
167  const std::vector< Index >& newElemOrder,
168  const std::stringstream& addParams ) const
169  {
170  // set the stream to full double precision
171  gridout.setf( std::ios_base::scientific, std::ios_base::floatfield );
172  gridout.precision( 16 );
173 
174  const IndexSet &indexSet = gridView_.indexSet();
175 
176  // vector containing entity seed (only needed if new ordering is given)
177  std::vector< ElementSeed > elementSeeds;
178 
179  // if ordering was provided
180  const size_t orderSize = newElemOrder.size() ;
181  if( orderSize == indexSet.size( 0 ) )
182  {
183  const ElementIterator end = gridView_.template end< 0 >();
184  ElementIterator it = gridView_.template begin< 0 >();
185 
186  if( it != end )
187  {
188  elementSeeds.resize( orderSize, (*it).seed() ) ;
189  size_t countElements = 0 ;
190  for( ; it != end; ++it, ++countElements )
191  {
192  const Element& element = *it ;
193  assert( newElemOrder[ indexSet.index( element ) ] < orderSize );
194  elementSeeds[ newElemOrder[ indexSet.index( element ) ] ] = element.seed();
195  }
196 
197  // make sure that the size of the index set is equal
198  // to the number of counted elements
199  if( countElements != orderSize )
200  DUNE_THROW(InvalidStateException,"DGFWriter::write: IndexSet not consecutive");
201  }
202  }
203 
204  // write DGF header
205  gridout << "DGF" << std::endl;
206 
207  const Index vxSize = indexSet.size( dimGrid );
208  std::vector< Index > vertexIndex( vxSize, vxSize );
209 
210  gridout << "%" << " Elements = " << indexSet.size( 0 ) << " | Vertices = " << vxSize << std::endl;
211 
212  // write all vertices into the "vertex" block
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 )
217  {
218  const Element& element = *it ;
219  const int numCorners = element.subEntities( dimGrid );
220  for( int i=0; i<numCorners; ++i )
221  {
222  const Index vxIndex = indexSet.subIndex( element, i, dimGrid );
223  assert( vxIndex < vxSize );
224  if( vertexIndex[ vxIndex ] == vxSize )
225  {
226  vertexIndex[ vxIndex ] = vertexCount++;
227  gridout << element.geometry().corner( i ) << std::endl;
228  }
229  }
230  }
231  gridout << "#" << std::endl;
232  if( vertexCount != vxSize )
233  DUNE_THROW( GridError, "Index set reports wrong number of vertices." );
234 
235  if( dimGrid > 1 )
236  {
237  // type of element to write
238  GeometryType simplex( GeometryType::simplex, dimGrid );
239 
240  // only write simplex block if grid view contains simplices
241  if( indexSet.size( simplex ) > 0 )
242  {
243  // write all simplices to the "simplex" block
244  gridout << std::endl << "SIMPLEX" << std::endl;
245 
246  // write all simplex elements
247  writeAllElements( elementSeeds, indexSet, simplex, vertexIndex, gridout );
248 
249  // write end marker for block
250  gridout << "#" << std::endl;
251  }
252  }
253 
254  {
255  // cube geometry type
256  GeometryType cube( GeometryType::cube, dimGrid );
257 
258  // only write cube block if grid view contains cubes
259  if( indexSet.size( cube ) > 0 )
260  {
261  // write all cubes to the "cube" block
262  gridout << std::endl << "CUBE" << std::endl;
263 
264  // write all simplex elements
265  writeAllElements( elementSeeds, indexSet, cube, vertexIndex, gridout );
266 
267  // write end marker for block
268  gridout << "#" << std::endl;
269  }
270  }
271 
272  // write all boundaries to the "boundarysegments" block
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 )
276  {
277  const Element& element = *it ;
278  if( !it->hasBoundaryIntersections() )
279  continue;
280 
281  const RefElement &refElement = RefElements::general( element.type() );
282 
283  const IntersectionIterator iend = gridView_.iend( element ) ;
284  for( IntersectionIterator iit = gridView_.ibegin( element ); iit != iend; ++iit )
285  {
286  if( !iit->boundary() )
287  continue;
288 
289  const int boundaryId = iit->boundaryId();
290  if( boundaryId <= 0 )
291  {
292  std::cerr << "Warning: Ignoring nonpositive boundary id: "
293  << boundaryId << "." << std::endl;
294  continue;
295  }
296 
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 )
301  {
302  const int j = refElement.subEntity( faceNumber, 1, i, dimGrid );
303  vertices[ i ] = vertexIndex[ indexSet.subIndex( element, j, dimGrid ) ];
304  }
305  gridout << boundaryId << " " << vertices[ 0 ];
306  for( unsigned int i = 1; i < faceSize; ++i )
307  gridout << " " << vertices[ i ];
308  gridout << std::endl;
309  }
310  }
311  gridout << "#" << std::endl << std::endl;
312 #endif // #if DUNE_GRID_EXPERIMENTAL_GRID_EXTENSIONS
313 
314  // add additional parameters given by the user
315  gridout << addParams.str() << std::endl;
316 
317  gridout << std::endl << "#" << std::endl;
318  }
319 
320  template< class GV >
321  inline void DGFWriter< GV >::
322  write ( std::ostream &gridout) const
323  {
324  // empty vector means no new ordering
325  std::vector< Index > noNewOrdering ;
326  std::stringstream addParams;
327  write( gridout, noNewOrdering, addParams );
328  }
329 
330  template< class GV >
331  inline void DGFWriter< GV >::
332  write ( std::ostream &gridout, const std::stringstream& addParams ) const
333  {
334  // empty vector means no new ordering
335  std::vector< Index > noNewOrdering ;
336  write( gridout, noNewOrdering, addParams );
337  }
338 
339  template< class GV >
340  inline void DGFWriter< GV >::write ( const std::string &fileName ) const
341  {
342  std::ofstream gridout( fileName.c_str() );
343  if( gridout )
344  write( gridout );
345  else
346  std::cerr << "Couldn't open file `"<< fileName << "'!"<< std::endl;
347  }
348 
349 }
350 
351 #endif // #ifndef DUNE_DGFWRITER_HH
write a GridView to a DGF file
Definition: dgfwriter.hh:31
static const int dimGrid
dimension of the grid
Definition: dgfwriter.hh:41
DGFWriter(const GridView &gridView)
constructor
Definition: dgfwriter.hh:63
void write(std::ostream &gridout, const std::vector< Index > &newElemOrder, const std::stringstream &addParams=std::stringstream()) const
write the GridView into a std::ostream
Definition: dgfwriter.hh:166
GV GridView
type of grid view
Definition: dgfwriter.hh:36
GridView::Grid Grid
type of underlying hierarchical grid
Definition: dgfwriter.hh:38
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:25
@ cube
Cube element in any nonnegative dimension.
Definition: type.hh:31
@ simplex
Simplicial element in any nonnegative dimension.
Definition: type.hh:30
Base class for exceptions in Dune grid modules.
Definition: exceptions.hh:18
Grid view abstract base class.
Definition: gridview.hh:59
Index Set Interface base class.
Definition: indexidset.hh:76
IndexTypeImp IndexType
The type used for the indices.
Definition: indexidset.hh:90
int indexInInside() const
Local index of codim 1 entity in the inside() entity where intersection is contained in.
Definition: intersection.hh:393
Default exception if a function was called while the object is not in a valid state for that function...
Definition: exceptions.hh:306
This class provides access to geometric and topological properties of a reference element.
Definition: referenceelements.hh:31
int size(int c) const
number of subentities of codimension c
Definition: referenceelements.hh:82
int subEntity(int i, int c, int ii, int cc) const
obtain number of ii-th subentity with codim cc of (i,c)
Definition: referenceelements.hh:118
Different resources needed by all grid implementations.
#define DUNE_THROW(E, m)
Definition: exceptions.hh:243
Traits ::IntersectionIterator IntersectionIterator
type of the intersection iterator
Definition: gridview.hh:86
IntersectionIterator ibegin(const typename Codim< 0 > ::Entity &entity) const
obtain begin intersection iterator with respect to this view
Definition: gridview.hh:236
Traits ::IndexSet IndexSet
type of the index set
Definition: gridview.hh:80
const Grid & grid() const
obtain a const reference to the underlying hierarchic grid
Definition: gridview.hh:164
IntersectionIterator iend(const typename Codim< 0 > ::Entity &entity) const
obtain end intersection iterator with respect to this view
Definition: gridview.hh:243
Traits ::Grid Grid
type of the grid
Definition: gridview.hh:77
const IndexSet & indexSet() const
obtain the index set
Definition: gridview.hh:175
Codim< cd >::Iterator end() const
obtain end iterator for this view
Definition: gridview.hh:213
@ dimension
The dimension of the grid.
Definition: gridview.hh:130
Dune namespace.
Definition: alignment.hh:10
Static tag representing a codimension.
Definition: dimension.hh:22
Class providing access to the singletons of the reference elements.
Definition: referenceelements.hh:479
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 16, 22:29, 2024)