3 #ifndef DUNE_DGF_GRIDPTR_HH
4 #define DUNE_DGF_GRIDPTR_HH
14 #include <dune/common/shared_ptr.hh>
15 #include <dune/common/parallel/mpihelper.hh>
32 struct DGFGridFactory;
34 template<
class Gr
idImp,
class IntersectionImp >
54 template<
class Gr
idType >
59 typedef shared_ptr< GridType > base_t ;
61 typedef null_deleter< GridType > emptydeleter_t ;
66 if( use_count() == 1 )
70 if( grd )
delete grd ;
81 using base_t :: swap ;
82 using base_t :: use_count ;
85 mygrid_ptr() : base_t( ( GridType * ) 0, emptydeleter_t() ) {}
89 explicit mygrid_ptr( GridType* grd ) : base_t( grd, emptydeleter_t() ) {}
104 GridType* grd = this->
get();
105 base_t ptr(( GridType * ) 0, emptydeleter_t() );
115 explicit GridPtr (
const std::string &filename,
252 template <
class Entity>
259 template<
class Gr
idImp,
class IntersectionImp >
266 template <
class Entity>
269 typedef typename GridType::LevelGridView
GridView;
270 GridView gridView =
gridPtr_->levelGridView( 0 );
276 assert( (
unsigned int)gridView.
indexSet().index( entity ) <
elParam_.size() );
280 case GridType::dimension :
292 template<
class Gr
idImp,
class IntersectionImp >
309 if (
gridPtr_->comm().max( params ) > 0 )
325 typedef typename GridType::LevelGridView
GridView;
326 GridView gridView =
gridPtr_->levelGridView( 0 );
329 nofElParam_ = dgfFactory.template numParameters< 0 >();
330 nofVtxParam_ = dgfFactory.template numParameters< dimension >();
334 elParam_.resize( indexSet.size(0) );
335 if ( nofVtxParam_ > 0 )
337 bndId_.resize( indexSet.size(1) );
342 typedef typename GridView::template Codim< 0 >::template Partition< partType >::Iterator Iterator;
343 const Iterator enditer = gridView.template end< 0, partType >();
344 for( Iterator iter = gridView.template begin< 0, partType >(); iter != enditer; ++iter )
346 const typename Iterator::Entity &el = *iter;
351 if ( nofVtxParam_ > 0 )
353 for (
int v = 0; v < el.template count<dimension>(); ++v)
355 typename GridView::IndexSet::IndexType index = indexSet.subIndex(el,v,
dimension);
357 std::swap(
vtxParam_[ index ], dgfFactory.
parameter(*el.template subEntity<dimension>(v) ) );
358 assert(
vtxParam_[ index ].size() == (
size_t)nofVtxParam_ );
361 if ( el.hasBoundaryIntersections() )
364 const IntersectionIterator iend = gridView.
iend(el);
365 for( IntersectionIterator iiter = gridView.
ibegin(el); iiter != iend; ++iiter )
381 template <
class Entity>
384 typedef typename GridType::LevelGridView
GridView;
385 GridView gridView =
gridPtr_->levelGridView( 0 );
395 case GridType::dimension :
418 idSet_(gridPtr->localIdSet())
420 typedef typename GridType::LevelGridView
GridView;
421 GridView gridView = gridPtr_->levelGridView( 0 );
425 typedef typename GridView::template Codim< 0 >::template Partition< partType >::Iterator Iterator;
426 const Iterator enditer = gridView.template end< 0, partType >();
427 for( Iterator iter = gridView.template begin< 0, partType >(); iter != enditer; ++iter )
429 const typename Iterator::Entity &el = *iter;
431 std::swap( gridPtr_.
elParam_[ indexSet.index(el) ], elData_[ idSet_.id(el) ] );
434 for (
int v = 0; v < el.template count<dimension>(); ++v)
436 typename GridView::IndexSet::IndexType index = indexSet.subIndex(el,v,
dimension);
437 if ( ! gridPtr_.
vtxParam_[ index ].empty() )
446 typedef typename GridType::LevelGridView
GridView;
447 GridView gridView = gridPtr_->levelGridView( 0 );
451 gridPtr_.
elParam_.resize( indexSet.size(0) );
456 typedef typename GridView::template Codim< 0 >::template Partition< partType >::Iterator Iterator;
457 const Iterator enditer = gridView.template end< 0, partType >();
458 for( Iterator iter = gridView.template begin< 0, partType >(); iter != enditer; ++iter )
460 const typename Iterator::Entity &el = *iter;
463 std::swap( gridPtr_.
elParam_[ indexSet.index(el) ], elData_[ idSet_.id(el) ] );
464 assert( gridPtr_.
elParam_[ indexSet.index(el) ].size() == (
unsigned int)gridPtr_.
nofElParam_ );
468 for (
int v = 0; v < el.template count<dimension>(); ++v)
470 typename GridView::IndexSet::IndexType index = indexSet.subIndex(el,v,
dimension);
471 if ( gridPtr_.
vtxParam_[ index ].empty() )
486 return (codim==dim || codim==0);
494 template<
class EntityType>
495 size_t size (
const EntityType& e)
const
500 template<
class MessageBufferImp,
class EntityType>
501 void gather (MessageBufferImp& buff,
const EntityType& e)
const
503 const std::vector<double> &v = (e.codimension==0) ? elData_[idSet_.id(e)] : vtxData_[idSet_.id(e)];
504 const size_t s = v.size();
505 for (
size_t i=0; i<s; ++i)
507 assert( s == (
size_t)gridPtr_.
nofParameters(e.codimension) );
510 template<
class MessageBufferImp,
class EntityType>
511 void scatter (MessageBufferImp& buff,
const EntityType& e,
size_t n)
513 std::vector<double> &v = (e.codimension==0) ? elData_[idSet_.id(e)] : vtxData_[idSet_.id(e)];
516 for (
size_t i=0; i<n; ++i)
521 typedef typename GridType::LocalIdSet
IdSet;
524 mutable std::map< typename IdSet::IdType, std::vector<double> > elData_, vtxData_;