2 #ifndef DUNE_PDELAB_BACKEND_ISTL_BCRSPATTERN_HH
3 #define DUNE_PDELAB_BACKEND_ISTL_BCRSPATTERN_HH
10 #include <dune/common/iteratorfacades.hh>
42 template<
typename RowOrdering,
typename ColOrdering>
49 typedef typename RowOrdering::Traits::size_type
size_type;
57 static const size_type empty = ~static_cast<size_type>(0);
69 struct PaddedColumnCriterion
74 return k == _j || k == empty;
86 typedef typename std::vector<size_type>::iterator IndicesIterator;
87 typedef typename std::set<std::pair<size_type,size_type> >::iterator OverflowIterator;
89 typedef typename std::vector<size_type>::const_iterator ConstIndicesIterator;
90 typedef typename std::set<std::pair<size_type,size_type> >::const_iterator ConstOverflowIterator;
95 template<
typename RI,
typename CI>
102 IndicesIterator start = _indices.begin();
103 IndicesIterator
begin = start + _entries_per_row*i;
104 IndicesIterator
end = start + _entries_per_row*(i+1);
107 IndicesIterator it = std::find_if(
begin,
end,PaddedColumnCriterion(j));
117 _overflow.insert(std::make_pair(i,j));
124 template<
typename RI,
typename CI>
125 void recursive_add_entry(
const RI& ri,
const CI& ci)
136 ConstIndicesIterator it = _indices.begin();
137 ConstIndicesIterator
end = _indices.begin() + _entries_per_row;
138 ConstOverflowIterator oit = _overflow.begin();
139 ConstOverflowIterator oend = _overflow.end();
140 for (
size_type i = 0; i < _row_ordering.blockCount(); ++i, ++rit,
end+=_entries_per_row)
144 for (; it !=
end; ++it)
152 for (; oit != oend && oit->first == i; ++oit)
159 std::vector<size_type>
sizes()
const
161 std::vector<size_type> r(_row_ordering.blockCount());
168 :
public ForwardIteratorFacade<iterator, const size_type>
185 if (++_oit == _oend or _oit->first != _row)
195 if (_it == _end || *_it == empty)
199 if (_oit == _oend || _oit->first > _row)
205 bool equals(
const iterator& other)
const
207 if (_row != other._row)
209 if (_at_end || other._at_end)
210 return _at_end && other._at_end;
212 return _oit == other._oit;
214 return _it == other._it;
219 , _in_overflow(
false)
221 , _it(
p._indices.begin() + row *
p._entries_per_row)
222 , _end(
p._indices.begin() + (row+1) *
p._entries_per_row)
223 , _oit(
p._overflow.lower_bound(std::make_pair(row,0)))
224 , _oend(
p._overflow.end())
227 if ((!_at_end) && (_it == _end || *_it == empty))
230 _at_end = _oit == _oend || _oit->first != _row;
237 typename std::vector<size_type>::const_iterator _it;
238 typename std::vector<size_type>::const_iterator _end;
239 typename std::set<std::pair<size_type,size_type> >::const_iterator _oit;
240 const typename std::set<std::pair<size_type,size_type> >::const_iterator _oend;
265 : _row_ordering(row_ordering)
266 , _col_ordering(col_ordering)
267 , _entries_per_row(entries_per_row)
268 , _indices(row_ordering.blockCount()*entries_per_row,
size_type(empty))
273 return _row_ordering;
278 return _row_ordering;
290 _indices = std::vector<size_type>();
291 _overflow = std::set<std::pair<size_type,size_type> >();
296 return _entries_per_row;
301 return _overflow.size();
306 const RowOrdering& _row_ordering;
307 const ColOrdering& _col_ordering;
310 std::vector<size_type> _indices;
311 std::set<std::pair<size_type,size_type> > _overflow;
322 template<
typename RowOrdering,
typename ColOrdering,
typename SubPattern_>
339 template<
typename RI,
typename CI>
342 recursive_add_entry(ri.view(),ci.view());
347 template<
typename RI,
typename CI>
348 void recursive_add_entry(
const RI& ri,
const CI& ci)
350 _sub_patterns[ri.back() * _col_ordering.blockCount() + ci.back()].recursive_add_entry(ri.back_popped(),ci.back_popped());
355 template<
typename EntriesPerRow>
356 NestedPattern(
const RowOrdering& row_ordering,
const ColOrdering& col_ordering,
const EntriesPerRow& entries_per_row)
357 : _row_ordering(row_ordering)
358 , _col_ordering(col_ordering)
360 size_type rows = row_ordering.blockCount();
361 size_type cols = col_ordering.blockCount();
364 _sub_patterns.push_back(
366 _row_ordering.childOrdering(i),
367 _col_ordering.childOrdering(j),
368 entries_per_row[i][j]
374 : _row_ordering(row_ordering)
375 , _col_ordering(col_ordering)
377 size_type rows = row_ordering.blockCount();
378 size_type cols = col_ordering.blockCount();
381 _sub_patterns.push_back(
383 _row_ordering.childOrdering(i),
384 _col_ordering.childOrdering(j),
393 return _sub_patterns[i * _col_ordering.blockCount() + j];
398 const RowOrdering& _row_ordering;
399 const ColOrdering& _col_ordering;
400 std::vector<SubPattern> _sub_patterns;
409 #endif // DUNE_PDELAB_BACKEND_ISTL_BCRSPATTERN_HH