54 Field
operator()(Matrix &Mat,
const Field& phi,
const std::vector<Field>& prev_solns)
56 int degree = prev_solns.size();
60 if(degree == 0){ chi =
Zero();
return chi; }
61 else if(degree == 1){
return prev_solns[0]; }
67 std::vector<Field> v(prev_solns);
68 std::vector<Field> MdagMv(degree,phi);
71 std::vector<std::vector<ComplexD>> G(degree, std::vector<ComplexD>(degree));
74 std::vector<ComplexD> a(degree);
75 std::vector<ComplexD> b(degree);
78 for(
int i=0; i<degree; i++){
79 v[i] *= 1.0/std::sqrt(
norm2(v[i]));
80 for(
int j=i+1; j<degree; j++){ v[j] -=
innerProduct(v[i],v[j]) * v[i]; }
84 for(
int i=0; i<degree; i++){
87 Mat.Mdag(Mv,MdagMv[i]);
92 for(
int j=0; j<degree; j++){
93 for(
int k=j+1; k<degree; k++){
99 for(
int i=0; i<degree; i++){
103 for(
int j=i+1; j<degree; j++){
if(
abs(G[j][j]) >
abs(G[k][k])){ k = j; } }
108 for(
int j=0; j<degree; j++){
116 for(
int j=i+1; j<degree; j++){
117 xp = G[j][i]/G[i][i];
119 for(
int k=0; k<degree; k++){ G[j][k] -= xp*G[i][k]; }
126 for(
int i=degree-1; i>=0; i--){
128 for(
int j=i+1; j<degree; j++){ a[i] += G[i][j] * a[j]; }
129 a[i] = (b[i]-a[i])/G[i][i];
136 for(
int i=0; i<degree; i++){
138 for(
int j=0; j<degree; j++){ tmp += G[i][j]*a[j]; }
140 true_r += std::sqrt(tmp.real());
144 std::cout <<
GridLogMessage <<
"ChronoForecast: |res|/|src| = " << error << std::endl;