47 int *row_ptr,
int *col_ind,
int *diag_ind,
double *precon_nnz_data,
48 double *x,
double *b,
double *H,
double *V,
double *g,
double *y,
double *w,
double *r)
51 const int n = bn * BLOCK;
52 double beta, tmp, c, s, h1, h2, rr;
54 sparse_status_t mklstat;
60 struct matrix_descr descr;
61 descr.type = SPARSE_MATRIX_TYPE_GENERAL;
79 mklstat = mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, -1.0, op, descr, x, 0.0, r);
80 if (mklstat != SPARSE_STATUS_SUCCESS) {
84 cblas_daxpy(n, 1.0, b, 1, r, 1);
91 beta = cblas_dnrm2(n, r, 1);
98 psolve(bn, row_ptr, col_ind, diag_ind, precon_nnz_data, r);
100 beta = cblas_dnrm2(n, r, 1);
104 #pragma omp parallel for
105 for (i=0; i<n; i++) {
112 for (j = 0; j < m; j++)
114 mklstat = mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, 1.0, op, descr, &V[j * n], 0.0, w);
115 if (mklstat != SPARSE_STATUS_SUCCESS) {
119 psolve(bn, row_ptr, col_ind, diag_ind, precon_nnz_data, w);
122 for (i = 0; i < (j + 1); i++) {
123 tmp = cblas_ddot(n, w, 1, &V[i * n], 1);
125 cblas_daxpy(n, -tmp, &V[i * n], 1, w, 1);
128 tmp = cblas_dnrm2(n, w, 1);
129 H[j + (j + 1) * m] = tmp;
131 #pragma omp parallel for
132 for (i=0; i<n; i++) {
133 V[(j+1)*n+i] = w[i]/tmp;
137 for (i = 0; i < j; i++)
142 h2 = H[j + (i + 1) * m];
143 H[j + i * m] = c * h1 - s * h2;
144 H[j + (i + 1) * m] = s * h1 + c * h2;
148 h2 = H[j + (j + 1) * m];
149 rr = sqrt(h1 * h1 + h2 * h2);
152 H[j * (m + 1)] = c * h1 - s * h2;
163 cblas_dtrsv(CblasRowMajor, CblasUpper, CblasNoTrans, CblasNonUnit, m, H, m, y, 1);
166 cblas_dgemv(CblasRowMajor, CblasTrans, m, n, 1.0, V, n, y, 1, 1.0, x, 1);
169 mklstat = mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, -1.0, op, descr, x, 0.0, r);
170 if (mklstat != SPARSE_STATUS_SUCCESS) {
174 cblas_daxpy(n, 1.0, b, 1, r, 1);
186 int bn,
int m,
int *flag,
187 int *row_ptr,
int *col_ind,
int *diag_ind,
double *precon_nnz_data,
188 double *x,
double *b,
double *H,
double *V,
double *g,
double *y,
double *w,
double *r)
191 const int n = bn * BLOCK;
192 double beta, tmp, c, s, h1, h2, rr;
193 sparse_status_t mklstat;
197 psolve(bn, row_ptr, col_ind, diag_ind, precon_nnz_data, r);
199 beta = cblas_dnrm2(n, r, 1);
203 #pragma omp parallel for
204 for (i=0; i<n; i++) {
211 for (j = 0; j < m; j++)
213 mklstat = mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, 1.0, op, descr, &V[j * n], 0.0, w);
214 if (mklstat != SPARSE_STATUS_SUCCESS) {
219 psolve(bn, row_ptr, col_ind, diag_ind, precon_nnz_data, w);
222 for (i = 0; i < (j + 1); i++)
224 tmp = cblas_ddot(n, w, 1, &V[i * n], 1);
226 cblas_daxpy(n, -tmp, &V[i * n], 1, w, 1);
229 tmp = cblas_dnrm2(n, w, 1);
230 H[j + (j + 1) * m] = tmp;
232 #pragma omp parallel for
233 for (i=0; i<n; i++) {
234 V[(j+1)*n+i] = w[i]/tmp;
238 for (i = 0; i < j; i++)
243 h2 = H[j + (i + 1) * m];
244 H[j + i * m] = c * h1 - s * h2;
245 H[j + (i + 1) * m] = s * h1 + c * h2;
249 h2 = H[j + (j + 1) * m];
250 rr = sqrt(h1 * h1 + h2 * h2);
253 H[j * (m + 1)] = c * h1 - s * h2;
264 cblas_dtrsv(CblasRowMajor, CblasUpper, CblasNoTrans, CblasNonUnit, m, H, m, y, 1);
267 cblas_dgemv(CblasRowMajor, CblasTrans, m, n, 1.0, V, n, y, 1, 1.0, x, 1);
270 mklstat = mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, -1.0, op, descr, x, 0.0, r);
271 if (mklstat != SPARSE_STATUS_SUCCESS) {
275 cblas_daxpy(n, 1.0, b, 1, r, 1);
287 int *row_ptr,
int *col_ind,
int *diag_ind,
double *precon_nnz_data,
288 double *x,
double *b,
double *r,
double *p,
double *v,
double *s,
double *t)
291 const int n = bn * BLOCK;
292 double rho, rhoprev, alpha, beta, omega, resid;
295 sparse_status_t mklstat;
298 struct matrix_descr descr;
299 descr.type = SPARSE_MATRIX_TYPE_GENERAL;
312 mklstat = mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, -1.0, op, descr, x, 0.0, r);
313 if (mklstat != SPARSE_STATUS_SUCCESS) {
317 cblas_daxpy(n, 1.0, b, 1, r, 1);
322 cblas_dcopy(n, r, 1, &r[n], 1);
327 resid = cblas_dnrm2(n, r, 1);
331 rho = cblas_ddot(n, r, 1, &r[n], 1);
338 cblas_dcopy(n, r, 1, p, 1);
341 beta = (rho / rhoprev) * (alpha / omega);
344 cblas_daxpy(n, -omega, v, 1, p, 1);
345 cblas_dscal(n, beta, p, 1);
346 cblas_daxpy(n, 1.0, r, 1, p, 1);
350 cblas_dcopy(n, p, 1, &p[n], 1);
351 psolve(bn, row_ptr, col_ind, diag_ind, precon_nnz_data, &p[n]);
354 mklstat = mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, 1.0, op, descr, &p[0], 0.0, v);
355 if (mklstat != SPARSE_STATUS_SUCCESS)
361 rv = cblas_ddot(n, v, 1, &r[n], 1);
366 cblas_daxpy(n, -alpha, v, 1, r, 1);
368 cblas_dcopy(n, r, 1, s, 1);
371 cblas_daxpy(n, alpha, &p[n], 1, x, 1);
372 resid = cblas_dnrm2(n, s, 1);
377 cblas_dcopy(n, s, 1, &s[n], 1);
378 psolve(bn, row_ptr, col_ind, diag_ind, precon_nnz_data, &s[n]);
380 mklstat = mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, 1.0, op, descr, &s[0], 0.0, t);
381 if (mklstat != SPARSE_STATUS_SUCCESS)
387 ts = cblas_ddot(n, t, 1, s, 1);
388 tt = cblas_ddot(n, t, 1, t, 1);
392 cblas_daxpy(n, omega, &s[0], 1, x, 1);
395 cblas_daxpy(n, -omega, t, 1, r, 1);
ucfd_status_t serial_gmres(sparse_matrix_t op, ucfd_precon_type_t precon_type, int bn, int block, int m, int *iter, double tol, int *row_ptr, int *col_ind, int *diag_ind, double *precon_nnz_data, double *x, double *b, double *H, double *V, double *g, double *y, double *w, double *r)
Serial GMRES routine.
ucfd_status_t step_gmres(sparse_matrix_t op, ucfd_precon_solve psolve, const struct matrix_descr descr, int bn, int m, int *flag, int *row_ptr, int *col_ind, int *diag_ind, double *precon_nnz_data, double *x, double *b, double *H, double *V, double *g, double *y, double *w, double *r)
Single GMRES iteration routine.
ucfd_status_t serial_bicgstab(sparse_matrix_t op, ucfd_precon_type_t precon_type, int bn, int *iter, double tol, int *row_ptr, int *col_ind, int *diag_ind, double *precon_nnz_data, double *x, double *b, double *r, double *p, double *v, double *s, double *t)
Serial BiCGstab routine.
Header file for Krylov subspace methods.
Header file for preconditioners for Krylov subspace methods.
void none_psolve(int bn, int *row_ptr, int *col_ind, int *diag_ind, double *nnz_data, double *b)
Unpreconditioned solver.
void lusgs_psolve(int bn, int *row_ptr, int *col_ind, int *diag_ind, double *nnz_data, double *b)
Solver function for LU-SGS preconditioner.
void bilu_psolve(int bn, int *row_ptr, int *col_ind, int *diag_ind, double *nnz_data, double *b)
Solver function for BILU preconditioner.
void(* ucfd_precon_solve)(int, int *, int *, int *, double *, double *)
@ UCFD_STATUS_RHO_BREAKDOWN