mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-04 05:54:32 +00:00 
			
		
		
		
	Namespace, format improved
This commit is contained in:
		@@ -1,4 +1,4 @@
 | 
			
		||||
    /*************************************************************************************
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
@@ -25,112 +25,109 @@ Author: Peter Boyle <peterboyle@Peters-MacBook-Pro-2.local>
 | 
			
		||||
    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 Impl>
 | 
			
		||||
    class FermionOperator : public CheckerBoardedSparseMatrixBase<typename Impl::FermionField>, public Impl
 | 
			
		||||
    {
 | 
			
		||||
    public:
 | 
			
		||||
template<class Impl>
 | 
			
		||||
class FermionOperator : public CheckerBoardedSparseMatrixBase<typename Impl::FermionField>, 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<Real> 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<Real> mom,
 | 
			
		||||
				   unsigned int tmin, 
 | 
			
		||||
				   unsigned int tmax)=0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
NAMESPACE_END(Grid);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user