#include namespace Grid { namespace QCD { void PartialFractionFermion5D::Mdir (const LatticeFermion &psi, LatticeFermion &chi,int dir,int disp){ // this does both dag and undag but is trivial; make a common helper routing int sign = 1; DhopDir(psi,chi,dir,disp); int nblock=(Ls-1)/2; for(int b=0;bmass)/(1-this->mass); //R g5 psi[Ls] + p[0] H ag5xpbg5y_ssp(chi,R*scale,psi,p[nblock]*scale/amax,D,Ls-1,Ls-1); for(int b=0;bn << " - n"<da << " -da "<db << " -db"<dn << " -dn"<dd << " -dd"<da -1) ); // Part frac // RealD R; R=(1+mass)/(1-mass); dw_diag = (4.0-M5); // std::vector p; // std::vector q; p.resize(zdata->da); q.resize(zdata->dd); for(int n=0;nda;n++){ p[n] = zdata -> alpha[n]; } for(int n=0;ndd;n++){ q[n] = -zdata -> ap[n]; } scale= part_frac_chroma_convention ? 2.0 : 1.0; // Chroma conventions annoy me amax=zolo_hi; } // Constructors PartialFractionFermion5D::PartialFractionFermion5D(LatticeGaugeField &_Umu, GridCartesian &FiveDimGrid, GridRedBlackCartesian &FiveDimRedBlackGrid, GridCartesian &FourDimGrid, GridRedBlackCartesian &FourDimRedBlackGrid, RealD _mass,RealD M5) : WilsonFermion5D(_Umu, FiveDimGrid, FiveDimRedBlackGrid, FourDimGrid, FourDimRedBlackGrid,M5), mass(_mass) { assert((Ls&0x1)==1); // Odd Ls required int nrational=Ls-1; Approx::zolotarev_data *zdata = Approx::higham(1.0,nrational); // NB: chroma uses a cast to "float" for the zolotarev range(!?). // this creates a real difference in the operator which I do not like but we can replicate here // to demonstrate compatibility // RealD eps = (zolo_lo / zolo_hi); // zdata = bfm_zolotarev(eps,nrational,0); SetCoefficientsTanh(zdata,1.0); Approx::zolotarev_free(zdata); } } }