dune-fem 2.8.0
Loading...
Searching...
No Matches
cacheprovider.hh
Go to the documentation of this file.
1#ifndef DUNE_FEM_CACHEPROVIDER_HH
2#define DUNE_FEM_CACHEPROVIDER_HH
3
4#include <vector>
5#include <map>
6#include <type_traits>
7
8#include <dune/common/math.hh>
9
12
13#include "pointmapper.hh"
14#include "twistprovider.hh"
15#include "pointprovider.hh"
16
17namespace Dune
18{
19
20 namespace Fem
21 {
22
24 template <class ct, int dim, bool hasTwists>
26
27
28
30 //---------------------------------------------------------------
31
32 template <class ct, int dim>
33 class CacheStorage<ct, dim, true>
34 {
35 private:
37
38 public:
41
42 public:
43 CacheStorage(int numFaces, int maxTwist) :
44 mappers_(numFaces)
45 {
46 for (MapperIteratorType it = mappers_.begin();
47 it != mappers_.end(); ++it)
48 {
49 it->resize(maxTwist + Traits::twistOffset_);
50 }
51 }
52
53 CacheStorage(const CacheStorage& other) :
54 mappers_(other.mappers_)
55 {}
56
57 void addMapper(const MapperType& faceMapper,
58 const MapperType& interpolMapper,
59 const MapperType& twistMapper,
60 int faceIndex, int faceTwist)
61 {
62 assert(twistMapper.size() == faceMapper.size());
63
64 MapperPairType& mapper =
65 mappers_[faceIndex][faceTwist + Traits::twistOffset_];
66 const size_t size = twistMapper.size();
67 mapper.first.resize( size );
68 for (size_t i = 0; i < size; ++i)
69 {
70 mapper.first[i] = faceMapper[twistMapper[i]];
71 }
72
73 if( !interpolMapper.empty() )
74 {
75 assert(twistMapper.size() == interpolMapper.size());
76 mapper.second.resize( twistMapper.size() );
77
78 for (size_t i = 0; i < size; ++i) {
79 mapper.second[i] = interpolMapper[twistMapper[i]];
80 }
81 }
82 }
83
84 const MapperPairType& getMapper(int faceIndex, int faceTwist) const
85 {
86 assert( faceTwist + Traits::twistOffset_ >= 0 );
87 return mappers_[faceIndex][faceTwist + Traits::twistOffset_];
88 }
89
90 private:
91 typedef std::vector< std::vector< MapperPairType > > MapperContainerType;
92 typedef typename MapperContainerType::iterator MapperIteratorType;
93
94 private:
95 MapperContainerType mappers_;
96 };
97
98
99
101 //-------------------------------------------------------------------
102
103 template <class ct, int dim>
104 class CacheStorage<ct, dim, false>
105 {
106 private:
108
109 public:
112
113 public:
114 explicit CacheStorage ( int numFaces )
115 : mappers_( numFaces )
116 {}
117
118 CacheStorage ( const CacheStorage &other )
119 : mappers_( other.mappers_ )
120 {}
121
122 void addMapper ( const MapperType &mapper,
123 const MapperType &interpolMapper,
124 int faceIndex )
125 {
126 assert( (faceIndex >= 0) && (faceIndex < (int)mappers_.size()) );
127 mappers_[ faceIndex ].first = mapper;
128 if( !interpolMapper.empty() )
129 {
130 assert( interpolMapper.size() == mapper.size() );
131 mappers_[ faceIndex ].second = interpolMapper;
132 }
133 }
134
135 const MapperPairType &getMapper ( int faceIndex, int faceTwist ) const
136 {
137#ifndef NDEBUG
138 if( faceIndex >= (int)mappers_.size() )
139 std::cerr << "Error: faceIndex = " << faceIndex << " >= " << mappers_.size() << " = mappers_.size()" << std::endl;
140#endif
141 assert( (faceIndex >= 0) && (faceIndex < (int)mappers_.size()) );
142 return mappers_[ faceIndex ];
143 }
144
145 private:
146 typedef typename std::vector< MapperPairType > MapperContainerType;
147
148 private:
149 MapperContainerType mappers_;
150 };
151
152
153 // CacheProvider
154 // -------------
155
156 template< class GridPart, int codim >
158
159 template <class GridPart>
160 class CacheProvider<GridPart, 0>
161 {
162 private:
163 static const int codim = 0;
164 static const int dim = GridPart::dimension;
165 typedef typename GridPart::ctype ct;
167
168 public:
170
171 public:
172 template <class QuadratureImpl>
173 static void registerQuadrature(const QuadratureImpl& quad) {
174 // get quadrature implementation
176 }
177 };
178
179 template <class GridPart>
180 class CacheProvider<GridPart, 1>
181 {
183
184 static const int codim = 1;
185 static const int dim = GridPart::dimension;
186 typedef typename GridPart::ctype ct;
187 typedef CachingTraits<ct, dim-codim> Traits;
188
189 // true if grid could have twists
190 static const bool hasTwists = ! Dune::Fem::GridPartCapabilities::isCartesian<GridPart>::v ;
191 public:
195
196 typedef std::pair< MapperType, MapperType > MapperPairType;
197
198 public:
199 template <class QuadratureImpl>
200 static const MapperPairType& getMapper(const QuadratureImpl& quadImpl,
201 GeometryType elementGeometry,
202 int faceIndex,
203 int faceTwist)
204 {
205 // get quadrature implementation
206 const QuadratureType& quad = quadImpl.ipList();
207
208 // create key
209 const QuadratureKeyType key (elementGeometry, quad.id() );
210
211 MapperContainerType& mappers_ = mappers();
212 MapperIteratorType it = mappers_.find( key );
213
214 if( it == mappers_.end() )
215 {
216 std::integral_constant< bool, hasTwists > i2t;
217 it = CacheProvider<GridPart, 1>::createMapper( quad, elementGeometry, i2t );
218 }
219
220 return it->second.getMapper(faceIndex, faceTwist);
221 }
222
223 private:
224 typedef CacheStorage< ct, dim-codim, hasTwists> CacheStorageType;
225 typedef typename Traits::MapperVectorType MapperVectorType;
226
227 typedef std::map<const QuadratureKeyType, CacheStorageType> MapperContainerType;
228 typedef typename MapperContainerType::iterator MapperIteratorType;
229
230 private:
231 static MapperIteratorType
232 createMapper ( const QuadratureType &quad, GeometryType elementGeometry, std::integral_constant< bool, true > );
233
234 static MapperIteratorType
235 createMapper ( const QuadratureType &quad, GeometryType elementGeometry, std::integral_constant< bool, false > );
236
237 // mapper container holding mappings for different quads
238 MapperContainerType mappers_;
239
240 private:
241 static MapperContainerType& mappers()
242 {
243 return instance().mappers_;
244 }
245
246 static ThisType& instance()
247 {
249 }
250 };
251
252 } // namespace Fem
253
254} // namespace Dune
255
256#include "cacheprovider.cc"
257
258#endif // #ifndef DUNE_FEM_CACHEPROVIDER_HH
Definition: bindguard.hh:11
specialize with 'true' if the grid part is cartesian (default=false)
Definition: gridpart/common/capabilities.hh:40
Storage class for mappers.
Definition: cacheprovider.hh:25
CacheStorage(const CacheStorage &other)
Definition: cacheprovider.hh:53
Traits::MapperType MapperType
Definition: cacheprovider.hh:39
CacheStorage(int numFaces, int maxTwist)
Definition: cacheprovider.hh:43
Traits::MapperPairType MapperPairType
Definition: cacheprovider.hh:40
void addMapper(const MapperType &faceMapper, const MapperType &interpolMapper, const MapperType &twistMapper, int faceIndex, int faceTwist)
Definition: cacheprovider.hh:57
const MapperPairType & getMapper(int faceIndex, int faceTwist) const
Definition: cacheprovider.hh:84
Traits::MapperType MapperType
Definition: cacheprovider.hh:110
Traits::MapperPairType MapperPairType
Definition: cacheprovider.hh:111
CacheStorage(const CacheStorage &other)
Definition: cacheprovider.hh:118
const MapperPairType & getMapper(int faceIndex, int faceTwist) const
Definition: cacheprovider.hh:135
CacheStorage(int numFaces)
Definition: cacheprovider.hh:114
void addMapper(const MapperType &mapper, const MapperType &interpolMapper, int faceIndex)
Definition: cacheprovider.hh:122
Definition: cacheprovider.hh:157
static void registerQuadrature(const QuadratureImpl &quad)
Definition: cacheprovider.hh:173
Traits::QuadratureType QuadratureType
Definition: cacheprovider.hh:169
Definition: cacheprovider.hh:181
std::pair< MapperType, MapperType > MapperPairType
Definition: cacheprovider.hh:196
static const MapperPairType & getMapper(const QuadratureImpl &quadImpl, GeometryType elementGeometry, int faceIndex, int faceTwist)
Definition: cacheprovider.hh:200
Traits::QuadratureType QuadratureType
Definition: cacheprovider.hh:192
Traits::QuadratureKeyType QuadratureKeyType
Definition: cacheprovider.hh:194
Traits::MapperType MapperType
Definition: cacheprovider.hh:193
Definition: pointmapper.hh:18
Definition: pointmapper.hh:52
std::pair< MapperType, MapperType > MapperPairType
Definition: pointmapper.hh:59
std::vector< size_t > MapperType
Definition: pointmapper.hh:58
Definition: pointprovider.hh:24
size_t id() const
obtain the identifier of the integration point list
Definition: quadratureimp.hh:122
static DUNE_EXPORT Object & instance(Args &&... args)
return singleton instance of given Object type.
Definition: singleton.hh:118