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 }