00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00024 class WupperthalSmearing { 00025 public: 00026 static void smear(fermi_field& psi, 00027 gauge_field& U, 00028 coefficients& coeff) { 00029 00030 if(coeff.has_key("factor")) 00031 error("WupperthalSmearing::smear()\nCoefficient 'factor' undefined."); 00032 if(coeff.has_key("steps")) 00033 error("WupperthalSmearing::smear()\nCoefficient 'steps' undefined."); 00034 mdp_real factor=coeff["factor"]; 00035 int steps =coeff["steps"]; 00036 00037 fermi_field chi(psi.lattice(),psi.nc, psi.nspin); 00038 site x(psi.lattice()); 00039 int a,mu,i,j; 00040 for(i=0; i<steps; i++) { 00041 chi=psi; 00042 forallsites(x) 00043 for(a=0; a<psi.nspin; a++) 00044 for(mu=1; mu<U.ndim; mu++) 00045 psi(x,a)+=factor*(U(x,mu)*chi(x+mu,a)+U(x,-1,mu)*chi(x-mu,a)); 00046 } 00047 psi.update(); 00048 } 00049 }; 00050 00051 00053 void smearSink(fermi_propagator &S, 00054 gauge_field &U, 00055 void (*smf)(fermi_field&, 00056 gauge_field&, 00057 coefficients&), 00058 coefficients& coeff) { 00059 fermi_field psi(S.lattice(),S.nc, S.nspin); 00060 site x(psi.lattice()); 00061 int a,b,i,j; 00062 for(b=0; b<S.nspin; b++) 00063 for(j=0; j<U.nc; j++) { 00064 forallsitesandcopies(x) 00065 for(a=0; a<S.nspin; a++) 00066 for(i=0; i<U.nc; i++) 00067 psi(x,a,i)=S(x,a,b,i,j); 00068 (*smf)(psi,U,coeff); 00069 forallsitesandcopies(x) 00070 for(a=0; a<S.nspin; a++) 00071 for(i=0; i<U.nc; i++) 00072 S(x,a,b,i,j)=psi(x,a,i); 00073 } 00074 }