mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-04 05:54:32 +00:00 
			
		
		
		
	Mobius Caley form, Mobius Zolotarev operators. Pass Even Odd vs unprec test and hermiticity checks
in tests/Grid_any_evenodd.cc; will work on inversion tests shortly.
This commit is contained in:
		@@ -38,6 +38,9 @@
 | 
				
			|||||||
//#include <qcd/action/fermion/PartialFraction.h>
 | 
					//#include <qcd/action/fermion/PartialFraction.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <qcd/action/fermion/DomainWallFermion.h>
 | 
					#include <qcd/action/fermion/DomainWallFermion.h>
 | 
				
			||||||
 | 
					#include <qcd/action/fermion/DomainWallFermion.h>
 | 
				
			||||||
 | 
					#include <qcd/action/fermion/MobiusFermion.h>
 | 
				
			||||||
 | 
					#include <qcd/action/fermion/MobiusZolotarevFermion.h>
 | 
				
			||||||
//#include <qcd/action/fermion/ScaledShamirCayleyTanh.h>
 | 
					//#include <qcd/action/fermion/ScaledShamirCayleyTanh.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -70,11 +73,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  class LinearGaugeAction : public GaugeAction< multi1d<LatticeColorMatrix>, multi1d<LatticeColorMatrix> >
 | 
					  class LinearGaugeAction : public GaugeAction< multi1d<LatticeColorMatrix>, multi1d<LatticeColorMatrix> >
 | 
				
			||||||
  typedef multi1d<LatticeColorMatrix>  P;
 | 
					  typedef multi1d<LatticeColorMatrix>  P;
 | 
				
			||||||
  typedef multi1d<LatticeColorMatrix>  Q;
 | 
					 | 
				
			||||||
  virtual void staple(LatticeColorMatrix& result,
 | 
					 | 
				
			||||||
		      const Handle< GaugeState<P,Q> >& state,
 | 
					 | 
				
			||||||
		      int mu, int cb) const = 0;
 | 
					 | 
				
			||||||
    */
 | 
					    */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,6 @@ namespace QCD {
 | 
				
			|||||||
		   FourDimRedBlackGrid,_M5),
 | 
							   FourDimRedBlackGrid,_M5),
 | 
				
			||||||
   mass(_mass)
 | 
					   mass(_mass)
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
   std::cout << "Constructing a CayleyFermion5D"<<std::endl;
 | 
					 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // override multiply
 | 
					  // override multiply
 | 
				
			||||||
@@ -229,7 +228,112 @@ namespace QCD {
 | 
				
			|||||||
      axpby_ssp_pplus (chi,1.0,chi,-lee[s],chi,s,s+1);  // chi[Ls]
 | 
					      axpby_ssp_pplus (chi,1.0,chi,-lee[s],chi,s,s+1);  // chi[Ls]
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  void CayleyFermion5D::SetCoefficients(RealD scale,Approx::zolotarev_data *zdata,RealD b,RealD c)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ///////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					    // The Cayley coeffs (unprec)
 | 
				
			||||||
 | 
					    ///////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					    omega.resize(Ls);
 | 
				
			||||||
 | 
					    bs.resize(Ls);
 | 
				
			||||||
 | 
					    cs.resize(Ls);
 | 
				
			||||||
 | 
					    as.resize(Ls);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // 
 | 
				
			||||||
 | 
					    // Ts = (    [bs+cs]Dw        )^-1 (    (bs+cs) Dw         )
 | 
				
			||||||
 | 
					    //     -(g5  -------       -1 )    ( g5 ---------     + 1  )
 | 
				
			||||||
 | 
					    //      (   {2+(bs-cs)Dw}     )    (    2+(bs-cs) Dw       )
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    //  bs = 1/2( (1/omega_s + 1)*b + (1/omega - 1)*c ) = 1/2(  1/omega(b+c) + (b-c) )
 | 
				
			||||||
 | 
					    //  cs = 1/2( (1/omega_s - 1)*b + (1/omega + 1)*c ) = 1/2(  1/omega(b+c) - (b-c) )
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    // bs+cs = 0.5*( 1/omega(b+c) + (b-c) + 1/omega(b+c) - (b-c) ) = 1/omega(b+c)
 | 
				
			||||||
 | 
					    // bs-cs = 0.5*( 1/omega(b+c) + (b-c) - 1/omega(b+c) + (b-c) ) = b-c
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    // So 
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    // Ts = (    [b+c]Dw/omega_s    )^-1 (    (b+c) Dw /omega_s        )
 | 
				
			||||||
 | 
					    //     -(g5  -------         -1 )    ( g5 ---------           + 1  )
 | 
				
			||||||
 | 
					    //      (   {2+(b-c)Dw}         )    (    2+(b-c) Dw               )
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    // Ts = (    [b+c]Dw            )^-1 (    (b+c) Dw                 )
 | 
				
			||||||
 | 
					    //     -(g5  -------    -omega_s)    ( g5 ---------      + omega_s )
 | 
				
			||||||
 | 
					    //      (   {2+(b-c)Dw}         )    (    2+(b-c) Dw               )
 | 
				
			||||||
 | 
					    // 
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    double bpc = b+c;
 | 
				
			||||||
 | 
					    double bmc = b-c;
 | 
				
			||||||
 | 
					    for(int i=0; i < Ls; i++){
 | 
				
			||||||
 | 
					      as[i] = 1.0;
 | 
				
			||||||
 | 
					      omega[i] = ((double)zdata->gamma[i]); //NB reciprocal relative to Chroma NEF code
 | 
				
			||||||
 | 
					      bs[i] = 0.5*(bpc/omega[i] + bmc);
 | 
				
			||||||
 | 
					      cs[i] = 0.5*(bpc/omega[i] - bmc);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					    // Constants for the preconditioned matrix Cayley form
 | 
				
			||||||
 | 
					    ////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					    bee.resize(Ls);
 | 
				
			||||||
 | 
					    cee.resize(Ls);
 | 
				
			||||||
 | 
					    beo.resize(Ls);
 | 
				
			||||||
 | 
					    ceo.resize(Ls);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    for(int i=0;i<Ls;i++){
 | 
				
			||||||
 | 
					      bee[i]=as[i]*(bs[i]*(4.0-M5) +1.0);
 | 
				
			||||||
 | 
					      cee[i]=as[i]*(1.0-cs[i]*(4.0-M5));
 | 
				
			||||||
 | 
					      beo[i]=as[i]*bs[i];
 | 
				
			||||||
 | 
					      ceo[i]=-as[i]*cs[i];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    aee.resize(Ls);
 | 
				
			||||||
 | 
					    aeo.resize(Ls);
 | 
				
			||||||
 | 
					    for(int i=0;i<Ls;i++){
 | 
				
			||||||
 | 
					      aee[i]=cee[i];
 | 
				
			||||||
 | 
					      aeo[i]=ceo[i];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //////////////////////////////////////////
 | 
				
			||||||
 | 
					    // LDU decomposition of eeoo
 | 
				
			||||||
 | 
					    //////////////////////////////////////////
 | 
				
			||||||
 | 
					    dee.resize(Ls);
 | 
				
			||||||
 | 
					    lee.resize(Ls);
 | 
				
			||||||
 | 
					    leem.resize(Ls);
 | 
				
			||||||
 | 
					    uee.resize(Ls);
 | 
				
			||||||
 | 
					    ueem.resize(Ls);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    for(int i=0;i<Ls;i++){
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      dee[i] = bee[i];
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      if ( i < Ls-1 ) {
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						lee[i] =-cee[i+1]/bee[i]; // sub-diag entry on the ith column
 | 
				
			||||||
 | 
						    
 | 
				
			||||||
 | 
						leem[i]=mass*cee[Ls-1]/bee[0];
 | 
				
			||||||
 | 
						for(int j=0;j<i;j++)  leem[i]*= aee[j]/bee[j+1];
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						uee[i] =-aee[i]/bee[i];   // up-diag entry on the ith row
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						ueem[i]=mass;
 | 
				
			||||||
 | 
						for(int j=1;j<=i;j++) ueem[i]*= cee[j]/bee[j];
 | 
				
			||||||
 | 
						ueem[i]*= aee[0]/bee[0];
 | 
				
			||||||
 | 
						    
 | 
				
			||||||
 | 
					      } else { 
 | 
				
			||||||
 | 
						lee[i] =0.0;
 | 
				
			||||||
 | 
						leem[i]=0.0;
 | 
				
			||||||
 | 
						uee[i] =0.0;
 | 
				
			||||||
 | 
						ueem[i]=0.0;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					    { 
 | 
				
			||||||
 | 
					      double delta_d=mass*cee[Ls-1];
 | 
				
			||||||
 | 
					      for(int j=0;j<Ls-1;j++) delta_d *= cee[j]/bee[j];
 | 
				
			||||||
 | 
					      dee[Ls-1] += delta_d;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,10 +22,8 @@ namespace Grid {
 | 
				
			|||||||
      virtual void   MooeeInvDag (const LatticeFermion &in, LatticeFermion &out);
 | 
					      virtual void   MooeeInvDag (const LatticeFermion &in, LatticeFermion &out);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      //    protected:
 | 
					      //    protected:
 | 
				
			||||||
 | 
					 | 
				
			||||||
      Approx::zolotarev_data *zdata;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      RealD mass;
 | 
					      RealD mass;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // Cayley form Moebius (tanh and zolotarev)
 | 
					      // Cayley form Moebius (tanh and zolotarev)
 | 
				
			||||||
      std::vector<RealD> omega; 
 | 
					      std::vector<RealD> omega; 
 | 
				
			||||||
      std::vector<RealD> bs;    // S dependent coeffs
 | 
					      std::vector<RealD> bs;    // S dependent coeffs
 | 
				
			||||||
@@ -53,6 +51,8 @@ namespace Grid {
 | 
				
			|||||||
		      GridRedBlackCartesian &FourDimRedBlackGrid,
 | 
							      GridRedBlackCartesian &FourDimRedBlackGrid,
 | 
				
			||||||
		      RealD _mass,RealD _M5);
 | 
							      RealD _mass,RealD _M5);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected:
 | 
				
			||||||
 | 
					      void SetCoefficients(RealD scale,Approx::zolotarev_data *zdata,RealD b,RealD c);
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,86 +28,13 @@ namespace Grid {
 | 
				
			|||||||
      {
 | 
					      {
 | 
				
			||||||
	RealD eps = 1.0;
 | 
						RealD eps = 1.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	zdata = Approx::grid_higham(eps,this->Ls);// eps is ignored for higham
 | 
						Approx::zolotarev_data *zdata = Approx::grid_higham(eps,this->Ls);// eps is ignored for higham
 | 
				
			||||||
	assert(zdata->n==this->Ls);
 | 
						assert(zdata->n==this->Ls);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						std::cout << "DomainWallFermion with Ls="<<Ls<<std::endl;
 | 
				
			||||||
 | 
						// Call base setter
 | 
				
			||||||
 | 
						this->CayleyFermion5D::SetCoefficients(1.0,zdata,1.0,0.0);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
	///////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
	// The Cayley coeffs (unprec)
 | 
					 | 
				
			||||||
	///////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
	this->omega.resize(this->Ls);
 | 
					 | 
				
			||||||
	this->bs.resize(this->Ls);
 | 
					 | 
				
			||||||
	this->cs.resize(this->Ls);
 | 
					 | 
				
			||||||
	this->as.resize(this->Ls);
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	for(int i=0; i < this->Ls; i++){
 | 
					 | 
				
			||||||
	  this->as[i] = 1.0;
 | 
					 | 
				
			||||||
	  this->omega[i] = ((double)zdata -> gamma[i]);
 | 
					 | 
				
			||||||
	  double bb=1.0;
 | 
					 | 
				
			||||||
	  this->bs[i] = 0.5*(bb/(this->omega[i]) + 1.0);
 | 
					 | 
				
			||||||
	  this->cs[i] = 0.5*(bb/(this->omega[i]) - 1.0);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
	// Constants for the preconditioned matrix Cayley form
 | 
					 | 
				
			||||||
	////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
	this->bee.resize(this->Ls);
 | 
					 | 
				
			||||||
	this->cee.resize(this->Ls);
 | 
					 | 
				
			||||||
	this->beo.resize(this->Ls);
 | 
					 | 
				
			||||||
	this->ceo.resize(this->Ls);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for(int i=0;i<this->Ls;i++){
 | 
					 | 
				
			||||||
	  this->bee[i]=as[i]*(bs[i]*(4.0-M5) +1.0);
 | 
					 | 
				
			||||||
	  this->cee[i]=as[i]*(1.0-cs[i]*(4.0-M5));
 | 
					 | 
				
			||||||
	  this->beo[i]=as[i]*bs[i];
 | 
					 | 
				
			||||||
	  this->ceo[i]=-as[i]*cs[i];
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	aee.resize(this->Ls);
 | 
					 | 
				
			||||||
	aeo.resize(this->Ls);
 | 
					 | 
				
			||||||
	for(int i=0;i<this->Ls;i++){
 | 
					 | 
				
			||||||
	  aee[i]=cee[i];
 | 
					 | 
				
			||||||
	  aeo[i]=ceo[i];
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	//////////////////////////////////////////
 | 
					 | 
				
			||||||
	// LDU decomposition of eeoo
 | 
					 | 
				
			||||||
	//////////////////////////////////////////
 | 
					 | 
				
			||||||
	dee.resize(this->Ls);
 | 
					 | 
				
			||||||
	lee.resize(this->Ls);
 | 
					 | 
				
			||||||
	leem.resize(this->Ls);
 | 
					 | 
				
			||||||
	uee.resize(this->Ls);
 | 
					 | 
				
			||||||
	ueem.resize(this->Ls);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for(int i=0;i<this->Ls;i++){
 | 
					 | 
				
			||||||
	  
 | 
					 | 
				
			||||||
	  dee[i] = bee[i];
 | 
					 | 
				
			||||||
	  
 | 
					 | 
				
			||||||
	  if ( i < this->Ls-1 ) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	    lee[i] =-cee[i+1]/bee[i]; // sub-diag entry on the ith column
 | 
					 | 
				
			||||||
	    
 | 
					 | 
				
			||||||
	    leem[i]=this->mass*cee[this->Ls-1]/bee[0];
 | 
					 | 
				
			||||||
	    for(int j=0;j<i;j++)  leem[i]*= aee[j]/bee[j+1];
 | 
					 | 
				
			||||||
	    
 | 
					 | 
				
			||||||
	    uee[i] =-aee[i]/bee[i];   // up-diag entry on the ith row
 | 
					 | 
				
			||||||
	    
 | 
					 | 
				
			||||||
	    ueem[i]=this->mass;
 | 
					 | 
				
			||||||
	    for(int j=1;j<=i;j++) ueem[i]*= cee[j]/bee[j];
 | 
					 | 
				
			||||||
	    ueem[i]*= aee[0]/bee[0];
 | 
					 | 
				
			||||||
	    
 | 
					 | 
				
			||||||
	  } else { 
 | 
					 | 
				
			||||||
	    lee[i] =0.0;
 | 
					 | 
				
			||||||
	    leem[i]=0.0;
 | 
					 | 
				
			||||||
	    uee[i] =0.0;
 | 
					 | 
				
			||||||
	    ueem[i]=0.0;
 | 
					 | 
				
			||||||
	  }
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	{ 
 | 
					 | 
				
			||||||
	  double delta_d=mass*cee[this->Ls-1];
 | 
					 | 
				
			||||||
	  for(int j=0;j<this->Ls-1;j++) delta_d *= cee[j]/bee[j];
 | 
					 | 
				
			||||||
	  dee[this->Ls-1] += delta_d;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										46
									
								
								lib/qcd/action/fermion/MobiusFermion.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								lib/qcd/action/fermion/MobiusFermion.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
				
			|||||||
 | 
					#ifndef  GRID_QCD_MOBIUS_FERMION_H
 | 
				
			||||||
 | 
					#define  GRID_QCD_MOBIUS_FERMION_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <Grid.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Grid {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  namespace QCD {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class MobiusFermion : public CayleyFermion5D
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					    public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Constructors
 | 
				
			||||||
 | 
					      MobiusFermion(LatticeGaugeField &_Umu,
 | 
				
			||||||
 | 
							    GridCartesian         &FiveDimGrid,
 | 
				
			||||||
 | 
							    GridRedBlackCartesian &FiveDimRedBlackGrid,
 | 
				
			||||||
 | 
							    GridCartesian         &FourDimGrid,
 | 
				
			||||||
 | 
							    GridRedBlackCartesian &FourDimRedBlackGrid,
 | 
				
			||||||
 | 
							    RealD _mass,RealD _M5,
 | 
				
			||||||
 | 
							    RealD b, RealD c) : 
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      CayleyFermion5D(_Umu,
 | 
				
			||||||
 | 
							      FiveDimGrid,
 | 
				
			||||||
 | 
							      FiveDimRedBlackGrid,
 | 
				
			||||||
 | 
							      FourDimGrid,
 | 
				
			||||||
 | 
							      FourDimRedBlackGrid,_mass,_M5)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
						RealD eps = 1.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::cout << "MobiusFermion (b="<<b<<",c="<<c<<") with Ls= "<<Ls<<" Tanh approx"<<std::endl;
 | 
				
			||||||
 | 
						Approx::zolotarev_data *zdata = Approx::grid_higham(eps,this->Ls);// eps is ignored for higham
 | 
				
			||||||
 | 
						assert(zdata->n==this->Ls);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						// Call base setter
 | 
				
			||||||
 | 
						this->CayleyFermion5D::SetCoefficients(1.0,zdata,b,c);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										48
									
								
								lib/qcd/action/fermion/MobiusZolotarevFermion.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								lib/qcd/action/fermion/MobiusZolotarevFermion.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
				
			|||||||
 | 
					#ifndef  GRID_QCD_MOBIUS_ZOLOTAREV_FERMION_H
 | 
				
			||||||
 | 
					#define  GRID_QCD_MOBIUS_ZOLOTAREV_FERMION_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <Grid.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Grid {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  namespace QCD {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class MobiusZolotarevFermion : public CayleyFermion5D
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					    public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Constructors
 | 
				
			||||||
 | 
					       MobiusZolotarevFermion(LatticeGaugeField &_Umu,
 | 
				
			||||||
 | 
								      GridCartesian         &FiveDimGrid,
 | 
				
			||||||
 | 
								      GridRedBlackCartesian &FiveDimRedBlackGrid,
 | 
				
			||||||
 | 
								      GridCartesian         &FourDimGrid,
 | 
				
			||||||
 | 
								      GridRedBlackCartesian &FourDimRedBlackGrid,
 | 
				
			||||||
 | 
								      RealD _mass,RealD _M5,
 | 
				
			||||||
 | 
								      RealD b, RealD c,
 | 
				
			||||||
 | 
								      RealD lo, RealD hi) : 
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      CayleyFermion5D(_Umu,
 | 
				
			||||||
 | 
							      FiveDimGrid,
 | 
				
			||||||
 | 
							      FiveDimRedBlackGrid,
 | 
				
			||||||
 | 
							      FourDimGrid,
 | 
				
			||||||
 | 
							      FourDimRedBlackGrid,_mass,_M5)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
						RealD eps = lo/hi;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Approx::zolotarev_data *zdata = Approx::grid_zolotarev(eps,this->Ls,0);// eps is ignored for higham
 | 
				
			||||||
 | 
						assert(zdata->n==this->Ls);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::cout << "MobiusZolotarevFermion (b="<<b<<",c="<<c<<") with Ls= "<<Ls<<" Zolotarev range ["<<lo<<","<<hi<<"]"<<std::endl;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						// Call base setter
 | 
				
			||||||
 | 
						this->CayleyFermion5D::SetCoefficients(1.0,zdata,b,c);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										51
									
								
								lib/qcd/action/fermion/ScaledShamir.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								lib/qcd/action/fermion/ScaledShamir.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
				
			|||||||
 | 
					#ifndef  GRID_QCD_DOMAIN_WALL_FERMION_H
 | 
				
			||||||
 | 
					#define  GRID_QCD_DOMAIN_WALL_FERMION_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <Grid.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Grid {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  namespace QCD {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class ScaledShamirFermion : public CayleyFermion5D
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					    public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Constructors
 | 
				
			||||||
 | 
					      ScaledShamirFermion(LatticeGaugeField &_Umu,
 | 
				
			||||||
 | 
								  GridCartesian         &FiveDimGrid,
 | 
				
			||||||
 | 
								  GridRedBlackCartesian &FiveDimRedBlackGrid,
 | 
				
			||||||
 | 
								  GridCartesian         &FourDimGrid,
 | 
				
			||||||
 | 
								  GridRedBlackCartesian &FourDimRedBlackGrid,
 | 
				
			||||||
 | 
								  RealD _mass,RealD _M5, RealD scale) : 
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      CayleyFermion5D(_Umu,
 | 
				
			||||||
 | 
							      FiveDimGrid,
 | 
				
			||||||
 | 
							      FiveDimRedBlackGrid,
 | 
				
			||||||
 | 
							      FourDimGrid,
 | 
				
			||||||
 | 
							      FourDimRedBlackGrid,_mass,_M5,
 | 
				
			||||||
 | 
							      RealD b, 
 | 
				
			||||||
 | 
							      RealD c)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
						RealD eps = 1.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Approx::zolotarev_data *zdata = Approx::grid_higham(eps,this->Ls);// eps is ignored for higham
 | 
				
			||||||
 | 
						assert(zdata->n==this->Ls);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						//b+c = scale;
 | 
				
			||||||
 | 
						//b-c = 1
 | 
				
			||||||
 | 
						//b   = 0.5(scale+1);
 | 
				
			||||||
 | 
						//c   = 0.5(scale-1);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						// Call base setter
 | 
				
			||||||
 | 
						this->CayleyFermion5D::SetCoefficients(1.0,zdata,0.5*(scale+1.0),0.5*(scale-1.0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
@@ -14,6 +14,18 @@ namespace Grid {
 | 
				
			|||||||
    // i.e. even even contains fifth dim hopping term.
 | 
					    // i.e. even even contains fifth dim hopping term.
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
    // [DIFFERS from original CPS red black implementation parity = (x+y+z+t+s)|2 ]
 | 
					    // [DIFFERS from original CPS red black implementation parity = (x+y+z+t+s)|2 ]
 | 
				
			||||||
 | 
					    ////////////////////////////
 | 
				
			||||||
 | 
					    //ContFrac:
 | 
				
			||||||
 | 
					    //  Ls always odd. Rational poly deg is either Ls or Ls-1
 | 
				
			||||||
 | 
					    //PartFrac 
 | 
				
			||||||
 | 
					    //  Ls always odd. Rational poly deg is either Ls or Ls-1
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    //Cayley: Ls always even, Rational poly deg is Ls
 | 
				
			||||||
 | 
					    // 
 | 
				
			||||||
 | 
					    // Just set nrational as Ls. Forget about Ls-1 cases.
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    // Require odd Ls for cont and part frac
 | 
				
			||||||
 | 
					    ////////////////////////////
 | 
				
			||||||
    ////////////////////////////////////////////////////////////////////////////////
 | 
					    ////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
    class WilsonFermion5D : public FermionOperator<LatticeFermion,LatticeGaugeField>
 | 
					    class WilsonFermion5D : public FermionOperator<LatticeFermion,LatticeGaugeField>
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										226
									
								
								tests/Grid_any_evenodd.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										226
									
								
								tests/Grid_any_evenodd.cc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,226 @@
 | 
				
			|||||||
 | 
					#include <Grid.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using namespace std;
 | 
				
			||||||
 | 
					using namespace Grid;
 | 
				
			||||||
 | 
					using namespace Grid::QCD;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<class d>
 | 
				
			||||||
 | 
					struct scal {
 | 
				
			||||||
 | 
					  d internal;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Gamma::GammaMatrix Gmu [] = {
 | 
				
			||||||
 | 
					    Gamma::GammaX,
 | 
				
			||||||
 | 
					    Gamma::GammaY,
 | 
				
			||||||
 | 
					    Gamma::GammaZ,
 | 
				
			||||||
 | 
					    Gamma::GammaT
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<class What> 
 | 
				
			||||||
 | 
					void  TestWhat(What & Ddwf,
 | 
				
			||||||
 | 
						       GridCartesian         * FGrid,	       GridRedBlackCartesian * FrbGrid,
 | 
				
			||||||
 | 
						       GridCartesian         * UGrid,	       GridRedBlackCartesian * UrbGrid,
 | 
				
			||||||
 | 
						       RealD mass, RealD M5,
 | 
				
			||||||
 | 
						       GridParallelRNG *RNG4,   GridParallelRNG *RNG5);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main (int argc, char ** argv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  Grid_init(&argc,&argv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int threads = GridThread::GetThreads();
 | 
				
			||||||
 | 
					  std::cout << "Grid is setup to use "<<threads<<" threads"<<std::endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const int Ls=8;
 | 
				
			||||||
 | 
					  GridCartesian         * UGrid   = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplexF::Nsimd()),GridDefaultMpi());
 | 
				
			||||||
 | 
					  GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid);
 | 
				
			||||||
 | 
					  GridCartesian         * FGrid   = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid);
 | 
				
			||||||
 | 
					  GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  std::vector<int> seeds4({1,2,3,4});
 | 
				
			||||||
 | 
					  std::vector<int> seeds5({5,6,7,8});
 | 
				
			||||||
 | 
					  GridParallelRNG          RNG5(FGrid);  RNG5.SeedFixedIntegers(seeds5);
 | 
				
			||||||
 | 
					  GridParallelRNG          RNG4(UGrid);  RNG4.SeedFixedIntegers(seeds4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  LatticeGaugeField Umu(UGrid); random(RNG4,Umu);
 | 
				
			||||||
 | 
					  std::vector<LatticeColourMatrix> U(4,UGrid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  RealD mass=0.1;
 | 
				
			||||||
 | 
					  RealD M5  =1.8;
 | 
				
			||||||
 | 
					  DomainWallFermion Ddwf(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5);
 | 
				
			||||||
 | 
					  TestWhat<DomainWallFermion>(Ddwf,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  RealD b=1.5;// Scale factor b+c=2, b-c=1
 | 
				
			||||||
 | 
					  RealD c=0.5;
 | 
				
			||||||
 | 
					  MobiusFermion Dmob(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5,b,c);
 | 
				
			||||||
 | 
					  TestWhat<MobiusFermion>(Dmob,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  MobiusZolotarevFermion Dzolo(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5,b,c,0.1,4.0);
 | 
				
			||||||
 | 
					  TestWhat<MobiusZolotarevFermion>(Dzolo,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Grid_finalize();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<class What> 
 | 
				
			||||||
 | 
					void  TestWhat(What & Ddwf, 
 | 
				
			||||||
 | 
						       GridCartesian         * FGrid,	       GridRedBlackCartesian * FrbGrid,
 | 
				
			||||||
 | 
						       GridCartesian         * UGrid,	       GridRedBlackCartesian * UrbGrid,
 | 
				
			||||||
 | 
						       RealD mass, RealD M5,
 | 
				
			||||||
 | 
						       GridParallelRNG *RNG4,
 | 
				
			||||||
 | 
						       GridParallelRNG *RNG5)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  LatticeFermion src   (FGrid); random(*RNG5,src);
 | 
				
			||||||
 | 
					  LatticeFermion phi   (FGrid); random(*RNG5,phi);
 | 
				
			||||||
 | 
					  LatticeFermion chi   (FGrid); random(*RNG5,chi);
 | 
				
			||||||
 | 
					  LatticeFermion result(FGrid); result=zero;
 | 
				
			||||||
 | 
					  LatticeFermion    ref(FGrid);    ref=zero;
 | 
				
			||||||
 | 
					  LatticeFermion    tmp(FGrid);    tmp=zero;
 | 
				
			||||||
 | 
					  LatticeFermion    err(FGrid);    tmp=zero;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  LatticeFermion src_e (FrbGrid);
 | 
				
			||||||
 | 
					  LatticeFermion src_o (FrbGrid);
 | 
				
			||||||
 | 
					  LatticeFermion r_e   (FrbGrid);
 | 
				
			||||||
 | 
					  LatticeFermion r_o   (FrbGrid);
 | 
				
			||||||
 | 
					  LatticeFermion r_eo  (FGrid);
 | 
				
			||||||
 | 
					  LatticeFermion r_eeoo(FGrid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  std::cout<<"=========================================================="<<std::endl;
 | 
				
			||||||
 | 
					  std::cout<<"= Testing that Meo + Moe + Moo + Mee = Munprec "<<std::endl;
 | 
				
			||||||
 | 
					  std::cout<<"=========================================================="<<std::endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pickCheckerboard(Even,src_e,src);
 | 
				
			||||||
 | 
					  pickCheckerboard(Odd,src_o,src);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Ddwf.Meooe(src_e,r_o);  std::cout<<"Applied Meo"<<std::endl;
 | 
				
			||||||
 | 
					  Ddwf.Meooe(src_o,r_e);  std::cout<<"Applied Moe"<<std::endl;
 | 
				
			||||||
 | 
					  setCheckerboard(r_eo,r_o);
 | 
				
			||||||
 | 
					  setCheckerboard(r_eo,r_e);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Ddwf.Mooee(src_e,r_e);  std::cout<<"Applied Mee"<<std::endl;
 | 
				
			||||||
 | 
					  Ddwf.Mooee(src_o,r_o);  std::cout<<"Applied Moo"<<std::endl;
 | 
				
			||||||
 | 
					  setCheckerboard(r_eeoo,r_e);
 | 
				
			||||||
 | 
					  setCheckerboard(r_eeoo,r_o);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  r_eo=r_eo+r_eeoo;
 | 
				
			||||||
 | 
					  Ddwf.M(src,ref);  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  //  std::cout << r_eo<<std::endl;
 | 
				
			||||||
 | 
					  //  std::cout << ref <<std::endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  err= ref - r_eo;
 | 
				
			||||||
 | 
					  std::cout << "EO norm diff   "<< norm2(err)<< " "<<norm2(ref)<< " " << norm2(r_eo) <<std::endl;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  LatticeComplex cerr(FGrid);
 | 
				
			||||||
 | 
					  cerr = localInnerProduct(err,err);
 | 
				
			||||||
 | 
					  //  std::cout << cerr<<std::endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  std::cout<<"=============================================================="<<std::endl;
 | 
				
			||||||
 | 
					  std::cout<<"= Test Ddagger is the dagger of D by requiring                "<<std::endl;
 | 
				
			||||||
 | 
					  std::cout<<"=  < phi | Deo | chi > * = < chi | Deo^dag| phi>  "<<std::endl;
 | 
				
			||||||
 | 
					  std::cout<<"=============================================================="<<std::endl;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  LatticeFermion chi_e   (FrbGrid);
 | 
				
			||||||
 | 
					  LatticeFermion chi_o   (FrbGrid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  LatticeFermion dchi_e  (FrbGrid);
 | 
				
			||||||
 | 
					  LatticeFermion dchi_o  (FrbGrid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  LatticeFermion phi_e   (FrbGrid);
 | 
				
			||||||
 | 
					  LatticeFermion phi_o   (FrbGrid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  LatticeFermion dphi_e  (FrbGrid);
 | 
				
			||||||
 | 
					  LatticeFermion dphi_o  (FrbGrid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pickCheckerboard(Even,chi_e,chi);
 | 
				
			||||||
 | 
					  pickCheckerboard(Odd ,chi_o,chi);
 | 
				
			||||||
 | 
					  pickCheckerboard(Even,phi_e,phi);
 | 
				
			||||||
 | 
					  pickCheckerboard(Odd ,phi_o,phi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Ddwf.Meooe(chi_e,dchi_o);
 | 
				
			||||||
 | 
					  Ddwf.Meooe(chi_o,dchi_e);
 | 
				
			||||||
 | 
					  Ddwf.MeooeDag(phi_e,dphi_o);
 | 
				
			||||||
 | 
					  Ddwf.MeooeDag(phi_o,dphi_e);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ComplexD pDce = innerProduct(phi_e,dchi_e);
 | 
				
			||||||
 | 
					  ComplexD pDco = innerProduct(phi_o,dchi_o);
 | 
				
			||||||
 | 
					  ComplexD cDpe = innerProduct(chi_e,dphi_e);
 | 
				
			||||||
 | 
					  ComplexD cDpo = innerProduct(chi_o,dphi_o);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  std::cout <<"e "<<pDce<<" "<<cDpe <<std::endl;
 | 
				
			||||||
 | 
					  std::cout <<"o "<<pDco<<" "<<cDpo <<std::endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  std::cout <<"pDce - conj(cDpo) "<< pDce-conj(cDpo) <<std::endl;
 | 
				
			||||||
 | 
					  std::cout <<"pDco - conj(cDpe) "<< pDco-conj(cDpe) <<std::endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  std::cout<<"=============================================================="<<std::endl;
 | 
				
			||||||
 | 
					  std::cout<<"= Test MeeInv Mee = 1                                         "<<std::endl;
 | 
				
			||||||
 | 
					  std::cout<<"=============================================================="<<std::endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pickCheckerboard(Even,chi_e,chi);
 | 
				
			||||||
 | 
					  pickCheckerboard(Odd ,chi_o,chi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Ddwf.Mooee(chi_e,src_e);
 | 
				
			||||||
 | 
					  Ddwf.MooeeInv(src_e,phi_e);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Ddwf.Mooee(chi_o,src_o);
 | 
				
			||||||
 | 
					  Ddwf.MooeeInv(src_o,phi_o);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  setCheckerboard(phi,phi_e);
 | 
				
			||||||
 | 
					  setCheckerboard(phi,phi_o);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  err = phi-chi;
 | 
				
			||||||
 | 
					  std::cout << "norm diff   "<< norm2(err)<< std::endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  std::cout<<"=============================================================="<<std::endl;
 | 
				
			||||||
 | 
					  std::cout<<"= Test MeeInvDag MeeDag = 1                                   "<<std::endl;
 | 
				
			||||||
 | 
					  std::cout<<"=============================================================="<<std::endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pickCheckerboard(Even,chi_e,chi);
 | 
				
			||||||
 | 
					  pickCheckerboard(Odd ,chi_o,chi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Ddwf.MooeeDag(chi_e,src_e);
 | 
				
			||||||
 | 
					  Ddwf.MooeeInvDag(src_e,phi_e);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Ddwf.MooeeDag(chi_o,src_o);
 | 
				
			||||||
 | 
					  Ddwf.MooeeInvDag(src_o,phi_o);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  setCheckerboard(phi,phi_e);
 | 
				
			||||||
 | 
					  setCheckerboard(phi,phi_o);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  err = phi-chi;
 | 
				
			||||||
 | 
					  std::cout << "norm diff   "<< norm2(err)<< std::endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  std::cout<<"=============================================================="<<std::endl;
 | 
				
			||||||
 | 
					  std::cout<<"= Test MpcDagMpc is Hermitian              "<<std::endl;
 | 
				
			||||||
 | 
					  std::cout<<"=============================================================="<<std::endl;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  random(*RNG5,phi);
 | 
				
			||||||
 | 
					  random(*RNG5,chi);
 | 
				
			||||||
 | 
					  pickCheckerboard(Even,chi_e,chi);
 | 
				
			||||||
 | 
					  pickCheckerboard(Odd ,chi_o,chi);
 | 
				
			||||||
 | 
					  pickCheckerboard(Even,phi_e,phi);
 | 
				
			||||||
 | 
					  pickCheckerboard(Odd ,phi_o,phi);
 | 
				
			||||||
 | 
					  RealD t1,t2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Ddwf.MpcDagMpc(chi_e,dchi_e,t1,t2);
 | 
				
			||||||
 | 
					  Ddwf.MpcDagMpc(chi_o,dchi_o,t1,t2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Ddwf.MpcDagMpc(phi_e,dphi_e,t1,t2);
 | 
				
			||||||
 | 
					  Ddwf.MpcDagMpc(phi_o,dphi_o,t1,t2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pDce = innerProduct(phi_e,dchi_e);
 | 
				
			||||||
 | 
					  pDco = innerProduct(phi_o,dchi_o);
 | 
				
			||||||
 | 
					  cDpe = innerProduct(chi_e,dphi_e);
 | 
				
			||||||
 | 
					  cDpo = innerProduct(chi_o,dphi_o);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  std::cout <<"e "<<pDce<<" "<<cDpe <<std::endl;
 | 
				
			||||||
 | 
					  std::cout <<"o "<<pDco<<" "<<cDpo <<std::endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  std::cout <<"pDce - conj(cDpo) "<< pDco-conj(cDpo) <<std::endl;
 | 
				
			||||||
 | 
					  std::cout <<"pDco - conj(cDpe) "<< pDce-conj(cDpe) <<std::endl;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -22,13 +22,10 @@ bin_PROGRAMS = Grid_main \
 | 
				
			|||||||
	Grid_dwf_even_odd\
 | 
						Grid_dwf_even_odd\
 | 
				
			||||||
	Grid_dwf_cg_unprec\
 | 
						Grid_dwf_cg_unprec\
 | 
				
			||||||
	Grid_dwf_cg_prec\
 | 
						Grid_dwf_cg_prec\
 | 
				
			||||||
	Grid_dwf_cg_schur
 | 
						Grid_dwf_cg_schur\
 | 
				
			||||||
 | 
						Grid_any_evenodd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test: 
 | 
					 | 
				
			||||||
	for f in $bin_PROGRAMS
 | 
					 | 
				
			||||||
	do
 | 
					 | 
				
			||||||
	./$f > $f.log
 | 
					 | 
				
			||||||
	done
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Grid_main_SOURCES = Grid_main.cc
 | 
					Grid_main_SOURCES = Grid_main.cc
 | 
				
			||||||
Grid_main_LDADD = -lGrid
 | 
					Grid_main_LDADD = -lGrid
 | 
				
			||||||
@@ -66,6 +63,9 @@ Grid_simd_LDADD = -lGrid
 | 
				
			|||||||
Grid_wilson_evenodd_SOURCES = Grid_wilson_evenodd.cc
 | 
					Grid_wilson_evenodd_SOURCES = Grid_wilson_evenodd.cc
 | 
				
			||||||
Grid_wilson_evenodd_LDADD = -lGrid
 | 
					Grid_wilson_evenodd_LDADD = -lGrid
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Grid_any_evenodd_SOURCES = Grid_any_evenodd.cc
 | 
				
			||||||
 | 
					Grid_any_evenodd_LDADD = -lGrid
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Grid_wilson_cg_unprec_SOURCES = Grid_wilson_cg_unprec.cc
 | 
					Grid_wilson_cg_unprec_SOURCES = Grid_wilson_cg_unprec.cc
 | 
				
			||||||
Grid_wilson_cg_unprec_LDADD = -lGrid
 | 
					Grid_wilson_cg_unprec_LDADD = -lGrid
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user