DUNE-FEM (unstable)

cacheprovider.hh
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
10#include <dune/fem/gridpart/common/capabilities.hh>
11#include <dune/fem/storage/singleton.hh>
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:
36 typedef CachingTraits<ct, dim> Traits;
37
38 public:
39 typedef typename Traits::MapperType MapperType;
40 typedef typename Traits::MapperPairType MapperPairType;
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:
107 typedef CachingTraits<ct, dim> Traits;
108
109 public:
110 typedef typename Traits::MapperType MapperType;
111 typedef typename Traits::MapperPairType MapperPairType;
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 >
157 class CacheProvider;
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;
166 typedef CachingTraits<ct, dim> Traits;
167
168 public:
169 typedef typename Traits::QuadratureType QuadratureType;
170
171 public:
172 template <class QuadratureImpl>
173 static void registerQuadrature(const QuadratureImpl& quad) {
174 // get quadrature implementation
175 PointProvider<ct, dim, codim>::registerQuadrature(quad.ipList());
176 }
177 };
178
179 template <class GridPart>
180 class CacheProvider<GridPart, 1>
181 {
182 typedef CacheProvider<GridPart, 1> ThisType;
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:
192 typedef typename Traits::QuadratureType QuadratureType;
193 typedef typename Traits::MapperType MapperType;
194 typedef typename Traits::QuadratureKeyType QuadratureKeyType;
195
196 typedef std::pair< MapperType, MapperType > MapperPairType;
197
198 private:
199 typedef CacheStorage< ct, dim-codim, hasTwists> CacheStorageType;
200 typedef typename Traits::MapperVectorType MapperVectorType;
201
202 typedef std::unordered_map<const QuadratureKeyType, CacheStorageType> MapperContainerType;
203 typedef typename MapperContainerType::iterator MapperIteratorType;
204
205 public:
206 template <class QuadratureImpl>
207 const MapperPairType& getMapperImpl(const QuadratureImpl& quadImpl,
208 const GeometryType elementGeometry,
209 const int faceIndex,
210 const int faceTwist,
211 const bool registerQuadrature = true )
212 {
213 // get quadrature implementation
214 const QuadratureType& quad = quadImpl.ipList();
215
216 // create key
217 const QuadratureKeyType key (elementGeometry, quad.id() );
218
219 MapperIteratorType it = mappers_.find( key );
220
221 assert( ! registerQuadrature ? it != mappers_.end() : true );
222 if( registerQuadrature && (it == mappers_.end()) )
223 {
224 std::integral_constant< bool, hasTwists > i2t;
225 it = CacheProvider<GridPart, 1>::createMapper( quad, elementGeometry, i2t, mappers_ );
226 }
227
228 return it->second.getMapper(faceIndex, faceTwist);
229 }
230
231 template <class QuadratureImpl>
232 static const MapperPairType& getMapper(const QuadratureImpl& quadImpl,
233 const GeometryType elementGeometry,
234 const int faceIndex,
235 const int faceTwist)
236 {
237 return instance().getMapperImpl( quadImpl, elementGeometry, faceIndex, faceTwist );
238 }
239
240 private:
241 static MapperIteratorType
242 createMapper ( const QuadratureType &quad, GeometryType elementGeometry, std::integral_constant< bool, true >, MapperContainerType& );
243
244 static MapperIteratorType
245 createMapper ( const QuadratureType &quad, GeometryType elementGeometry, std::integral_constant< bool, false >, MapperContainerType& );
246
247 // mapper container holding mappings for different quads
248 MapperContainerType mappers_;
249
250 public:
251 static ThisType& instance()
252 {
254 }
255 };
256
257 } // namespace Fem
258
259} // namespace Dune
260
261#include "cacheprovider.cc"
262
263#endif // #ifndef DUNE_FEM_CACHEPROVIDER_HH
Storage class for mappers.
Definition: cacheprovider.hh:25
static DUNE_EXPORT Object & instance(Args &&... args)
return singleton instance of given Object type.
Definition: singleton.hh:123
Some useful basic math stuff.
Dune namespace.
Definition: alignedallocator.hh:13
constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
Return the size of the sequence.
Definition: integersequence.hh:75
specialize with 'true' if the grid part is cartesian (default=false)
Definition: capabilities.hh:40
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Nov 13, 23:29, 2024)