1 #ifndef DUNE_DGF_GRIDPTR_HH
2 #define DUNE_DGF_GRIDPTR_HH
12 #include <dune/common/mpihelper.hh>
27 struct DGFGridFactory;
29 template<
class Gr
idImp,
template <
class >
class IntersectionImp >
44 template<
class Gr
idType >
51 explicit GridPtr (
const std::string &filename,
142 gridPtr_ = std::auto_ptr<GridType>(grd);
190 template <
class Entity>
197 template<
class Gr
idImp,
template<
class >
class IntersectionImp >
204 template <
class Entity>
207 typedef typename GridType::LevelGridView
GridView;
208 GridView gridView =
gridPtr_->levelView( 0 );
214 assert( (
unsigned int)gridView.
indexSet().index( entity ) <
elParam_.size() );
218 case GridType::dimension:
230 template<
class Gr
idImp,
template<
class >
class IntersectionImp >
247 if (
gridPtr_->comm().max( params ) > 0 )
261 gridPtr_ = std::auto_ptr< GridType >( dgfFactory.
grid() );
263 typedef typename GridType::LevelGridView
GridView;
264 GridView gridView =
gridPtr_->levelView( 0 );
267 nofElParam_ = dgfFactory.template numParameters< 0 >();
268 nofVtxParam_ = dgfFactory.template numParameters< dimension >();
272 elParam_.resize( indexSet.size(0) );
273 if ( nofVtxParam_ > 0 )
275 bndId_.resize( indexSet.size(1) );
280 typedef typename GridView::template Codim< 0 >::template Partition< partType >::Iterator Iterator;
281 const Iterator enditer = gridView.template end< 0, partType >();
282 for( Iterator iter = gridView.template begin< 0, partType >(); iter != enditer; ++iter )
284 const typename Iterator::Entity &el = *iter;
289 if ( nofVtxParam_ > 0 )
291 for (
int v = 0; v < el.template count<dimension>(); ++v)
293 typename GridView::IndexSet::IndexType index = indexSet.subIndex(el,v,
dimension);
295 std::swap(
vtxParam_[ index ], dgfFactory.
parameter(*el.template subEntity<dimension>(v) ) );
296 assert(
vtxParam_[ index ].size() == (
size_t)nofVtxParam_ );
299 if ( el.hasBoundaryIntersections() )
302 const IntersectionIterator iend = gridView.
iend(el);
303 for( IntersectionIterator iiter = gridView.
ibegin(el); iiter != iend; ++iiter )
319 template <
class Entity>
322 typedef typename GridType::LevelGridView
GridView;
323 GridView gridView =
gridPtr_->levelView( 0 );
333 case GridType::dimension:
356 idSet_(gridPtr->localIdSet())
358 typedef typename GridType::LevelGridView
GridView;
359 GridView gridView = gridPtr_->levelView( 0 );
363 typedef typename GridView::template Codim< 0 >::template Partition< partType >::Iterator Iterator;
364 const Iterator enditer = gridView.template end< 0, partType >();
365 for( Iterator iter = gridView.template begin< 0, partType >(); iter != enditer; ++iter )
367 const typename Iterator::Entity &el = *iter;
369 std::swap( gridPtr_.
elParam_[ indexSet.index(el) ], elData_[ idSet_.id(el) ] );
372 for (
int v = 0; v < el.template count<dimension>(); ++v)
374 typename GridView::IndexSet::IndexType index = indexSet.subIndex(el,v,
dimension);
375 if ( ! gridPtr_.
vtxParam_[ index ].empty() )
384 typedef typename GridType::LevelGridView
GridView;
385 GridView gridView = gridPtr_->levelView( 0 );
389 gridPtr_.
elParam_.resize( indexSet.size(0) );
394 typedef typename GridView::template Codim< 0 >::template Partition< partType >::Iterator Iterator;
395 const Iterator enditer = gridView.template end< 0, partType >();
396 for( Iterator iter = gridView.template begin< 0, partType >(); iter != enditer; ++iter )
398 const typename Iterator::Entity &el = *iter;
401 std::swap( gridPtr_.
elParam_[ indexSet.index(el) ], elData_[ idSet_.id(el) ] );
402 assert( gridPtr_.
elParam_[ indexSet.index(el) ].size() == (
unsigned int)gridPtr_.
nofElParam_ );
406 for (
int v = 0; v < el.template count<dimension>(); ++v)
408 typename GridView::IndexSet::IndexType index = indexSet.subIndex(el,v,
dimension);
409 if ( gridPtr_.
vtxParam_[ index ].empty() )
424 return (codim==dim || codim==0);
432 template<
class EntityType>
433 size_t size (
const EntityType& e)
const
438 template<
class MessageBufferImp,
class EntityType>
439 void gather (MessageBufferImp& buff,
const EntityType& e)
const
441 const std::vector<double> &v = (e.codimension==0)? elData_[idSet_.id(e)]:vtxData_[idSet_.id(e)];
442 const size_t s = v.size();
443 for (
size_t i=0;i<s;++i)
445 assert( s == (
size_t)gridPtr_.
nofParameters(e.codimension) );
448 template<
class MessageBufferImp,
class EntityType>
449 void scatter (MessageBufferImp& buff,
const EntityType& e,
size_t n)
451 std::vector<double> &v = (e.codimension==0)? elData_[idSet_.id(e)]:vtxData_[idSet_.id(e)];
454 for (
size_t i=0;i<n;++i)
459 typedef typename GridType::LocalIdSet
IdSet;
462 mutable std::map< typename IdSet::IdType, std::vector<double> > elData_, vtxData_;