void atimes(unsigned long n, double x[], double r[], int itrnsp) { void dsprsax(double sa[], unsigned long ija[], double x[], double b[], unsigned long n); void dsprstx(double sa[], unsigned long ija[], double x[], double b[], unsigned long n); if (itrnsp) dsprstx(sa,ija,x,r,n); else dsprsax(sa,ija,x,r,n); }
int main(void) { int i,ii,iter; double *b,*bcmp,*x,err; b=dvector(1,NP); bcmp=dvector(1,NP); x=dvector(1,NP); for (i=1;i<=NP;i++) { x[i]=0.0; b[i]=1.0; } b[1]=3.0; b[NP] = -1.0; linbcg(NP,b,x,ITOL,TOL,ITMAX,&iter,&err); printf("%s %15e\n","Estimated error:",err); printf("%s %6d\n","Iterations needed:",iter); printf("\nSolution vector:\n"); for (ii=1;ii<=NP/5;ii++) { for (i=5*(ii-1)+1;i<=5*ii;i++) printf("%12.6f",x[i]); printf("\n"); } for (i=1;i<=(NP % 5);i++) printf("%12.6f",x[5*(NP/5)+i]); printf("\n"); dsprsax(sa,ija,x,bcmp,NP); /* this is a double precision version of sprsax */ printf("\npress RETURN to continue...\n"); (void) getchar(); printf("test of solution vector:\n"); printf("%9s %12s\n","a*x","b"); for (i=1;i<=NP;i++) printf("%12.6f %12.6f\n",bcmp[i],b[i]); free_dvector(x,1,NP); free_dvector(bcmp,1,NP); free_dvector(b,1,NP); return 0; }
void PCBCGSolver::atimes(unsigned long n, double x[], double r[], int itrnsp) { if (itrnsp) dsprstx(sa,ija,x,r,n); else dsprsax(sa,ija,x,r,n); }