diff --git a/lib/qcd/action/fermion/FermionOperator.h b/lib/qcd/action/fermion/FermionOperator.h index 1d395d53..ada45429 100644 --- a/lib/qcd/action/fermion/FermionOperator.h +++ b/lib/qcd/action/fermion/FermionOperator.h @@ -1,4 +1,4 @@ - /************************************************************************************* +/************************************************************************************* Grid physics library, www.github.com/paboyle/Grid @@ -25,112 +25,109 @@ Author: Peter Boyle 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. See the full license in the file "LICENSE" in the top level distribution directory - *************************************************************************************/ - /* END LEGAL */ +*************************************************************************************/ +/* END LEGAL */ #ifndef GRID_QCD_FERMION_OPERATOR_H #define GRID_QCD_FERMION_OPERATOR_H -namespace Grid { +NAMESPACE_BEGIN(Grid); - namespace QCD { - - //////////////////////////////////////////////////////////////// - // Allow to select between gauge representation rank bc's, flavours etc. - // and single/double precision. - //////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +// Allow to select between gauge representation rank bc's, flavours etc. +// and single/double precision. +//////////////////////////////////////////////////////////////// - template - class FermionOperator : public CheckerBoardedSparseMatrixBase, public Impl - { - public: +template +class FermionOperator : public CheckerBoardedSparseMatrixBase, public Impl +{ +public: - INHERIT_IMPL_TYPES(Impl); + INHERIT_IMPL_TYPES(Impl); - FermionOperator(const ImplParams &p= ImplParams()) : Impl(p) {}; - virtual ~FermionOperator(void) = default; + FermionOperator(const ImplParams &p= ImplParams()) : Impl(p) {}; + virtual ~FermionOperator(void) = default; - virtual FermionField &tmp(void) = 0; + virtual FermionField &tmp(void) = 0; - GridBase * Grid(void) { return FermionGrid(); }; // this is all the linalg routines need to know - GridBase * RedBlackGrid(void) { return FermionRedBlackGrid(); }; + GridBase * Grid(void) { return FermionGrid(); }; // this is all the linalg routines need to know + GridBase * RedBlackGrid(void) { return FermionRedBlackGrid(); }; - virtual GridBase *FermionGrid(void) =0; - virtual GridBase *FermionRedBlackGrid(void) =0; - virtual GridBase *GaugeGrid(void) =0; - virtual GridBase *GaugeRedBlackGrid(void) =0; + virtual GridBase *FermionGrid(void) =0; + virtual GridBase *FermionRedBlackGrid(void) =0; + virtual GridBase *GaugeGrid(void) =0; + virtual GridBase *GaugeRedBlackGrid(void) =0; - // override multiply - virtual RealD M (const FermionField &in, FermionField &out)=0; - virtual RealD Mdag (const FermionField &in, FermionField &out)=0; + // override multiply + virtual RealD M (const FermionField &in, FermionField &out)=0; + virtual RealD Mdag (const FermionField &in, FermionField &out)=0; - // half checkerboard operaions - virtual int ConstEE(void) { return 1; }; // clover returns zero as EE depends on gauge field + // half checkerboard operaions + virtual int ConstEE(void) { return 1; }; // clover returns zero as EE depends on gauge field - virtual void Meooe (const FermionField &in, FermionField &out)=0; - virtual void MeooeDag (const FermionField &in, FermionField &out)=0; - virtual void Mooee (const FermionField &in, FermionField &out)=0; - virtual void MooeeDag (const FermionField &in, FermionField &out)=0; - virtual void MooeeInv (const FermionField &in, FermionField &out)=0; - virtual void MooeeInvDag (const FermionField &in, FermionField &out)=0; + virtual void Meooe (const FermionField &in, FermionField &out)=0; + virtual void MeooeDag (const FermionField &in, FermionField &out)=0; + virtual void Mooee (const FermionField &in, FermionField &out)=0; + virtual void MooeeDag (const FermionField &in, FermionField &out)=0; + virtual void MooeeInv (const FermionField &in, FermionField &out)=0; + virtual void MooeeInvDag (const FermionField &in, FermionField &out)=0; - // non-hermitian hopping term; half cb or both - virtual void Dhop (const FermionField &in, FermionField &out,int dag)=0; - virtual void DhopOE(const FermionField &in, FermionField &out,int dag)=0; - virtual void DhopEO(const FermionField &in, FermionField &out,int dag)=0; - virtual void DhopDir(const FermionField &in, FermionField &out,int dir,int disp)=0; // implemented by WilsonFermion and WilsonFermion5D + // non-hermitian hopping term; half cb or both + virtual void Dhop (const FermionField &in, FermionField &out,int dag)=0; + virtual void DhopOE(const FermionField &in, FermionField &out,int dag)=0; + virtual void DhopEO(const FermionField &in, FermionField &out,int dag)=0; + virtual void DhopDir(const FermionField &in, FermionField &out,int dir,int disp)=0; // implemented by WilsonFermion and WilsonFermion5D - // force terms; five routines; default to Dhop on diagonal - virtual void MDeriv (GaugeField &mat,const FermionField &U,const FermionField &V,int dag){DhopDeriv(mat,U,V,dag);}; - virtual void MoeDeriv(GaugeField &mat,const FermionField &U,const FermionField &V,int dag){DhopDerivOE(mat,U,V,dag);}; - virtual void MeoDeriv(GaugeField &mat,const FermionField &U,const FermionField &V,int dag){DhopDerivEO(mat,U,V,dag);}; - virtual void MooDeriv(GaugeField &mat,const FermionField &U,const FermionField &V,int dag){mat=zero;}; // Clover can override these - virtual void MeeDeriv(GaugeField &mat,const FermionField &U,const FermionField &V,int dag){mat=zero;}; + // force terms; five routines; default to Dhop on diagonal + virtual void MDeriv (GaugeField &mat,const FermionField &U,const FermionField &V,int dag){DhopDeriv(mat,U,V,dag);}; + virtual void MoeDeriv(GaugeField &mat,const FermionField &U,const FermionField &V,int dag){DhopDerivOE(mat,U,V,dag);}; + virtual void MeoDeriv(GaugeField &mat,const FermionField &U,const FermionField &V,int dag){DhopDerivEO(mat,U,V,dag);}; + virtual void MooDeriv(GaugeField &mat,const FermionField &U,const FermionField &V,int dag){mat=zero;}; // Clover can override these + virtual void MeeDeriv(GaugeField &mat,const FermionField &U,const FermionField &V,int dag){mat=zero;}; - virtual void DhopDeriv (GaugeField &mat,const FermionField &U,const FermionField &V,int dag)=0; - virtual void DhopDerivEO(GaugeField &mat,const FermionField &U,const FermionField &V,int dag)=0; - virtual void DhopDerivOE(GaugeField &mat,const FermionField &U,const FermionField &V,int dag)=0; + virtual void DhopDeriv (GaugeField &mat,const FermionField &U,const FermionField &V,int dag)=0; + virtual void DhopDerivEO(GaugeField &mat,const FermionField &U,const FermionField &V,int dag)=0; + virtual void DhopDerivOE(GaugeField &mat,const FermionField &U,const FermionField &V,int dag)=0; - virtual void Mdiag (const FermionField &in, FermionField &out) { Mooee(in,out);}; // Same as Mooee applied to both CB's - virtual void Mdir (const FermionField &in, FermionField &out,int dir,int disp)=0; // case by case Wilson, Clover, Cayley, ContFrac, PartFrac + virtual void Mdiag (const FermionField &in, FermionField &out) { Mooee(in,out);}; // Same as Mooee applied to both CB's + virtual void Mdir (const FermionField &in, FermionField &out,int dir,int disp)=0; // case by case Wilson, Clover, Cayley, ContFrac, PartFrac - virtual void MomentumSpacePropagator(FermionField &out,const FermionField &in,RealD _m) { assert(0);}; + virtual void MomentumSpacePropagator(FermionField &out,const FermionField &in,RealD _m) { assert(0);}; - virtual void FreePropagator(const FermionField &in,FermionField &out,RealD mass) { - FFT theFFT((GridCartesian *) in._grid); + virtual void FreePropagator(const FermionField &in,FermionField &out,RealD mass) { + FFT theFFT((GridCartesian *) in._grid); - FermionField in_k(in._grid); - FermionField prop_k(in._grid); + FermionField in_k(in._grid); + FermionField prop_k(in._grid); - theFFT.FFT_all_dim(in_k,in,FFT::forward); - this->MomentumSpacePropagator(prop_k,in_k,mass); - theFFT.FFT_all_dim(out,prop_k,FFT::backward); - }; + theFFT.FFT_all_dim(in_k,in,FFT::forward); + this->MomentumSpacePropagator(prop_k,in_k,mass); + theFFT.FFT_all_dim(out,prop_k,FFT::backward); + }; - /////////////////////////////////////////////// - // Updates gauge field during HMC - /////////////////////////////////////////////// - virtual void ImportGauge(const GaugeField & _U)=0; + /////////////////////////////////////////////// + // Updates gauge field during HMC + /////////////////////////////////////////////// + virtual void ImportGauge(const GaugeField & _U)=0; - ////////////////////////////////////////////////////////////////////// - // Conserved currents, either contract at sink or insert sequentially. - ////////////////////////////////////////////////////////////////////// - virtual void ContractConservedCurrent(PropagatorField &q_in_1, - PropagatorField &q_in_2, - PropagatorField &q_out, - Current curr_type, - unsigned int mu)=0; - virtual void SeqConservedCurrent(PropagatorField &q_in, - PropagatorField &q_out, - Current curr_type, - unsigned int mu, - std::vector mom, - unsigned int tmin, - unsigned int tmax)=0; - }; + ////////////////////////////////////////////////////////////////////// + // Conserved currents, either contract at sink or insert sequentially. + ////////////////////////////////////////////////////////////////////// + virtual void ContractConservedCurrent(PropagatorField &q_in_1, + PropagatorField &q_in_2, + PropagatorField &q_out, + Current curr_type, + unsigned int mu)=0; + virtual void SeqConservedCurrent(PropagatorField &q_in, + PropagatorField &q_out, + Current curr_type, + unsigned int mu, + std::vector mom, + unsigned int tmin, + unsigned int tmax)=0; +}; - } -} +NAMESPACE_END(Grid); #endif