3 #ifndef DUNE_DGF_GRIDPTR_HH
4 #define DUNE_DGF_GRIDPTR_HH
14 #include <type_traits>
18 #include <dune/common/parallel/mpihelper.hh>
19 #include <dune/common/shared_ptr.hh>
40 struct DGFGridFactory;
42 template<
class Gr
idImp,
class IntersectionImp >
62 template<
class Gr
idType >
67 typedef std::shared_ptr< GridType > base_t ;
69 typedef null_deleter< GridType > emptydeleter_t ;
74 if( use_count() == 1 )
78 if( grd )
delete grd ;
85 base_t :: operator = ( other );
89 using base_t :: swap ;
90 using base_t :: use_count ;
93 mygrid_ptr() : base_t( ( GridType * ) 0, emptydeleter_t() ) {}
97 explicit mygrid_ptr( GridType* grd ) : base_t( grd, emptydeleter_t() ) {}
112 GridType* grd = this->get();
113 base_t ptr(( GridType * ) 0, emptydeleter_t() );
123 auto extpos = filename.find_last_of(
".");
125 if( extpos != std::string::npos)
126 ext = filename.substr( extpos + 1 );
129 for(
auto& item : ext )
130 item = std::tolower( item );
135 void readGmsh(
const std::string& filename, std::integral_constant< bool, true > )
138 std::vector<int> boundaryIDs;
139 std::vector<int> elementsIDs;
141 initialize( gridFactory, boundaryIDs,elementsIDs);
145 void readGmsh(
const std::string& filename, std::integral_constant< bool, false > )
147 DUNE_THROW(
GridError,
"GmshReader requires dimWorld <= 3." );
156 explicit GridPtr (
const std::string &filename,
170 if( fileExt ==
"dgf" )
175 else if( fileExt ==
"msh" )
178 readGmsh( filename, std::integral_constant<
bool, GridType::dimensionworld <= 3 > () );
180 else if( fileExt ==
"amc" || fileExt ==
"2d" || fileExt ==
"3d" )
183 DUNE_THROW( NotImplemented,
"GridPtr: file format '" << fileExt <<
"' not supported yet!" );
185 else if( fileExt ==
"vtu" )
188 DUNE_THROW( NotImplemented,
"GridPtr: file format '" << fileExt <<
"' not supported yet!" );
192 DUNE_THROW( NotImplemented,
"GridPtr: file format '" << fileExt <<
"' not supported yet!" );
308 template <
class Entity>
315 template<
class Gr
idImp,
class IntersectionImp >
322 template <
class Entity>
325 typedef typename GridType::LevelGridView
GridView;
332 assert( (
unsigned int)gridView.
indexSet().index( entity ) <
elParam_.size() );
336 case GridType::dimension :
348 template<
class Gr
idImp,
class IntersectionImp >
378 template<
class Range >
381 return range.begin() == range.end();
388 const auto gridView =
gridPtr_->levelGridView( 0 );
389 const auto &indexSet = gridView.indexSet();
391 nofElParam_ = dgfFactory.template numParameters< 0 >();
392 nofVtxParam_ = dgfFactory.template numParameters< dimension >();
396 gridView.comm().max( nofParams.data(), nofParams.size() );
409 DUNE_THROW(
DGFException,
"Number of parameters differs between processes" );
414 bndId_.resize( indexSet.size( 1 ) );
422 std::swap(
elParam_[ indexSet.index( element ) ], dgfFactory.
parameter( element ) );
423 assert(
elParam_[ indexSet.index( element ) ].size() ==
static_cast< std::size_t
>(
nofElParam_ ) );
428 for(
unsigned int v = 0, n = element.subEntities(
dimension ); v < n; ++v )
430 const auto index = indexSet.subIndex( element, v,
dimension );
432 std::swap(
vtxParam_[ index ], dgfFactory.
parameter( element.template subEntity< dimension >( v ) ) );
437 if( element.hasBoundaryIntersections() )
439 for(
const auto &intersection : intersections( gridView, element ) )
442 if( !intersection.boundary() || intersection.type().isNone() )
445 const auto k = indexSet.subIndex( element, intersection.indexInInside(), 1 );
455 std::vector<int>& boundaryIds,
456 std::vector<int>& elementIds )
460 const auto& gridView =
gridPtr_->leafGridView();
461 const auto& indexSet = gridView.indexSet();
468 gridView.comm().max( nofParams.data(), nofParams.size() );
480 if(!boundaryIds.empty() || !elementIds.empty() )
483 elParam_.resize( elementIds.size(), std::vector<double>(1) );
484 for(
const auto& entity : elements( gridView ))
489 for(
const auto& intersection : intersections( gridView,entity) )
491 if(intersection.boundary())
494 bndParam_[intersection.boundarySegmentIndex()] = std::to_string(boundaryIds[factory.
insertionIndex(intersection)]);
502 template <
class Entity>
505 const auto gridView =
gridPtr_->levelGridView( 0 );
510 if ( gridView.indexSet().index( entity ) >=
elParam_.size() )
511 elParam_.resize( gridView.indexSet().index( entity ) );
512 return elParam_[ gridView.indexSet().index( entity ) ];
515 case GridType::dimension :
517 if ( gridView.indexSet().index( entity ) >=
vtxParam_.size() )
518 vtxParam_.resize( gridView.indexSet().index( entity ) );
519 return vtxParam_[ gridView.indexSet().index( entity ) ];
538 : gridPtr_( gridPtr ), idSet_( gridPtr->localIdSet() )
540 const auto gridView = gridPtr_->levelGridView( 0 );
541 const auto &indexSet = gridView.indexSet();
546 std::swap( gridPtr_.
elParam_[ indexSet.index( element ) ], elData_[ idSet_.id( element ) ] );
550 for(
unsigned int v = 0, n = element.subEntities(
dimension ); v < n; ++v )
552 const auto index = indexSet.subIndex( element, v,
dimension );
553 if ( !gridPtr_.
vtxParam_[ index ].empty() )
554 std::swap( gridPtr_.
vtxParam_[ index ], vtxData_[ idSet_.subId( element, v,
dimension ) ] );
558 if( element.hasBoundaryIntersections() )
560 for(
const auto &intersection : intersections( gridView, element ) )
563 if( !intersection.boundary() || intersection.type().isNone() )
566 const int i = intersection.indexInInside();
567 auto &bndData = bndData_[ idSet_.subId( element, i, 1 ) ];
568 bndData.first = gridPtr_.
bndId_[ indexSet.subIndex( element, i, 1 ) ];
570 std::swap( bndData.second, gridPtr_.
bndParam_[ intersection.boundarySegmentIndex() ] );
581 const auto gridView = gridPtr_->levelGridView( 0 );
582 const auto &indexSet = gridView.indexSet();
585 gridPtr_.
elParam_.resize( indexSet.size( 0 ) );
588 gridPtr_.
bndId_.resize( indexSet.size( 1 ) );
590 gridPtr_.
bndParam_.resize( gridPtr_->numBoundarySegments() );
596 std::swap( gridPtr_.
elParam_[ indexSet.index( element ) ], elData_[ idSet_.id( element ) ] );
597 assert( gridPtr_.
elParam_[ indexSet.index( element ) ].size() ==
static_cast< std::size_t
>( gridPtr_.
nofElParam_ ) );
602 for(
unsigned int v = 0; v < element.subEntities(
dimension ); ++v )
604 const auto index = indexSet.subIndex( element, v,
dimension );
605 if( gridPtr_.
vtxParam_[ index ].empty() )
606 std::swap( gridPtr_.
vtxParam_[ index ], vtxData_[ idSet_.subId( element, v,
dimension ) ] );
611 if( element.hasBoundaryIntersections() )
613 for(
const auto &intersection : intersections( gridView, element ) )
616 if( !intersection.boundary() || intersection.type().isNone() )
619 const int i = intersection.indexInInside();
620 auto &bndData = bndData_[ idSet_.subId( element, i, 1 ) ];
621 gridPtr_.
bndId_[ indexSet.subIndex( element, i, 1 ) ] = bndData.first;
623 std::swap( bndData.second, gridPtr_.
bndParam_[ intersection.boundarySegmentIndex() ] );
638 bool fixedSize (
int dim,
int codim)
const {
return false; }
640 template<
class Entity >
643 std::size_t
size = 0;
648 assert( elData_[ idSet_.id( entity ) ].size() ==
static_cast< std::size_t
>( gridPtr_.
nofElParam_ ) );
649 for(
double &v : elData_[ idSet_.id( entity ) ] )
650 size += dataSize( v );
655 assert( vtxData_[ idSet_.id( entity ) ].size() ==
static_cast< std::size_t
>( gridPtr_.
nofVtxParam_ ) );
656 for(
double &v : vtxData_[ idSet_.id( entity ) ] )
657 size += dataSize( v );
662 const auto bndData = bndData_.find( idSet_.id( entity ) );
663 if( bndData != bndData_.end() )
664 size += dataSize( bndData->second.first ) + dataSize( bndData->second.second );
670 template<
class Buffer,
class Entity >
676 assert( elData_[ idSet_.id( entity ) ].size() ==
static_cast< std::size_t
>( gridPtr_.
nofElParam_ ) );
677 for(
double &v : elData_[ idSet_.id( entity ) ] )
683 assert( vtxData_[ idSet_.id( entity ) ].size() ==
static_cast< std::size_t
>( gridPtr_.
nofVtxParam_ ) );
684 for(
double &v : vtxData_[ idSet_.id( entity ) ] )
690 const auto bndData = bndData_.find( idSet_.id( entity ) );
691 if( bndData != bndData_.end() )
693 write( buffer, bndData->second.first );
694 write( buffer, bndData->second.second );
699 template<
class Buffer,
class Entity >
705 auto &p = elData_[ idSet_.id( entity ) ];
708 read( buffer, v, n );
713 auto &p = vtxData_[ idSet_.id( entity ) ];
716 read( buffer, v, n );
721 auto &bndData = bndData_[ idSet_.id( entity ) ];
722 read( buffer, bndData.first, n );
723 read( buffer, bndData.second, n );
731 static std::enable_if_t< std::is_trivially_copyable< T >::value, std::size_t > dataSize (
const T &value )
736 static std::size_t dataSize (
const std::string &s )
738 return dataSize( s.size() ) + s.size();
741 template<
class Buffer,
class T >
742 static std::enable_if_t< std::is_trivially_copyable< T >::value > write ( Buffer &buffer,
const T &value )
744 std::array< char,
sizeof( T ) > bytes;
745 std::memcpy( bytes.data(), &value,
sizeof( T ) );
746 for(
char &b : bytes )
750 template<
class Buffer >
751 static void write ( Buffer &buffer,
const std::string &s )
753 write( buffer, s.size() );
754 for(
const char &c : s )
758 template<
class Buffer,
class T >
759 static std::enable_if_t< std::is_trivially_copyable< T >::value > read ( Buffer &buffer, T &value, std::size_t &n )
761 assert( n >=
sizeof( T ) );
764 std::array< char,
sizeof( T ) > bytes;
765 for(
char &b : bytes )
767 std::memcpy( &value, bytes.data(),
sizeof( T ) );
770 template<
class Buffer >
771 static void read ( Buffer &buffer, std::string &s, std::size_t &n )
774 read( buffer,
size, n );
785 const typename GridType::LocalIdSet &idSet_;
786 mutable std::map< typename GridType::LocalIdSet::IdType, std::vector< double > > elData_, vtxData_;
787 mutable std::map< typename GridType::LocalIdSet::IdType, std::pair< int, DGFBoundaryParameter::type > > bndData_;