dune-pdelab  2.0.0
uncachedvectorview.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 #ifndef DUNE_PDELAB_BACKEND_COMMON_UNCACHEDVECTORVIEW_HH
4 #define DUNE_PDELAB_BACKEND_COMMON_UNCACHEDVECTORVIEW_HH
5 
6 #include <dune/common/typetraits.hh>
7 #include <dune/common/deprecated.hh>
9 
10 namespace Dune {
11  namespace PDELab {
12 
13 
14  template<typename V, typename LFSC>
16  {
17 
18  typedef typename remove_const<V>::type Container;
19  typedef LFSC LFSCache;
20 
21  typedef typename Container::E ElementType;
22  typedef typename Container::size_type size_type;
23  typedef typename LFSCache::DOFIndex DOFIndex;
24  typedef typename LFSCache::ContainerIndex ContainerIndex;
25 
26 
28  : _container(nullptr)
29  , _lfs_cache(nullptr)
30  {}
31 
33  : _container(&container)
34  , _lfs_cache(nullptr)
35  {}
36 
37  void attach(V& container)
38  {
40  }
41 
42  void detach()
43  {
44  _container = nullptr;
45  }
46 
47  void bind(const LFSCache& lfs_cache)
48  {
49  _lfs_cache = &lfs_cache;
50  }
51 
52  void unbind()
53  {
54  }
55 
56  size_type size() const
57  {
58  return cache().size();
59  }
60 
61  template<typename LC>
62  void read(LC& local_container) const
63  {
64  for (size_type i = 0; i < size(); ++i)
65  {
66  accessBaseContainer(local_container)[i] = container()[cache().containerIndex(i)];
67  }
68  }
69 
70  template<typename ChildLFS, typename LC>
71  void read(const ChildLFS& child_lfs, LC& local_container) const
72  {
73  for (size_type i = 0; i < child_lfs.size(); ++i)
74  {
75  const size_type local_index = child_lfs.localIndex(i);
76  accessBaseContainer(local_container)[local_index] = container()[cache().containerIndex(local_index)];
77  }
78  }
79 
80  template<typename ChildLFS, typename LC>
81  void read_sub_container(const ChildLFS& child_lfs, LC& local_container) const
82  {
83  for (size_type i = 0; i < child_lfs.size(); ++i)
84  {
85  const size_type local_index = child_lfs.localIndex(i);
86  accessBaseContainer(local_container)[i] = container()[cache().containerIndex(local_index)];
87  }
88  }
89 
90 
92  {
93  return container()[cache().containerIndex(i)];
94  }
95 
96 
97  const ElementType& operator[](const DOFIndex& di) const
98  {
99  return container()[cache().containerIndex(di)];
100  }
101 
102 
103  const ElementType& operator[](const ContainerIndex& ci) const
104  {
105  return container()[ci];
106  }
107 
108 
109  const Container& container() const
110  {
111  return *_container;
112  }
113 
114  const LFSCache& cache() const
115  {
116  return *_lfs_cache;
117  }
118 
119  protected:
120 
123 
124  };
125 
126 
127  template<typename V, typename LFSC>
129  : public ConstUncachedVectorView<V,LFSC>
130  {
131 
132  //dune_static_assert((is_same<typename LFSCache::LocalFunctionSpace::Traits::GridFunctionSpace,GFS>::value),
133  // "The LocalFunctionSpace passed to LocalView must belong to the underlying GridFunctionSpace.");
134 
135  typedef V Container;
136  typedef typename Container::ElementType ElementType;
137  typedef typename Container::size_type size_type;
138 
139  typedef LFSC LFSCache;
140  typedef typename LFSCache::DOFIndex DOFIndex;
141  typedef typename LFSCache::ContainerIndex ContainerIndex;
142 
145 
146  // Explicitly pull in operator[] from the base class to work around a problem
147  // with clang not finding the const overloads of the operator from the base class.
149 
151  {}
152 
154  : ConstUncachedVectorView<V,LFSC>(container)
155  {}
156 
157  template<typename LC>
158  void write(const LC& local_container)
159  {
160  for (size_type i = 0; i < size(); ++i)
161  {
162  container()[cache().containerIndex(i)] = accessBaseContainer(local_container)[i];
163  }
164  }
165 
166  template<typename LC>
167  void add(const LC& local_container)
168  {
169  for (size_type i = 0; i < size(); ++i)
170  {
171  container()[cache().containerIndex(i)] += accessBaseContainer(local_container)[i];
172  }
173  }
174 
175 
176 
177  template<typename ChildLFS, typename LC>
178  void write(const ChildLFS& child_lfs, const LC& local_container)
179  {
180  for (size_type i = 0; i < child_lfs.size(); ++i)
181  {
182  const size_type local_index = child_lfs.localIndex(i);
183  container()[cache().containerIndex(local_index)] = accessBaseContainer(local_container)[local_index];
184  }
185  }
186 
187  template<typename ChildLFS, typename LC>
188  void add(const ChildLFS& child_lfs, const LC& local_container)
189  {
190  for (size_type i = 0; i < child_lfs.size(); ++i)
191  {
192  const size_type local_index = child_lfs.localIndex(i);
193  container()[cache().containerIndex(local_index)] += accessBaseContainer(local_container)[local_index];
194  }
195  }
196 
197 
198 
199 
200  template<typename ChildLFS, typename LC>
201  void write_sub_container(const ChildLFS& child_lfs, const LC& local_container)
202  {
203  for (size_type i = 0; i < child_lfs.size(); ++i)
204  {
205  const size_type local_index = child_lfs.localIndex(i);
206  container()[cache().containerIndex(local_index)] = accessBaseContainer(local_container)[i];
207  }
208  }
209 
210  template<typename ChildLFS, typename LC>
211  void add_sub_container(const ChildLFS& child_lfs, const LC& local_container)
212  {
213  for (size_type i = 0; i < child_lfs.size(); ++i)
214  {
215  const size_type local_index = child_lfs.localIndex(i);
216  container()[cache().containerIndex(local_index)] += accessBaseContainer(local_container)[i];
217  }
218  }
219 
220  void commit()
221  {
222  }
223 
224 
226  {
227  return container()[cache().containerIndex(i)];
228  }
229 
230 
232  {
233  return container()[cache().containerIndex(di)];
234  }
235 
236 
238  {
239  return container()[ci];
240  }
241 
242 
244  {
245  return *(this->_container);
246  }
247 
248 
249  };
250 
251  } // namespace PDELab
252 } // namespace Dune
253 
254 #endif // DUNE_PDELAB_BACKEND_COMMON_UNCACHEDVECTORVIEW_HH
ConstUncachedVectorView(V &container)
Definition: uncachedvectorview.hh:32
void add_sub_container(const ChildLFS &child_lfs, const LC &local_container)
Definition: uncachedvectorview.hh:211
void attach(V &container)
Definition: uncachedvectorview.hh:37
void detach()
Definition: uncachedvectorview.hh:42
void read_sub_container(const ChildLFS &child_lfs, LC &local_container) const
Definition: uncachedvectorview.hh:81
void add(const ChildLFS &child_lfs, const LC &local_container)
Definition: uncachedvectorview.hh:188
Container::E ElementType
Definition: uncachedvectorview.hh:21
UncachedVectorView(Container &container)
Definition: uncachedvectorview.hh:153
const ElementType & operator[](size_type i) const
Definition: uncachedvectorview.hh:91
const ElementType & operator[](const DOFIndex &di) const
Definition: uncachedvectorview.hh:97
ElementType & operator[](const ContainerIndex &ci)
Definition: uncachedvectorview.hh:237
Container & container()
Definition: uncachedvectorview.hh:243
Definition: uncachedvectorview.hh:15
LFSCache::ContainerIndex ContainerIndex
Definition: uncachedvectorview.hh:24
Container::size_type size_type
Definition: uncachedvectorview.hh:22
C & accessBaseContainer(C &c)
Definition: localvector.hh:296
V * _container
Definition: uncachedvectorview.hh:121
ConstUncachedVectorView()
Definition: uncachedvectorview.hh:27
Container::ElementType ElementType
Definition: uncachedvectorview.hh:136
const LFSCache * _lfs_cache
Definition: uncachedvectorview.hh:122
ElementType & operator[](size_type i)
Definition: uncachedvectorview.hh:225
V Container
Definition: uncachedvectorview.hh:135
void write(const LC &local_container)
Definition: uncachedvectorview.hh:158
void write_sub_container(const ChildLFS &child_lfs, const LC &local_container)
Definition: uncachedvectorview.hh:201
remove_const< V >::type Container
Definition: uncachedvectorview.hh:18
void bind(const LFSCache &lfs_cache)
Definition: uncachedvectorview.hh:47
void add(const LC &local_container)
Definition: uncachedvectorview.hh:167
LFSC LFSCache
Definition: uncachedvectorview.hh:19
void read(LC &local_container) const
Definition: uncachedvectorview.hh:62
void commit()
Definition: uncachedvectorview.hh:220
const LFSCache & cache() const
Definition: uncachedvectorview.hh:114
void write(const ChildLFS &child_lfs, const LC &local_container)
Definition: uncachedvectorview.hh:178
LFSCache::ContainerIndex ContainerIndex
Definition: uncachedvectorview.hh:141
size_type size() const
Definition: uncachedvectorview.hh:56
Container::size_type size_type
Definition: uncachedvectorview.hh:137
const Container & container() const
Definition: uncachedvectorview.hh:109
LFSC LFSCache
Definition: uncachedvectorview.hh:139
void read(const ChildLFS &child_lfs, LC &local_container) const
Definition: uncachedvectorview.hh:71
Definition: uncachedvectorview.hh:128
LFSCache::DOFIndex DOFIndex
Definition: uncachedvectorview.hh:140
LFSCache::DOFIndex DOFIndex
Definition: uncachedvectorview.hh:23
ElementType & operator[](const DOFIndex &di)
Definition: uncachedvectorview.hh:231
void unbind()
Definition: uncachedvectorview.hh:52
UncachedVectorView()
Definition: uncachedvectorview.hh:150
const ElementType & operator[](const ContainerIndex &ci) const
Definition: uncachedvectorview.hh:103