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 (*ij).rightmultiply(*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())
71 if (ik.index()<jk.index())
79 if (ij.index()!=i.index())
80 DUNE_THROW(
ISTLError,
"diagonal entry missing");
84 catch (Dune::FMatrixError & e) {
86 << i.index() <<
"][" << ij.index() <<
"]" << e.what();
87 th__ex.
r=i.index(); th__ex.c=ij.index(););
93 template<
class M,
class X,
class Y>
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)
106 dblock rhs(d[i.index()]);
107 for (coliterator j=(*i).begin(); j.index()<i.index(); ++j)
108 (*j).mmv(v[j.index()],rhs);
113 rowiterator rendi=A.beforeBegin();
114 for (rowiterator i=A.beforeEnd(); i!=rendi; --i)
116 vblock rhs(v[i.index()]);
118 for (j=(*i).beforeEnd(); j.index()>i.index(); --j)
119 (*j).mmv(v[j.index()],rhs);
121 (*j).umv(rhs,v[i.index()]);
134 template<
class K,
int n,
int m>
157 typedef typename M::RowIterator rowiterator;
158 typedef typename M::ColIterator coliterator;
159 typedef typename M::ConstRowIterator crowiterator;
160 typedef typename M::ConstColIterator ccoliterator;
161 typedef typename M::CreateIterator createiterator;
162 typedef typename M::block_type block;
163 typedef typename M::field_type K;
164 typedef std::map<size_t, int> map;
165 typedef typename map::iterator mapiterator;
168 crowiterator endi=A.end();
169 createiterator ci=ILU.createbegin();
170 for (crowiterator i=A.begin(); i!=endi; ++i)
176 for (ccoliterator j=(*i).begin(); j!=(*i).end(); ++j)
177 rowpattern[j.index()] = 0;
180 for (mapiterator ik=rowpattern.begin(); (*ik).first<i.index(); ++ik)
187 coliterator endk = ILU[(*ik).first].end();
188 coliterator kj = ILU[(*ik).first].find((*ik).first);
189 for (++kj; kj!=endk; ++kj)
194 mapiterator ij = rowpattern.find(kj.index());
195 if (ij==rowpattern.end())
200 rowpattern[kj.index()] = generation+1;
208 for (mapiterator ik=rowpattern.begin(); ik!=rowpattern.end(); ++ik)
209 ci.insert((*ik).first);
213 coliterator endILUij = ILU[i.index()].end();;
214 for (coliterator ILUij=ILU[i.index()].begin(); ILUij!=endILUij; ++ILUij)
221 for (crowiterator i=A.begin(); i!=endi; ++i)
224 coliterator endILUij = ILU[i.index()].end();;
225 for (ILUij=ILU[i.index()].begin(); ILUij!=endILUij; ++ILUij)
227 ccoliterator Aij = (*i).begin();
228 ccoliterator endAij = (*i).end();
229 ILUij = ILU[i.index()].begin();
230 while (Aij!=endAij && ILUij!=endILUij)
232 if (Aij.index()==ILUij.index())
239 if (Aij.index()<ILUij.index())