24 double alpha,beta=0,small=1e-20;
26 double gg_gg= (gg).innerProd(gg);
27 double gg_rr=-(gg).innerProd(rr);
31 if(fabs(gg_gg) < small){
32 fprintf(stderr,
"Zero dot product in first CG step %g %g\n",gg_gg,gg_rr);
37 double ss_ss=(ss).innerProd(ss);
38 double gg_ss=(gg).innerProd(ss);
39 if(fabs(gg_gg) < small || fabs(ss_ss) < small){
40 fprintf(stderr,
"Zero dot product in CG step %g %g / %g %g \n",gg_gg,gg_rr,ss_ss,gg_ss);
44 double determ=gg_gg*ss_ss*std::max( 1.-(gg_ss/gg_gg)*(gg_ss/ss_ss) , 1e-12 );
45 double ss_rr=-(ss).innerProd(rr);
46 alpha = (ss_ss*gg_rr - gg_ss*ss_rr)/determ;
47 beta = (-gg_ss*gg_rr + gg_gg*ss_rr)/determ;
51 std::cout <<
"iter: " << iter <<
" , alpha = " << alpha <<
", beta = " << beta <<
"\n";
54 (s).linearCombo(beta,g,alpha);
55 (ss).linearCombo(beta,gg,alpha);
57 (m).linearCombo(1.0,s,1.0);
58 (rr).linearCombo(1.0,ss,1.0);
60 res = (rr).innerProd(rr);