int hmat_cg(phmatrix hm, pavector b, pavector x) { if (hm->rc->size != b->dim) { return -1; } else { double ep = 1e-2; pavector r = new_avector(b->dim); pavector p = new_avector(b->dim); pavector q = new_avector(b->dim); pavector tempq = new_avector(b->dim); pavector newb = new_avector(b->dim); addeval_hmatrix_avector(f_one, hm, CblasConjTrans, b, newb); for (int i=0;i<b->dim;i++) { r->v[i] = newb->v[i]; x->v[i] = 0; } int i; field alpha, beta; field rr1; field rr; for (i=0;i<10001;i++) { rr = dot_prod_avec('c', r, r); if (i == 0) { for (int j=0;j<b->dim;j++) { p->v[j] = r->v[j]; } } else { beta = rr / rr1; add_avec(1, r, beta, p); } addeval_hmatrix_avector(f_one, hm, CblasNoTrans, p, tempq); addeval_hmatrix_avector(f_one, hm, CblasConjTrans, tempq, q); alpha = rr / dot_prod_avec('c', q, p); add_avec(alpha, p, 1, x); add_avec(-alpha, q, 1, r); rr1 = rr; if (LAPACKE_zlange(LAPACK_ROW_MAJOR, 'f', 1, r->dim, (MKL_Complex16 *)r->v, r->dim) < ep) { break; } } return i; } }
DLLEXPORT double z_matrix_norm(char norm, lapack_int m, lapack_int n, lapack_complex_double a[]) { return LAPACKE_zlange(LAPACK_COL_MAJOR, norm, m, n, a, m); }
int hmat_cg(phmatrix hm, pavector b, pavector x) { if (hm->rc->size != b->dim) { return -1; } else { double ep = 1e-2; pavector r = new_avector(b->dim); pavector p = new_avector(b->dim); pavector q = new_avector(b->dim); pavector tempq = new_avector(b->dim); pavector newb = new_avector(b->dim); pavector bp, xp; avector btmp, xtmp; int ip; /* Permutation of b */ bp = init_avector(&btmp, b->dim); for (int i = 0; i < bp->dim; i++) { ip = hm->cc->idx[i]; assert(ip < x->dim); bp->v[i] = b->v[ip]; } /* Permutation of y */ xp = init_avector(&xtmp, x->dim); fastaddeval_hmatrix_avector(1.0, hm, CblasConjTrans, bp, 0.0, newb); for (int i=0;i<bp->dim;i++) { r->v[i] = newb->v[i]; xp->v[i] = 0; } int i; field alpha, beta; field rr1; field rr; for (i=0;i<400;i++) { rr = dot_prod_avec('c', r, r); if (i == 0) { for (int j=0;j<bp->dim;j++) { p->v[j] = r->v[j]; } } else { beta = rr / rr1; add_avec(1, r, beta, p); } fastaddeval_hmatrix_avector(1.0, hm, CblasNoTrans, p, 0.0, tempq); fastaddeval_hmatrix_avector(1.0, hm, CblasConjTrans, tempq, 0.0, q); alpha = rr / dot_prod_avec('c', q, p); add_avec(alpha, p, 1, xp); add_avec(-alpha, q, 1, r); rr1 = rr; if (LAPACKE_zlange(LAPACK_ROW_MAJOR, 'f', 1, r->dim, (MKL_Complex16 *)r->v, r->dim) < ep) { continue; //break; } } /* Reverse permutation of y */ for (int i = 0; i < xp->dim; i++) { ip = hm->rc->idx[i]; assert(ip < xp->dim); x->v[ip] = xp->v[i]; } uninit_avector(bp); uninit_avector(xp); return i; } }