示例#1
0
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;
    }
}
示例#2
0
	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);
	}
示例#3
0
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;
    }
}