5#ifndef DUNE_ISTL_GSETC_HH
6#define DUNE_ISTL_GSETC_HH
68 template<
int I, WithDiagType diag, WithRelaxType relax>
70 template<
class M,
class X,
class Y,
class K>
71 static void bltsolve (
const M& A, X& v,
const Y& d,
const K& w)
74 typedef typename M::ConstRowIterator rowiterator;
75 typedef typename M::ConstColIterator coliterator;
76 typedef typename Y::block_type bblock;
79 rowiterator endi=A.end();
80 for (rowiterator i=A.begin(); i!=endi; ++i)
82 bblock rhs(d[i.index()]);
84 for (j=(*i).begin(); j.index()<i.index(); ++j)
85 (*j).mmv(v[j.index()],rhs);
89 template<
class M,
class X,
class Y,
class K>
90 static void butsolve (
const M& A, X& v,
const Y& d,
const K& w)
95 typedef typename Y::block_type bblock;
98 rrowiterator rbegin{A.begin()};
99 auto rindex = [](
const auto& it) {
return std::prev(it.base()).index(); };
100 for (rrowiterator i = rrowiterator{A.end()}; i!=rbegin; ++i)
102 auto row = rindex(i);
105 for (j=rcoliterator{(*i).end()}; rindex(j)>row; ++j)
106 (*j).mmv(v[rindex(j)],rhs);
115 template<
class M,
class X,
class Y,
class K>
116 static void bltsolve (
const M& A, X& v,
const Y& d,
const K& w)
121 template<
class M,
class X,
class Y,
class K>
122 static void butsolve (
const M& A, X& v,
const Y& d,
const K& w)
130 template<
class M,
class X,
class Y,
class K>
131 static void bltsolve (
const M& A, X& v,
const Y& d,
const K& )
135 template<
class M,
class X,
class Y,
class K>
136 static void butsolve (
const M& A, X& v,
const Y& d,
const K& )
143 template<
class M,
class X,
class Y,
class K>
144 static void bltsolve (
const M& , X& v,
const Y& d,
const K& w)
149 template<
class M,
class X,
class Y,
class K>
150 static void butsolve (
const M& , X& v,
const Y& d,
const K& w)
158 template<
class M,
class X,
class Y,
class K>
159 static void bltsolve (
const M& , X& v,
const Y& d,
const K& )
163 template<
class M,
class X,
class Y,
class K>
164 static void butsolve (
const M& , X& v,
const Y& d,
const K& )
176 template<
class M,
class X,
class Y>
179 typename X::field_type w=1;
183 template<
class M,
class X,
class Y,
class K>
184 void bltsolve (
const M& A, X& v,
const Y& d,
const K& w)
189 template<
class M,
class X,
class Y>
192 typename X::field_type w=1;
196 template<
class M,
class X,
class Y,
class K>
203 template<
class M,
class X,
class Y>
206 typename X::field_type w=1;
210 template<
class M,
class X,
class Y,
class K>
211 void butsolve (
const M& A, X& v,
const Y& d,
const K& w)
216 template<
class M,
class X,
class Y>
219 typename X::field_type w=1;
223 template<
class M,
class X,
class Y,
class K>
232 template<
class M,
class X,
class Y,
int l>
235 typename X::field_type w=1;
239 template<
class M,
class X,
class Y,
class K,
int l>
245 template<
class M,
class X,
class Y,
int l>
248 typename X::field_type w=1;
252 template<
class M,
class X,
class Y,
class K,
int l>
259 template<
class M,
class X,
class Y,
int l>
262 typename X::field_type w=1;
266 template<
class M,
class X,
class Y,
class K,
int l>
272 template<
class M,
class X,
class Y,
int l>
275 typename X::field_type w=1;
279 template<
class M,
class X,
class Y,
class K,
int l>
295 template<
int I, WithRelaxType relax>
297 template<
class M,
class X,
class Y,
class K>
298 static void bdsolve (
const M& A, X& v,
const Y& d,
const K& w)
302 using coliterator =
typename M::ConstColIterator;
305 rrowiterator rendi{A.begin()};
306 for (rrowiterator i = rrowiterator{A.end()}; i!=rendi; ++i)
309 coliterator ii=(*i).find(row);
318 template<
class M,
class X,
class Y,
class K>
319 static void bdsolve (
const M& A, X& v,
const Y& d,
const K& w)
327 template<
class M,
class X,
class Y,
class K>
328 static void bdsolve (
const M& A, X& v,
const Y& d,
const K& )
339 template<
class M,
class X,
class Y>
342 typename X::field_type w=1;
346 template<
class M,
class X,
class Y,
class K>
347 void bdsolve (
const M& A, X& v,
const Y& d,
const K& w)
355 template<
class M,
class X,
class Y,
int l>
358 typename X::field_type w=1;
362 template<
class M,
class X,
class Y,
class K,
int l>
377 template<
int I,
typename M>
380 template<
class X,
class Y,
class K>
381 static void dbgs (
const M& A, X& x,
const Y& b,
const K& w)
383 typedef typename M::ConstRowIterator rowiterator;
384 typedef typename M::ConstColIterator coliterator;
385 typedef typename Y::block_type bblock;
390 rowiterator endi=A.end();
391 for (rowiterator i=A.begin(); i!=endi; ++i)
394 coliterator endj=(*i).end();
395 coliterator j=(*i).begin();
398 for (; j.index()<i.index(); ++j)
399 rhs -= (*j) * x[j.index()];
400 coliterator diag=j++;
401 for (; j != endj; ++j)
402 rhs -= (*j) * x[j.index()];
403 x[i.index()] = rhs / (*diag);
407 for (; j.index()<i.index(); ++j)
408 (*j).mmv(x[j.index()],rhs);
409 coliterator diag=j++;
410 for (; j != endj; ++j)
411 (*j).mmv(x[j.index()],rhs);
420 template<
class X,
class Y,
class K>
421 static void bsorf (
const M& A, X& x,
const Y& b,
const K& w)
423 typedef typename M::ConstRowIterator rowiterator;
424 typedef typename M::ConstColIterator coliterator;
425 typedef typename Y::block_type bblock;
426 typedef typename X::block_type xblock;
430 rowiterator endi=A.end();
431 for (rowiterator i=A.begin(); i!=endi; ++i)
434 coliterator endj=(*i).end();
435 coliterator j=(*i).begin();
438 for (; j.index()<i.index(); ++j)
439 rhs -= (*j) * x[j.index()];
442 rhs -= (*j) * x[j.index()];
448 for (; j.index()<i.index(); ++j)
449 (*j).mmv(x[j.index()],rhs);
452 (*j).mmv(x[j.index()],rhs);
455 x[i.index()].axpy(w,v);
460 template<
class X,
class Y,
class K>
461 static void bsorb (
const M& A, X& x,
const Y& b,
const K& w)
464 typedef typename M::ConstColIterator coliterator;
465 typedef typename Y::block_type bblock;
466 typedef typename X::block_type xblock;
470 rrowiterator rbegini=rrowiterator{A.begin()};
471 auto rindex = [](
const rrowiterator& it) {
return std::prev(it.base()).index(); };
472 for (rrowiterator i=rrowiterator{A.end()}; i!=rbegini; ++i)
474 auto row = rindex(i);
476 coliterator endj=(*i).end();
477 coliterator j=(*i).begin();
480 for (; j.index()<row; ++j)
481 rhs -= (*j) * x[j.index()];
484 rhs -= (*j) * x[j.index()];
490 for (; j.index()<row; ++j)
491 j->mmv(x[j.index()],rhs);
494 j->mmv(x[j.index()],rhs);
502 template<
class X,
class Y,
class K>
503 static void dbjac (
const M& A, X& x,
const Y& b,
const K& w)
505 typedef typename M::ConstRowIterator rowiterator;
506 typedef typename M::ConstColIterator coliterator;
507 typedef typename Y::block_type bblock;
512 rowiterator endi=A.end();
513 for (rowiterator i=A.begin(); i!=endi; ++i)
516 coliterator endj=(*i).end();
517 coliterator j=(*i).begin();
520 for (; j.index()<i.index(); ++j)
521 rhs -= (*j) * x[j.index()];
524 rhs -= (*j) * x[j.index()];
525 v[i.index()] = rhs / (*diag);
529 for (; j.index()<i.index(); ++j)
530 j->mmv(x[j.index()],rhs);
533 j->mmv(x[j.index()],rhs);
543 template<
class X,
class Y,
class K>
544 static void dbgs (
const M& A, X& x,
const Y& b,
const K& )
548 template<
class X,
class Y,
class K>
549 static void bsorf (
const M& A, X& x,
const Y& b,
const K& )
553 template<
class X,
class Y,
class K>
554 static void bsorb (
const M& A, X& x,
const Y& b,
const K& )
558 template<
class X,
class Y,
class K>
559 static void dbjac (
const M& A, X& x,
const Y& b,
const K& )
565 template<
int I,
typename T1,
typename... MultiTypeMatrixArgs>
568 typename... MultiTypeVectorArgs,
580 typename... MultiTypeVectorArgs,
592 typename... MultiTypeVectorArgs,
604 typename... MultiTypeVectorArgs,
620 template<
class M,
class X,
class Y,
class K>
621 void dbgs (
const M& A, X& x,
const Y& b,
const K& w)
626 template<
class M,
class X,
class Y,
class K,
int l>
632 template<
class M,
class X,
class Y,
class K>
633 void bsorf (
const M& A, X& x,
const Y& b,
const K& w)
638 template<
class M,
class X,
class Y,
class K,
int l>
644 template<
class M,
class X,
class Y,
class K>
645 void bsorb (
const M& A, X& x,
const Y& b,
const K& w)
650 template<
class M,
class X,
class Y,
class K,
int l>
656 template<
class M,
class X,
class Y,
class K>
657 void dbjac (
const M& A, X& x,
const Y& b,
const K& w)
662 template<
class M,
class X,
class Y,
class K,
int l>
static void dbjac(const TMatrix &A, TVector &x, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:584
static void dbgs(const TMatrix &A, TVector &x, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:500
static void bsorb(const TMatrix &A, TVector &x, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:556
static constexpr size_type N()
Return the number of matrix rows.
Definition multitypeblockmatrix.hh:84
static void bsorf(const TMatrix &A, TVector &x, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:529
void bltsolve(const M &A, X &v, const Y &d)
block lower triangular solve
Definition gsetc.hh:177
WithDiagType
Definition gsetc.hh:49
void bsorb(const M &A, X &x, const Y &b, const K &w)
SSOR step.
Definition gsetc.hh:645
void ubltsolve(const M &A, X &v, const Y &d)
unit block lower triangular solve
Definition gsetc.hh:190
void dbjac(const M &A, X &x, const Y &b, const K &w)
Jacobi step.
Definition gsetc.hh:657
void dbgs(const M &A, X &x, const Y &b, const K &w)
GS step.
Definition gsetc.hh:621
WithRelaxType
Definition gsetc.hh:54
void bdsolve(const M &A, X &v, const Y &d)
block diagonal solve, no relaxation
Definition gsetc.hh:340
void butsolve(const M &A, X &v, const Y &d)
block upper triangular solve
Definition gsetc.hh:204
void bsorf(const M &A, X &x, const Y &b, const K &w)
SOR step.
Definition gsetc.hh:633
void ubutsolve(const M &A, X &v, const Y &d)
unit block upper triangular solve
Definition gsetc.hh:217
@ nodiag
Definition gsetc.hh:51
@ withdiag
Definition gsetc.hh:50
@ norelax
Definition gsetc.hh:56
@ withrelax
Definition gsetc.hh:55
static constexpr size_type M()
static constexpr size_type N()
A Vector class to support different block types.
Definition multitypeblockvector.hh:59
A Matrix class to support different block types.
Definition multitypeblockmatrix.hh:46
compile-time parameter for block recursion depth
Definition gsetc.hh:45
@ recursion_level
Definition gsetc.hh:46
static void butsolve(const M &A, X &v, const Y &d, const K &w)
Definition gsetc.hh:90
static void bltsolve(const M &A, X &v, const Y &d, const K &w)
Definition gsetc.hh:71
static void bltsolve(const M &A, X &v, const Y &d, const K &w)
Definition gsetc.hh:116
static void butsolve(const M &A, X &v, const Y &d, const K &w)
Definition gsetc.hh:122
static void bltsolve(const M &A, X &v, const Y &d, const K &)
Definition gsetc.hh:131
static void butsolve(const M &A, X &v, const Y &d, const K &)
Definition gsetc.hh:136
static void bltsolve(const M &, X &v, const Y &d, const K &w)
Definition gsetc.hh:144
static void butsolve(const M &, X &v, const Y &d, const K &w)
Definition gsetc.hh:150
static void bltsolve(const M &, X &v, const Y &d, const K &)
Definition gsetc.hh:159
static void butsolve(const M &, X &v, const Y &d, const K &)
Definition gsetc.hh:164
static void bdsolve(const M &A, X &v, const Y &d, const K &w)
Definition gsetc.hh:298
static void bdsolve(const M &A, X &v, const Y &d, const K &w)
Definition gsetc.hh:319
static void bdsolve(const M &A, X &v, const Y &d, const K &)
Definition gsetc.hh:328
static void bsorb(const M &A, X &x, const Y &b, const K &w)
Definition gsetc.hh:461
static void bsorf(const M &A, X &x, const Y &b, const K &w)
Definition gsetc.hh:421
static void dbjac(const M &A, X &x, const Y &b, const K &w)
Definition gsetc.hh:503
static void dbgs(const M &A, X &x, const Y &b, const K &w)
Definition gsetc.hh:381
static void dbgs(const M &A, X &x, const Y &b, const K &)
Definition gsetc.hh:544
static void dbjac(const M &A, X &x, const Y &b, const K &)
Definition gsetc.hh:559
static void bsorf(const M &A, X &x, const Y &b, const K &)
Definition gsetc.hh:549
static void bsorb(const M &A, X &x, const Y &b, const K &)
Definition gsetc.hh:554
static void dbgs(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< MultiTypeVectorArgs... > &b, const K &w)
Definition gsetc.hh:570
static void dbjac(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< MultiTypeVectorArgs... > &b, const K &w)
Definition gsetc.hh:607
static void bsorf(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< MultiTypeVectorArgs... > &b, const K &w)
Definition gsetc.hh:582
static void bsorb(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< MultiTypeVectorArgs... > &b, const K &w)
Definition gsetc.hh:594