96 std::vector<RealD> &mass(
shifts.poles);
97 std::vector<RealD> &mresidual(
shifts.tolerances);
98 std::vector<RealD> alpha(nshift,1.0);
99 std::vector<Field> ps(nshift,grid);
101 assert(psi.size()==nshift);
102 assert(mass.size()==nshift);
103 assert(mresidual.size()==nshift);
106 std::vector<RealD> bs(nshift);
107 std::vector<RealD> rsq(nshift);
108 std::vector<std::array<RealD,2> > z(nshift);
109 std::vector<int> converged(nshift);
111 const int primary =0;
124 for(
int s=0;s<nshift;s++){
125 assert( mass[s]>= mass[primary] );
136 for(
int s=0;s<nshift;s++){
144 for(
int s=0;s<nshift;s++){
145 rsq[s] = cp * mresidual[s] * mresidual[s];
146 std::cout<<
GridLogMessage<<
"ConjugateGradientMultiShift: shift "<<s
147 <<
" target resid^2 "<<rsq[s]<<std::endl;
156 axpy(mmp,mass[0],p,mmp);
173 for(
int s=1;s<nshift;s++){
175 z[s][iz] = 1.0/( 1.0 - b*(mass[s]-mass[0]));
183 for(
int s=0;s<nshift;s++) {
184 axpby(psi[s],0.,-bs[s]*alpha[s],src,src);
187 std::cout <<
GridLogIterative <<
"ConjugateGradientMultiShift: initial rn (|src|^2) =" << rn <<
" qq (|MdagM src|^2) =" << qq <<
" d ( dot(src, [MdagM + m_0]src) ) =" << d <<
" c=" << c << std::endl;
218 for(
int s=0;s<nshift;s++){
219 if ( ! converged[s] ) {
221 axpy(ps[s],a,ps[s],r);
223 RealD as =a *z[s][iz]*bs[s] /(z[s][1-iz]*b);
224 axpby(ps[s],z[s][iz],as,r,ps[s]);
240 axpy(mmp,mass[0],p,mmp);
256 for(
int s=1;s<nshift;s++){
258 RealD z0 = z[s][1-iz];
261 / (b*a*(z1-z0) + z1*bp*(1- (mass[s]-mass[0])*b));
262 bs[s] = b*z[s][iz]/z0;
267 for(
int s=0;s<nshift;s++){
282 if( (!converged[s]) ) {
283 axpy(psi[ss],-bs[s]*alpha[s],ps[s],psi[ss]);
288 int all_converged = 1;
289 for(
int s=0;s<nshift;s++){
291 if ( (!converged[s]) ){
294 RealD css = c * z[s][iz]* z[s][iz];
297 if ( ! converged[s] )
298 std::cout<<
GridLogMessage<<
"ConjugateGradientMultiShift k="<<k<<
" Shift "<<s<<
" has converged"<<std::endl;
307 if ( all_converged ){
312 std::cout<<
GridLogMessage<<
"CGMultiShift: All shifts have converged iteration "<<k<<std::endl;
313 std::cout<<
GridLogMessage<<
"CGMultiShift: Checking solutions"<<std::endl;
316 for(
int s=0; s < nshift; s++) {
318 axpy(tmp,mass[s],psi[s],mmp);
319 axpy(r,-alpha[s],src,tmp);
340 std::cout<<
GridLogMessage<<
"CG multi shift did not converge"<<std::endl;