#include "BSprivate.h" void BSbuild_solution(int i,int n,int BS,FLOAT *x,FLOAT *y, FLOAT **v,FLOAT ***h,FLOAT **s,BSprocinfo *procinfo) { int ii, j, q; FLOAT temp; for (q=0;q=0;ii--) { temp = s[q][ii]; for (j=ii+1;j<=i;j++) { temp -= h[q][ii][j] * y[j]; } y[ii] = temp / h[q][ii][ii]; } for (ii=0;ii<=i;ii++) { for (j=0;jnum_rows; m = restart; /* reorder the rhs */ MY_MALLOCN(rhs,(FLOAT *),sizeof(FLOAT)*n*BS,1); for (i=0;iperm); CHKERRN(0); } /* allocate space for x */ MY_MALLOCN(x,(FLOAT *),sizeof(FLOAT)*n*BS,2); MY_MALLOCN(bnorm,(FLOAT *),sizeof(FLOAT)*BS,3); /* allocate space for gmres vectors */ MY_MALLOCN(resid,(FLOAT *),sizeof(FLOAT)*n*BS,4); MY_MALLOCN(w,(FLOAT *),sizeof(FLOAT)*n*BS,5); MY_MALLOCN(v,(FLOAT **),sizeof(FLOAT)*(m+1),6); for (i=0;i<(m+1);i++) { MY_MALLOCN(v[i],(FLOAT *),sizeof(FLOAT)*n*BS,6); } MY_MALLOCN(h,(FLOAT ***),sizeof(FLOAT)*BS,7); for (i=0;iperm); CHKERRN(0); } } /* scale the rhs and x */ if(A->scale_diag!=NULL) { for (i=0;iscale_diag[j])); t_rhs[j] /= tval; t_x[j] *= tval; } } } /* get the norm of B */ BSpar_bip(n,rhs,rhs,BS,bnorm,procinfo); CHKERRN(0); done = TRUE; for (i=0;imy_id==0) printf("bnorm = %e\n",bnorm[i]); */ if (bnorm[i] != 0.0) done = FALSE; } cur_step = 0; while (!done) { /* compute initial residual */ BStri_mult(A,comm_A,NULL,NULL,x,resid,NULL,NULL,0.0, BS,procinfo); CHKERRN(0); for (i=0;i= err_tol) done = FALSE; /* printf("initial residual(%d) = %e\n",i,residual[i]); */ } /* GMRES iteration cycle */ for (i=0;iperm); CHKERRN(0); for (j=0;jperm); CHKERRN(0); for (j=0;jmy_id==0) printf("error(%d,%d) = %e;\n",cur_step,j+1,error); */ if (error >= err_tol) done = FALSE; } if(cur_step >= max_iter) done = TRUE; if(done) { BSbuild_solution(i,n,BS,x,y,v,h,s,procinfo); /* if(procinfo->my_id==0) printf("done in %d iterations\n",cur_step); */ break; } } if (!done) { BSbuild_solution(m-1,n,BS,x,y,v,h,s,procinfo); } } /* compute final residual */ BStri_mult(A,comm_A,NULL,NULL,x,resid,NULL,NULL,0.0,BS, procinfo); CHKERRN(0); for (i=0;imy_id==0) printf("final residual[%d] = %e\n",i,residual[i]); */ } MY_FREE(bnorm); MY_FREE(resid); MY_FREE(w); for (i=0;iscale_diag!=NULL) { for (i=0;iscale_diag[j])); } } } /* reorder the solution vector */ for (i=0;iperm); CHKERRN(0); } MY_FREE(x); /* return the number of iterations */ return(cur_step); }