Dune Core Modules (2.5.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 
48  typedef typename ElementIterator :: Entity Element ;
49  typedef typename Element :: EntitySeed ElementSeed ;
50 
51  typedef typename IndexSet::IndexType Index;
52 
55 
56  public:
61  DGFWriter ( const GridView &gridView )
62  : gridView_( gridView )
63  {}
64 
72  void write ( std::ostream &gridout,
73  const std::vector< Index >& newElemOrder,
74  const std::stringstream& addParams = std::stringstream() ) const;
75 
80  void write ( std::ostream &gridout ) const;
81 
88  void write ( std::ostream &gridout,
89  const std::stringstream& addParams ) const;
90 
95  void write ( const std::string &fileName ) const;
96 
97  protected:
98  GridView gridView_;
99 
100  protected:
102  // helper methods
104 
105  // write all elements of type elementType
106  void writeAllElements( const std::vector<ElementSeed>& elementSeeds,
107  const IndexSet& indexSet,
108  const GeometryType& elementType,
109  const std::vector< Index >& vertexIndex,
110  std::ostream &gridout ) const
111  {
112  if (!elementSeeds.empty()) {
113  // perform grid traversal based on new element ordering
114  for (const auto& seed : elementSeeds) {
115  const Element element = gridView_.grid().entity(seed);
116  writeElement(element, indexSet, elementType, vertexIndex, gridout);
117  }
118  }
119  else {
120  // perform default grid traversal
121  for (const auto& element : elements(gridView_))
122  writeElement(element, indexSet, elementType, vertexIndex, gridout);
123  }
124  }
125 
126  // write one element
127  void writeElement( const Element& element,
128  const IndexSet& indexSet,
129  const GeometryType& elementType,
130  const std::vector< Index >& vertexIndex,
131  std::ostream &gridout ) const
132  {
133  // if element's type is not the same as the type to write the return
134  if( element.type() != elementType )
135  return ;
136 
137  // get vertex numbers of the element
138  const size_t vxSize = element.subEntities( Element::dimension );
139  std::vector<Index> vertices(vxSize);
140  for( size_t i = 0; i < vxSize; ++i )
141  vertices[ i ] = vertexIndex[ indexSet.subIndex( element, i, dimGrid ) ];
142 
143  gridout << vertices[ 0 ];
144  for( size_t i = 1; i < vxSize; ++i )
145  gridout << " " << vertices[ i ];
146  gridout << std::endl;
147  }
148  };
149 
150 
151  template< class GV >
152  inline void DGFWriter< GV >::
153  write ( std::ostream &gridout,
154  const std::vector< Index >& newElemOrder,
155  const std::stringstream& addParams ) const
156  {
157  // set the stream to full double precision
158  gridout.setf( std::ios_base::scientific, std::ios_base::floatfield );
159  gridout.precision( 16 );
160 
161  const IndexSet &indexSet = gridView_.indexSet();
162 
163  // vector containing entity seed (only needed if new ordering is given)
164  std::vector< ElementSeed > elementSeeds;
165 
166  // if ordering was provided
167  const size_t orderSize = newElemOrder.size() ;
168  if( orderSize == indexSet.size( 0 ) )
169  {
170  const ElementIterator end = gridView_.template end< 0 >();
171  ElementIterator it = gridView_.template begin< 0 >();
172 
173  if( it != end )
174  {
175  elementSeeds.resize( orderSize, (*it).seed() ) ;
176  size_t countElements = 0 ;
177  for( ; it != end; ++it, ++countElements )
178  {
179  const Element& element = *it ;
180  assert( newElemOrder[ indexSet.index( element ) ] < orderSize );
181  elementSeeds[ newElemOrder[ indexSet.index( element ) ] ] = element.seed();
182  }
183 
184  // make sure that the size of the index set is equal
185  // to the number of counted elements
186  if( countElements != orderSize )
187  DUNE_THROW(InvalidStateException,"DGFWriter::write: IndexSet not consecutive");
188  }
189  }
190 
191  // write DGF header
192  gridout << "DGF" << std::endl;
193 
194  const Index vxSize = indexSet.size( dimGrid );
195  std::vector< Index > vertexIndex( vxSize, vxSize );
196 
197  gridout << "%" << " Elements = " << indexSet.size( 0 ) << " | Vertices = " << vxSize << std::endl;
198 
199  // write all vertices into the "vertex" block
200  gridout << std::endl << "VERTEX" << std::endl;
201  Index vertexCount = 0;
202  const ElementIterator end = gridView_.template end< 0 >();
203  for( ElementIterator it = gridView_.template begin< 0 >(); it != end; ++it )
204  {
205  const Element& element = *it ;
206  const int numCorners = element.subEntities( dimGrid );
207  for( int i=0; i<numCorners; ++i )
208  {
209  const Index vxIndex = indexSet.subIndex( element, i, dimGrid );
210  assert( vxIndex < vxSize );
211  if( vertexIndex[ vxIndex ] == vxSize )
212  {
213  vertexIndex[ vxIndex ] = vertexCount++;
214  gridout << element.geometry().corner( i ) << std::endl;
215  }
216  }
217  }
218  gridout << "#" << std::endl;
219  if( vertexCount != vxSize )
220  DUNE_THROW( GridError, "Index set reports wrong number of vertices." );
221 
222  if( dimGrid > 1 )
223  {
224  // type of element to write
225  GeometryType simplex( GeometryType::simplex, dimGrid );
226 
227  // only write simplex block if grid view contains simplices
228  if( indexSet.size( simplex ) > 0 )
229  {
230  // write all simplices to the "simplex" block
231  gridout << std::endl << "SIMPLEX" << std::endl;
232 
233  // write all simplex elements
234  writeAllElements( elementSeeds, indexSet, simplex, vertexIndex, gridout );
235 
236  // write end marker for block
237  gridout << "#" << std::endl;
238  }
239  }
240 
241  {
242  // cube geometry type
243  GeometryType cube( GeometryType::cube, dimGrid );
244 
245  // only write cube block if grid view contains cubes
246  if( indexSet.size( cube ) > 0 )
247  {
248  // write all cubes to the "cube" block
249  gridout << std::endl << "CUBE" << std::endl;
250 
251  // write all simplex elements
252  writeAllElements( elementSeeds, indexSet, cube, vertexIndex, gridout );
253 
254  // write end marker for block
255  gridout << "#" << std::endl;
256  }
257  }
258 
259  // write all boundaries to the "boundarysegments" block
260 #if DUNE_GRID_EXPERIMENTAL_GRID_EXTENSIONS
261  gridout << std::endl << "BOUNDARYSEGMENTS" << std::endl;
262  for( ElementIterator it = gridView_.template begin< 0 >(); it != end; ++it )
263  {
264  const Element& element = *it ;
265  if( !it->hasBoundaryIntersections() )
266  continue;
267 
268  const RefElement &refElement = RefElements::general( element.type() );
269 
270  const IntersectionIterator iend = gridView_.iend( element ) ;
271  for( IntersectionIterator iit = gridView_.ibegin( element ); iit != iend; ++iit )
272  {
273  if( !iit->boundary() )
274  continue;
275 
276  const int boundaryId = iit->boundaryId();
277  if( boundaryId <= 0 )
278  {
279  std::cerr << "Warning: Ignoring nonpositive boundary id: "
280  << boundaryId << "." << std::endl;
281  continue;
282  }
283 
284  const int faceNumber = iit->indexInInside();
285  const unsigned int faceSize = refElement.size( faceNumber, 1, dimGrid );
286  std::vector< Index > vertices( faceSize );
287  for( unsigned int i = 0; i < faceSize; ++i )
288  {
289  const int j = refElement.subEntity( faceNumber, 1, i, dimGrid );
290  vertices[ i ] = vertexIndex[ indexSet.subIndex( element, j, dimGrid ) ];
291  }
292  gridout << boundaryId << " " << vertices[ 0 ];
293  for( unsigned int i = 1; i < faceSize; ++i )
294  gridout << " " << vertices[ i ];
295  gridout << std::endl;
296  }
297  }
298  gridout << "#" << std::endl << std::endl;
299 #endif // #if DUNE_GRID_EXPERIMENTAL_GRID_EXTENSIONS
300 
301  // add additional parameters given by the user
302  gridout << addParams.str() << std::endl;
303 
304  gridout << std::endl << "#" << std::endl;
305  }
306 
307  template< class GV >
308  inline void DGFWriter< GV >::
309  write ( std::ostream &gridout) const
310  {
311  // empty vector means no new ordering
312  std::vector< Index > noNewOrdering ;
313  std::stringstream addParams;
314  write( gridout, noNewOrdering, addParams );
315  }
316 
317  template< class GV >
318  inline void DGFWriter< GV >::
319  write ( std::ostream &gridout, const std::stringstream& addParams ) const
320  {
321  // empty vector means no new ordering
322  std::vector< Index > noNewOrdering ;
323  write( gridout, noNewOrdering, addParams );
324  }
325 
326  template< class GV >
327  inline void DGFWriter< GV >::write ( const std::string &fileName ) const
328  {
329  std::ofstream gridout( fileName.c_str() );
330  if( gridout )
331  write( gridout );
332  else
333  std::cerr << "Couldn't open file `"<< fileName << "'!"<< std::endl;
334  }
335 
336 }
337 
338 #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:61
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:153
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:268
@ cube
Cube element in any nonnegative dimension.
Definition: type.hh:274
@ simplex
Simplicial element in any nonnegative dimension.
Definition: type.hh:273
Base class for exceptions in Dune grid modules.
Definition: exceptions.hh:18
Grid view abstract base class.
Definition: gridview.hh:60
Index Set Interface base class.
Definition: indexidset.hh:76
IndexTypeImp IndexType
The type used for the indices.
Definition: indexidset.hh:90
IndexType size(GeometryType type) const
Return total number of entities of given geometry type in entity set .
Definition: indexidset.hh:220
int indexInInside() const
Local index of codim 1 entity in the inside() entity where intersection is contained in.
Definition: intersection.hh:374
Default exception if a function was called while the object is not in a valid state for that function...
Definition: exceptions.hh:279
This class provides access to geometric and topological properties of a reference element.
Definition: referenceelements.hh:355
int size(int c) const
number of subentities of codimension c
Definition: referenceelements.hh:382
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:418
Different resources needed by all grid implementations.
#define DUNE_THROW(E, m)
Definition: exceptions.hh:216
Traits ::IntersectionIterator IntersectionIterator
type of the intersection iterator
Definition: gridview.hh:87
IntersectionIterator ibegin(const typename Codim< 0 > ::Entity &entity) const
obtain begin intersection iterator with respect to this view
Definition: gridview.hh:234
Traits ::IndexSet IndexSet
type of the index set
Definition: gridview.hh:81
const Grid & grid() const
obtain a const reference to the underlying hierarchic grid
Definition: gridview.hh:162
IntersectionIterator iend(const typename Codim< 0 > ::Entity &entity) const
obtain end intersection iterator with respect to this view
Definition: gridview.hh:241
Traits ::Grid Grid
type of the grid
Definition: gridview.hh:78
const IndexSet & indexSet() const
obtain the index set
Definition: gridview.hh:173
@ dimension
The dimension of the grid.
Definition: gridview.hh:128
Dune namespace.
Definition: alignment.hh:11
Static tag representing a codimension.
Definition: dimension.hh:22
Class providing access to the singletons of the reference elements.
Definition: referenceelements.hh:753
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 7, 22:32, 2024)