dune-grid  2.3.1
2d/bndprojection.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_ALU2D_BNDPROJECTION_HH
4 #define DUNE_ALU2D_BNDPROJECTION_HH
5 
7 
9 
10 namespace Dune
11 {
12 
13  template< class Grid >
15  : public ALU2DSPACE VtxProjection ALU2DDIMWORLD(Grid::dimensionworld,Grid::elementType)
16  {
17  typedef ALU2DSPACE VtxProjection ALU2DDIMWORLD (Grid::dimensionworld,Grid::elementType) Base;
18 
19  public:
20  enum { ncoord = Base::ncoord };
21 
22  typedef typename Base::hbndel_t hbndel_t;
23  typedef typename Base::helement_t helement_t;
24 
25  typedef typename Grid::DuneBoundaryProjectionType DuneBoundaryProjectionType;
26 
27  typedef typename DuneBoundaryProjectionType::CoordinateType CoordinateType;
28 
29  explicit ALU2dGridBoundaryProjection ( const Grid &grid )
30  : grid_( grid )
31  {}
32 
33  int operator() ( const hbndel_t *hbndel, const double local, double (&global)[ ncoord ] ) const
34  {
35  return callProjection( grid_.boundaryProjection( hbndel->segmentIndex() ), global );
36  }
37 
38  int operator() ( const helement_t *helement, const double (&local)[ 2 ], double (&global)[ ncoord ] ) const
39  {
40  return callProjection( grid_.globalProjection(), global );
41  }
42 
43  private:
44  static int callProjection ( const DuneBoundaryProjectionType *prj, double (&global)[ ncoord ] )
45  {
46  if( prj )
47  {
48  CoordinateType x, y;
49  for( int i = 0; i < ncoord; ++i )
50  x[ i ] = global[ i ];
51  y = (*prj)( x );
52  for( int i = 0; i < ncoord; ++i )
53  global[ i ] = y[ i ];
54  }
55  return 1;
56  }
57 
58  const Grid &grid_;
59  };
60 
61 } // end namespace Dune
62 
63 #endif // #ifndef DUNE_ALU2D_BNDPROJECTION_HH