63 template<
int I, WithDiagType diag, WithRelaxType relax>
65 template<
class M,
class X,
class Y,
class K>
66 static void bltsolve (
const M&
A, X& v,
const Y& d,
const K& w)
69 typedef typename M::ConstRowIterator rowiterator;
70 typedef typename M::ConstColIterator coliterator;
71 typedef typename Y::block_type bblock;
74 rowiterator endi=A.end();
75 for (rowiterator i=A.begin(); i!=endi; ++i)
77 bblock rhs(d[i.index()]);
79 for (j=(*i).begin(); j.index()<i.index(); ++j)
80 (*j).mmv(v[j.index()],rhs);
84 template<
class M,
class X,
class Y,
class K>
85 static void butsolve (
const M&
A, X& v,
const Y& d,
const K& w)
88 typedef typename M::ConstRowIterator rowiterator;
89 typedef typename M::ConstColIterator coliterator;
90 typedef typename Y::block_type bblock;
93 rowiterator rendi=A.beforeBegin();
94 for (rowiterator i=A.beforeEnd(); i!=rendi; --i)
96 bblock rhs(d[i.index()]);
98 for (j=(*i).beforeEnd(); j.index()>i.index(); --j)
99 (*j).mmv(v[j.index()],rhs);
108 template<
class M,
class X,
class Y,
class K>
109 static void bltsolve (
const M&
A, X& v,
const Y& d,
const K& w)
114 template<
class M,
class X,
class Y,
class K>
115 static void butsolve (
const M&
A, X& v,
const Y& d,
const K& w)
123 template<
class M,
class X,
class Y,
class K>
124 static void bltsolve (
const M&
A, X& v,
const Y& d,
const K& w)
128 template<
class M,
class X,
class Y,
class K>
129 static void butsolve (
const M&
A, X& v,
const Y& d,
const K& w)
136 template<
class M,
class X,
class Y,
class K>
137 static void bltsolve (
const M&
A, X& v,
const Y& d,
const K& w)
142 template<
class M,
class X,
class Y,
class K>
143 static void butsolve (
const M&
A, X& v,
const Y& d,
const K& w)
151 template<
class M,
class X,
class Y,
class K>
152 static void bltsolve (
const M&
A, X& v,
const Y& d,
const K& w)
156 template<
class M,
class X,
class Y,
class K>
157 static void butsolve (
const M&
A, X& v,
const Y& d,
const K& w)
169 template<
class M,
class X,
class Y>
172 typename X::field_type w=1;
176 template<
class M,
class X,
class Y,
class K>
177 void bltsolve (
const M&
A, X& v,
const Y& d,
const K& w)
182 template<
class M,
class X,
class Y>
185 typename X::field_type w=1;
189 template<
class M,
class X,
class Y,
class K>
196 template<
class M,
class X,
class Y>
199 typename X::field_type w=1;
203 template<
class M,
class X,
class Y,
class K>
204 void butsolve (
const M&
A, X& v,
const Y& d,
const K& w)
209 template<
class M,
class X,
class Y>
212 typename X::field_type w=1;
216 template<
class M,
class X,
class Y,
class K>
225 template<
class M,
class X,
class Y,
int l>
228 typename X::field_type w=1;
232 template<
class M,
class X,
class Y,
class K,
int l>
238 template<
class M,
class X,
class Y,
int l>
241 typename X::field_type w=1;
245 template<
class M,
class X,
class Y,
class K,
int l>
252 template<
class M,
class X,
class Y,
int l>
255 typename X::field_type w=1;
259 template<
class M,
class X,
class Y,
class K,
int l>
265 template<
class M,
class X,
class Y,
int l>
268 typename X::field_type w=1;
272 template<
class M,
class X,
class Y,
class K,
int l>
288 template<
int I, WithRelaxType relax>
290 template<
class M,
class X,
class Y,
class K>
291 static void bdsolve (
const M&
A, X& v,
const Y& d,
const K& w)
294 typedef typename M::ConstRowIterator rowiterator;
295 typedef typename M::ConstColIterator coliterator;
298 rowiterator rendi=A.beforeBegin();
299 for (rowiterator i=A.beforeEnd(); i!=rendi; --i)
301 coliterator ii=(*i).find(i.index());
310 template<
class M,
class X,
class Y,
class K>
311 static void bdsolve (
const M&
A, X& v,
const Y& d,
const K& w)
319 template<
class M,
class X,
class Y,
class K>
320 static void bdsolve (
const M&
A, X& v,
const Y& d,
const K& w)
331 template<
class M,
class X,
class Y>
334 typename X::field_type w=1;
338 template<
class M,
class X,
class Y,
class K>
339 void bdsolve (
const M&
A, X& v,
const Y& d,
const K& w)
347 template<
class M,
class X,
class Y,
int l>
350 typename X::field_type w=1;
354 template<
class M,
class X,
class Y,
class K,
int l>
377 #ifdef HAVE_BOOST_FUSION
379 template<
typename T11,
typename T12,
typename T13,
typename T14,
380 typename T15,
typename T16,
typename T17,
typename T18,
381 typename T19,
typename T21,
typename T22,
typename T23,
382 typename T24,
typename T25,
typename T26,
typename T27,
383 typename T28,
typename T29,
class K>
384 static void dbgs (
const MultiTypeBlockMatrix<T11,T12,T13,T14,T15,T16,T17,T18,T19>&
A,
385 MultiTypeBlockVector<T21,T22,T23,T24,T25,T26,T27,T28,T29>& x,
386 const MultiTypeBlockVector<T21,T22,T23,T24,T25,T26,T27,T28,T29>& b,
390 boost::mpl::size<MultiTypeBlockMatrix<T11,T12,T13,T14,T15,T16,T17,T18,T19> >::value;
396 template<
class M,
class X,
class Y,
class K>
397 static void dbgs (
const M& A, X& x,
const Y& b,
const K& w)
399 typedef typename M::ConstRowIterator rowiterator;
400 typedef typename M::ConstColIterator coliterator;
401 typedef typename Y::block_type bblock;
402 typedef typename X::block_type xblock;
407 rowiterator endi=A.end();
408 for (rowiterator i=A.begin(); i!=endi; ++i)
411 coliterator endj=(*i).end();
412 coliterator j=(*i).begin();
413 for (; j.index()<i.index(); ++j)
414 (*j).mmv(x[j.index()],rhs);
415 coliterator diag=j++;
416 for (; j != endj; ++j)
417 (*j).mmv(x[j.index()],rhs);
426 #ifdef HAVE_BOOST_FUSION
428 template<
typename T11,
typename T12,
typename T13,
typename T14,
429 typename T15,
typename T16,
typename T17,
typename T18,
430 typename T19,
typename T21,
typename T22,
typename T23,
431 typename T24,
typename T25,
typename T26,
typename T27,
432 typename T28,
typename T29,
class K>
433 static void bsorf (
const MultiTypeBlockMatrix<T11,T12,T13,T14,T15,T16,T17,T18,T19>& A,
434 MultiTypeBlockVector<T21,T22,T23,T24,T25,T26,T27,T28,T29>& x,
435 const MultiTypeBlockVector<T21,T22,T23,T24,T25,T26,T27,T28,T29>& b,
439 boost::mpl::size<MultiTypeBlockMatrix<T11,T12,T13,T14,T15,T16,T17,T18,T19> >::value;
445 template<
class M,
class X,
class Y,
class K>
446 static void bsorf (
const M& A, X& x,
const Y& b,
const K& w)
448 typedef typename M::ConstRowIterator rowiterator;
449 typedef typename M::ConstColIterator coliterator;
450 typedef typename Y::block_type bblock;
451 typedef typename X::block_type xblock;
456 if(A.begin()!=A.end())
459 rowiterator endi=A.end();
460 for (rowiterator i=A.begin(); i!=endi; ++i)
463 coliterator endj=(*i).end();
464 coliterator j=(*i).begin();
465 for (; j.index()<i.index(); ++j)
466 (*j).mmv(x[j.index()],rhs);
469 (*j).mmv(x[j.index()],rhs);
471 x[i.index()].axpy(w,v);
476 #ifdef HAVE_BOOST_FUSION
478 template<
typename T11,
typename T12,
typename T13,
typename T14,
479 typename T15,
typename T16,
typename T17,
typename T18,
480 typename T19,
typename T21,
typename T22,
typename T23,
481 typename T24,
typename T25,
typename T26,
typename T27,
482 typename T28,
typename T29,
class K>
483 static void bsorb (
const MultiTypeBlockMatrix<T11,T12,T13,T14,T15,T16,T17,T18,T19>& A,
484 MultiTypeBlockVector<T21,T22,T23,T24,T25,T26,T27,T28,T29>& x,
485 const MultiTypeBlockVector<T21,T22,T23,T24,T25,T26,T27,T28,T29>& b,
489 mpl::size<MultiTypeBlockMatrix<T11,T12,T13,T14,T15,T16,T17,T18,T19> >::value;
495 template<
class M,
class X,
class Y,
class K>
496 static void bsorb (
const M& A, X& x,
const Y& b,
const K& w)
498 typedef typename M::ConstRowIterator rowiterator;
499 typedef typename M::ConstColIterator coliterator;
500 typedef typename Y::block_type bblock;
501 typedef typename X::block_type xblock;
506 if(A.begin()!=A.end())
509 rowiterator endi=A.beforeBegin();
510 for (rowiterator i=A.beforeEnd(); i!=endi; --i)
513 coliterator endj=(*i).end();
514 coliterator j=(*i).begin();
515 for (; j.index()<i.index(); ++j)
516 (*j).mmv(x[j.index()],rhs);
519 (*j).mmv(x[j.index()],rhs);
521 x[i.index()].axpy(w,v);
526 #ifdef HAVE_BOOST_FUSION
528 template<
typename T11,
typename T12,
typename T13,
typename T14,
529 typename T15,
typename T16,
typename T17,
typename T18,
530 typename T19,
typename T21,
typename T22,
typename T23,
531 typename T24,
typename T25,
typename T26,
typename T27,
532 typename T28,
typename T29,
class K>
533 static void dbjac (
const MultiTypeBlockMatrix<T11,T12,T13,T14,T15,T16,T17,T18,T19>& A,
534 MultiTypeBlockVector<T21,T22,T23,T24,T25,T26,T27,T28,T29>& x,
535 const MultiTypeBlockVector<T21,T22,T23,T24,T25,T26,T27,T28,T29>& b,
539 boost::mpl::size<MultiTypeBlockMatrix<T11,T12,T13,T14,T15,T16,T17,T18,T19> >::value;
545 template<
class M,
class X,
class Y,
class K>
546 static void dbjac (
const M& A, X& x,
const Y& b,
const K& w)
548 typedef typename M::ConstRowIterator rowiterator;
549 typedef typename M::ConstColIterator coliterator;
550 typedef typename Y::block_type bblock;
551 typedef typename X::block_type xblock;
556 rowiterator endi=A.end();
557 for (rowiterator i=A.begin(); i!=endi; ++i)
560 coliterator endj=(*i).end();
561 coliterator j=(*i).begin();
562 for (; j.index()<i.index(); ++j)
563 (*j).mmv(x[j.index()],rhs);
566 (*j).mmv(x[j.index()],rhs);
575 template<
class M,
class X,
class Y,
class K>
576 static void dbgs (
const M&
A, X& x,
const Y& b,
const K& w)
580 template<
class M,
class X,
class Y,
class K>
581 static void bsorf (
const M&
A, X& x,
const Y& b,
const K& w)
585 template<
class M,
class X,
class Y,
class K>
586 static void bsorb (
const M&
A, X& x,
const Y& b,
const K& w)
590 template<
class M,
class X,
class Y,
class K>
591 static void dbjac (
const M&
A, X& x,
const Y& b,
const K& w)
601 template<
class M,
class X,
class Y,
class K>
602 void dbgs (
const M&
A, X& x,
const Y& b,
const K& w)
607 template<
class M,
class X,
class Y,
class K,
int l>
608 void dbgs (
const M&
A, X& x,
const Y& b,
const K& w,
BL<l> bl)
613 template<
class M,
class X,
class Y,
class K>
614 void bsorf (
const M&
A, X& x,
const Y& b,
const K& w)
619 template<
class M,
class X,
class Y,
class K,
int l>
625 template<
class M,
class X,
class Y,
class K>
626 void bsorb (
const M&
A, X& x,
const Y& b,
const K& w)
631 template<
class M,
class X,
class Y,
class K,
int l>
637 template<
class M,
class X,
class Y,
class K>
638 void dbjac (
const M&
A, X& x,
const Y& b,
const K& w)
643 template<
class M,
class X,
class Y,
class K,
int l>