7#ifndef SENK_BICGSTAB_HPP
8#define SENK_BICGSTAB_HPP
31 T *val,
int *cind,
int *rptr,
33 int max_iter,
int N, T epsilon)
48 sparse::SpmvCsr<T>(val, cind, rptr, x, r, N);
49 blas1::Axpby<T>(1, b, -1, r, N);
50 blas1::Copy<T>(r, rstr, N);
51 blas1::Copy<T>(r, p, N);
52 r_rstr = blas1::Dot<T>(r, rstr, N);
53 for(i=0; i<max_iter; i++) {
54 sparse::SpmvCsr<T>(val, cind, rptr, p, Ap, N);
55 alpha = r_rstr / blas1::Dot<T>(Ap, rstr, N);
56 blas1::Axpyz<T>(-alpha, Ap, r, s, N);
57 sparse::SpmvCsr<T>(val, cind, rptr, s, As, N);
58 omega = blas1::Dot<T>(As, s, N) / blas1::Dot<T>(As, As, N);
59 blas1::Axpy<T>(alpha, p, x, N);
60 blas1::Axpy<T>(omega, s, x, N);
61 blas1::Axpyz<T>(-omega, As, s, r, N);
62 nrm_r = blas1::Nrm2<T>(r, N);
63 printf(
"%d %e\n", i+1, nrm_r/nrm_b);
64 if(nrm_r < epsilon * nrm_b) {
65 printf(
"# iter %d\n", i+1);
66 printf(
"# res %e\n", nrm_r/nrm_b);
71 r_rstr = blas1::Dot<T>(r, rstr, N);
72 beta = alpha / omega * r_rstr / prev;
73 blas1::Axpyz<T>(-omega, Ap, p, temp, N);
74 blas1::Axpyz<T>(beta, temp, r, p, N);
77 printf(
"# iter %d (max)\n", i);
78 printf(
"# res %e\n", nrm_r/nrm_b);
109 T *val,
int *cind,
int *rptr,
110 T *lval,
int *lcind,
int *lrptr,
111 T *uval,
int *ucind,
int *urptr,
113 int max_iter,
int N, T epsilon)
127 T alpha, beta, omega;
131 sparse::SpmvCsr<T>(val, cind, rptr, x, r, N);
132 blas1::Axpby<T>(1, b, -1, r, N);
133 blas1::Copy<T>(r, rstr, N);
134 blas1::Copy<T>(r, p, N);
135 r_rstr = blas1::Dot<T>(r, rstr, N);
136 for(i=0; i<max_iter; i++) {
137 sparse::SptrsvCsr_l<T>(lval, lcind, lrptr, p, Kp, N);
138 sparse::SptrsvCsr_u<T>(uval, ucind, urptr, Kp, Kp, N);
139 sparse::SpmvCsr<T>(val, cind, rptr, Kp, AKp, N);
140 alpha = r_rstr / blas1::Dot<T>(AKp, rstr, N);
142 sparse::SptrsvCsr_l<T>(lval, lcind, lrptr, s, Ks, N);
143 sparse::SptrsvCsr_u<T>(uval, ucind, urptr, Ks, Ks, N);
144 sparse::SpmvCsr<T>(val, cind, rptr, Ks, AKs, N);
145 omega = blas1::Dot<T>(AKs, s, N) / blas1::Dot<T>(AKs, AKs, N);
146 blas1::Axpy<T>(alpha, Kp, x, N);
147 blas1::Axpy<T>(omega, Ks, x, N);
148 blas1::Axpyz<T>(-omega, AKs, s, r, N);
149 nrm_r = blas1::Nrm2<T>(r, N);
150 printf(
"%d %e\n", i+1, nrm_r/nrm_b);
151 if(nrm_r < epsilon * nrm_b) {
152 printf(
"# iter %d\n", i+1);
153 printf(
"# res %e\n", nrm_r/nrm_b);
158 r_rstr = blas1::Dot<T>(r, rstr, N);
159 beta = alpha / omega * r_rstr / prev;
160 blas1::Axpyz<T>(-omega, AKp, p, temp, N);
161 blas1::Axpyz<T>(beta, temp, r, p, N);
164 printf(
"# iter %d (max)\n", i);
165 printf(
"# res %e\n", nrm_r/nrm_b);
198template <
typename T,
int bnl,
int bnw>
200 T *val,
int *cind,
int *rptr,
201 T *blval,
int *blcind,
int *blrptr,
202 T *buval,
int *bucind,
int *burptr,
204 int max_iter,
int N, T epsilon)
218 T alpha, beta, omega;
222 sparse::SpmvCsr<T>(val, cind, rptr, x, r, N);
223 blas1::Axpby<T>(1, b, -1, r, N);
224 blas1::Copy<T>(r, rstr, N);
225 blas1::Copy<T>(r, p, N);
226 r_rstr = blas1::Dot<T>(r, rstr, N);
227 for(i=0; i<max_iter; i++) {
228 sparse::SptrsvBcsr_l<T, bnl, bnw>(blval, blcind, blrptr, p, Kp, N);
229 sparse::SptrsvBcsr_u<T, bnl, bnw>(buval, bucind, burptr, Kp, Kp, N);
230 sparse::SpmvCsr<T>(val, cind, rptr, Kp, AKp, N);
233 sparse::SptrsvBcsr_l<T, bnl, bnw>(blval, blcind, blrptr, s, Ks, N);
234 sparse::SptrsvBcsr_u<T, bnl, bnw>(buval, bucind, burptr, Ks, Ks, N);
235 sparse::SpmvCsr<T>(val, cind, rptr, Ks, AKs, N);
236 omega = blas1::Dot<T>(AKs, s, N) / blas1::Dot<T>(AKs, AKs, N);
237 blas1::Axpy<T>(alpha, Kp, x, N);
238 blas1::Axpy<T>(omega, Ks, x, N);
239 blas1::Axpyz<T>(-omega, AKs, s, r, N);
240 nrm_r = blas1::Nrm2<T>(r, N);
241 printf(
"%d %e\n", i+1, nrm_r/nrm_b);
242 if(nrm_r < epsilon * nrm_b) {
243 printf(
"# iter %d\n", i+1);
244 printf(
"# res %e\n", nrm_r/nrm_b);
249 r_rstr = blas1::Dot<T>(r, rstr, N);
250 beta = alpha / omega * r_rstr / prev;
251 blas1::Axpyz<T>(-omega, AKp, p, temp, N);
252 blas1::Axpyz<T>(beta, temp, r, p, N);
255 printf(
"# iter %d (max)\n", i);
256 printf(
"# res %e\n", nrm_r/nrm_b);
T Dot(T *x, T *y, int N)
Compute the dot product of x and y.
void Axpyz(T a, T *x, T *y, T *z, int N)
Compute z = a * x + y.
void IlubBicgstab(T *val, int *cind, int *rptr, T *blval, int *blcind, int *blrptr, T *buval, int *bucind, int *burptr, T *b, T *x, T nrm_b, int max_iter, int N, T epsilon)
ILUB preconditioned BiCGStab solver.
void IluBicgstab(T *val, int *cind, int *rptr, T *lval, int *lcind, int *lrptr, T *uval, int *ucind, int *urptr, T *b, T *x, T nrm_b, int max_iter, int N, T epsilon)
ILU preconditioned BiCGStab solver.
void Bicgstab(T *val, int *cind, int *rptr, T *b, T *x, T nrm_b, int max_iter, int N, T epsilon)
Non-preconditioned BiCGStab solver.
The top-level namespace of SenK.
Level1 BLAS-style functions are written.
Functions related to sparse matrices are written.