From 1cd5b9dfa5c5253b9283b6d75b450389e9a7544f Mon Sep 17 00:00:00 2001 From: "Kurt A. O'Hearn" <ohearnku@msu.edu> Date: Tue, 16 Feb 2016 12:09:43 -0500 Subject: [PATCH] sPuReMD: fix iteration matrix used in Jacobi iteration. --- puremd_rc_1003/sPuReMD/GMRES.c | 48 +++++++++++++++++----------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/puremd_rc_1003/sPuReMD/GMRES.c b/puremd_rc_1003/sPuReMD/GMRES.c index 72026881..363c94e7 100644 --- a/puremd_rc_1003/sPuReMD/GMRES.c +++ b/puremd_rc_1003/sPuReMD/GMRES.c @@ -58,41 +58,40 @@ static void Sparse_MatVec( const sparse_matrix * const A, } -/* sparse matrix-vector product Ax=b - * ommitting diagonal of A (for Jacobi iteration), - * A: triangular matrix +/* sparse matrix-vector product Gx=b (for Jacobi iteration), + * where G = (I - D^{-1}R) (G not explicitly computed and stored) + * R: strictly triangular matrix (diagonals not used) + * tri: triangularity of A (lower/upper) + * D_inv: inverse of the diagonal of R * x: vector - * b: vector (result) - * tri: triangularity of A (lower/upper) */ -static void Sparse_MatVec2( const sparse_matrix * const A, - const TRIANGULARITY tri, const real * const x, real * const b) + * b: vector (result) */ +static void Sparse_MatVec2( const sparse_matrix * const R, + const TRIANGULARITY tri, const real * const Dinv, + const real * const x, real * const b) { - int i, j, k, n, si = 0, ei = 0; - real H; + int i, k, si = 0, ei = 0; - n = A->n; - Vector_MakeZero( b, n ); + Vector_MakeZero( b, R->n ); - for ( i = 0; i < n; ++i ) + for ( i = 0; i < R->n; ++i ) { if (tri == LOWER) { - si = A->start[i]; - ei = A->start[i + 1] - 1; + si = R->start[i]; + ei = R->start[i + 1] - 1; } else if (tri == UPPER) { - si = A->start[i] + 1; - ei = A->start[i + 1]; + si = R->start[i] + 1; + ei = R->start[i + 1]; } for ( k = si; k < ei; ++k ) { - j = A->entries[k].j; - H = A->entries[k].val; - b[i] += H * x[j]; + b[i] += R->entries[k].val * x[R->entries[k].j]; } + b[i] *= -Dinv[i]; } } @@ -179,8 +178,9 @@ static void Jacobi_Iter( const sparse_matrix * const G, const TRIANGULARITY tri, do { + // Issue: G = I - D^{-1}R, NOT R // x_{k+1} = G*x_{k} + Dinv*b; - Sparse_MatVec2( (sparse_matrix*)G, tri, rp, rp2 ); + Sparse_MatVec2( (sparse_matrix*)G, tri, Dinv, rp, rp2 ); Vector_Add2( rp2, Dinv_b, n ); rp3 = rp; rp = rp2; @@ -682,8 +682,8 @@ int PGMRES_Jacobi( static_storage *workspace, sparse_matrix *H, real *b, real to Sparse_MatVec( H, x, workspace->b_prm ); Vector_Sum( workspace->v[0], 1., b, -1., workspace->b_prm, N ); // TODO: add parameters to config file - Jacobi_Iter( L, LOWER, Dinv_L, N, workspace->v[0], workspace->v[0], 100 ); - Jacobi_Iter( U, UPPER, Dinv_U, N, workspace->v[0], workspace->v[0], 100 ); + Jacobi_Iter( L, LOWER, Dinv_L, N, workspace->v[0], workspace->v[0], 30 ); + Jacobi_Iter( U, UPPER, Dinv_U, N, workspace->v[0], workspace->v[0], 30 ); // Forward_Subs( L, workspace->v[0], workspace->v[0] ); // Backward_Subs( U, workspace->v[0], workspace->v[0] ); workspace->g[0] = Norm( workspace->v[0], N ); @@ -696,8 +696,8 @@ int PGMRES_Jacobi( static_storage *workspace, sparse_matrix *H, real *b, real to /* matvec */ Sparse_MatVec( H, workspace->v[j], workspace->v[j + 1] ); // TODO: add parameters to config file - Jacobi_Iter( L, LOWER, Dinv_L, N, workspace->v[j + 1], workspace->v[j + 1], 100 ); - Jacobi_Iter( U, UPPER, Dinv_U, N, workspace->v[j + 1], workspace->v[j + 1], 100 ); + Jacobi_Iter( L, LOWER, Dinv_L, N, workspace->v[j + 1], workspace->v[j + 1], 30 ); + Jacobi_Iter( U, UPPER, Dinv_U, N, workspace->v[j + 1], workspace->v[j + 1], 30 ); // Forward_Subs( L, workspace->v[j + 1], workspace->v[j + 1] ); // Backward_Subs( U, workspace->v[j + 1], workspace->v[j + 1] ); -- GitLab