3 #ifndef DUNE_DGF_GRIDPTR_HH
4 #define DUNE_DGF_GRIDPTR_HH
13 #include <type_traits>
17 #include <dune/common/parallel/mpihelper.hh>
18 #include <dune/common/shared_ptr.hh>
37 struct DGFGridFactory;
39 template<
class Gr
idImp,
class IntersectionImp >
59 template<
class Gr
idType >
64 typedef std::shared_ptr< GridType > base_t ;
66 typedef null_deleter< GridType > emptydeleter_t ;
71 if( use_count() == 1 )
75 if( grd )
delete grd ;
82 base_t :: operator = ( other );
86 using base_t :: swap ;
87 using base_t :: use_count ;
90 mygrid_ptr() : base_t( ( GridType * ) 0, emptydeleter_t() ) {}
94 explicit mygrid_ptr( GridType* grd ) : base_t( grd, emptydeleter_t() ) {}
109 GridType* grd = this->get();
110 base_t ptr(( GridType * ) 0, emptydeleter_t() );
120 explicit GridPtr (
const std::string &filename,
257 template <
class Entity>
264 template<
class Gr
idImp,
class IntersectionImp >
271 template <
class Entity>
274 typedef typename GridType::LevelGridView
GridView;
281 assert( (
unsigned int)gridView.
indexSet().index( entity ) <
elParam_.size() );
285 case GridType::dimension :
297 template<
class Gr
idImp,
class IntersectionImp >
327 template<
class Range >
330 return range.begin() == range.end();
337 const auto gridView =
gridPtr_->levelGridView( 0 );
338 const auto &indexSet = gridView.indexSet();
340 nofElParam_ = dgfFactory.template numParameters< 0 >();
341 nofVtxParam_ = dgfFactory.template numParameters< dimension >();
345 gridView.comm().max( nofParams.data(), nofParams.size() );
358 DUNE_THROW(
DGFException,
"Number of parameters differs between processes" );
363 bndId_.resize( indexSet.size( 1 ) );
371 std::swap(
elParam_[ indexSet.index( element ) ], dgfFactory.
parameter( element ) );
372 assert(
elParam_[ indexSet.index( element ) ].size() ==
static_cast< std::size_t
>(
nofElParam_ ) );
377 for(
unsigned int v = 0, n = element.subEntities(
dimension ); v < n; ++v )
379 const auto index = indexSet.subIndex( element, v,
dimension );
381 std::swap(
vtxParam_[ index ], dgfFactory.
parameter( element.template subEntity< dimension >( v ) ) );
386 if( element.hasBoundaryIntersections() )
388 for(
const auto &intersection : intersections( gridView, element ) )
391 if( !intersection.boundary() || intersection.type().isNone() )
394 const auto k = indexSet.subIndex( element, intersection.indexInInside(), 1 );
403 template <
class Entity>
406 const auto gridView =
gridPtr_->levelGridView( 0 );
411 if ( gridView.indexSet().index( entity ) >=
elParam_.size() )
412 elParam_.resize( gridView.indexSet().index( entity ) );
413 return elParam_[ gridView.indexSet().index( entity ) ];
416 case GridType::dimension :
418 if ( gridView.indexSet().index( entity ) >=
vtxParam_.size() )
419 vtxParam_.resize( gridView.indexSet().index( entity ) );
420 return vtxParam_[ gridView.indexSet().index( entity ) ];
439 : gridPtr_( gridPtr ), idSet_( gridPtr->localIdSet() )
441 const auto gridView = gridPtr_->levelGridView( 0 );
442 const auto &indexSet = gridView.indexSet();
447 std::swap( gridPtr_.
elParam_[ indexSet.index( element ) ], elData_[ idSet_.id( element ) ] );
451 for(
unsigned int v = 0, n = element.subEntities(
dimension ); v < n; ++v )
453 const auto index = indexSet.subIndex( element, v,
dimension );
454 if ( !gridPtr_.
vtxParam_[ index ].empty() )
455 std::swap( gridPtr_.
vtxParam_[ index ], vtxData_[ idSet_.subId( element, v,
dimension ) ] );
459 if( element.hasBoundaryIntersections() )
461 for(
const auto &intersection : intersections( gridView, element ) )
464 if( !intersection.boundary() || intersection.type().isNone() )
467 const int i = intersection.indexInInside();
468 auto &bndData = bndData_[ idSet_.subId( element, i, 1 ) ];
469 bndData.first = gridPtr_.
bndId_[ indexSet.subIndex( element, i, 1 ) ];
471 std::swap( bndData.second, gridPtr_.
bndParam_[ intersection.boundarySegmentIndex() ] );
482 const auto gridView = gridPtr_->levelGridView( 0 );
483 const auto &indexSet = gridView.indexSet();
486 gridPtr_.
elParam_.resize( indexSet.size( 0 ) );
494 std::swap( gridPtr_.
elParam_[ indexSet.index( element ) ], elData_[ idSet_.id( element ) ] );
495 assert( gridPtr_.
elParam_[ indexSet.index( element ) ].size() ==
static_cast< std::size_t
>( gridPtr_.
nofElParam_ ) );
500 for(
unsigned int v = 0; v < element.subEntities(
dimension ); ++v )
502 const auto index = indexSet.subIndex( element, v,
dimension );
503 if( gridPtr_.
vtxParam_[ index ].empty() )
504 std::swap( gridPtr_.
vtxParam_[ index ], vtxData_[ idSet_.subId( element, v,
dimension ) ] );
509 if( element.hasBoundaryIntersections() )
511 for(
const auto &intersection : intersections( gridView, element ) )
514 if( !intersection.boundary() || intersection.type().isNone() )
517 const int i = intersection.indexInInside();
518 auto &bndData = bndData_[ idSet_.subId( element, i, 1 ) ];
519 gridPtr_.
bndId_[ indexSet.subIndex( element, i, 1 ) ] = bndData.first;
521 std::swap( bndData.second, gridPtr_.
bndParam_[ intersection.boundarySegmentIndex() ] );
536 bool fixedSize (
int dim,
int codim)
const {
return false; }
538 template<
class Entity >
541 std::size_t
size = 0;
546 assert( elData_[ idSet_.id( entity ) ].size() ==
static_cast< std::size_t
>( gridPtr_.
nofElParam_ ) );
547 for(
double &v : elData_[ idSet_.id( entity ) ] )
548 size += dataSize( v );
553 assert( vtxData_[ idSet_.id( entity ) ].size() ==
static_cast< std::size_t
>( gridPtr_.
nofVtxParam_ ) );
554 for(
double &v : vtxData_[ idSet_.id( entity ) ] )
555 size += dataSize( v );
560 const auto bndData = bndData_.find( idSet_.id( entity ) );
561 if( bndData != bndData_.end() )
562 size += dataSize( bndData->second.first ) + dataSize( bndData->second.second );
568 template<
class Buffer,
class Entity >
574 assert( elData_[ idSet_.id( entity ) ].size() ==
static_cast< std::size_t
>( gridPtr_.
nofElParam_ ) );
575 for(
double &v : elData_[ idSet_.id( entity ) ] )
581 assert( vtxData_[ idSet_.id( entity ) ].size() ==
static_cast< std::size_t
>( gridPtr_.
nofVtxParam_ ) );
582 for(
double &v : vtxData_[ idSet_.id( entity ) ] )
588 const auto bndData = bndData_.find( idSet_.id( entity ) );
589 if( bndData != bndData_.end() )
591 write( buffer, bndData->second.first );
592 write( buffer, bndData->second.second );
597 template<
class Buffer,
class Entity >
603 auto &p = elData_[ idSet_.id( entity ) ];
606 read( buffer, v, n );
611 auto &p = vtxData_[ idSet_.id( entity ) ];
614 read( buffer, v, n );
619 auto &bndData = bndData_[ idSet_.id( entity ) ];
620 read( buffer, bndData.first, n );
621 read( buffer, bndData.second, n );
629 static std::enable_if_t< std::is_trivially_copyable< T >::value, std::size_t > dataSize (
const T &value )
634 static std::size_t dataSize (
const std::string &s )
636 return dataSize( s.size() ) + s.size();
639 template<
class Buffer,
class T >
640 static std::enable_if_t< std::is_trivially_copyable< T >::value > write ( Buffer &buffer,
const T &value )
642 std::array< char,
sizeof( T ) > bytes;
643 std::memcpy( bytes.data(), &value,
sizeof( T ) );
644 for(
char &b : bytes )
648 template<
class Buffer >
649 static void write ( Buffer &buffer,
const std::string &s )
651 write( buffer, s.size() );
652 for(
const char &c : s )
656 template<
class Buffer,
class T >
657 static std::enable_if_t< std::is_trivially_copyable< T >::value > read ( Buffer &buffer, T &value, std::size_t &n )
659 assert( n >=
sizeof( T ) );
662 std::array< char,
sizeof( T ) > bytes;
663 for(
char &b : bytes )
665 std::memcpy( &value, bytes.data(),
sizeof( T ) );
668 template<
class Buffer >
669 static void read ( Buffer &buffer, std::string &s, std::size_t &n )
672 read( buffer,
size, n );
683 const typename GridType::LocalIdSet &idSet_;
684 mutable std::map< typename GridType::LocalIdSet::IdType, std::vector< double > > elData_, vtxData_;
685 mutable std::map< typename GridType::LocalIdSet::IdType, std::pair< int, DGFBoundaryParameter::type > > bndData_;