1 #ifndef DUNE_FEM_BASESETLOCALKEYSTORAGE_HH 2 #define DUNE_FEM_BASESETLOCALKEYSTORAGE_HH 7 #include <dune/common/exceptions.hh> 10 #include <dune/geometry/type.hh> 11 #include <dune/geometry/typeindex.hh> 26 template<
class Entry >
35 virtual ~FactoryIF () {}
36 virtual Entry* getObject(
const GeometryType& geomType )
const = 0;
37 virtual void removeObjects( std::vector<Entry*>& entryStorage )
const = 0;
38 virtual FactoryIF* clone()
const = 0;
42 template <
class SingletonProv
ider>
43 class FactoryImpl :
public FactoryIF
48 Entry* getObject(
const GeometryType& geomType )
const 50 return & SingletonProvider :: getObject( geomType );
53 void removeObjects( std::vector<Entry*>& entryStorage )
const 55 const size_t size = entryStorage.size();
56 for(
size_t i=0; i<size; ++i )
58 if( entryStorage[ i ] )
60 SingletonProvider :: removeObject( *(entryStorage[ i ]) );
61 entryStorage[ i ] = 0 ;
66 virtual FactoryIF* clone()
const {
return new FactoryImpl<SingletonProvider> (); }
70 const FactoryIF* factory_;
72 std::vector< Entry* > entryStorage_;
85 : factory_( other.factory_ ? other.factory_->clone() : 0 )
86 , entryStorage_( other.entryStorage_.size(), ( Entry * ) 0 )
89 const size_t size = entryStorage_.size();
90 for(
size_t i=0; i<size; ++i )
92 Entry* otherEntry = other.entryStorage_[ i ];
97 entryStorage_[ i ] = factory_->getObject( otherEntry->type() );
104 : factory_( other.factory_ ),
105 entryStorage_(
std::
move( other.entryStorage_ ) )
107 other.factory_ =
nullptr;
108 other.entryStorage_.clear();
114 if( entryStorage_.size() > 0 )
116 factory_->removeObjects( entryStorage_ );
127 const size_t size = entryStorage_.size() ;
128 for(
size_t i=0; i<size; ++i)
130 if( entryStorage_[ i ] )
132 unsigned int enSize = entryStorage_[ i ]->size();
133 maxSize =
std::max( enSize , maxSize );
140 template <
class SingletonProv
ider>
141 bool insert(
const GeometryType geomType )
146 factory_ =
new FactoryImpl< SingletonProvider > ();
150 assert(
dynamic_cast< const FactoryImpl< SingletonProvider >*
> ( factory_ ) != 0 );
153 const size_t geomIndex =
index( geomType ) ;
155 if( entryStorage_.size() <= geomIndex )
156 entryStorage_.resize( geomIndex + 1, (Entry* ) 0 );
158 assert( geomIndex < entryStorage_.size() );
161 if( entryStorage_[ geomIndex ] == 0 )
163 entryStorage_[ geomIndex ] = factory_->getObject( geomType );
170 bool exists(
const GeometryType& geomType )
const 172 if(
index( geomType ) < static_cast< int >( entryStorage_.size() ) )
173 return (entryStorage_[
index( geomType ) ] != 0) ;
182 assert(
index( geomType ) < static_cast< int >( entryStorage_.size() ) );
183 assert( entryStorage_[
index( geomType ) ] != 0 );
184 return *( entryStorage_[
index( geomType ) ]);
187 int index(
const GeometryType& geomType )
const 189 return LocalGeometryTypeIndex::index( geomType );
197 template<
class CompiledLocalKey,
unsigned int minPolOrder,
unsigned int maxPolOrder >
211 enum { numOrders = maxPolOrder - minPolOrder + 1 };
227 return new CompiledLocalKeyType( type, pOrd );
237 static void apply( LocalKeyVectorType& compiledLocalKeys,
238 const GeometryType& geometryType )
240 const size_t k = pOrd ;
245 CompiledLocalKeySingletonProviderType;
248 compiledLocalKeys[ k - minPolOrder ].template insert< CompiledLocalKeySingletonProviderType > ( geometryType );
260 template <
class Gr
idPart>
262 : compiledLocalKeys_( numOrders )
264 typedef typename GridPart :: IndexSetType IndexSetType ;
265 typedef typename GridPart :: GridType GridType ;
266 const IndexSetType &indexSet = gridPart.indexSet();
270 const std :: vector< GeometryType >& geometryTypes
274 for(
unsigned int i = 0; i < geometryTypes.size(); ++i )
276 ForLoop< ConstructCompiledLocalKeys, minPolOrder, maxPolOrder > ::
277 apply( compiledLocalKeys_, geometryTypes[ i ] );
289 assert( order - minPolOrder >= 0 );
290 assert(
int( order - minPolOrder ) <
int( compiledLocalKeys_.size() ) );
291 return compiledLocalKeys_[ order - minPolOrder ];
301 inline const CompiledLocalKeyType &
compiledLocalKey(
const GeometryType& type,
const int order )
const 303 return compiledLocalKeys( order )[ type ];
311 #endif // DUNE_FEM_BASESETLOCALKEYSTORAGE_HH
unsigned int maxSize() const
Definition: basesetlocalkeystorage.hh:124
BaseSetLocalKeyStorage< CompiledLocalKeyType > LocalKeyStorageType
type of storage class for compiled local keys
Definition: basesetlocalkeystorage.hh:205
CompiledLocalKey CompiledLocalKeyType
Definition: basesetlocalkeystorage.hh:202
static constexpr T max(T a)
Definition: utility.hh:65
Singleton list for key/object pairs.
Definition: singletonlist.hh:49
static void deleteObject(CompiledLocalKeyType *obj)
delete BaseFunctionSet
Definition: basesetlocalkeystorage.hh:231
const LocalKeyStorageType & compiledLocalKeys(const int order) const
provide access to all compiled local keys for a given polynomial order
Definition: basesetlocalkeystorage.hh:287
static CompiledLocalKeyType * createObject(const GeometryType &type)
create new BaseFunctionSet
Definition: basesetlocalkeystorage.hh:225
bool exists(const GeometryType &geomType) const
return true if an entry for this geometry type exists
Definition: basesetlocalkeystorage.hh:170
Definition: basesetlocalkeystorage.hh:214
~BaseSetLocalKeyStorage()
destructor
Definition: basesetlocalkeystorage.hh:112
LocalKeyVectorType compiledLocalKeys_
Definition: basesetlocalkeystorage.hh:254
static void apply(LocalKeyVectorType &compiledLocalKeys, const GeometryType &geometryType)
Definition: basesetlocalkeystorage.hh:237
const CompiledLocalKeyType & compiledLocalKey(const GeometryType &type, const int order) const
provide access to the compiled local keys for a geometry type and polynomial order ...
Definition: basesetlocalkeystorage.hh:301
Definition: coordinate.hh:4
class for storage local keys for a given range of polynomial order and available geometry type ...
Definition: basesetlocalkeystorage.hh:198
BaseSetLocalKeyStorage(BaseSetLocalKeyStorage &&other)
move constructor
Definition: basesetlocalkeystorage.hh:103
BaseSetLocalKeyStorage(const BaseSetLocalKeyStorage &other)
copy constructor
Definition: basesetlocalkeystorage.hh:84
CompiledLocalKeyContainer(const GridPart &gridPart)
Definition: basesetlocalkeystorage.hh:261
default implementation uses method geomTypes of given index set. Used in DiscreteFunctionSpaces.
Definition: allgeomtypes.hh:89
void move(ArrayInterface< T > &array, const unsigned int oldOffset, const unsigned int newOffset, const unsigned int length)
Definition: array_inline.hh:38
const Entry & operator[](const GeometryType &geomType) const
access to stored entry with given geometry type
Definition: basesetlocalkeystorage.hh:179
CompiledLocalKeyFactory method createObject and deleteObject for the SingletonList.
Definition: basesetlocalkeystorage.hh:221
bool insert(const GeometryType geomType)
insert entry to storage for given geometry type
Definition: basesetlocalkeystorage.hh:141
const std::vector< GeometryType > & geomTypes(unsigned int codim) const
returns vector with geometry tpyes this index set has indices for
Definition: allgeomtypes.hh:145
BaseSetLocalKeyStorage()
Definition: basesetlocalkeystorage.hh:78
Entry value_type
Definition: basesetlocalkeystorage.hh:75
int index(const GeometryType &geomType) const
Definition: basesetlocalkeystorage.hh:187
std::vector< LocalKeyStorageType > LocalKeyVectorType
Definition: basesetlocalkeystorage.hh:208
storage class for base function set pointer and compiled local key pointers
Definition: basesetlocalkeystorage.hh:27