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
00080 if(l<L5-1)
00081 psi_out(x,l)+=kappa5*(1-Gamma5)*psi_in(x,l+1);
00082 else
00083 psi_out(x,L5-1)+=kappaf*(1-Gamma5)*psi_in(x,0);
00084 if(l>0)
00085 psi_out(x,l)+=kappa5*(1+Gamma5)*psi_in(x,l-1);
00086 else
00087 psi_out(x,0)+=kappaf*(1+Gamma5)*psi_in(x,L5-1);
00088
00089 }
00090 }
00091 }
00092 };
00093
00094
00110
00111 class DWFermiActionFast {
00112 public:
00113 static void mul_Q(dwfermi_field &psi_out,
00114 dwfermi_field &psi_in,
00115 gauge_field &U,
00116 coefficients &coeff) {
00117
00118 if(psi_in.nspin!=4) error("fermiqcd_dwfermi_algorithms/dwfermi_mul_Q_ONE: nspin!=4");
00119 if(psi_in.nc!=U.nc) error("fermiqcd_dwfermi_algorithms/dwfermi_mul_Q_ONE: gauge and spinor have different nc");
00120
00121 register int ndim=psi_in.lattice().ndim;
00122 register int nspin=psi_in.nspin;
00123 register int nc=psi_in.nc;
00124 register int L5=psi_in.L5;
00125 register mdp_real m_5,m_f,sign;
00126 if(coeff.has_key("m_5")) m_5=coeff["m_5"];
00127 else error("coefficients m_5 undeclared");
00128 if(coeff.has_key("m_f")) m_f=coeff["m_f"];
00129 else error("coefficients m_f undeclared");
00130 if(coeff.has_key("sign")) sign=coeff["sign"];
00131 else sign=1;
00132
00133
00134 register mdp_real kappa5=0.5/(m_5-6.0);
00135 register mdp_real kappaf=-m_f*kappa5;
00136
00137 site x(psi_in.lattice());
00138 register int l,a,mu;
00139
00140 mdp_matrix psi_up(nspin,nc);
00141 mdp_matrix psi_dw(nspin,nc);
00142 mdp_matrix psi_lo(nspin,nc);
00143
00144
00145
00146
00147
00148 mdp_matrix tmp;
00149
00150 psi_out=psi_in;
00151 forallsites(x) {
00152 for(l=0; l<L5; l++) {
00153 for(mu=0; mu<ndim; mu++) {
00154 for(a=0; a<nspin; a++)
00155 for(int i=0; i<nc; i++) {
00156 psi_up(a,i)=psi_dw(a,i)=0;
00157 for(int j=0; j<nc; j++) {
00158 psi_up(a,i)+=U(x,mu,i,j)*psi_in(x+mu,l,a,j);
00159 psi_dw(a,i)+=conj(U(x-mu,mu,j,i))*psi_in(x-mu,l,a,j);
00160 }
00161 psi_out(x,l,a,i)+=kappa5*(psi_dw(a,i)+psi_up(a,i));
00162 psi_out(x,l,Gamma_idx[mu][a],i)+=(kappa5*sign)*Gamma_val[mu][a]*(psi_dw(a,i)-psi_up(a,i));
00163
00164 }
00165 }
00166
00167 if(l<L5-1)
00168 for(a=0; a<nspin; a++)
00169 for(int i=0; i<nc; i++) {
00170 psi_out(x,l,a,i)+=kappa5*psi_in(x,l+1,a,i);
00171 psi_out(x,l,Gamma5_idx[a],i)-=kappa5*Gamma5_val[a]*psi_in(x,l+1,a,i);
00172 }
00173 else
00174 for(a=0; a<nspin; a++)
00175 for(int i=0; i<nc; i++) {
00176 psi_out(x,L5-1,a,i)+=kappaf*psi_in(x,0,a,i);
00177 psi_out(x,L5-1,Gamma5_idx[a],i)-=kappaf*Gamma5_val[a]*psi_in(x,0,a,i);
00178 }
00179 if(l>0)
00180 for(a=0; a<nspin; a++)
00181 for(int i=0; i<nc; i++) {
00182 psi_out(x,l,a,i)+=kappa5*psi_in(x,l-1,a,i);
00183 psi_out(x,l,Gamma5_idx[a],i)+=kappa5*Gamma5_val[a]*psi_in(x,l-1,a,i);
00184 }
00185 else
00186 for(a=0; a<nspin; a++)
00187 for(int i=0; i<nc; i++) {
00188 psi_out(x,0,a,i)+=kappaf*psi_in(x,L5-1,a,i);
00189 psi_out(x,0,Gamma5_idx[a],i)+=kappaf*Gamma5_val[a]*psi_in(x,L5-1,a,i);
00190 }
00191
00192 }
00193 }
00194 }
00195 };
00196