00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00028
00029 class DWFermiActionSlow {
00030 public:
00031 static void mul_Q(dwfermi_field &psi_out,
00032 dwfermi_field &psi_in,
00033 gauge_field &U,
00034 coefficients &coeff) {
00035
00036 if(psi_in.nspin!=4) error("fermiqcd_dwfermi_algorithms/dwfermi_mul_Q_ONE: nspin!=4");
00037 if(psi_in.nc!=U.nc) error("fermiqcd_dwfermi_algorithms/dwfermi_mul_Q_ONE: gauge and spinor have different nc");
00038
00039 register int ndim=psi_in.lattice().ndim;
00040 register int nspin=psi_in.nspin;
00041 register int nc=psi_in.nc;
00042 register int L5=psi_in.L5;
00043 register mdp_real m_5,m_f,sign;
00044 if(coeff.has_key("m_5")) m_5=coeff["m_5"];
00045 else error("coefficients m_5 undeclared");
00046 if(coeff.has_key("m_f")) m_f=coeff["m_f"];
00047 else error("coefficients m_f undeclared");
00048 if(coeff.has_key("sign")) sign=coeff["sign"];
00049 else sign=1;
00050
00051
00052 register mdp_real kappa5=0.5/(m_5-6.0);
00053 register mdp_real kappaf=-m_f*kappa5;
00054
00055 site x(psi_in.lattice());
00056 register int l,a,mu;
00057
00058 mdp_matrix psi_up(nspin,nc);
00059 mdp_matrix psi_dw(nspin,nc);
00060 mdp_matrix psi_lo(nspin,nc);
00061
00062
00063
00064
00065
00066 mdp_matrix tmp;
00067
00068 psi_out=psi_in;
00069 forallsites(x) {
00070 for(l=0; l<L5; l++) {
00071 for(mu=0; mu<ndim; mu++) {
00072 for(a=0; a<nspin; a++) {
00073 psi_up(a)=U(x,mu)*psi_in(x+mu,l,a);
00074 psi_dw(a)=hermitian(U(x-mu,mu))*psi_in(x-mu,l,a);
00075 }
00076 psi_out(x,l)+=kappa5*((1-sign*Gamma[mu])*psi_up+
00077 (1+sign*Gamma[mu])*psi_dw);
00078 }
00079 if(l<L5-1)
00080 psi_out(x,l)+=kappa5*(1-Gamma5)*psi_in(x,l+1);
00081 else
00082 psi_out(x,L5-1)+=kappaf*(1-Gamma5)*psi_in(x,0);
00083 if(l>0)
00084 psi_out(x,l)+=kappa5*(1+Gamma5)*psi_in(x,l-1);
00085 else
00086 psi_out(x,0)+=kappaf*(1+Gamma5)*psi_in(x,L5-1);
00087 }
00088 }
00089 }
00090 };
00091