dune-grid  2.4
dgfs.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_DGFS_HH
4 #define DUNE_DGFS_HH
5 
7 #include <dune/grid/sgrid.hh>
8 #include "dgfparser.hh"
9 
10 namespace Dune
11 {
12 
13  // External Forward Declarations
14  // -----------------------------
15 
16  template< class GridImp, class IntersectionImp >
17  class Intersection;
18 
19 
20 
21  // DGFGridFactory for SGrid
22  // ------------------------
23 
24  template< int dim, int dimworld, class ctype >
25  struct DGFGridFactory< SGrid< dim, dimworld, ctype > >
26  {
28 
29  const static int dimension = Grid::dimension;
30 
31  typedef MPIHelper::MPICommunicator MPICommunicatorType;
32 
33  private:
34  typedef FieldVector< double, dimension > Point;
35 
37 
38  public:
39  explicit DGFGridFactory ( std::istream &input,
40  MPICommunicatorType comm = MPIHelper::getCommunicator() )
41  {
42  generate( input, comm );
43  }
44 
45  explicit DGFGridFactory ( const std::string &filename,
46  MPICommunicatorType comm = MPIHelper::getCommunicator() )
47  {
48  std::ifstream input( filename.c_str() );
49  generate( input, comm );
50  }
51 
52  Grid *grid() const
53  {
54  return grid_;
55  }
56 
57  template< class Intersection >
58  bool wasInserted ( const Intersection &intersection ) const
59  {
60  return false;
61  }
62 
63  template< class Intersection >
64  int boundaryId ( const Intersection &intersection ) const
65  {
66  if( boundaryDomainBlock_->isactive() )
67  {
68  std::vector< Point > corners;
69  getCorners( intersection.geometry(), corners );
70  const dgf::DomainData *data = boundaryDomainBlock_->contains( corners );
71  if( data )
72  return data->id();
73  else
74  return intersection.indexInInside();
75  }
76  else
77  return intersection.indexInInside();
78  }
79 
80  template< int codim >
81  int numParameters () const
82  {
83  return 0;
84  }
85 
86  // return true if boundary parameters found
87  bool haveBoundaryParameters () const
88  {
89  return boundaryDomainBlock_->isactive();
90  }
91 
92  template< class GG, class II >
93  const typename DGFBoundaryParameter::type &
94  boundaryParameter ( const Intersection< GG, II > & intersection ) const
95  {
97  {
98  std::vector< Point > corners;
99  getCorners( intersection.geometry(), corners );
100  const dgf::DomainData *data = boundaryDomainBlock_->contains( corners );
101  if( data )
102  return data->parameter();
103  else
105  }
106  else
108  }
109 
110 
111  template< class Entity >
112  std::vector< double > &parameter ( const Entity &entity )
113  {
114  return emptyParam;
115  }
116 
117  private:
118  void generate( std::istream &gridin, MPICommunicatorType comm );
119 
120  template< class Geometry >
121  static void getCorners ( const Geometry &geometry, std::vector< Point > &corners )
122  {
123  corners.resize( geometry.corners() );
124  for( int i = 0; i < geometry.corners(); ++i )
125  {
126  const typename Geometry::GlobalCoordinate corner = geometry.corner( i );
127  for( int j = 0; j < dimension; ++j )
128  corners[ i ][ j ] = corner[ j ];
129  }
130  }
131 
132  Grid *grid_;
133  dgf::BoundaryDomBlock *boundaryDomainBlock_;
134  std::vector< double > emptyParam;
135  };
136 
137 
138 
139  template< int dim, int dimworld, class ctype >
140  inline void DGFGridFactory< SGrid< dim, dimworld, ctype > >
141  ::generate ( std::istream &gridin, MPICommunicatorType comm )
142  {
143  dgf::IntervalBlock intervalBlock( gridin );
144 
145  if( !intervalBlock.isactive() )
146  DUNE_THROW( DGFException, "SGrid can only be created from an interval block." );
147 
148  if( intervalBlock.numIntervals() != 1 )
149  DUNE_THROW( DGFException, "SGrid can only handle 1 interval block." );
150 
151  if( intervalBlock.dimw() != dim )
152  {
153  DUNE_THROW( DGFException,
154  "Cannot read an interval of dimension " << intervalBlock.dimw()
155  << "into a SGrid< " << dim << ", " << dimworld << " >." );
156  }
157 
158  const dgf::IntervalBlock::Interval &interval = intervalBlock.get( 0 );
159 
160  FieldVector< double, dimension > lower, upper;
161  FieldVector< int, dimension > anz;
162  for( int i = 0; i < dimension; ++i )
163  {
164  lower[ i ] = interval.p[ 0 ][ i ];
165  upper[ i ] = interval.p[ 1 ][ i ];
166  anz[ i ] = interval.n[ i ];
167  }
168 
169  grid_ = new Grid( anz, lower, upper );
170 
171  boundaryDomainBlock_ = new dgf::BoundaryDomBlock( gridin, dimension );
172  }
173 
174 
175 
176  template< int dim, int dimworld, class ctype >
177  struct DGFGridInfo< SGrid< dim, dimworld, ctype > >
178  {
179  static int refineStepsForHalf ()
180  {
181  return 1;
182  }
183 
184  static double refineWeight ()
185  {
186  return 1.0 / double( 1 << dim );
187  }
188  };
189 
190 }
191 #endif // #ifndef DUNE_DGFS_HH
DGFGridFactory(const std::string &filename, MPICommunicatorType comm=MPIHelper::getCommunicator())
Definition: dgfs.hh:45
static const type & defaultValue()
default constructor
Definition: parser.hh:26
int numParameters() const
Definition: dgfs.hh:81
static const int dimension
Definition: dgfgridfactory.hh:38
Geometry geometry() const
geometrical information about the intersection in global coordinates.
Definition: common/intersection.hh:373
Wrapper class for geometries.
Definition: common/geometry.hh:65
bool wasInserted(const Intersection &intersection) const
Definition: dgfs.hh:58
Include standard header files.
Definition: agrid.hh:59
SGrid< dim, dimworld, ctype > Grid
Definition: dgfs.hh:27
static double refineWeight()
Definition: dgfs.hh:184
[ provides Dune::Grid ]
Definition: sgrid.hh:54
Definition: agrid.hh:66
GlobalCoordinate corner(int i) const
Obtain a corner of the geometry.
Definition: common/geometry.hh:156
bool haveBoundaryParameters() const
Definition: dgfgridfactory.hh:156
const BoundaryParameter & parameter() const
Definition: boundarydom.hh:52
Some simple static information for a given GridType.
Definition: io/file/dgfparser/dgfparser.hh:54
Grid * grid() const
Definition: dgfs.hh:52
The dimension of the grid.
Definition: common/grid.hh:402
std::vector< double > & parameter(const Entity &entity)
Definition: dgfs.hh:112
int indexInInside() const
Local index of codim 1 entity in the inside() entity where intersection is contained in...
Definition: common/intersection.hh:393
Definition: boundarydom.hh:20
Intersection of a mesh entities of codimension 0 ("elements") with a "neighboring" element or with th...
Definition: albertagrid/dgfparser.hh:26
const DGFBoundaryParameter::type & boundaryParameter(const Intersection< GG, II > &intersection) const
Definition: dgfs.hh:94
int boundaryId(const Intersection &intersection) const
Definition: dgfs.hh:64
MPIHelper::MPICommunicator MPICommunicatorType
Definition: dgfs.hh:31
static int refineStepsForHalf()
Definition: dgfs.hh:179
int id() const
Definition: boundarydom.hh:40
std::string type
type of additional boundary parameters
Definition: parser.hh:23
int corners() const
Return the number of corners of the reference element.
Definition: common/geometry.hh:142
FieldVector< ctype, cdim > GlobalCoordinate
type of the global coordinates
Definition: common/geometry.hh:104
Definition: boundarydom.hh:191
DGFGridFactory(std::istream &input, MPICommunicatorType comm=MPIHelper::getCommunicator())
Definition: dgfs.hh:39
bool haveBoundaryParameters() const
Definition: dgfs.hh:87
Wrapper class for entities.
Definition: common/entity.hh:61