36 typedef typename M::RowIterator rowiterator;
37 typedef typename M::ColIterator coliterator;
38 typedef typename M::block_type block;
41 rowiterator endi=A.end();
42 for (rowiterator i=A.begin(); i!=endi; ++i)
45 coliterator endij=(*i).end();
49 for (ij=(*i).begin(); ij.index()<i.index(); ++ij)
52 coliterator jj = A[ij.index()].find(ij.index());
55 Impl::asMatrix(*ij).rightmultiply(Impl::asMatrix(*jj));
58 coliterator endjk=A[ij.index()].end();
59 coliterator jk=jj; ++jk;
60 coliterator ik=ij; ++ik;
61 while (ik!=endij && jk!=endjk)
62 if (ik.index()==jk.index())
65 Impl::asMatrix(B).leftmultiply(Impl::asMatrix(*ij));
71 if (ik.index()<jk.index())
79 if (ij.index()!=i.index())
80 DUNE_THROW(
ISTLError,
"diagonal entry missing");
82 Impl::asMatrix(*ij).invert();
84 catch (Dune::FMatrixError & e) {
86 << i.index() <<
"][" << ij.index() <<
"]" << e.what();
87 th__ex.r=i.index(); th__ex.c=ij.index(););
97 typedef typename M::ConstRowIterator rowiterator;
98 typedef typename M::ConstColIterator coliterator;
99 typedef typename Y::block_type dblock;
100 typedef typename X::block_type vblock;
103 rowiterator endi=A.end();
104 for (rowiterator i=A.begin(); i!=endi; ++i)
112 dblock rhsValue(d[i.index()]);
113 auto&& rhs = Impl::asVector(rhsValue);
114 for (coliterator j=(*i).begin(); j.index()<i.index(); ++j)
115 Impl::asMatrix(*j).mmv(Impl::asVector(v[j.index()]),rhs);
116 Impl::asVector(v[i.index()]) = rhs;
120 rowiterator rendi=A.beforeBegin();
121 for (rowiterator i=A.beforeEnd(); i!=rendi; --i)
129 vblock rhsValue(v[i.index()]);
130 auto&& rhs = Impl::asVector(rhsValue);
132 for (j=(*i).beforeEnd(); j.index()>i.index(); --j)
133 Impl::asMatrix(*j).mmv(Impl::asVector(v[j.index()]),rhs);
134 auto&& vi = Impl::asVector(v[i.index()]);
135 Impl::asMatrix(*j).mv(rhs,vi);