dune-grid  2.2.0
geometrygrid/datahandle.hh
Go to the documentation of this file.
00001 #ifndef DUNE_GEOGRID_DATAHANDLE_HH
00002 #define DUNE_GEOGRID_DATAHANDLE_HH
00003 
00004 #include <dune/common/typetraits.hh>
00005 
00006 #include <dune/grid/common/datahandleif.hh>
00007 #include <dune/grid/common/grid.hh>
00008 #include <dune/grid/geometrygrid/capabilities.hh>
00009 #include <dune/grid/geometrygrid/entity.hh>
00010 
00011 namespace Dune
00012 {
00013 
00014   namespace GeoGrid
00015   {
00016 
00017     template< int codim, class Grid >
00018     class EntityProxy
00019     {
00020       typedef typename remove_const< Grid >::type::Traits Traits;
00021 
00022       typedef typename Traits::template Codim< codim >::Entity Entity;
00023       typedef GeoGrid::Entity< codim, Traits::dimension, const Grid > EntityImpl;
00024       typedef typename EntityImpl::HostEntity HostEntity;
00025 
00026       template< bool >
00027       struct InitReal
00028       {
00029         static void apply ( EntityImpl &entityImpl, const HostEntity &hostEntity )
00030         {
00031           entityImpl.initialize( hostEntity );
00032         }
00033       };
00034 
00035       template< bool >
00036       struct InitFake
00037       {
00038         static void apply ( EntityImpl &entityImpl, const HostEntity &hostEntity )
00039         {
00040           DUNE_THROW( NotImplemented, "Host grid has no entities for codimension " << codim << "." );
00041         }
00042       };
00043 
00044       static const bool hasHostEntity = Capabilities::hasHostEntity< Grid, codim >::v;
00045       typedef typename SelectType< hasHostEntity, InitReal< true >, InitFake< false > >::Type Init;
00046 
00047     public:
00048       EntityProxy ( const Grid &grid, const HostEntity &hostEntity )
00049       : entity_( EntityImpl( grid ) )
00050       {
00051         Init::apply( Grid::getRealImplementation( entity_ ), hostEntity );
00052       }
00053 
00054       const Entity &operator* () const
00055       {
00056         return entity_;
00057       }
00058 
00059     private:
00060       Entity entity_;
00061     };
00062 
00063 
00064 
00065     // GeometryGridDataHandle
00066     // ----------------------
00067 
00068     template< class Grid, class WrappedHandle >
00069     class CommDataHandle
00070     : public CommDataHandleIF< CommDataHandle< Grid, WrappedHandle >, typename WrappedHandle::DataType >
00071     {
00072       typedef typename remove_const< Grid >::type::Traits Traits;
00073 
00074     public:
00075       CommDataHandle ( const Grid &grid, WrappedHandle &handle )
00076       : grid_( grid ),
00077         wrappedHandle_( handle )
00078       {}
00079 
00080       bool contains ( int dim, int codim ) const
00081       {
00082         const bool contains = wrappedHandle_.contains( dim, codim );
00083         if( contains )
00084           assertHostEntity( dim, codim );
00085         return contains;
00086       }
00087 
00088       bool fixedsize ( int dim, int codim ) const
00089       {
00090         return wrappedHandle_.fixedsize( dim, codim );
00091       }
00092 
00093       template< class HostEntity >
00094       size_t size ( const HostEntity &hostEntity ) const
00095       {
00096         EntityProxy< HostEntity::codimension, Grid > proxy( grid_, hostEntity );
00097         return wrappedHandle_.size( *proxy );
00098       }
00099 
00100       template< class MessageBuffer, class HostEntity >
00101       void gather ( MessageBuffer &buffer, const HostEntity &hostEntity ) const
00102       {
00103         EntityProxy< HostEntity::codimension, Grid > proxy( grid_, hostEntity );
00104         wrappedHandle_.gather( buffer, *proxy );
00105       }
00106 
00107       template< class MessageBuffer, class HostEntity >
00108       void scatter ( MessageBuffer &buffer, const HostEntity &hostEntity, size_t size )
00109       {
00110         EntityProxy< HostEntity::codimension, Grid > proxy( grid_, hostEntity );
00111         wrappedHandle_.scatter( buffer, *proxy, size );
00112       }
00113 
00114     private:
00115       static void assertHostEntity ( int dim, int codim )
00116       {
00117         if( !Capabilities::CodimCache< Grid >::hasHostEntity( codim ) )
00118           noEntity( codim );
00119       }
00120 
00121       static void noEntity ( int codim )
00122       {
00123         DUNE_THROW( NotImplemented, "Host grid has no entities for codimension " << codim << "." );
00124       }
00125 
00126       const Grid &grid_;
00127       WrappedHandle &wrappedHandle_;
00128     };
00129 
00130   } // namespace GeoGrid
00131 
00132 } // namespace Dune
00133 
00134 #endif // #ifndef DUNE_GEOGRID_DATAHANDLE_HH