#ifndef GRID_QCD_CAYLEY_FERMION_H #define GRID_QCD_CAYLEY_FERMION_H namespace Grid { namespace QCD { template class CayleyFermion5D : public WilsonFermion5D { public: #include public: // override multiply virtual RealD M (const FermionField &in, FermionField &out); virtual RealD Mdag (const FermionField &in, FermionField &out); // half checkerboard operations virtual void Meooe (const FermionField &in, FermionField &out); virtual void MeooeDag (const FermionField &in, FermionField &out); virtual void Mooee (const FermionField &in, FermionField &out); virtual void MooeeDag (const FermionField &in, FermionField &out); virtual void MooeeInv (const FermionField &in, FermionField &out); virtual void MooeeInvDag (const FermionField &in, FermionField &out); virtual void Instantiatable(void)=0; // force terms; five routines; default to Dhop on diagonal virtual void MDeriv (GaugeField &mat,const FermionField &U,const FermionField &V,int dag); virtual void MoeDeriv(GaugeField &mat,const FermionField &U,const FermionField &V,int dag); virtual void MeoDeriv(GaugeField &mat,const FermionField &U,const FermionField &V,int dag); // Efficient support for multigrid coarsening virtual void Mdir (const FermionField &in, FermionField &out,int dir,int disp); void Meooe5D (const FermionField &in, FermionField &out); void MeooeDag5D (const FermionField &in, FermionField &out); // protected: RealD mass; // Cayley form Moebius (tanh and zolotarev) std::vector omega; std::vector bs; // S dependent coeffs std::vector cs; std::vector as; // For preconditioning Cayley form std::vector bee; std::vector cee; std::vector aee; std::vector beo; std::vector ceo; std::vector aeo; // LDU factorisation of the eeoo matrix std::vector lee; std::vector leem; std::vector uee; std::vector ueem; std::vector dee; // Constructors CayleyFermion5D(GaugeField &_Umu, GridCartesian &FiveDimGrid, GridRedBlackCartesian &FiveDimRedBlackGrid, GridCartesian &FourDimGrid, GridRedBlackCartesian &FourDimRedBlackGrid, RealD _mass,RealD _M5); protected: void SetCoefficientsZolotarev(RealD zolohi,Approx::zolotarev_data *zdata,RealD b,RealD c); void SetCoefficientsTanh(Approx::zolotarev_data *zdata,RealD b,RealD c); }; } } #endif