dune-grid  2.3.1-rc1
albertagrid/dgfparser.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_ALBERTA_DGFPARSER_HH
4 #define DUNE_ALBERTA_DGFPARSER_HH
5 
6 #include <vector>
7 
10 
13 
16 
17 #if HAVE_ALBERTA
18 
19 namespace Dune
20 {
21 
22  // External Forward Declarations
23  // -----------------------------
24 
25  template< class GridImp, class IntersectionImp >
26  class Intersection;
27 
28 
29 
30  // DGFGridFactory for AlbertaGrid
31  // ------------------------------
32 
33  template< int dim, int dimworld >
34  struct DGFGridFactory< AlbertaGrid< dim, dimworld > >
35  {
37  const static int dimension = Grid::dimension;
38  typedef MPIHelper::MPICommunicator MPICommunicatorType;
39  typedef typename Grid::template Codim<0>::Entity Element;
40  typedef typename Grid::template Codim<dimension>::Entity Vertex;
42 
43  explicit DGFGridFactory ( std::istream &input,
44  MPICommunicatorType comm = MPIHelper::getCommunicator() );
45  explicit DGFGridFactory ( const std::string &filename,
46  MPICommunicatorType comm = MPIHelper::getCommunicator() );
47 
48  Grid *grid () const
49  {
50  return grid_;
51  }
52 
53  template< class Intersection >
54  bool wasInserted ( const Intersection &intersection ) const
55  {
56  return factory_.wasInserted( intersection );
57  }
58 
59  template< class Intersection >
60  int boundaryId ( const Intersection &intersection ) const
61  {
62  return Grid::getRealImplementation( intersection ).boundaryId();
63  }
64 
65  // return true if boundary paramters found
66  bool haveBoundaryParameters () const
67  {
68  return dgf_.haveBndParameters;
69  }
70 
71  template < class GG, class II >
73  boundaryParameter ( const Intersection< GG, II > & intersection ) const
74  {
76  typename Intersection::EntityPointer inside = intersection.inside();
77  const typename Intersection::Entity & entity = *inside;
78  const int face = intersection.indexInInside();
79 
80  const ReferenceElement< double, dimension > & refElem =
81  ReferenceElements< double, dimension >::general( entity.type() );
82  int corners = refElem.size( face, 1, dimension );
83  std :: vector< unsigned int > bound( corners );
84  for( int i=0; i < corners; ++i )
85  {
86  const int k = refElem.subEntity( face, 1, i, dimension );
87  bound[ i ] = factory_.insertionIndex( *entity.template subEntity< dimension >( k ) );
88  }
89 
90  DuneGridFormatParser::facemap_t::key_type key( bound, false );
91  const DuneGridFormatParser::facemap_t::const_iterator pos = dgf_.facemap.find( key );
92  if( pos != dgf_.facemap.end() )
93  return dgf_.facemap.find( key )->second.second;
94  else
96  }
97 
98  template< int codim >
99  int numParameters () const
100  {
101  if( codim == 0 )
102  return dgf_.nofelparams;
103  else if( codim == dimension )
104  return dgf_.nofvtxparams;
105  else
106  return 0;
107  }
108 
109  std::vector< double > &parameter ( const Element &element )
110  {
111  if( numParameters< 0 >() <= 0 )
112  {
113  DUNE_THROW( InvalidStateException,
114  "Calling DGFGridFactory::parameter is only allowed if there are parameters." );
115  }
116  return dgf_.elParams[ factory_.insertionIndex( element ) ];
117  }
118 
119  std::vector< double > &parameter ( const Vertex &vertex )
120  {
121  if( numParameters< dimension >() <= 0 )
122  {
123  DUNE_THROW( InvalidStateException,
124  "Calling DGFGridFactory::parameter is only allowed if there are parameters." );
125  }
126  return dgf_.vtxParams[ factory_.insertionIndex( vertex ) ];
127  }
128 
129  private:
130  bool generate( std::istream &input );
131 
132  Grid *grid_;
133  GridFactory factory_;
135  };
136 
137 
138 
139  // DGFGridInfo for AlbertaGrid
140  // ---------------------------
141 
142  template< int dim, int dimworld >
143  struct DGFGridInfo< AlbertaGrid< dim, dimworld > >
144  {
145  static int refineStepsForHalf ()
146  {
147  return dim;
148  }
149 
150  static double refineWeight ()
151  {
152  return 0.5;
153  }
154  };
155 
156 
157 
158  // Implementation of DGFGridFactory for AlbertaGrid
159  // ------------------------------------------------
160 
161  template< int dim, int dimworld >
162  inline DGFGridFactory< AlbertaGrid< dim, dimworld > >
163  ::DGFGridFactory ( std::istream &input, MPICommunicatorType comm )
164  : dgf_( 0, 1 )
165  {
166  input.clear();
167  input.seekg( 0 );
168  if( !input )
169  DUNE_THROW(DGFException, "Error resetting input stream." );
170  generate( input );
171  }
172 
173 
174  template< int dim, int dimworld >
176  ::DGFGridFactory ( const std::string &filename, MPICommunicatorType comm )
177  : dgf_( 0, 1 )
178  {
179  std::ifstream input( filename.c_str() );
180  if( !input )
181  DUNE_THROW( DGFException, "Macrofile " << filename << " not found." );
182  if( !generate( input ) )
183  grid_ = new AlbertaGrid< dim, dimworld >( filename.c_str() );
184  input.close();
185  }
186 
187 }
188 
189 #endif // #if HAVE_ALBERTA
190 
191 #endif // #ifndef DUNE_ALBERTA_DGFPARSER_HH
MPIHelper::MPICommunicator MPICommunicatorType
Definition: albertagrid/dgfparser.hh:38
Some simple static information for a given GridType.
Definition: io/file/dgfparser/dgfparser.hh:54
exception class for IO errors in the DGF parser
Definition: dgfexception.hh:12
Definition: common.hh:179
bool wasInserted(const Intersection &intersection) const
Definition: albertagrid/dgfparser.hh:54
std::vector< double > & parameter(const Vertex &vertex)
Definition: albertagrid/dgfparser.hh:119
bool haveBoundaryParameters() const
Definition: albertagrid/dgfparser.hh:66
DGFGridFactory(std::istream &input, MPICommunicatorType comm=MPIHelper::getCommunicator())
Definition: dgfgridfactory.hh:47
static double refineWeight()
Definition: albertagrid/dgfparser.hh:150
Grid * grid() const
Definition: albertagrid/dgfparser.hh:48
The dimension of the grid.
Definition: common/grid.hh:400
GridImp::template Codim< 0 >::EntityPointer EntityPointer
Pointer to the type of entities that this Intersection belongs to.
Definition: common/intersection.hh:191
int boundaryId(const Intersection &intersection) const
Definition: albertagrid/dgfparser.hh:60
[ provides Dune::Grid ]
Definition: agrid.hh:137
specialization of the generic GridFactory for AlbertaGrid
Grid::template Codim< dimension >::Entity Vertex
Definition: albertagrid/dgfparser.hh:40
Dune::GridFactory< Grid > GridFactory
Definition: albertagrid/dgfparser.hh:41
std::string type
type of additional boundary parameters
Definition: parser.hh:23
static const int dimension
Definition: dgfgridfactory.hh:38
Grid abstract base classThis class is the base class for all grid implementations. Although no virtual functions are used we call it abstract since its methods do not contain an implementation but forward to the methods of the derived class via the Barton-Nackman trick.
Definition: common/grid.hh:386
The DuneGridFormatParser class: reads a DGF file and stores build information in vector structures us...
Definition: parser.hh:44
EntityPointer inside() const
return EntityPointer to the Entity on the inside of this intersection. That is the Entity where we st...
Definition: common/intersection.hh:273
Intersection of a mesh entities of codimension 0 ("elements") with a "neighboring" element or with th...
Definition: albertagrid/dgfparser.hh:26
GridImp::template Codim< 0 >::Entity Entity
Type of entity that this Intersection belongs to.
Definition: common/intersection.hh:188
int indexInInside() const
Local index of codim 1 entity in the inside() entity where intersection is contained in...
Definition: common/intersection.hh:363
const DGFBoundaryParameter::type & boundaryParameter(const Intersection< GG, II > &intersection) const
Definition: albertagrid/dgfparser.hh:73
static int refineStepsForHalf()
Definition: albertagrid/dgfparser.hh:145
static const type & defaultValue()
default constructor
Definition: parser.hh:26
AlbertaGrid< dim, dimworld > Grid
Definition: albertagrid/dgfparser.hh:36
std::vector< double > & parameter(const Element &element)
Definition: albertagrid/dgfparser.hh:109
Grid::template Codim< 0 >::Entity Element
Definition: albertagrid/dgfparser.hh:39
Definition: agrid.hh:66
int numParameters() const
Definition: albertagrid/dgfparser.hh:99