dune-grid
2.2.0
|
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