1#ifndef DUNE_MMESH_MISC_PERSISTENTCONTAINER_HH
2#define DUNE_MMESH_MISC_PERSISTENTCONTAINER_HH
4#include <unordered_map>
5#include <dune/grid/utility/persistentcontainer.hh>
6#include <dune/grid/utility/persistentcontainermap.hh>
11 template<
class HostGr
id,
int dim,
class T >
12 class PersistentContainer< MMesh< HostGrid, dim >, T >
13 :
public Dune::PersistentContainerMap<
14 MMesh< HostGrid, dim >,
15 typename MMesh< HostGrid, dim >::LocalIdSet,
16 std::unordered_map< typename MMesh< HostGrid, dim >::LocalIdSet::IdType, T > >
18 typedef MMesh< HostGrid, dim > G;
19 typedef PersistentContainerMap< G, typename G::LocalIdSet, std::unordered_map< typename G::LocalIdSet::IdType, T > > Base;
20 typedef typename MMesh< HostGrid, dim >::LocalIdSet IdSet;
21 typedef std::unordered_map< typename MMesh< HostGrid, dim >::LocalIdSet::IdType, T > Map;
24 typedef typename Base::Grid Grid;
25 typedef typename Base::Value Value;
27 PersistentContainer (
const Grid &grid,
int codim,
const Value &value = Value() )
28 : Base( grid, codim, grid.localIdSet(), value )
31 using Base::codimension;
32 using Base::migrateLevel;
34 void resize (
const Value &value = Value() )
36 if( sequence_ != this->grid_->sequence() )
38 Hybrid::forEach( std::make_index_sequence< Grid::dimension+1 >{},
39 [ & ](
auto i ){
if( i == this->codimension() ) this->
template resize< i >( value ); } );
40 sequence_ = this->grid_->sequence();
45 void resize (
const Value &value )
47 std::integral_constant< bool, Capabilities::hasEntity< Grid, codim >::v > hasEntity;
48 assert( codim == codimension() );
51 if constexpr (codim == 0)
53 MMeshImpl::MultiId id ( { std::size_t(-4), std::size_t(-3), std::size_t(-2) } );
54 this->data_.insert( std::make_pair(
id, value ) );
58 if constexpr (codim == 1)
60 MMeshImpl::MultiId eid0 ( { std::size_t(-4), std::size_t(-3) } );
61 this->data_.insert( std::make_pair( eid0, value ) );
62 MMeshImpl::MultiId eid1 ( { std::size_t(-4), std::size_t(-2) } );
63 this->data_.insert( std::make_pair( eid1, value ) );
64 MMeshImpl::MultiId eid2 ( { std::size_t(-3), std::size_t(-2) } );
65 this->data_.insert( std::make_pair( eid2, value ) );
69 if constexpr (codim == dim)
71 MMeshImpl::MultiId vid0 ( std::size_t(-4) );
72 this->data_.insert( std::make_pair( vid0, value ) );
73 MMeshImpl::MultiId vid1 ( std::size_t(-3) );
74 this->data_.insert( std::make_pair( vid1, value ) );
75 MMeshImpl::MultiId vid2 ( std::size_t(-2) );
76 this->data_.insert( std::make_pair( vid2, value ) );
83 this->
template migrateLevel< codim >( 0, value, data, hasEntity );
91 template<
class MMesh,
class T >
92 class PersistentContainer< MMeshInterfaceGrid< MMesh >, T >
93 :
public Dune::PersistentContainerMap<
94 MMeshInterfaceGrid< MMesh >,
95 typename MMeshInterfaceGrid< MMesh >::LocalIdSet,
96 std::unordered_map< typename MMeshInterfaceGrid< MMesh >::LocalIdSet::IdType, T > >
98 typedef MMeshInterfaceGrid< MMesh > G;
99 typedef PersistentContainerMap< G, typename G::LocalIdSet, std::unordered_map< typename G::LocalIdSet::IdType, T > > Base;
100 typedef typename MMeshInterfaceGrid< MMesh >::LocalIdSet IdSet;
101 typedef std::unordered_map< typename MMeshInterfaceGrid< MMesh >::LocalIdSet::IdType, T > Map;
102 static constexpr int dim = MMesh::dimensionworld-1;
105 typedef typename Base::Grid Grid;
106 typedef typename Base::Value Value;
108 PersistentContainer (
const Grid &grid,
int codim,
const Value &value = Value() )
109 : Base( grid, codim, grid.localIdSet(), value )
112 using Base::codimension;
113 using Base::migrateLevel;
115 void resize (
const Value &value = Value() )
117 if( sequence_ != this->grid_->sequence() )
119 Hybrid::forEach( std::make_index_sequence< Grid::dimension+1 >{},
120 [ & ](
auto i ){
if( i == this->codimension() ) this->
template resize< i >( value ); } );
121 sequence_ = this->grid_->sequence();
125 template<
int codim >
126 void resize (
const Value &value )
128 std::integral_constant< bool, Capabilities::hasEntity< Grid, codim >::v > hasEntity;
129 assert( codim == codimension() );
132 if constexpr (codim == 0)
134 MMeshImpl::MultiId id ( { std::size_t(-3), std::size_t(-2)} );
135 this->data_.insert( std::make_pair(
id, value ) );
139 if constexpr (codim == dim)
141 MMeshImpl::MultiId vid0 ( std::size_t(-3) );
142 this->data_.insert( std::make_pair( vid0, value ) );
143 MMeshImpl::MultiId vid1 ( std::size_t(-2) );
144 this->data_.insert( std::make_pair( vid1, value ) );
151 this->
template migrateLevel< codim >( 0, value, data, hasEntity );