6 #include <qdp-lapack.h>
22 using namespace LinAlg ;
25 namespace InvEigCG2Env
33 const multi1d<T>& evec,
37 if(Nvecs>evec.size()){
41 QDPIO::cerr<<
"OOPS! your matrix can't take this many matrix elements\n";
48 for(
int i(0);
i<H.
N;
i++)
51 for(
int j(
i);
j<H.
N;
j++)
55 H(
i,
j) = conj(H(
j,
i));
56 if(
i==
j) H(
i,
j) = real(H(
i,
j));
64 const multi1d<T>& evec,
65 const multi1d<Double>& eval,
66 int Nvecs,
int NgoodEvecs)
69 if(Nvecs>evec.size()){
73 QDPIO::cerr<<
"OOPS! your matrix can't take this many matrix elements\n";
79 for(
int i(0);
i<NgoodEvecs;
i++)
83 for(
int i(NgoodEvecs);
i<H.
N;
i++)
86 for(
int j(0);
j<H.
N;
j++)
90 H(
i,
j) = conj(H(
j,
i));
91 if(
i==
j) H(
i,
j) = real(H(
i,
j));
101 multi1d<Double>& eval,
106 const int PrintLevel)
110 FlopCounter flopcount;
127 Double r_dot_z, r_dot_z_old ;
131 r[
A.subset()] =
b - Ap ;
132 r_dot_z = norm2(
r,
A.subset()) ;
135 QDPIO::cout <<
"InvEigCG2: Nevecs(input) = " << evec.size() << std::endl;
136 QDPIO::cout <<
"InvEigCG2: k = " <<
k <<
" res^2 = " << r_dot_z << std::endl;
149 while(toBool(r_dot_z>
rsd_sq)){
154 r_dot_z_old = r_dot_z ;
155 r_dot_z = norm2(
r,
A.subset());
156 Double inv_sqrt_r_dot_z = 1.0/sqrt(r_dot_z) ;
164 beta = r_dot_z/r_dot_z_old ;
169 if((Neig>0)&& (H.
N == Nmax)) Ap_prev[
A.subset()]=Ap ;
176 H(H.
N-1,H.
N-1) = 1/
alpha + betaprev/alphaprev;
178 QDPIO::cout<<
"MAGIC BEGINS: H.N ="<<H.
N<<std::endl ;
180 #ifndef QDP_IS_QDPJIT
182 std::stringstream
tag ;
184 OctavePrintOut(H.
mat,Nmax,
tag.str(),
"Hmatrix.m");
189 std::stringstream
tag ;
191 OctavePrintOut(
tmp.mat,Nmax,
tag.str(),
"Hmatrix.m");
195 multi2d<DComplex> Hevecs(H.
mat) ;
196 multi1d<Double> Heval ;
197 char V =
'V' ;
char U =
'U' ;
198 QDPLapack::zheev(V,
U,Nmax,Hevecs,Heval);
200 #ifndef QDP_IS_QDPJIT
202 std::stringstream
tag ;
204 OctavePrintOut(Hevecs,Nmax,
tag.str(),
"Hmatrix.m");
206 for(
int i(0);
i<Nmax;
i++)
207 QDPIO::cout<<
" eignvalue: "<<Heval[
i]<<std::endl ;
210 multi2d<DComplex> Hevecs_old(H.
mat) ;
211 multi1d<Double> Heval_old ;
212 QDPLapack::zheev(V,
U,Nmax-1,Hevecs_old,Heval_old);
213 for(
int i(0);
i<Nmax;
i++)
214 Hevecs_old(
i,Nmax-1) = Hevecs_old(Nmax-1,
i) = 0.0 ;
219 for(
int i(Neig);
i<2*Neig;
i++)
220 for(
int j(0);
j<Nmax;
j++)
221 Hevecs(
i,
j) = Hevecs_old(
i-Neig,
j) ;
226 multi1d<DComplex> TAU ;
227 QDPLapack::zgeqrf(Nmax,2*Neig,Hevecs,TAU) ;
228 char R =
'R' ;
char L =
'L' ;
char N =
'N' ;
char C =
'C' ;
229 multi2d<DComplex> Htmp = H.
mat ;
230 QDPLapack::zunmqr(R,N,Nmax,Nmax,Hevecs,TAU,Htmp);
231 QDPLapack::zunmqr(L,
C,Nmax,2*Neig,Hevecs,TAU,Htmp);
233 QDPLapack::zheev(V,
U,2*Neig,Htmp,Heval);
235 #ifndef QDP_IS_QDPJIT
237 std::stringstream
tag ;
239 OctavePrintOut(Htmp,Nmax,
tag.str(),
"Hmatrix.m");
243 for(
int i(Neig);
i< 2*Neig;
i++ )
244 for(
int j(2*Neig);
j<Nmax;
j++)
248 #ifndef QDP_IS_QDPJIT
250 std::stringstream
tag ;
251 tag<<
"HtmpBeforeZUM"<<
k ;
252 OctavePrintOut(Htmp,Nmax,
tag.str(),
"Hmatrix.m");
256 QDPLapack::zunmqr(L,N,Nmax,2*Neig,Hevecs,TAU,Htmp);
258 #ifndef QDP_IS_QDPJIT
260 std::stringstream
tag ;
261 tag<<
"HtmpAfeterZUM"<<
k ;
262 OctavePrintOut(Htmp,Nmax,
tag.str(),
"Hmatrix.m");
267 #ifndef USE_BLAS_FOR_LATTICEFERMIONS
268 multi1d<T> tt_vec(2*Neig);
269 for(
int i(0);
i<2*Neig;
i++){
270 tt_vec[
i][
A.subset()] =
zero ;
271 for(
int j(0);
j<Nmax;
j++)
272 tt_vec[
i][
A.subset()] +=Htmp(
i,
j)*vec[
j] ;
274 for(
int i(0);
i<2*Neig;
i++)
275 vec[
i][
A.subset()] = tt_vec[
i] ;
286 for (
int i=0;
i<2*Neig;
i++) H(
i,
i) = Heval[
i];
289 tt[
A.subset()] = Ap -
beta*Ap_prev ;
291 #ifndef USE_BLAS_FOR_LATTICEFERMIONS
292 for (
int i=0;
i<2*Neig;
i++){
294 H(
i,2*Neig)=conj(H(2*Neig,
i)) ;
316 pAp = innerProductReal(
p,Ap,
A.subset());
318 alpha = r_dot_z/pAp ;
326 res.
resid = sqrt(r_dot_z);
332 QDPIO::cout <<
"InvEigCG2: k = " <<
k ;
333 QDPIO::cout <<
" r_dot_z = " << r_dot_z << std::endl;
341 #define USE_LAST_VECTORS
342 #ifdef USE_LAST_VECTORS
344 multi2d<DComplex> Hevecs(H.
mat) ;
345 multi1d<Double> Heval ;
346 char V =
'V' ;
char U =
'U' ;
347 QDPLapack::zheev(V,
U,H.
N-1,Hevecs,Heval);
349 for(
int i(0);
i<Neig;
i++){
350 evec[
i][
A.subset()] =
zero ;
352 for(
int j(0);
j<H.
N-1;
j++)
353 evec[
i][
A.subset()] +=Hevecs(
i,
j)*vec[
j] ;
356 for(
int i(0);
i<Neig;
i++){
357 evec[
i][
A.subset()] = vec[
i] ;
358 eval[
i] = real(H(
i,
i)) ;
363 res.
resid = sqrt(r_dot_z);
365 QDPIO::cout <<
"InvEigCG2: k = " <<
k << std::endl;
366 flopcount.report(
"InvEigCG2", swatch.getTimeInSeconds());
376 multi1d<Double>& eval,
381 const int PrintLevel)
385 char V =
'V' ;
char U =
'U' ;
387 FlopCounter flopcount;
402 Double r_dot_z, r_dot_z_old ;
408 r[
A.subset()] =
b - Ap ;
409 Double r_norm2 = norm2(
r,
A.subset()) ;
412 QDPIO::cout <<
"InvEigCG2: Nevecs(input) = " << evec.size() << std::endl;
414 QDPIO::cout <<
"InvEigCG2: k = " <<
k <<
" res^2 = "<<r_norm2<<std::endl;
416 Real inorm(Real(1.0/sqrt(r_norm2)));
417 bool FindEvals = (Neig>0);
425 p[
A.subset()] = inorm*
r ;
431 from_restart = true ;
440 while(toBool(r_norm2>
rsd_sq)){
445 r_dot_z = innerProductReal(
r,
r,
A.subset());
454 beta = r_dot_z/r_dot_z_old ;
460 if(!((from_restart)&&(H.
N == tr+1))){
462 H(H.
N-2,H.
N-2) = 1/
alpha + betaprev/alphaprev;
464 from_restart = false ;
473 pAp = innerProductReal(
p,Ap,
A.subset());
476 alpha = r_dot_z/pAp ;
479 r_norm2 = norm2(
r,
A.subset()) ;
480 r_dot_z_old = r_dot_z ;
489 QDPIO::cout<<
"MAGIC BEGINS: H.N ="<<H.
N<<std::endl ;
490 H(Nmax-1,Nmax-1) = 1/
alpha +
beta/alphaprev;
492 multi2d<DComplex> Hevecs(H.
mat) ;
493 multi1d<Double> Heval ;
494 QDPLapack::zheev(V,
U,Hevecs,Heval);
495 multi2d<DComplex> Hevecs_old(H.
mat) ;
497 multi1d<Double> Heval_old ;
498 QDPLapack::zheev(V,
U,Nmax-1,Hevecs_old,Heval_old);
499 for(
int i(0);
i<Nmax;
i++)
503 for(
int i(Neig);
i<tr;
i++)
504 for(
int j(0);
j<Nmax;
j++)
505 Hevecs(
i,
j) = Hevecs_old(
i-Neig,
j) ;
510 multi1d<DComplex> TAU ;
511 QDPLapack::zgeqrf(Nmax,2*Neig,Hevecs,TAU) ;
512 char R =
'R' ;
char L =
'L' ;
char N =
'N' ;
char C =
'C' ;
513 multi2d<DComplex> Htmp = H.
mat ;
514 QDPLapack::zunmqr(R,N,Nmax,Nmax,Hevecs,TAU,Htmp);
515 QDPLapack::zunmqr(L,
C,Nmax,2*Neig,Hevecs,TAU,Htmp);
519 QDPLapack::zheev(V,
U,2*Neig,Htmp,Heval);
520 for(
int i(Neig);
i< 2*Neig;
i++ )
521 for(
int j(2*Neig);
j<Nmax;
j++)
524 QDPLapack::zunmqr(L,N,Nmax,2*Neig,Hevecs,TAU,Htmp);
527 multi1d<T> tt_vec = vec.
vec;
528 for(
int i(0);
i<2*Neig;
i++){
529 vec[
i][
A.subset()] =
zero ;
530 for(
int j(0);
j<Nmax;
j++)
531 vec[
i][
A.subset()] +=Htmp(
i,
j)*tt_vec[
j] ;
535 for (
int i=0;
i<2*Neig;
i++) H(
i,
i) = Heval[
i];
552 for (
int i=0;
i<2*Neig;
i++){
554 H(
i,2*Neig) = conj(H(2*Neig,
i)) ;
556 H(2*Neig,2*Neig) =
innerProduct(
r, Ar,
A.subset())/sqrt(r_norm2) ;
559 from_restart = true ;
564 Double inorm = 1.0/sqrt(r_norm2) ;
572 res.
resid = sqrt(r_norm2);
578 QDPIO::cout <<
"InvEigCG2: k = " <<
k <<
" res^2 = " << r_norm2 ;
579 QDPIO::cout <<
" r_dot_z = " << r_dot_z << std::endl;
583 res.
resid = sqrt(r_norm2);
595 multi1d<Double> tt_eval ;
596 QDPLapack::zheev(V,
U,Htmp.
mat,tt_eval);
599 for(
int i(0);
i<Neig;
i++){
600 evec[
i][
A.subset()] =
zero ;
601 eval[
i] = tt_eval[
i] ;
602 for(
int j(0);
j<2*Neig;
j++)
603 evec[
i][
A.subset()] += Htmp(
i,
j)*vec[
j] ;
611 for(
int i(0);
i<Neig;
i++){
614 Av[
A.subset()] -= eval[
i]*evec[
i] ;
615 Double tt = sqrt(norm2(Av,
A.subset()));
616 QDPIO::cout<<
"FINAL: error eigenstd::vector["<<
i<<
"] = "<<tt<<
" " ;
617 tt = sqrt(norm2(evec[
i],
A.subset()));
618 QDPIO::cout<<
"--- rq ="<<real(rq)<<
" ";
619 QDPIO::cout<<
"--- norm = "<<tt<<std::endl ;
625 res.
resid = sqrt(r_norm2);
627 QDPIO::cout <<
"InvEigCG2: k = " <<
k << std::endl;
628 flopcount.report(
"InvEigCG2", swatch.getTimeInSeconds());
641 multi1d<Double>& eval,
649 FlopCounter flopcount;
664 Double r_dot_z, r_dot_z_old ;
670 r[
A.subset()] =
b - Ap ;
671 Double r_norm2 = norm2(
r,
A.subset()) ;
674 QDPIO::cout <<
"InvEigCG2: Nevecs(input) = " << evec.size() << std::endl;
675 QDPIO::cout <<
"InvEigCG2: k = " <<
k <<
" res^2 = " << r_norm2 << std::endl;
677 Real inorm(Real(1.0/sqrt(r_norm2)));
678 bool FindEvals = (Neig>0);
684 vec.AddVectors(evec,
A.subset()) ;
686 p[
A.subset()] = inorm*
r ;
687 vec.AddOrReplaceVector(
p,
A.subset());
692 from_restart = true ;
701 while(toBool(r_norm2>
rsd_sq)){
705 r_dot_z = innerProductReal(
r,
z,
A.subset());
713 beta = r_dot_z/r_dot_z_old ;
718 if(!((from_restart)&&(H.N == tr+1))){
720 H(H.N-2,H.N-2) = 1/
alpha + betaprev/alphaprev;
722 from_restart = false ;
731 pAp = innerProductReal(
p,Ap,
A.subset());
734 alpha = r_dot_z/pAp ;
737 r_norm2 = norm2(
r,
A.subset()) ;
738 r_dot_z_old = r_dot_z ;
746 QDPIO::cout<<
"MAGIC BEGINS: H.N ="<<H.N<<std::endl ;
747 H(Nmax-1,Nmax-1) = 1/
alpha +
beta/alphaprev;
750 #ifndef QDP_IS_QDPJIT
752 std::stringstream
tag ;
754 OctavePrintOut(H.mat,Nmax,
tag.str(),
"Hmatrix.m");
757 Matrix<DComplex>
tmp(Nmax) ;
759 std::stringstream
tag ;
761 OctavePrintOut(
tmp.mat,Nmax,
tag.str(),
"Hmatrix.m");
766 multi2d<DComplex> Hevecs(H.mat) ;
767 multi1d<Double> Heval ;
768 char V =
'V' ;
char U =
'U' ;
769 QDPLapack::zheev(V,
U,Hevecs,Heval);
770 multi2d<DComplex> Hevecs_old(H.mat) ;
774 multi1d<T> tt_vec(vec.size());
775 for(
int i(0);
i<Nmax;
i++){
776 tt_vec[
i][
A.subset()] =
zero ;
777 for(
int j(0);
j<Nmax;
j++)
778 tt_vec[
i][
A.subset()] +=Hevecs(
i,
j)*vec[
j] ;
783 for(
int i(0);
i<Nmax;
i++){
786 Av[
A.subset()] -= Heval[
i]*tt_vec[
i] ;
787 Double tt = sqrt(norm2(Av,
A.subset()));
788 QDPIO::cout<<
"1 error eigenstd::vector["<<
i<<
"] = "<<tt<<
" " ;
789 tt = sqrt(norm2(tt_vec[
i],
A.subset()));
790 QDPIO::cout<<
" --- eval = "<<Heval[
i]<<
" ";
791 QDPIO::cout<<
" --- rq = "<<real(rq)<<
" ";
792 QDPIO::cout<<
"--- norm = "<<tt<<std::endl ;
796 multi1d<Double> Heval_old ;
797 QDPLapack::zheev(V,
U,Nmax-1,Hevecs_old,Heval_old);
798 for(
int i(0);
i<Nmax;
i++)
799 Hevecs_old(
i,Nmax-1) = Hevecs_old(Nmax-1,
i) = 0.0 ;
801 #ifndef QDP_IS_QDPJIT
803 std::stringstream
tag ;
804 tag<<
"Hevecs_old"<<
k ;
805 OctavePrintOut(Hevecs_old,Nmax,
tag.str(),
"Hmatrix.m");
812 for(
int i(Neig);
i<tr;
i++)
813 for(
int j(0);
j<Nmax;
j++)
814 Hevecs(
i,
j) = Hevecs_old(
i-Neig,
j) ;
816 #ifndef QDP_IS_QDPJIT
818 std::stringstream
tag ;
820 OctavePrintOut(Hevecs,Nmax,
tag.str(),
"Hmatrix.m");
828 multi1d<DComplex> TAU ;
829 QDPLapack::zgeqrf(Nmax,2*Neig,Hevecs,TAU) ;
830 char R =
'R' ;
char L =
'L' ;
char N =
'N' ;
char C =
'C' ;
831 multi2d<DComplex> Htmp = H.mat ;
832 QDPLapack::zunmqr(R,N,Nmax,Nmax,Hevecs,TAU,Htmp);
833 QDPLapack::zunmqr(L,
C,Nmax,2*Neig,Hevecs,TAU,Htmp);
837 #ifndef QDP_IS_QDPJIT
839 std::stringstream
tag ;
841 OctavePrintOut(Htmp,Nmax,
tag.str(),
"Hmatrix.m");
845 QDPLapack::zheev(V,
U,2*Neig,Htmp,Heval);
846 for(
int i(Neig);
i< 2*Neig;
i++ )
847 for(
int j(2*Neig);
j<Nmax;
j++)
850 #ifndef QDP_IS_QDPJIT
852 std::stringstream
tag ;
854 OctavePrintOut(Htmp,Nmax,
tag.str(),
"Hmatrix.m");
858 QDPLapack::zunmqr(L,N,Nmax,2*Neig,Hevecs,TAU,Htmp);
860 #ifndef QDP_IS_QDPJIT
862 std::stringstream
tag ;
863 tag<<
"Yevecstmp"<<
k ;
864 OctavePrintOut(Htmp,Nmax,
tag.str(),
"Hmatrix.m");
869 multi1d<T> tt_vec = vec.vec;
870 for(
int i(0);
i<2*Neig;
i++){
871 vec[
i][
A.subset()] =
zero ;
872 for(
int j(0);
j<Nmax;
j++)
873 vec[
i][
A.subset()] +=Htmp(
i,
j)*tt_vec[
j] ;
877 #ifndef QDP_IS_QDPJIT
881 for(
int i(0);
i<2*Neig;
i++){
884 Av[
A.subset()] -= Heval[
i]*vec[
i] ;
885 Double tt = sqrt(norm2(Av,
A.subset()));
886 QDPIO::cout<<
"error eigenstd::vector["<<
i<<
"] = "<<tt<<
" " ;
887 tt = sqrt(norm2(vec[
i],
A.subset()));
888 QDPIO::cout<<
"--- rq ="<<real(rq)<<
" ";
889 QDPIO::cout<<
"--- norm = "<<tt<<std::endl ;
896 for (
int i=0;
i<2*Neig;
i++) H(
i,
i) = Heval[
i];
913 for (
int i=0;
i<2*Neig;
i++){
915 H(
i,2*Neig) = conj(H(2*Neig,
i)) ;
917 H(2*Neig,2*Neig) =
innerProduct(
r, Ar,
A.subset())/sqrt(r_norm2) ;
920 from_restart = true ;
923 #ifndef QDP_IS_QDPJIT
925 std::stringstream
tag ;
927 OctavePrintOut(H.mat,Nmax,
tag.str(),
"Hmatrix.m");
933 Double inorm = 1.0/sqrt(r_norm2) ;
934 vec.NormalizeAndAddVector(
r,inorm,
A.subset()) ;
941 res.
resid = sqrt(r_norm2);
947 QDPIO::cout <<
"InvEigCG2: k = " <<
k <<
" res^2 = " << r_norm2 ;
948 QDPIO::cout <<
" r_dot_z = " << r_dot_z << std::endl;
952 res.
resid = sqrt(r_norm2);
960 Matrix<DComplex> Htmp(2*Neig) ;
963 char V =
'V' ;
char U =
'U' ;
964 multi1d<Double> tt_eval ;
965 QDPLapack::zheev(V,
U,Htmp.mat,tt_eval);
968 for(
int i(0);
i<Neig;
i++){
969 evec[
i][
A.subset()] =
zero ;
970 eval[
i] = tt_eval[
i] ;
971 for(
int j(0);
j<2*Neig;
j++)
972 evec[
i][
A.subset()] += Htmp(
i,
j)*vec[
j] ;
981 for(
int i(0);
i<Neig;
i++)
985 Av[
A.subset()] -= eval[
i]*evec[
i] ;
986 Double tt = sqrt(norm2(Av,
A.subset()));
987 QDPIO::cout<<
"FINAL: error eigenstd::vector["<<
i<<
"] = "<<tt<<
" " ;
988 tt = sqrt(norm2(evec[
i],
A.subset()));
989 QDPIO::cout<<
"--- rq ="<<real(rq)<<
" ";
990 QDPIO::cout<<
"--- norm = "<<tt<<std::endl ;
998 res.
resid = sqrt(r_norm2);
1000 QDPIO::cout <<
"InvEigCG2: k = " <<
k << std::endl;
1001 flopcount.report(
"InvEigCG2", swatch.getTimeInSeconds());
1009 template<
typename T>
1013 const multi1d<Double>& eval,
1014 const multi1d<T>& evec,
1015 int startV,
int endV,
1020 FlopCounter flopcount;
1026 if(endV>eval.size()){
1027 QDP_error_exit(
"vPrecondCG: not enought evecs eval.size()=%d",eval.size());
1039 Double r_dot_z, r_dot_z_old ;
1045 r[
A.subset()] =
b - Ap ;
1046 Double r_norm2 = norm2(
r,
A.subset()) ;
1049 QDPIO::cout <<
"vecPrecondCG: k = " <<
k <<
" res^2 = " << r_norm2 << std::endl;
1053 while(toBool(r_norm2>
rsd_sq)){
1057 for(
int i(startV);
i<endV;
i++){
1060 z[
A.subset()] += (1.0/eval[
i]-1.0)*
d*evec[
i];
1064 r_dot_z = innerProductReal(
r,
z,
A.subset());
1070 beta = r_dot_z/r_dot_z_old ;
1075 pAp = innerProductReal(
p,Ap,
A.subset());
1077 alpha = r_dot_z/pAp ;
1080 r_norm2 = norm2(
r,
A.subset()) ;
1081 r_dot_z_old = r_dot_z ;
1089 QDPIO::cout <<
"vecPrecondCG: k = " <<
k <<
" res^2 = " << r_norm2 ;
1090 QDPIO::cout <<
" r_dot_z = " << r_dot_z << std::endl;
1095 res.
resid = sqrt(r_norm2);
1097 QDPIO::cout <<
"vPreconfCG: k = " <<
k << std::endl;
1098 flopcount.report(
"vPrecondCG", swatch.getTimeInSeconds());
1103 template<
typename T>
1107 const multi1d<Double>& eval,
1108 const multi1d<T>& evec,
1111 int N = evec.size();
1115 template<
typename T>
1119 const multi1d<Double>& eval,
1120 const multi1d<T>& evec,
1132 r[
A.subset()] =
b - Ap ;
1135 for(
int i(0);
i<N;
i++){
1137 x[
A.subset()] += (
d/eval[
i])*evec[
i];
1158 const multi1d<LatticeFermionF>& evec,
1161 SubSpaceMatrix_T<LatticeFermionF>(H,
A, evec, Nvecs);
1166 const multi1d<LatticeFermionF>& evec,
1167 const multi1d<Double>& eval,
1168 int Nvecs,
int NgoodEvecs){
1169 SubSpaceMatrix_T<LatticeFermionF>(H,
A, evec, eval, Nvecs, NgoodEvecs) ;
1174 const LatticeFermionF&
b,
1175 multi1d<Double>& eval,
1176 multi1d<LatticeFermionF>& evec,
1180 const int PrintLevel)
1182 return InvEigCG2_T<LatticeFermionF>(
A,
x,
b, eval, evec, Neig, Nmax,
RsdCG,
MaxCG, PrintLevel);
1187 const LatticeFermionF&
b,
1188 const multi1d<Double>& eval,
1189 const multi1d<LatticeFermionF>& evec,
1190 int startV,
int endV,
1193 return vecPrecondCG_T<LatticeFermionF>(
A,
x,
b, eval, evec, startV, endV,
RsdCG,
MaxCG);
1198 const LatticeFermionF&
b,
1199 const multi1d<Double>& eval,
1200 const multi1d<LatticeFermionF>& evec,
1208 const LatticeFermionF&
b,
1209 const multi1d<Double>& eval,
1210 const multi1d<LatticeFermionF>& evec,
1221 const multi1d<LatticeFermionD>& evec,
1224 SubSpaceMatrix_T<LatticeFermionD>(H,
A, evec, Nvecs);
1229 const multi1d<LatticeFermionD>& evec,
1230 const multi1d<Double>& eval,
1231 int Nvecs,
int NgoodEvecs){
1232 SubSpaceMatrix_T<LatticeFermionD>(H,
A, evec, eval, Nvecs, NgoodEvecs) ;
1238 const LatticeFermionD&
b,
1239 multi1d<Double>& eval,
1240 multi1d<LatticeFermionD>& evec,
1246 return InvEigCG2_T<LatticeFermionD>(
A,
x,
b, eval, evec, Neig, Nmax,
RsdCG,
MaxCG,plvl);
1251 const LatticeFermionD&
b,
1252 const multi1d<Double>& eval,
1253 const multi1d<LatticeFermionD>& evec,
1254 int startV,
int endV,
1257 return vecPrecondCG_T<LatticeFermionD>(
A,
x,
b, eval, evec, startV, endV,
RsdCG,
MaxCG);
1262 const LatticeFermionD&
b,
1263 const multi1d<Double>& eval,
1264 const multi1d<LatticeFermionD>& evec,
1272 const LatticeFermionD&
b,
1273 const multi1d<Double>& eval,
1274 const multi1d<LatticeFermionD>& evec,
void AddVectors(multi1d< T > &v, const Subset &s)
void AddOrReplaceVector(const T &v, const Subset &s)
void NormalizeAndAddVector(const T &v, const Double &inorm, const Subset &s)
void normGramSchmidt(multi1d< LatticeFermionF > &vec, int f, int t, const Subset &sub)
Gram-Schmidt with normalization.
Conjugate-Gradient algorithm with eigenstd::vector acceleration.
SpinMatrix C()
C = Gamma(10)
BinaryReturn< C1, C2, FnInnerProduct >::Type_t innerProduct(const QDPSubType< T1, C1 > &s1, const QDPType< T2, C2 > &s2)
SystemSolverResults_t vecPrecondCG(const LinearOperator< LatticeFermionD > &A, LatticeFermionD &x, const LatticeFermionD &b, const multi1d< Double > &eval, const multi1d< LatticeFermionD > &evec, int startV, int endV, const Real &RsdCG, int MaxCG)
void InitGuess(const LinearOperator< LatticeFermionD > &A, LatticeFermionD &x, const LatticeFermionD &b, const multi1d< Double > &eval, const multi1d< LatticeFermionD > &evec, int N, int &n_count)
SystemSolverResults_t new_InvEigCG2_T(const LinearOperator< T > &A, T &x, const T &b, multi1d< Double > &eval, multi1d< T > &evec, int Neig, int Nmax, const Real &RsdCG, int MaxCG, const int PrintLevel)
void SubSpaceMatrix(LinAlg::Matrix< DComplex > &H, const LinearOperator< LatticeFermionD > &A, const multi1d< LatticeFermionD > &evec, const multi1d< Double > &eval, int Nvecs, int NgoodEvecs)
SystemSolverResults_t vecPrecondCG_T(const LinearOperator< T > &A, T &x, const T &b, const multi1d< Double > &eval, const multi1d< T > &evec, int startV, int endV, const Real &RsdCG, int MaxCG)
SystemSolverResults_t InvEigCG2_T(const LinearOperator< T > &A, T &x, const T &b, multi1d< Double > &eval, multi1d< T > &evec, int Neig, int Nmax, const Real &RsdCG, int MaxCG, const int PrintLevel)
void SubSpaceMatrix_T(LinAlg::Matrix< DComplex > &H, const LinearOperator< T > &A, const multi1d< T > &evec, const multi1d< Double > &eval, int Nvecs, int NgoodEvecs)
void InitGuess_T(const LinearOperator< T > &A, T &x, const T &b, const multi1d< Double > &eval, const multi1d< T > &evec, int N, int &n_count)
SystemSolverResults_t InvEigCG2(const LinearOperator< LatticeFermionD > &A, LatticeFermionD &x, const LatticeFermionD &b, multi1d< Double > &eval, multi1d< LatticeFermionD > &evec, int Neig, int Nmax, const Real &RsdCG, int MaxCG, const int plvl)
static const LatticeInteger & beta(const int dim)
static const LatticeInteger & alpha(const int dim)
Asqtad Staggered-Dirac operator.
const WilsonTypeFermAct< multi1d< LatticeFermion > > Handle< const ConnectState > const multi1d< Real > enum InvType invType const multi1d< Real > & RsdCG
QDP_error_exit("too many BiCG iterations", n_count, rsd_sq, cp, c, re_rvr, im_rvr, re_a, im_a, re_b, im_b)
LinOpSysSolverMGProtoClover::T T
const WilsonTypeFermAct< multi1d< LatticeFermion > > Handle< const ConnectState > const multi1d< Real > enum InvType invType const multi1d< Real > int MaxCG
std::string tag(const std::string &prefix)
FloatingPoint< double > Double
Gram-Schmidt with normalization.
Holds return info from SystemSolver call.
multi1d< LatticeColorMatrix > U