mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-03 21:44:33 +00:00 
			
		
		
		
	Merge branch 'develop' into feature/hmc_generalise
This commit is contained in:
		@@ -64,7 +64,7 @@ int main (int argc, char ** argv)
 | 
			
		||||
  LatticeFermion    ref(FGrid); ref=zero;
 | 
			
		||||
  LatticeFermion    tmp(FGrid);
 | 
			
		||||
  LatticeFermion    err(FGrid);
 | 
			
		||||
  LatticeGaugeField Umu(UGrid); random(RNG4,Umu);
 | 
			
		||||
  LatticeGaugeField Umu(UGrid); SU3::HotConfiguration(RNG4,Umu);
 | 
			
		||||
 | 
			
		||||
  std::vector<LatticeColourMatrix> U(4,UGrid);
 | 
			
		||||
  for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
 
 | 
			
		||||
@@ -70,7 +70,7 @@ int main (int argc, char ** argv)
 | 
			
		||||
  GridParallelRNG          RNG5(FGrid);  RNG5.SeedFixedIntegers(seeds5);
 | 
			
		||||
  GridParallelRNG          RNG4(UGrid);  RNG4.SeedFixedIntegers(seeds4);
 | 
			
		||||
 | 
			
		||||
  LatticeGaugeField Umu(UGrid); random(RNG4,Umu);
 | 
			
		||||
  LatticeGaugeField Umu(UGrid); SU3::HotConfiguration(RNG4,Umu);
 | 
			
		||||
  std::vector<LatticeColourMatrix> U(4,UGrid);
 | 
			
		||||
 | 
			
		||||
  RealD mass=0.1;
 | 
			
		||||
 
 | 
			
		||||
@@ -32,6 +32,8 @@ Author: paboyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Grid::QCD;
 | 
			
		||||
 | 
			
		||||
#define POWER10
 | 
			
		||||
 | 
			
		||||
int main (int argc, char ** argv)
 | 
			
		||||
{
 | 
			
		||||
  Grid_init(&argc,&argv);
 | 
			
		||||
@@ -47,11 +49,12 @@ int main (int argc, char ** argv)
 | 
			
		||||
  GridCartesian         Fine  (latt_size,simd_layout,mpi_layout);
 | 
			
		||||
  GridRedBlackCartesian RBFine(latt_size,simd_layout,mpi_layout,mask,1);
 | 
			
		||||
 | 
			
		||||
  GridParallelRNG      FineRNG(&Fine);  FineRNG.SeedRandomDevice();
 | 
			
		||||
  GridParallelRNG      FineRNG(&Fine);  FineRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}));
 | 
			
		||||
 | 
			
		||||
  LatticeComplex U(&Fine);
 | 
			
		||||
  LatticeComplex ShiftU(&Fine);
 | 
			
		||||
  LatticeComplex rbShiftU(&Fine);
 | 
			
		||||
  LatticeComplex err(&Fine);
 | 
			
		||||
  LatticeComplex Ue(&RBFine); 
 | 
			
		||||
  LatticeComplex Uo(&RBFine);
 | 
			
		||||
  LatticeComplex ShiftUe(&RBFine);
 | 
			
		||||
@@ -68,7 +71,11 @@ int main (int argc, char ** argv)
 | 
			
		||||
      Integer i=0;
 | 
			
		||||
      LatticeCoordinate(coor,d);
 | 
			
		||||
      lex = lex + coor*stride+i;
 | 
			
		||||
#ifndef POWER10
 | 
			
		||||
      stride=stride*latt_size[d];
 | 
			
		||||
#else 
 | 
			
		||||
      stride=stride*10;
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
    U=lex;
 | 
			
		||||
  }
 | 
			
		||||
@@ -87,28 +94,31 @@ int main (int argc, char ** argv)
 | 
			
		||||
    //    if ( dir!=1 ) continue;
 | 
			
		||||
    for(int shift=0;shift<latt_size[dir];shift++){
 | 
			
		||||
 | 
			
		||||
	std::cout<<GridLogMessage<<"Shifting by "<<shift<<" in direction"<<dir<<std::endl;
 | 
			
		||||
      std::cout<<GridLogMessage<<"Shifting by "<<shift<<" in direction"<<dir<< "  ";
 | 
			
		||||
 | 
			
		||||
	std::cout<<GridLogMessage<<"Even grid"<<std::endl;
 | 
			
		||||
	//	std::cout<<GridLogMessage<<"Even grid"<<std::endl;
 | 
			
		||||
	ShiftUe = Cshift(Ue,dir,shift);    // Shift everything cb by cb
 | 
			
		||||
	std::cout<<GridLogMessage << "\tShiftUe " <<norm2(ShiftUe)<<std::endl;
 | 
			
		||||
	//	std::cout<<GridLogMessage << "\tShiftUe " <<norm2(ShiftUe)<<std::endl;
 | 
			
		||||
 | 
			
		||||
	std::cout<<GridLogMessage<<"Odd grid"<<std::endl;
 | 
			
		||||
	//	std::cout<<GridLogMessage<<"Odd grid"<<std::endl;
 | 
			
		||||
	ShiftUo = Cshift(Uo,dir,shift);    
 | 
			
		||||
	std::cout<<GridLogMessage << "\tShiftUo " <<norm2(ShiftUo)<<std::endl;
 | 
			
		||||
	//	std::cout<<GridLogMessage << "\tShiftUo " <<norm2(ShiftUo)<<std::endl;
 | 
			
		||||
 | 
			
		||||
	std::cout<<GridLogMessage<<"Recombined Even/Odd grids"<<std::endl;
 | 
			
		||||
	//	std::cout<<GridLogMessage<<"Recombined Even/Odd grids"<<std::endl;
 | 
			
		||||
	setCheckerboard(rbShiftU,ShiftUe);
 | 
			
		||||
	setCheckerboard(rbShiftU,ShiftUo);
 | 
			
		||||
	std::cout<<GridLogMessage << "\trbShiftU " <<norm2(rbShiftU)<<std::endl;
 | 
			
		||||
	//std::cout<<GridLogMessage << "\trbShiftU " <<norm2(rbShiftU)<<std::endl;
 | 
			
		||||
 | 
			
		||||
	std::cout<<GridLogMessage<<"Full grid shift"<<std::endl;
 | 
			
		||||
	//	std::cout<<GridLogMessage<<"Full grid shift"<<std::endl;
 | 
			
		||||
	ShiftU  = Cshift(U,dir,shift);    // Shift everything
 | 
			
		||||
	std::cout<<GridLogMessage << "\tShiftU " <<norm2(rbShiftU)<<std::endl;
 | 
			
		||||
	//	std::cout<<GridLogMessage << "\tShiftU " <<norm2(rbShiftU)<<std::endl;
 | 
			
		||||
 | 
			
		||||
	err = ShiftU - rbShiftU;
 | 
			
		||||
	std::cout<< "\terror " <<norm2(err)<<std::endl;
 | 
			
		||||
 | 
			
		||||
	std::vector<int> coor(4);
 | 
			
		||||
 | 
			
		||||
	std::cout<<GridLogMessage << "Checking the non-checkerboard shift"<<std::endl;
 | 
			
		||||
	std::cout<<GridLogMessage << "  Checking the non-checkerboard shift "<<shift <<" dir "<<dir <<" ... ";
 | 
			
		||||
	for(coor[3]=0;coor[3]<latt_size[3];coor[3]++){
 | 
			
		||||
	for(coor[2]=0;coor[2]<latt_size[2];coor[2]++){
 | 
			
		||||
	for(coor[1]=0;coor[1]<latt_size[1];coor[1]++){
 | 
			
		||||
@@ -121,18 +131,26 @@ int main (int argc, char ** argv)
 | 
			
		||||
	  std::vector<int> scoor(coor);
 | 
			
		||||
	  scoor[dir] = (scoor[dir]+shift)%latt_size[dir];
 | 
			
		||||
	  
 | 
			
		||||
#ifndef POWER10
 | 
			
		||||
	  std::vector<int> powers=latt_size;
 | 
			
		||||
	  Integer slex = scoor[0]
 | 
			
		||||
	    + latt_size[0]*scoor[1]
 | 
			
		||||
	    + latt_size[0]*latt_size[1]*scoor[2]
 | 
			
		||||
	    + latt_size[0]*latt_size[1]*latt_size[2]*scoor[3];
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
	  std::vector<int> powers({1,10,100,1000});
 | 
			
		||||
	  Integer slex = scoor[0]
 | 
			
		||||
	    + 10        *scoor[1]
 | 
			
		||||
	    + 100       *scoor[2]
 | 
			
		||||
	    + 1000      *scoor[3];
 | 
			
		||||
#endif
 | 
			
		||||
	  Complex scm(slex);
 | 
			
		||||
	  
 | 
			
		||||
	  double nrm = abs(scm-cm()()());
 | 
			
		||||
	  std::vector<int> peer(4);
 | 
			
		||||
	  Complex ctmp = cm;
 | 
			
		||||
	  Integer index=real(ctmp);
 | 
			
		||||
	  Lexicographic::CoorFromIndex(peer,index,latt_size);
 | 
			
		||||
	  Lexicographic::CoorFromIndex(peer,index,powers);
 | 
			
		||||
 | 
			
		||||
	  if (nrm > 0){
 | 
			
		||||
	    std::cout<<"FAIL shift "<< shift<<" in dir "<< dir
 | 
			
		||||
@@ -145,9 +163,10 @@ int main (int argc, char ** argv)
 | 
			
		||||
	    exit(-1);
 | 
			
		||||
	  }
 | 
			
		||||
	}}}}
 | 
			
		||||
	std::cout << " OK !"<<std::endl;
 | 
			
		||||
 | 
			
		||||
	int exx=0;
 | 
			
		||||
	std::cout<<GridLogMessage << "Checking the checkerboard shift"<<std::endl;
 | 
			
		||||
	std::cout<<GridLogMessage << "  Checking the     checkerboard shift "<< shift << " dir " << dir <<" ... ";
 | 
			
		||||
	for(coor[3]=0;coor[3]<latt_size[3];coor[3]++){
 | 
			
		||||
	for(coor[2]=0;coor[2]<latt_size[2];coor[2]++){
 | 
			
		||||
	for(coor[1]=0;coor[1]<latt_size[1];coor[1]++){
 | 
			
		||||
@@ -157,39 +176,49 @@ int main (int argc, char ** argv)
 | 
			
		||||
 | 
			
		||||
	  Integer checkerboard = RBFine.CheckerBoard(coor);
 | 
			
		||||
 | 
			
		||||
	  //	  std::cout << " coor "<<" ["<<coor[0]<<","<<coor[1]<<","<<coor[2]<<","<<coor[3]<<"] \n ";
 | 
			
		||||
	  //	  std::cout << "shift "<< shift <<" dir "<<dir<< " checker board "<< checkerboard << " ";
 | 
			
		||||
	  //	  std::cout << "Uo "   << ShiftUo.checkerboard << " Ue "<<ShiftUe.checkerboard<<std::endl;
 | 
			
		||||
	  if ( checkerboard == ShiftUo.checkerboard ) {
 | 
			
		||||
	    peekSite(cmeo,ShiftUo,coor);
 | 
			
		||||
	  } else { 
 | 
			
		||||
	    peekSite(cmeo,ShiftUe,coor);
 | 
			
		||||
	  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	  std::vector<int> scoor(coor);
 | 
			
		||||
	  scoor[dir] = (scoor[dir]+shift)%latt_size[dir];
 | 
			
		||||
	  
 | 
			
		||||
#ifndef POWER10
 | 
			
		||||
	  std::vector<int> powers=latt_size;
 | 
			
		||||
	  Integer slex = scoor[0]
 | 
			
		||||
	    + latt_size[0]*scoor[1]
 | 
			
		||||
	    + latt_size[0]*latt_size[1]*scoor[2]
 | 
			
		||||
	    + latt_size[0]*latt_size[1]*latt_size[2]*scoor[3];
 | 
			
		||||
 | 
			
		||||
#else 
 | 
			
		||||
	  std::vector<int> powers({1,10,100,1000});
 | 
			
		||||
	  Integer slex = scoor[0]
 | 
			
		||||
	    + 10        *scoor[1]
 | 
			
		||||
	    + 100       *scoor[2]
 | 
			
		||||
	    + 1000      *scoor[3];
 | 
			
		||||
#endif
 | 
			
		||||
	  Complex scm(slex);
 | 
			
		||||
 | 
			
		||||
	  std::vector<int> peer(4);
 | 
			
		||||
	  Complex ctmp=cmeo;
 | 
			
		||||
	  Integer index=real(ctmp);
 | 
			
		||||
	  Lexicographic::CoorFromIndex(peer,index,latt_size);
 | 
			
		||||
	  Lexicographic::CoorFromIndex(peer,index,powers);
 | 
			
		||||
 | 
			
		||||
	  double nrm = abs(cmeo()()()-scm);
 | 
			
		||||
	  if (nrm != 0) {
 | 
			
		||||
 | 
			
		||||
	    std::cout << " coor "<<" ["<<coor[0]<<","<<coor[1]<<","<<coor[2]<<","<<coor[3]<<"] \n ";
 | 
			
		||||
	    std::cout << "shift "<< shift <<" dir "<<dir<< " checker board "<< checkerboard << " ";
 | 
			
		||||
	    std::cout << "Uo cb = "   << ShiftUo.checkerboard << " Ue cb= "<<ShiftUe.checkerboard<<std::endl;
 | 
			
		||||
 | 
			
		||||
	    std::cout<<"EOFAIL shift "<< shift<<" in dir "<< dir
 | 
			
		||||
		     <<" ["<<coor[0]<<","<<coor[1]<<","<<coor[2]<<","<<coor[3]<<"] = "
 | 
			
		||||
		     <<" cm " << cm()()()<<" cmeo "
 | 
			
		||||
		     << cmeo()()()<<" expect "<<scm<<"  "<<nrm<<std::endl;
 | 
			
		||||
	    std::cout<<"Got    "<<index<<" " << peer[0]<<","<<peer[1]<<","<<peer[2]<<","<<peer[3]<<std::endl;
 | 
			
		||||
	    index=real(scm);
 | 
			
		||||
	    Lexicographic::CoorFromIndex(peer,index,latt_size);
 | 
			
		||||
	    Lexicographic::CoorFromIndex(peer,index,powers);
 | 
			
		||||
	    std::cout<<"Expect "<<index<<" " << peer[0]<<","<<peer[1]<<","<<peer[2]<<","<<peer[3]<<std::endl;
 | 
			
		||||
	    exx=1;
 | 
			
		||||
 | 
			
		||||
@@ -205,17 +234,17 @@ int main (int argc, char ** argv)
 | 
			
		||||
		     << cm()()()<<" expect "<<scm<<"  "<<nrm<<std::endl;
 | 
			
		||||
	    std::cout<<"Got    "<<index<<" " << peer[0]<<","<<peer[1]<<","<<peer[2]<<","<<peer[3]<<std::endl;
 | 
			
		||||
	    index=real(scm);
 | 
			
		||||
	    Lexicographic::CoorFromIndex(peer,index,latt_size);
 | 
			
		||||
	    Lexicographic::CoorFromIndex(peer,index,powers);
 | 
			
		||||
	    std::cout<<"Expect "<<index<<" " << peer[0]<<","<<peer[1]<<","<<peer[2]<<","<<peer[3]<<std::endl;
 | 
			
		||||
	    exx=1;
 | 
			
		||||
	  } else if (1) { 
 | 
			
		||||
	  } else if (0) { 
 | 
			
		||||
	    std::cout<<GridLogMessage<<"PASS shift "<< shift<<" in dir "<< dir
 | 
			
		||||
		     <<" ["<<coor[0]<<","<<coor[1]<<","<<coor[2]<<","<<coor[3]<<"] = "
 | 
			
		||||
		     << cm()()()<<" expect "<<scm<<"  "<<nrm<<std::endl;
 | 
			
		||||
	  }
 | 
			
		||||
	}}}}
 | 
			
		||||
	if (exx) exit(-1);
 | 
			
		||||
 | 
			
		||||
	std::cout << " OK !"<<std::endl;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -32,6 +32,8 @@ Author: paboyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Grid::QCD;
 | 
			
		||||
 | 
			
		||||
#define POWER10
 | 
			
		||||
 | 
			
		||||
int main (int argc, char ** argv)
 | 
			
		||||
{
 | 
			
		||||
  Grid_init(&argc,&argv);
 | 
			
		||||
@@ -47,8 +49,9 @@ int main (int argc, char ** argv)
 | 
			
		||||
  GridCartesian         Fine  (latt_size,simd_layout,mpi_layout);
 | 
			
		||||
  GridRedBlackCartesian RBFine(latt_size,simd_layout,mpi_layout,mask,1);
 | 
			
		||||
 | 
			
		||||
  GridParallelRNG      FineRNG(&Fine);  FineRNG.SeedRandomDevice();
 | 
			
		||||
  GridParallelRNG      FineRNG(&Fine);  FineRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}));
 | 
			
		||||
 | 
			
		||||
  LatticeComplex err(&Fine);
 | 
			
		||||
  LatticeComplex U(&Fine);
 | 
			
		||||
  LatticeComplex ShiftU(&Fine);
 | 
			
		||||
  LatticeComplex rbShiftU(&Fine);
 | 
			
		||||
@@ -66,9 +69,15 @@ int main (int argc, char ** argv)
 | 
			
		||||
    for(int d=0;d<Nd;d++){
 | 
			
		||||
      //      Integer i=10000;
 | 
			
		||||
      Integer i=0;
 | 
			
		||||
#ifdef POWER10
 | 
			
		||||
      LatticeCoordinate(coor,Nd-d-1);
 | 
			
		||||
      lex = lex + coor*stride+i;
 | 
			
		||||
      stride=stride*10;
 | 
			
		||||
#else 
 | 
			
		||||
      LatticeCoordinate(coor,d);
 | 
			
		||||
      lex = lex + coor*stride+i;
 | 
			
		||||
      stride=stride*latt_size[d];
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
    U=lex;
 | 
			
		||||
  }
 | 
			
		||||
@@ -87,28 +96,30 @@ int main (int argc, char ** argv)
 | 
			
		||||
    //    if ( dir!=1 ) continue;
 | 
			
		||||
    for(int shift=0;shift<latt_size[dir];shift++){
 | 
			
		||||
 | 
			
		||||
	std::cout<<GridLogMessage<<"Shifting by "<<shift<<" in direction"<<dir<<std::endl;
 | 
			
		||||
      std::cout<<GridLogMessage<<"Shifting by "<<shift<<" in direction"<<dir;
 | 
			
		||||
 | 
			
		||||
	std::cout<<GridLogMessage<<"Even grid"<<std::endl;
 | 
			
		||||
	//	std::cout<<GridLogMessage<<"Even grid"<<std::endl;
 | 
			
		||||
	ShiftUe = Cshift(Ue,dir,shift);    // Shift everything cb by cb
 | 
			
		||||
	std::cout<<GridLogMessage << "\tShiftUe " <<norm2(ShiftUe)<<std::endl;
 | 
			
		||||
 | 
			
		||||
	std::cout<<GridLogMessage<<"Odd grid"<<std::endl;
 | 
			
		||||
	//	std::cout<<GridLogMessage << "\tShiftUe " <<norm2(ShiftUe)<<std::endl;
 | 
			
		||||
	//	std::cout<<GridLogMessage<<"Odd grid"<<std::endl;
 | 
			
		||||
	ShiftUo = Cshift(Uo,dir,shift);    
 | 
			
		||||
	std::cout<<GridLogMessage << "\tShiftUo " <<norm2(ShiftUo)<<std::endl;
 | 
			
		||||
	//	std::cout<<GridLogMessage << "\tShiftUo " <<norm2(ShiftUo)<<std::endl;
 | 
			
		||||
 | 
			
		||||
	std::cout<<GridLogMessage<<"Recombined Even/Odd grids"<<std::endl;
 | 
			
		||||
	//	std::cout<<GridLogMessage<<"Recombined Even/Odd grids"<<std::endl;
 | 
			
		||||
	setCheckerboard(rbShiftU,ShiftUe);
 | 
			
		||||
	setCheckerboard(rbShiftU,ShiftUo);
 | 
			
		||||
	std::cout<<GridLogMessage << "\trbShiftU " <<norm2(rbShiftU)<<std::endl;
 | 
			
		||||
	//	std::cout<<GridLogMessage << "\trbShiftU " <<norm2(rbShiftU)<<std::endl;
 | 
			
		||||
 | 
			
		||||
	std::cout<<GridLogMessage<<"Full grid shift"<<std::endl;
 | 
			
		||||
	//	std::cout<<GridLogMessage<<"Full grid shift"<<std::endl;
 | 
			
		||||
	ShiftU  = Cshift(U,dir,shift);    // Shift everything
 | 
			
		||||
	std::cout<<GridLogMessage << "\tShiftU " <<norm2(rbShiftU)<<std::endl;
 | 
			
		||||
	//	std::cout<<GridLogMessage << "\tShiftU " <<norm2(rbShiftU)<<std::endl;
 | 
			
		||||
 | 
			
		||||
	err = ShiftU - rbShiftU;
 | 
			
		||||
	std::cout<< "\terror " <<norm2(err)<<std::endl;
 | 
			
		||||
 | 
			
		||||
	std::vector<int> coor(4);
 | 
			
		||||
 | 
			
		||||
	std::cout<<GridLogMessage << "Checking the non-checkerboard shift"<<std::endl;
 | 
			
		||||
	std::cout<<GridLogMessage << "  Checking the non-checkerboard shift "<< shift << " dir "<<dir  <<"... ";
 | 
			
		||||
	for(coor[3]=0;coor[3]<latt_size[3];coor[3]++){
 | 
			
		||||
	for(coor[2]=0;coor[2]<latt_size[2];coor[2]++){
 | 
			
		||||
	for(coor[1]=0;coor[1]<latt_size[1];coor[1]++){
 | 
			
		||||
@@ -120,11 +131,20 @@ int main (int argc, char ** argv)
 | 
			
		||||
 | 
			
		||||
	  std::vector<int> scoor(coor);
 | 
			
		||||
	  scoor[dir] = (scoor[dir]+shift)%latt_size[dir];
 | 
			
		||||
	  
 | 
			
		||||
 | 
			
		||||
#ifdef POWER10
 | 
			
		||||
	  std::vector<int> powers({1,10,100,1000});
 | 
			
		||||
	  Integer slex = scoor[3]
 | 
			
		||||
	    + 10        *scoor[2]
 | 
			
		||||
	    + 100       *scoor[1]
 | 
			
		||||
	    + 1000      *scoor[0];
 | 
			
		||||
#else
 | 
			
		||||
	  std::vector<int> powers=latt_size;
 | 
			
		||||
	  Integer slex = scoor[0]
 | 
			
		||||
	    + latt_size[0]*scoor[1]
 | 
			
		||||
	    + latt_size[0]*latt_size[1]*scoor[2]
 | 
			
		||||
	    + latt_size[0]*latt_size[1]*latt_size[2]*scoor[3];
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	  Complex scm(slex);
 | 
			
		||||
	  
 | 
			
		||||
@@ -132,7 +152,7 @@ int main (int argc, char ** argv)
 | 
			
		||||
	  std::vector<int> peer(4);
 | 
			
		||||
	  Complex ctmp = cm;
 | 
			
		||||
	  Integer index=real(ctmp);
 | 
			
		||||
	  Lexicographic::CoorFromIndex(peer,index,latt_size);
 | 
			
		||||
	  Lexicographic::CoorFromIndex(peer,index,powers);
 | 
			
		||||
 | 
			
		||||
	  if (nrm > 0){
 | 
			
		||||
	    std::cout<<"FAIL shift "<< shift<<" in dir "<< dir
 | 
			
		||||
@@ -140,14 +160,16 @@ int main (int argc, char ** argv)
 | 
			
		||||
		     << cm()()()<<" expect "<<scm<<"  "<<nrm<<std::endl;
 | 
			
		||||
	    std::cout<<"Got    "<<index<<" " << peer[0]<<","<<peer[1]<<","<<peer[2]<<","<<peer[3]<<std::endl;
 | 
			
		||||
	    index=real(scm);
 | 
			
		||||
	    Lexicographic::CoorFromIndex(peer,index,latt_size);
 | 
			
		||||
	    Lexicographic::CoorFromIndex(peer,index,powers);
 | 
			
		||||
	    std::cout<<"Expect "<<index<<" " << peer[0]<<","<<peer[1]<<","<<peer[2]<<","<<peer[3]<<std::endl;
 | 
			
		||||
	    exit(-1);
 | 
			
		||||
	  }
 | 
			
		||||
	  
 | 
			
		||||
	}}}}
 | 
			
		||||
	std::cout<< " OK! "<<std::endl ;
 | 
			
		||||
 | 
			
		||||
	int exx=0;
 | 
			
		||||
	std::cout<<GridLogMessage << "Checking the checkerboard shift"<<std::endl;
 | 
			
		||||
	std::cout<<GridLogMessage << "  Checking the     checkerboard shift "<< shift << " dir " << dir <<"... ";
 | 
			
		||||
	for(coor[3]=0;coor[3]<latt_size[3];coor[3]++){
 | 
			
		||||
	for(coor[2]=0;coor[2]<latt_size[2];coor[2]++){
 | 
			
		||||
	for(coor[1]=0;coor[1]<latt_size[1];coor[1]++){
 | 
			
		||||
@@ -169,18 +191,26 @@ int main (int argc, char ** argv)
 | 
			
		||||
 | 
			
		||||
	  std::vector<int> scoor(coor);
 | 
			
		||||
	  scoor[dir] = (scoor[dir]+shift)%latt_size[dir];
 | 
			
		||||
	  
 | 
			
		||||
 | 
			
		||||
#ifdef POWER10	  
 | 
			
		||||
	  std::vector<int> powers({1,10,100,1000});
 | 
			
		||||
	  Integer slex = scoor[3]
 | 
			
		||||
	    + 10        *scoor[2]
 | 
			
		||||
	    + 100       *scoor[1]
 | 
			
		||||
	    + 1000      *scoor[0];
 | 
			
		||||
#else
 | 
			
		||||
	  std::vector<int> powers = latt_size;
 | 
			
		||||
	  Integer slex = scoor[0]
 | 
			
		||||
	    + latt_size[0]*scoor[1]
 | 
			
		||||
	    + latt_size[0]*latt_size[1]*scoor[2]
 | 
			
		||||
	    + latt_size[0]*latt_size[1]*latt_size[2]*scoor[3];
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
	  Complex scm(slex);
 | 
			
		||||
 | 
			
		||||
	  std::vector<int> peer(4);
 | 
			
		||||
	  Complex ctmp=cmeo;
 | 
			
		||||
	  Integer index=real(ctmp);
 | 
			
		||||
	  Lexicographic::CoorFromIndex(peer,index,latt_size);
 | 
			
		||||
	  Lexicographic::CoorFromIndex(peer,index,powers);
 | 
			
		||||
 | 
			
		||||
	  double nrm = abs(cmeo()()()-scm);
 | 
			
		||||
	  if (nrm != 0) {
 | 
			
		||||
@@ -189,10 +219,9 @@ int main (int argc, char ** argv)
 | 
			
		||||
		     << cmeo()()()<<" expect "<<scm<<"  "<<nrm<<std::endl;
 | 
			
		||||
	    std::cout<<"Got    "<<index<<" " << peer[0]<<","<<peer[1]<<","<<peer[2]<<","<<peer[3]<<std::endl;
 | 
			
		||||
	    index=real(scm);
 | 
			
		||||
	    Lexicographic::CoorFromIndex(peer,index,latt_size);
 | 
			
		||||
	    Lexicographic::CoorFromIndex(peer,index,powers);
 | 
			
		||||
	    std::cout<<"Expect "<<index<<" " << peer[0]<<","<<peer[1]<<","<<peer[2]<<","<<peer[3]<<std::endl;
 | 
			
		||||
	    exx=1;
 | 
			
		||||
 | 
			
		||||
	  }
 | 
			
		||||
 | 
			
		||||
	  ctmp=cm;
 | 
			
		||||
@@ -205,16 +234,17 @@ int main (int argc, char ** argv)
 | 
			
		||||
		     << cm()()()<<" expect "<<scm<<"  "<<nrm<<std::endl;
 | 
			
		||||
	    std::cout<<"Got    "<<index<<" " << peer[0]<<","<<peer[1]<<","<<peer[2]<<","<<peer[3]<<std::endl;
 | 
			
		||||
	    index=real(scm);
 | 
			
		||||
	    Lexicographic::CoorFromIndex(peer,index,latt_size);
 | 
			
		||||
	    Lexicographic::CoorFromIndex(peer,index,powers);
 | 
			
		||||
	    std::cout<<"Expect "<<index<<" " << peer[0]<<","<<peer[1]<<","<<peer[2]<<","<<peer[3]<<std::endl;
 | 
			
		||||
	    exx=1;
 | 
			
		||||
	  } else if (1) { 
 | 
			
		||||
	  } else if (0) { 
 | 
			
		||||
	    std::cout<<GridLogMessage<<"PASS shift "<< shift<<" in dir "<< dir
 | 
			
		||||
		     <<" ["<<coor[0]<<","<<coor[1]<<","<<coor[2]<<","<<coor[3]<<"] = "
 | 
			
		||||
		     << cm()()()<<" expect "<<scm<<"  "<<nrm<<std::endl;
 | 
			
		||||
	  }
 | 
			
		||||
	}}}}
 | 
			
		||||
	if (exx) exit(-1);
 | 
			
		||||
	std::cout<< " OK! "<<std::endl ;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -41,11 +41,10 @@ int main (int argc, char ** argv)
 | 
			
		||||
 | 
			
		||||
  GridCartesian        Fine(latt_size,simd_layout,mpi_layout);
 | 
			
		||||
 | 
			
		||||
  GridParallelRNG      FineRNG(&Fine);  FineRNG.SeedRandomDevice();
 | 
			
		||||
  GridParallelRNG      FineRNG(&Fine);  FineRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}));
 | 
			
		||||
 | 
			
		||||
  LatticeComplex U(&Fine);
 | 
			
		||||
  LatticeComplex ShiftU(&Fine);
 | 
			
		||||
 | 
			
		||||
  LatticeComplex lex(&Fine);
 | 
			
		||||
  lex=zero;
 | 
			
		||||
  Integer stride =1;
 | 
			
		||||
 
 | 
			
		||||
@@ -72,7 +72,7 @@ int main (int argc, char ** argv)
 | 
			
		||||
  LatticeFermion    ref(FGrid);    ref=zero;
 | 
			
		||||
  LatticeFermion    tmp(FGrid);    tmp=zero;
 | 
			
		||||
  LatticeFermion    err(FGrid);    tmp=zero;
 | 
			
		||||
  LatticeGaugeField Umu(UGrid); random(RNG4,Umu);
 | 
			
		||||
  LatticeGaugeField Umu(UGrid); SU3::HotConfiguration(RNG4,Umu);
 | 
			
		||||
  std::vector<LatticeColourMatrix> U(4,UGrid);
 | 
			
		||||
 | 
			
		||||
  // Only one non-zero (y)
 | 
			
		||||
 
 | 
			
		||||
@@ -81,7 +81,7 @@ int main (int argc, char ** argv)
 | 
			
		||||
  LatticeFermion    tmp(FGrid);
 | 
			
		||||
  LatticeFermion    err(FGrid);
 | 
			
		||||
 | 
			
		||||
  LatticeGaugeField Umu(UGrid); random(RNG4,Umu);
 | 
			
		||||
  LatticeGaugeField Umu(UGrid); SU3::HotConfiguration(RNG4,Umu);
 | 
			
		||||
  std::vector<LatticeColourMatrix> U(4,UGrid);
 | 
			
		||||
 | 
			
		||||
  // Only one non-zero (y)
 | 
			
		||||
 
 | 
			
		||||
@@ -245,7 +245,7 @@ int main(int argc, char *argv[])
 | 
			
		||||
  GridCartesian Grid(latt_size,simd_layout,mpi_layout);
 | 
			
		||||
  GridSerialRNG sRNG;
 | 
			
		||||
  
 | 
			
		||||
  sRNG.SeedRandomDevice();
 | 
			
		||||
  sRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}));
 | 
			
		||||
  
 | 
			
		||||
  std::cout << GridLogMessage << "======== Test algebra" << std::endl;
 | 
			
		||||
  createTestAlgebra();
 | 
			
		||||
 
 | 
			
		||||
@@ -50,7 +50,7 @@ int main (int argc, char ** argv)
 | 
			
		||||
  GridParallelRNG          pRNG(&Grid);
 | 
			
		||||
  //  std::vector<int> seeds({1,2,3,4});
 | 
			
		||||
  //  pRNG.SeedFixedIntegers(seeds);
 | 
			
		||||
  pRNG.SeedRandomDevice();
 | 
			
		||||
  pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}));
 | 
			
		||||
 | 
			
		||||
  typedef typename GparityWilsonFermionR::FermionField FermionField;
 | 
			
		||||
 | 
			
		||||
@@ -61,7 +61,7 @@ int main (int argc, char ** argv)
 | 
			
		||||
  FermionField    ref(&Grid);    ref=zero;
 | 
			
		||||
  FermionField    tmp(&Grid);    tmp=zero;
 | 
			
		||||
  FermionField    err(&Grid);    tmp=zero;
 | 
			
		||||
  LatticeGaugeField Umu(&Grid); random(pRNG,Umu);
 | 
			
		||||
  LatticeGaugeField Umu(&Grid); SU3::HotConfiguration(pRNG,Umu);
 | 
			
		||||
  std::vector<LatticeColourMatrix> U(4,&Grid);
 | 
			
		||||
 | 
			
		||||
  double volume=1;
 | 
			
		||||
 
 | 
			
		||||
@@ -86,7 +86,7 @@ int main(int argc, char** argv) {
 | 
			
		||||
 | 
			
		||||
  // Projectors 
 | 
			
		||||
  GridParallelRNG gridRNG(grid);
 | 
			
		||||
  gridRNG.SeedRandomDevice();
 | 
			
		||||
  gridRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}));
 | 
			
		||||
  SU3Adjoint::LatticeAdjMatrix Gauss(grid);
 | 
			
		||||
  SU3::LatticeAlgebraVector ha(grid);
 | 
			
		||||
  SU3::LatticeAlgebraVector hb(grid);
 | 
			
		||||
 
 | 
			
		||||
@@ -89,8 +89,8 @@ int main(int argc, char **argv) {
 | 
			
		||||
      GridSerialRNG SerialRNG;
 | 
			
		||||
      GridSerialRNG SerialRNG1;
 | 
			
		||||
 | 
			
		||||
      FineRNG.SeedRandomDevice();
 | 
			
		||||
      SerialRNG.SeedRandomDevice();
 | 
			
		||||
      FineRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}));
 | 
			
		||||
      SerialRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}));
 | 
			
		||||
 | 
			
		||||
      std::cout << "SerialRNG" << SerialRNG._generators[0] << std::endl;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -43,10 +43,10 @@ int main (int argc, char ** argv)
 | 
			
		||||
 | 
			
		||||
  std::vector<int> seeds({1,2,3,4});
 | 
			
		||||
 | 
			
		||||
  GridSerialRNG             sRNG;   sRNG.SeedRandomDevice();
 | 
			
		||||
  GridSerialRNG             sRNG;   sRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}));
 | 
			
		||||
  GridSerialRNG            fsRNG;  fsRNG.SeedFixedIntegers(seeds);
 | 
			
		||||
 | 
			
		||||
  GridParallelRNG           pRNG(&Grid);   pRNG.SeedRandomDevice();
 | 
			
		||||
  GridParallelRNG           pRNG(&Grid);   pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}));
 | 
			
		||||
  GridParallelRNG          fpRNG(&Grid);  fpRNG.SeedFixedIntegers(seeds);
 | 
			
		||||
 | 
			
		||||
  SpinMatrix rnd  ; 
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										291
									
								
								tests/core/Test_staggered.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										291
									
								
								tests/core/Test_staggered.cc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,291 @@
 | 
			
		||||
    /*************************************************************************************
 | 
			
		||||
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
    Source file: ./benchmarks/Benchmark_wilson.cc
 | 
			
		||||
 | 
			
		||||
    Copyright (C) 2015
 | 
			
		||||
 | 
			
		||||
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
Author: paboyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
 | 
			
		||||
    This program is free software; you can redistribute it and/or modify
 | 
			
		||||
    it under the terms of the GNU General Public License as published by
 | 
			
		||||
    the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
    (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
    This program is distributed in the hope that it will be useful,
 | 
			
		||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
    GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
    You should have received a copy of the GNU General Public License along
 | 
			
		||||
    with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
    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 */
 | 
			
		||||
#include <Grid/Grid.h>
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Grid::QCD;
 | 
			
		||||
 | 
			
		||||
int main (int argc, char ** argv)
 | 
			
		||||
{
 | 
			
		||||
  Grid_init(&argc,&argv);
 | 
			
		||||
 | 
			
		||||
  std::vector<int> latt_size   = GridDefaultLatt();
 | 
			
		||||
  std::vector<int> simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd());
 | 
			
		||||
  std::vector<int> mpi_layout  = GridDefaultMpi();
 | 
			
		||||
  GridCartesian               Grid(latt_size,simd_layout,mpi_layout);
 | 
			
		||||
  GridRedBlackCartesian     RBGrid(latt_size,simd_layout,mpi_layout);
 | 
			
		||||
 | 
			
		||||
  int threads = GridThread::GetThreads();
 | 
			
		||||
  std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "Grid floating point word size is REALF"<< sizeof(RealF)<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "Grid floating point word size is REALD"<< sizeof(RealD)<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "Grid floating point word size is REAL"<< sizeof(Real)<<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::vector<int> seeds({1,2,3,4});
 | 
			
		||||
  GridParallelRNG          pRNG(&Grid);
 | 
			
		||||
  pRNG.SeedFixedIntegers(seeds);
 | 
			
		||||
  //  pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9});
 | 
			
		||||
 | 
			
		||||
  typedef typename ImprovedStaggeredFermionR::FermionField FermionField; 
 | 
			
		||||
  typedef typename ImprovedStaggeredFermionR::ComplexField ComplexField; 
 | 
			
		||||
  typename ImprovedStaggeredFermionR::ImplParams params; 
 | 
			
		||||
 | 
			
		||||
  FermionField src   (&Grid); random(pRNG,src);
 | 
			
		||||
  FermionField result(&Grid); result=zero;
 | 
			
		||||
  FermionField    ref(&Grid);    ref=zero;
 | 
			
		||||
  FermionField    tmp(&Grid);    tmp=zero;
 | 
			
		||||
  FermionField    err(&Grid);    tmp=zero;
 | 
			
		||||
  FermionField phi   (&Grid); random(pRNG,phi);
 | 
			
		||||
  FermionField chi   (&Grid); random(pRNG,chi);
 | 
			
		||||
  LatticeGaugeField Umu(&Grid); SU3::HotConfiguration(pRNG,Umu);
 | 
			
		||||
  std::vector<LatticeColourMatrix> U(4,&Grid);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  double volume=1;
 | 
			
		||||
  for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
    volume=volume*latt_size[mu];
 | 
			
		||||
  }  
 | 
			
		||||
 | 
			
		||||
  // Only one non-zero (y)
 | 
			
		||||
  for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
    U[mu] = PeekIndex<LorentzIndex>(Umu,mu);
 | 
			
		||||
  /* Debug force unit
 | 
			
		||||
    U[mu] = 1.0;
 | 
			
		||||
    PokeIndex<LorentzIndex>(Umu,U[mu],mu);
 | 
			
		||||
  */
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ref = zero;
 | 
			
		||||
 | 
			
		||||
  RealD mass=0.1;
 | 
			
		||||
  RealD c1=9.0/8.0;
 | 
			
		||||
  RealD c2=-1.0/24.0;
 | 
			
		||||
  RealD u0=1.0;
 | 
			
		||||
 | 
			
		||||
  { // Simple improved staggered implementation
 | 
			
		||||
    ref = zero;
 | 
			
		||||
    RealD c1tad = 0.5*c1/u0;
 | 
			
		||||
    RealD c2tad = 0.5*c2/u0/u0/u0;
 | 
			
		||||
 | 
			
		||||
    Lattice<iScalar<vInteger> > coor(&Grid);
 | 
			
		||||
 | 
			
		||||
    Lattice<iScalar<vInteger> > x(&Grid); LatticeCoordinate(x,0);
 | 
			
		||||
    Lattice<iScalar<vInteger> > y(&Grid); LatticeCoordinate(y,1);
 | 
			
		||||
    Lattice<iScalar<vInteger> > z(&Grid); LatticeCoordinate(z,2);
 | 
			
		||||
    Lattice<iScalar<vInteger> > t(&Grid); LatticeCoordinate(t,3);
 | 
			
		||||
 | 
			
		||||
    Lattice<iScalar<vInteger> > lin_z(&Grid); lin_z=x+y;
 | 
			
		||||
    Lattice<iScalar<vInteger> > lin_t(&Grid); lin_t=x+y+z;
 | 
			
		||||
 | 
			
		||||
    for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
 | 
			
		||||
      // Staggered Phase.
 | 
			
		||||
      ComplexField phases(&Grid);	phases=1.0;
 | 
			
		||||
  
 | 
			
		||||
      if ( mu == 1 ) phases = where( mod(x    ,2)==(Integer)0, phases,-phases);
 | 
			
		||||
      if ( mu == 2 ) phases = where( mod(lin_z,2)==(Integer)0, phases,-phases);
 | 
			
		||||
      if ( mu == 3 ) phases = where( mod(lin_t,2)==(Integer)0, phases,-phases);
 | 
			
		||||
 | 
			
		||||
      tmp = PeriodicBC::CovShiftForward(U[mu],mu,src);
 | 
			
		||||
      ref = ref +c1tad*tmp*phases; // Forward 1 hop
 | 
			
		||||
 | 
			
		||||
      tmp = PeriodicBC::CovShiftForward(U[mu],mu,tmp); // 2 hop
 | 
			
		||||
      tmp = PeriodicBC::CovShiftForward(U[mu],mu,tmp); // 3 hop
 | 
			
		||||
      ref = ref +c2tad*tmp*phases; // Forward 3 hop
 | 
			
		||||
 | 
			
		||||
      tmp = PeriodicBC::CovShiftBackward(U[mu],mu,src);
 | 
			
		||||
      ref = ref -c1tad*tmp*phases; // Forward 3 hop
 | 
			
		||||
 | 
			
		||||
      tmp = PeriodicBC::CovShiftBackward(U[mu],mu,tmp);
 | 
			
		||||
      tmp = PeriodicBC::CovShiftBackward(U[mu],mu,tmp);
 | 
			
		||||
      ref = ref -c2tad*tmp*phases; // Forward 3 hop
 | 
			
		||||
    }
 | 
			
		||||
    //    ref = ref + mass * src;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ImprovedStaggeredFermionR Ds(Umu,Umu,Grid,RBGrid,mass,c1,c2,u0,params);
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage<<"=========================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"= Testing Dhop against cshift implementation         "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=========================================================="<<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage << "Calling Ds"<<std::endl;
 | 
			
		||||
  int ncall=1000;
 | 
			
		||||
  double t0=usecond();
 | 
			
		||||
  for(int i=0;i<ncall;i++){
 | 
			
		||||
    Ds.Dhop(src,result,0);
 | 
			
		||||
  }
 | 
			
		||||
  double t1=usecond();
 | 
			
		||||
  double t2;
 | 
			
		||||
  double flops=(16*(3*(6+8+8)) + 15*3*2)*volume*ncall; // == 66*16 +  == 1146
 | 
			
		||||
  
 | 
			
		||||
  std::cout<<GridLogMessage << "Called Ds"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "norm result "<< norm2(result)<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "norm ref    "<< norm2(ref)<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "mflop/s =   "<< flops/(t1-t0)<<std::endl;
 | 
			
		||||
 | 
			
		||||
  err = ref-result; 
 | 
			
		||||
  std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage<<"=========================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"= Testing that Deo + Doe = Dunprec "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=========================================================="<<std::endl;
 | 
			
		||||
 | 
			
		||||
  FermionField src_e   (&RBGrid);
 | 
			
		||||
  FermionField src_o   (&RBGrid);
 | 
			
		||||
  FermionField r_e   (&RBGrid);
 | 
			
		||||
  FermionField r_o   (&RBGrid);
 | 
			
		||||
  FermionField r_eo  (&Grid);
 | 
			
		||||
  pickCheckerboard(Even,src_e,src);
 | 
			
		||||
  pickCheckerboard(Odd,src_o,src);
 | 
			
		||||
 | 
			
		||||
  Ds.Meooe(src_e,r_o);  std::cout<<GridLogMessage<<"Applied Meo"<<std::endl;
 | 
			
		||||
  Ds.Meooe(src_o,r_e);  std::cout<<GridLogMessage<<"Applied Moe"<<std::endl;
 | 
			
		||||
  Ds.Dhop (src,ref,DaggerNo);
 | 
			
		||||
 | 
			
		||||
  setCheckerboard(r_eo,r_o);
 | 
			
		||||
  setCheckerboard(r_eo,r_e);
 | 
			
		||||
 | 
			
		||||
  err= ref - r_eo;
 | 
			
		||||
  std::cout<<GridLogMessage << "EO norm diff   "<< norm2(err)<< " "<<norm2(ref)<< " " << norm2(r_eo) <<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"= Test Ddagger is the dagger of D by requiring                "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=  < phi | Deo | chi > * = < chi | Deo^dag| phi>  "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
 | 
			
		||||
  FermionField chi_e   (&RBGrid);
 | 
			
		||||
  FermionField chi_o   (&RBGrid);
 | 
			
		||||
 | 
			
		||||
  FermionField dchi_e  (&RBGrid);
 | 
			
		||||
  FermionField dchi_o  (&RBGrid);
 | 
			
		||||
 | 
			
		||||
  FermionField phi_e   (&RBGrid);
 | 
			
		||||
  FermionField phi_o   (&RBGrid);
 | 
			
		||||
 | 
			
		||||
  FermionField dphi_e  (&RBGrid);
 | 
			
		||||
  FermionField dphi_o  (&RBGrid);
 | 
			
		||||
 | 
			
		||||
  pickCheckerboard(Even,chi_e,chi);
 | 
			
		||||
  pickCheckerboard(Odd ,chi_o,chi);
 | 
			
		||||
  pickCheckerboard(Even,phi_e,phi);
 | 
			
		||||
  pickCheckerboard(Odd ,phi_o,phi);
 | 
			
		||||
 | 
			
		||||
  Ds.Meooe(chi_e,dchi_o);
 | 
			
		||||
  Ds.Meooe(chi_o,dchi_e);
 | 
			
		||||
  Ds.MeooeDag(phi_e,dphi_o);
 | 
			
		||||
  Ds.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<<GridLogMessage <<"e "<<pDce<<" "<<cDpe <<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"o "<<pDco<<" "<<cDpo <<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage <<"pDce - conj(cDpo) "<< pDce-conj(cDpo) <<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"pDco - conj(cDpe) "<< pDco-conj(cDpe) <<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"e "<<pDce<<" "<<cDpe <<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"o "<<pDco<<" "<<cDpo <<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage <<"pDce - conj(cDpo) "<< pDce-conj(cDpo) <<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"pDco - conj(cDpe) "<< pDco-conj(cDpe) <<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"= Test MeeInv Mee = 1                                         "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
 | 
			
		||||
  pickCheckerboard(Even,chi_e,chi);
 | 
			
		||||
  pickCheckerboard(Odd ,chi_o,chi);
 | 
			
		||||
 | 
			
		||||
  Ds.Mooee(chi_e,src_e);
 | 
			
		||||
  Ds.MooeeInv(src_e,phi_e);
 | 
			
		||||
 | 
			
		||||
  Ds.Mooee(chi_o,src_o);
 | 
			
		||||
  Ds.MooeeInv(src_o,phi_o);
 | 
			
		||||
  
 | 
			
		||||
  setCheckerboard(phi,phi_e);
 | 
			
		||||
  setCheckerboard(phi,phi_o);
 | 
			
		||||
 | 
			
		||||
  err = phi-chi;
 | 
			
		||||
  std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<< std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"= Test MeeInvDag MeeDag = 1                                   "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
 | 
			
		||||
  pickCheckerboard(Even,chi_e,chi);
 | 
			
		||||
  pickCheckerboard(Odd ,chi_o,chi);
 | 
			
		||||
 | 
			
		||||
  Ds.MooeeDag(chi_e,src_e);
 | 
			
		||||
  Ds.MooeeInvDag(src_e,phi_e);
 | 
			
		||||
 | 
			
		||||
  Ds.MooeeDag(chi_o,src_o);
 | 
			
		||||
  Ds.MooeeInvDag(src_o,phi_o);
 | 
			
		||||
  
 | 
			
		||||
  setCheckerboard(phi,phi_e);
 | 
			
		||||
  setCheckerboard(phi,phi_o);
 | 
			
		||||
 | 
			
		||||
  err = phi-chi;
 | 
			
		||||
  std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<< std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"= Test MpcDagMpc is Hermitian              "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
  
 | 
			
		||||
  random(pRNG,phi);
 | 
			
		||||
  random(pRNG,chi);
 | 
			
		||||
  pickCheckerboard(Even,chi_e,chi);
 | 
			
		||||
  pickCheckerboard(Odd ,chi_o,chi);
 | 
			
		||||
  pickCheckerboard(Even,phi_e,phi);
 | 
			
		||||
  pickCheckerboard(Odd ,phi_o,phi);
 | 
			
		||||
 | 
			
		||||
  SchurDiagMooeeOperator<ImprovedStaggeredFermionR,FermionField> HermOpEO(Ds);
 | 
			
		||||
  HermOpEO.MpcDagMpc(chi_e,dchi_e,t1,t2);
 | 
			
		||||
  HermOpEO.MpcDagMpc(chi_o,dchi_o,t1,t2);
 | 
			
		||||
 | 
			
		||||
  HermOpEO.MpcDagMpc(phi_e,dphi_e,t1,t2);
 | 
			
		||||
  HermOpEO.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<<GridLogMessage <<"e "<<pDce<<" "<<cDpe <<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"o "<<pDco<<" "<<cDpo <<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage <<"pDce - conj(cDpo) "<< pDco-conj(cDpo) <<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"pDco - conj(cDpe) "<< pDce-conj(cDpe) <<std::endl;
 | 
			
		||||
 | 
			
		||||
  Grid_finalize();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										309
									
								
								tests/core/Test_staggered5D.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										309
									
								
								tests/core/Test_staggered5D.cc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,309 @@
 | 
			
		||||
    /*************************************************************************************
 | 
			
		||||
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
    Source file: ./benchmarks/Benchmark_wilson.cc
 | 
			
		||||
 | 
			
		||||
    Copyright (C) 2015
 | 
			
		||||
 | 
			
		||||
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
Author: paboyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
 | 
			
		||||
    This program is free software; you can redistribute it and/or modify
 | 
			
		||||
    it under the terms of the GNU General Public License as published by
 | 
			
		||||
    the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
    (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
    This program is distributed in the hope that it will be useful,
 | 
			
		||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
    GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
    You should have received a copy of the GNU General Public License along
 | 
			
		||||
    with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
    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 */
 | 
			
		||||
#include <Grid/Grid.h>
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Grid::QCD;
 | 
			
		||||
 | 
			
		||||
int main (int argc, char ** argv)
 | 
			
		||||
{
 | 
			
		||||
  Grid_init(&argc,&argv);
 | 
			
		||||
 | 
			
		||||
  std::vector<int> latt_size   = GridDefaultLatt();
 | 
			
		||||
  std::vector<int> simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd());
 | 
			
		||||
  std::vector<int> mpi_layout  = GridDefaultMpi();
 | 
			
		||||
 | 
			
		||||
  std::cout << GridLogMessage << "Making s innermost grids"<<std::endl;
 | 
			
		||||
 | 
			
		||||
  const int Ls=16;
 | 
			
		||||
  GridCartesian         * UGrid   = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi());
 | 
			
		||||
  GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid);
 | 
			
		||||
  GridCartesian         * FGrid   = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid);
 | 
			
		||||
  GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid);
 | 
			
		||||
 | 
			
		||||
  int threads = GridThread::GetThreads();
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "Grid floating point word size is REALF"<< sizeof(RealF)<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "Grid floating point word size is REALD"<< sizeof(RealD)<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "Grid floating point word size is REAL"<< sizeof(Real)<<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::vector<int> seeds({1,2,3,4});
 | 
			
		||||
  GridParallelRNG          pRNG4(UGrid);
 | 
			
		||||
  GridParallelRNG          pRNG5(FGrid);
 | 
			
		||||
  pRNG4.SeedFixedIntegers(seeds);
 | 
			
		||||
  pRNG5.SeedFixedIntegers(seeds);
 | 
			
		||||
 | 
			
		||||
  typedef typename ImprovedStaggeredFermion5DR::FermionField FermionField; 
 | 
			
		||||
  typedef typename ImprovedStaggeredFermion5DR::ComplexField ComplexField; 
 | 
			
		||||
  typename ImprovedStaggeredFermion5DR::ImplParams params; 
 | 
			
		||||
 | 
			
		||||
  FermionField src   (FGrid);
 | 
			
		||||
 | 
			
		||||
  random(pRNG5,src);
 | 
			
		||||
 | 
			
		||||
  FermionField result(FGrid); result=zero;
 | 
			
		||||
  FermionField    ref(FGrid);    ref=zero;
 | 
			
		||||
  FermionField    tmp(FGrid);    tmp=zero;
 | 
			
		||||
  FermionField    err(FGrid);    tmp=zero;
 | 
			
		||||
  FermionField phi   (FGrid); random(pRNG5,phi);
 | 
			
		||||
  FermionField chi   (FGrid); random(pRNG5,chi);
 | 
			
		||||
 | 
			
		||||
  LatticeGaugeField Umu(UGrid); SU3::ColdConfiguration(pRNG4,Umu);
 | 
			
		||||
  LatticeGaugeField Umua(UGrid); Umua=Umu;
 | 
			
		||||
 | 
			
		||||
  double volume=Ls;
 | 
			
		||||
  for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
    volume=volume*latt_size[mu];
 | 
			
		||||
  }  
 | 
			
		||||
 | 
			
		||||
  ////////////////////////////////////
 | 
			
		||||
  // Naive implementation needs to
 | 
			
		||||
  // replicate across fifth dimension
 | 
			
		||||
  ////////////////////////////////////
 | 
			
		||||
  LatticeGaugeField Umu5d(FGrid); 
 | 
			
		||||
  for(int ss=0;ss<Umu._grid->oSites();ss++){
 | 
			
		||||
    for(int s=0;s<Ls;s++){
 | 
			
		||||
      Umu5d._odata[Ls*ss+s] = Umu._odata[ss];
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  std::vector<LatticeColourMatrix> U(4,FGrid);
 | 
			
		||||
 | 
			
		||||
  for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
    U[mu] = PeekIndex<LorentzIndex>(Umu5d,mu);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  RealD mass=0.1;
 | 
			
		||||
  RealD c1=9.0/8.0;
 | 
			
		||||
  RealD c2=-1.0/24.0;
 | 
			
		||||
  RealD u0=1.0;
 | 
			
		||||
 | 
			
		||||
  { // Simple improved staggered implementation
 | 
			
		||||
    ref = zero;
 | 
			
		||||
    RealD c1tad = 0.5*c1/u0;
 | 
			
		||||
    RealD c2tad = 0.5*c2/u0/u0/u0;
 | 
			
		||||
 | 
			
		||||
    Lattice<iScalar<vInteger> > coor(FGrid);
 | 
			
		||||
 | 
			
		||||
    Lattice<iScalar<vInteger> > x(FGrid); LatticeCoordinate(x,1); // s innermost
 | 
			
		||||
    Lattice<iScalar<vInteger> > y(FGrid); LatticeCoordinate(y,2);
 | 
			
		||||
    Lattice<iScalar<vInteger> > z(FGrid); LatticeCoordinate(z,3);
 | 
			
		||||
    Lattice<iScalar<vInteger> > t(FGrid); LatticeCoordinate(t,4);
 | 
			
		||||
 | 
			
		||||
    Lattice<iScalar<vInteger> > lin_z(FGrid); lin_z=x+y;
 | 
			
		||||
    Lattice<iScalar<vInteger> > lin_t(FGrid); lin_t=x+y+z;
 | 
			
		||||
 | 
			
		||||
    for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
 | 
			
		||||
      // Staggered Phase.
 | 
			
		||||
      ComplexField phases(FGrid);	phases=1.0;
 | 
			
		||||
  
 | 
			
		||||
      if ( mu == 1 ) phases = where( mod(x    ,2)==(Integer)0, phases,-phases);
 | 
			
		||||
      if ( mu == 2 ) phases = where( mod(lin_z,2)==(Integer)0, phases,-phases);
 | 
			
		||||
      if ( mu == 3 ) phases = where( mod(lin_t,2)==(Integer)0, phases,-phases);
 | 
			
		||||
 | 
			
		||||
      tmp = PeriodicBC::CovShiftForward(U[mu],mu+1,src);
 | 
			
		||||
      ref = ref +c1tad*tmp*phases; // Forward 1 hop
 | 
			
		||||
 | 
			
		||||
      tmp = PeriodicBC::CovShiftForward(U[mu],mu+1,tmp); // 2 hop
 | 
			
		||||
      tmp = PeriodicBC::CovShiftForward(U[mu],mu+1,tmp); // 3 hop
 | 
			
		||||
      ref = ref +c2tad*tmp*phases; // Forward 3 hop
 | 
			
		||||
 | 
			
		||||
      tmp = PeriodicBC::CovShiftBackward(U[mu],mu+1,src);
 | 
			
		||||
      ref = ref -c1tad*tmp*phases; // Forward 3 hop
 | 
			
		||||
 | 
			
		||||
      tmp = PeriodicBC::CovShiftBackward(U[mu],mu+1,tmp);
 | 
			
		||||
      tmp = PeriodicBC::CovShiftBackward(U[mu],mu+1,tmp);
 | 
			
		||||
      ref = ref -c2tad*tmp*phases; // Forward 3 hop
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ImprovedStaggeredFermion5DR Ds(Umu,Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,c1,c2,u0,params);
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage<<"=========================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"= Testing Dhop against cshift implementation         "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=========================================================="<<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage << "Calling Ds"<<std::endl;
 | 
			
		||||
  int ncall=1000;
 | 
			
		||||
  double t0=usecond();
 | 
			
		||||
  for(int i=0;i<ncall;i++){
 | 
			
		||||
    Ds.Dhop(src,result,0);
 | 
			
		||||
  }
 | 
			
		||||
  double t1=usecond();
 | 
			
		||||
 | 
			
		||||
  double t2;
 | 
			
		||||
  double flops=(16*(3*(6+8+8)) + 15*3*2)*volume*ncall; // == 66*16 +  == 1146
 | 
			
		||||
  
 | 
			
		||||
  std::cout<<GridLogMessage << "Called Ds"<<std::endl;
 | 
			
		||||
  //  std::cout<<GridLogMessage << "result"<< result <<std::endl;
 | 
			
		||||
  //  std::cout<<GridLogMessage << "ref   "<< ref   <<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "norm result "<< norm2(result)<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "norm ref    "<< norm2(ref)<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "mflop/s =   "<< flops/(t1-t0)<<std::endl;
 | 
			
		||||
 | 
			
		||||
  err = ref-result; 
 | 
			
		||||
  std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage<<"=========================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"= Testing that Deo + Doe = Dunprec "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=========================================================="<<std::endl;
 | 
			
		||||
 | 
			
		||||
  FermionField src_e   (FrbGrid);
 | 
			
		||||
  FermionField src_o   (FrbGrid);
 | 
			
		||||
  FermionField r_e   (FrbGrid);
 | 
			
		||||
  FermionField r_o   (FrbGrid);
 | 
			
		||||
  FermionField r_eo  (FGrid);
 | 
			
		||||
  pickCheckerboard(Even,src_e,src);
 | 
			
		||||
  pickCheckerboard(Odd,src_o,src);
 | 
			
		||||
 | 
			
		||||
  Ds.Meooe(src_e,r_o);  std::cout<<GridLogMessage<<"Applied Meo"<<std::endl;
 | 
			
		||||
  Ds.Meooe(src_o,r_e);  std::cout<<GridLogMessage<<"Applied Moe"<<std::endl;
 | 
			
		||||
  Ds.Dhop (src,ref,DaggerNo);
 | 
			
		||||
 | 
			
		||||
  setCheckerboard(r_eo,r_o);
 | 
			
		||||
  setCheckerboard(r_eo,r_e);
 | 
			
		||||
 | 
			
		||||
  err= ref - r_eo;
 | 
			
		||||
  std::cout<<GridLogMessage << "EO norm diff   "<< norm2(err)<< " "<<norm2(ref)<< " " << norm2(r_eo) <<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"= Test Ddagger is the dagger of D by requiring                "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=  < phi | Deo | chi > * = < chi | Deo^dag| phi>  "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
 | 
			
		||||
  FermionField chi_e   (FrbGrid);
 | 
			
		||||
  FermionField chi_o   (FrbGrid);
 | 
			
		||||
 | 
			
		||||
  FermionField dchi_e  (FrbGrid);
 | 
			
		||||
  FermionField dchi_o  (FrbGrid);
 | 
			
		||||
 | 
			
		||||
  FermionField phi_e   (FrbGrid);
 | 
			
		||||
  FermionField phi_o   (FrbGrid);
 | 
			
		||||
 | 
			
		||||
  FermionField dphi_e  (FrbGrid);
 | 
			
		||||
  FermionField dphi_o  (FrbGrid);
 | 
			
		||||
 | 
			
		||||
  pickCheckerboard(Even,chi_e,chi);
 | 
			
		||||
  pickCheckerboard(Odd ,chi_o,chi);
 | 
			
		||||
  pickCheckerboard(Even,phi_e,phi);
 | 
			
		||||
  pickCheckerboard(Odd ,phi_o,phi);
 | 
			
		||||
 | 
			
		||||
  Ds.Meooe(chi_e,dchi_o);
 | 
			
		||||
  Ds.Meooe(chi_o,dchi_e);
 | 
			
		||||
  Ds.MeooeDag(phi_e,dphi_o);
 | 
			
		||||
  Ds.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<<GridLogMessage <<"e "<<pDce<<" "<<cDpe <<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"o "<<pDco<<" "<<cDpo <<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage <<"pDce - conj(cDpo) "<< pDce-conj(cDpo) <<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"pDco - conj(cDpe) "<< pDco-conj(cDpe) <<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"e "<<pDce<<" "<<cDpe <<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"o "<<pDco<<" "<<cDpo <<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage <<"pDce - conj(cDpo) "<< pDce-conj(cDpo) <<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"pDco - conj(cDpe) "<< pDco-conj(cDpe) <<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"= Test MeeInv Mee = 1                                         "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
 | 
			
		||||
  pickCheckerboard(Even,chi_e,chi);
 | 
			
		||||
  pickCheckerboard(Odd ,chi_o,chi);
 | 
			
		||||
 | 
			
		||||
  Ds.Mooee(chi_e,src_e);
 | 
			
		||||
  Ds.MooeeInv(src_e,phi_e);
 | 
			
		||||
 | 
			
		||||
  Ds.Mooee(chi_o,src_o);
 | 
			
		||||
  Ds.MooeeInv(src_o,phi_o);
 | 
			
		||||
  
 | 
			
		||||
  setCheckerboard(phi,phi_e);
 | 
			
		||||
  setCheckerboard(phi,phi_o);
 | 
			
		||||
 | 
			
		||||
  err = phi-chi;
 | 
			
		||||
  std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<< std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"= Test MeeInvDag MeeDag = 1                                   "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
 | 
			
		||||
  pickCheckerboard(Even,chi_e,chi);
 | 
			
		||||
  pickCheckerboard(Odd ,chi_o,chi);
 | 
			
		||||
 | 
			
		||||
  Ds.MooeeDag(chi_e,src_e);
 | 
			
		||||
  Ds.MooeeInvDag(src_e,phi_e);
 | 
			
		||||
 | 
			
		||||
  Ds.MooeeDag(chi_o,src_o);
 | 
			
		||||
  Ds.MooeeInvDag(src_o,phi_o);
 | 
			
		||||
  
 | 
			
		||||
  setCheckerboard(phi,phi_e);
 | 
			
		||||
  setCheckerboard(phi,phi_o);
 | 
			
		||||
 | 
			
		||||
  err = phi-chi;
 | 
			
		||||
  std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<< std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"= Test MpcDagMpc is Hermitian              "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
  
 | 
			
		||||
  random(pRNG5,phi);
 | 
			
		||||
  random(pRNG5,chi);
 | 
			
		||||
  pickCheckerboard(Even,chi_e,chi);
 | 
			
		||||
  pickCheckerboard(Odd ,chi_o,chi);
 | 
			
		||||
  pickCheckerboard(Even,phi_e,phi);
 | 
			
		||||
  pickCheckerboard(Odd ,phi_o,phi);
 | 
			
		||||
 | 
			
		||||
  SchurDiagMooeeOperator<ImprovedStaggeredFermion5DR,FermionField> HermOpEO(Ds);
 | 
			
		||||
  HermOpEO.MpcDagMpc(chi_e,dchi_e,t1,t2);
 | 
			
		||||
  HermOpEO.MpcDagMpc(chi_o,dchi_o,t1,t2);
 | 
			
		||||
 | 
			
		||||
  HermOpEO.MpcDagMpc(phi_e,dphi_e,t1,t2);
 | 
			
		||||
  HermOpEO.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<<GridLogMessage <<"e "<<pDce<<" "<<cDpe <<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"o "<<pDco<<" "<<cDpo <<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage <<"pDce - conj(cDpo) "<< pDco-conj(cDpo) <<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"pDco - conj(cDpe) "<< pDce-conj(cDpe) <<std::endl;
 | 
			
		||||
 | 
			
		||||
  Grid_finalize();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										193
									
								
								tests/core/Test_staggered5Dvec.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								tests/core/Test_staggered5Dvec.cc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,193 @@
 | 
			
		||||
    /*************************************************************************************
 | 
			
		||||
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
    Source file: ./benchmarks/Benchmark_wilson.cc
 | 
			
		||||
 | 
			
		||||
    Copyright (C) 2015
 | 
			
		||||
 | 
			
		||||
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
Author: paboyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
 | 
			
		||||
    This program is free software; you can redistribute it and/or modify
 | 
			
		||||
    it under the terms of the GNU General Public License as published by
 | 
			
		||||
    the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
    (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
    This program is distributed in the hope that it will be useful,
 | 
			
		||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
    GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
    You should have received a copy of the GNU General Public License along
 | 
			
		||||
    with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
    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 */
 | 
			
		||||
#include <Grid/Grid.h>
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Grid::QCD;
 | 
			
		||||
 | 
			
		||||
int main (int argc, char ** argv)
 | 
			
		||||
{
 | 
			
		||||
  Grid_init(&argc,&argv);
 | 
			
		||||
 | 
			
		||||
  std::vector<int> latt_size   = GridDefaultLatt();
 | 
			
		||||
  std::vector<int> simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd());
 | 
			
		||||
  std::vector<int> mpi_layout  = GridDefaultMpi();
 | 
			
		||||
 | 
			
		||||
  const int Ls=16;
 | 
			
		||||
  GridCartesian         * UGrid   = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi());
 | 
			
		||||
  GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid);
 | 
			
		||||
  GridCartesian         * FGrid   = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid);
 | 
			
		||||
  GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid);
 | 
			
		||||
 | 
			
		||||
  std::cout << GridLogMessage << "Making s innermost grids"<<std::endl;
 | 
			
		||||
  GridCartesian         * sUGrid   = SpaceTimeGrid::makeFourDimDWFGrid(GridDefaultLatt(),GridDefaultMpi());
 | 
			
		||||
  GridRedBlackCartesian * sUrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(sUGrid);
 | 
			
		||||
  GridCartesian         * sFGrid   = SpaceTimeGrid::makeFiveDimDWFGrid(Ls,UGrid);
 | 
			
		||||
  GridRedBlackCartesian * sFrbGrid = SpaceTimeGrid::makeFiveDimDWFRedBlackGrid(Ls,UGrid);
 | 
			
		||||
 | 
			
		||||
  int threads = GridThread::GetThreads();
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::vector<int> seeds({1,2,3,4});
 | 
			
		||||
 | 
			
		||||
  GridParallelRNG          pRNG4(UGrid);
 | 
			
		||||
  GridParallelRNG          pRNG5(FGrid);
 | 
			
		||||
  pRNG4.SeedFixedIntegers(seeds);
 | 
			
		||||
  pRNG5.SeedFixedIntegers(seeds);
 | 
			
		||||
 | 
			
		||||
  typedef typename ImprovedStaggeredFermion5DR::FermionField FermionField; 
 | 
			
		||||
  typedef typename ImprovedStaggeredFermion5DR::ComplexField ComplexField; 
 | 
			
		||||
  typename ImprovedStaggeredFermion5DR::ImplParams params; 
 | 
			
		||||
 | 
			
		||||
  FermionField src   (FGrid);
 | 
			
		||||
  random(pRNG5,src);
 | 
			
		||||
  /*
 | 
			
		||||
  std::vector<int> site({0,1,2,0,0});
 | 
			
		||||
  ColourVector cv = zero;
 | 
			
		||||
  cv()()(0)=1.0;
 | 
			
		||||
  src = zero;
 | 
			
		||||
  pokeSite(cv,src,site);
 | 
			
		||||
  */
 | 
			
		||||
  FermionField result(FGrid); result=zero;
 | 
			
		||||
  FermionField    tmp(FGrid);    tmp=zero;
 | 
			
		||||
  FermionField    err(FGrid);    tmp=zero;
 | 
			
		||||
  FermionField phi   (FGrid); random(pRNG5,phi);
 | 
			
		||||
  FermionField chi   (FGrid); random(pRNG5,chi);
 | 
			
		||||
 | 
			
		||||
  LatticeGaugeField Umu(UGrid);
 | 
			
		||||
  SU3::HotConfiguration(pRNG4,Umu);
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
  for(int mu=1;mu<4;mu++){
 | 
			
		||||
    auto tmp = PeekIndex<LorentzIndex>(Umu,mu);
 | 
			
		||||
        tmp = zero;
 | 
			
		||||
    PokeIndex<LorentzIndex>(Umu,tmp,mu);
 | 
			
		||||
  }
 | 
			
		||||
  */
 | 
			
		||||
  double volume=Ls;
 | 
			
		||||
  for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
    volume=volume*latt_size[mu];
 | 
			
		||||
  }  
 | 
			
		||||
 | 
			
		||||
  RealD mass=0.1;
 | 
			
		||||
  RealD c1=9.0/8.0;
 | 
			
		||||
  RealD c2=-1.0/24.0;
 | 
			
		||||
  RealD u0=1.0;
 | 
			
		||||
 | 
			
		||||
  ImprovedStaggeredFermion5DR     Ds(Umu,Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,c1,c2,u0,params);
 | 
			
		||||
  ImprovedStaggeredFermionVec5dR sDs(Umu,Umu,*sFGrid,*sFrbGrid,*sUGrid,*sUrbGrid,mass,c1,c2,u0,params);
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage<<"=========================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"= Testing Dhop against cshift implementation         "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=========================================================="<<std::endl;
 | 
			
		||||
 | 
			
		||||
  int ncall=1000;
 | 
			
		||||
  int ncall1=1000;
 | 
			
		||||
  double t0(0),t1(0);
 | 
			
		||||
  double flops=(16*(3*(6+8+8)) + 15*3*2)*volume*ncall; // == 66*16 +  == 1146
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage << "Calling staggered operator"<<std::endl;
 | 
			
		||||
  t0=usecond();
 | 
			
		||||
  for(int i=0;i<ncall1;i++){
 | 
			
		||||
    Ds.Dhop(src,result,0);
 | 
			
		||||
  }
 | 
			
		||||
  t1=usecond();
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
  std::cout<<GridLogMessage << "Called Ds"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "norm result "<< norm2(result)<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "mflop/s =   "<< flops/(t1-t0)<<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage << "Calling vectorised staggered operator"<<std::endl;
 | 
			
		||||
 | 
			
		||||
#ifdef AVX512
 | 
			
		||||
  QCD::StaggeredKernelsStatic::Opt=QCD::StaggeredKernelsStatic::OptInlineAsm;
 | 
			
		||||
#else
 | 
			
		||||
  QCD::StaggeredKernelsStatic::Opt=QCD::StaggeredKernelsStatic::OptGeneric;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  t0=usecond();
 | 
			
		||||
  for(int i=0;i<ncall1;i++){
 | 
			
		||||
    Ds.Dhop(src,tmp,0);
 | 
			
		||||
  }
 | 
			
		||||
  t1=usecond();
 | 
			
		||||
 
 | 
			
		||||
  std::cout<<GridLogMessage << "Called Ds ASM"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "norm result "<< norm2(tmp)<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "mflop/s =   "<< flops/(t1-t0)<<std::endl;
 | 
			
		||||
 | 
			
		||||
  err = tmp-result; 
 | 
			
		||||
  std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<<std::endl;
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
  FermionField ssrc  (sFGrid);  localConvert(src,ssrc);
 | 
			
		||||
  FermionField sresult(sFGrid); sresult=zero;
 | 
			
		||||
 | 
			
		||||
  QCD::StaggeredKernelsStatic::Opt=QCD::StaggeredKernelsStatic::OptHandUnroll;
 | 
			
		||||
  t0=usecond();
 | 
			
		||||
  for(int i=0;i<ncall1;i++){
 | 
			
		||||
    sDs.Dhop(ssrc,sresult,0);
 | 
			
		||||
  }
 | 
			
		||||
  t1=usecond();
 | 
			
		||||
  localConvert(sresult,tmp);
 | 
			
		||||
 
 | 
			
		||||
  std::cout<<GridLogMessage << "Called sDs unroll"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "norm result "<< norm2(sresult)<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "mflop/s =   "<< flops/(t1-t0)<<std::endl;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef AVX512
 | 
			
		||||
  QCD::StaggeredKernelsStatic::Opt=QCD::StaggeredKernelsStatic::OptInlineAsm;
 | 
			
		||||
#else
 | 
			
		||||
  QCD::StaggeredKernelsStatic::Opt=QCD::StaggeredKernelsStatic::OptGeneric;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  err = tmp-result; 
 | 
			
		||||
  std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<<std::endl;
 | 
			
		||||
  int extra=1;
 | 
			
		||||
  t0=usecond();
 | 
			
		||||
  for(int i=0;i<ncall1*extra;i++){
 | 
			
		||||
    sDs.Dhop(ssrc,sresult,0);
 | 
			
		||||
  }
 | 
			
		||||
  t1=usecond();
 | 
			
		||||
  localConvert(sresult,tmp);
 | 
			
		||||
 
 | 
			
		||||
  std::cout<<GridLogMessage << "Called sDs asm"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "norm result "<< norm2(sresult)<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "mflop/s =   "<< flops/(t1-t0)*extra<<std::endl;
 | 
			
		||||
 | 
			
		||||
  err = tmp-result; 
 | 
			
		||||
  std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<<std::endl;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  Grid_finalize();
 | 
			
		||||
}
 | 
			
		||||
@@ -62,7 +62,7 @@ int main (int argc, char ** argv)
 | 
			
		||||
  GridParallelRNG          pRNG(&Grid);
 | 
			
		||||
  //  std::vector<int> seeds({1,2,3,4});
 | 
			
		||||
  //  pRNG.SeedFixedIntegers(seeds);
 | 
			
		||||
  pRNG.SeedRandomDevice();
 | 
			
		||||
  pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}));
 | 
			
		||||
 | 
			
		||||
  LatticeFermion src   (&Grid); random(pRNG,src);
 | 
			
		||||
  LatticeFermion phi   (&Grid); random(pRNG,phi);
 | 
			
		||||
@@ -71,7 +71,7 @@ int main (int argc, char ** argv)
 | 
			
		||||
  LatticeFermion    ref(&Grid);    ref=zero;
 | 
			
		||||
  LatticeFermion    tmp(&Grid);    tmp=zero;
 | 
			
		||||
  LatticeFermion    err(&Grid);    tmp=zero;
 | 
			
		||||
  LatticeGaugeField Umu(&Grid); random(pRNG,Umu);
 | 
			
		||||
  LatticeGaugeField Umu(&Grid); SU3::HotConfiguration(pRNG,Umu);
 | 
			
		||||
  std::vector<LatticeColourMatrix> U(4,&Grid);
 | 
			
		||||
 | 
			
		||||
  double volume=1;
 | 
			
		||||
 
 | 
			
		||||
@@ -61,7 +61,7 @@ int main (int argc, char ** argv)
 | 
			
		||||
  GridParallelRNG          pRNG(&Grid);
 | 
			
		||||
  //  std::vector<int> seeds({1,2,3,4});
 | 
			
		||||
  //  pRNG.SeedFixedIntegers(seeds);
 | 
			
		||||
  pRNG.SeedRandomDevice();
 | 
			
		||||
  pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}));
 | 
			
		||||
 | 
			
		||||
  LatticeFermion src   (&Grid); random(pRNG,src);
 | 
			
		||||
  LatticeFermion phi   (&Grid); random(pRNG,phi);
 | 
			
		||||
@@ -70,7 +70,7 @@ int main (int argc, char ** argv)
 | 
			
		||||
  LatticeFermion    ref(&Grid);    ref=zero;
 | 
			
		||||
  LatticeFermion    tmp(&Grid);    tmp=zero;
 | 
			
		||||
  LatticeFermion    err(&Grid);    tmp=zero;
 | 
			
		||||
  LatticeGaugeField Umu(&Grid); random(pRNG,Umu);
 | 
			
		||||
  LatticeGaugeField Umu(&Grid); SU3::HotConfiguration(pRNG,Umu);
 | 
			
		||||
  std::vector<LatticeColourMatrix> U(4,&Grid);
 | 
			
		||||
 | 
			
		||||
  double volume=1;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										287
									
								
								tests/core/Test_zmobius_even_odd.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										287
									
								
								tests/core/Test_zmobius_even_odd.cc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,287 @@
 | 
			
		||||
    /*************************************************************************************
 | 
			
		||||
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
    Source file: ./tests/Test_dwf_even_odd.cc
 | 
			
		||||
 | 
			
		||||
    Copyright (C) 2015
 | 
			
		||||
 | 
			
		||||
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
Author: paboyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
 | 
			
		||||
    This program is free software; you can redistribute it and/or modify
 | 
			
		||||
    it under the terms of the GNU General Public License as published by
 | 
			
		||||
    the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
    (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
    This program is distributed in the hope that it will be useful,
 | 
			
		||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
    GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
    You should have received a copy of the GNU General Public License along
 | 
			
		||||
    with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
    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 */
 | 
			
		||||
#include <Grid/Grid.h>
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
using namespace Grid::QCD;
 | 
			
		||||
 | 
			
		||||
template<class d>
 | 
			
		||||
struct scal {
 | 
			
		||||
  d internal;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
  Gamma::Algebra Gmu [] = {
 | 
			
		||||
    Gamma::Algebra::GammaX,
 | 
			
		||||
    Gamma::Algebra::GammaY,
 | 
			
		||||
    Gamma::Algebra::GammaZ,
 | 
			
		||||
    Gamma::Algebra::GammaT
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main (int argc, char ** argv)
 | 
			
		||||
{
 | 
			
		||||
  Grid_init(&argc,&argv);
 | 
			
		||||
 | 
			
		||||
  int threads = GridThread::GetThreads();
 | 
			
		||||
  std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  const int Ls=10;
 | 
			
		||||
  GridCartesian         * UGrid   = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi());
 | 
			
		||||
  GridCartesian         * FGrid   = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid);
 | 
			
		||||
  GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid);
 | 
			
		||||
  GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid);
 | 
			
		||||
 | 
			
		||||
  std::vector<int> seeds4({1,2,3,4});
 | 
			
		||||
  std::vector<int> seeds5({5,6,7,8});
 | 
			
		||||
 | 
			
		||||
  GridParallelRNG          RNG4(UGrid);  RNG4.SeedFixedIntegers(seeds4);
 | 
			
		||||
  GridParallelRNG          RNG5(FGrid);  RNG5.SeedFixedIntegers(seeds5);
 | 
			
		||||
 | 
			
		||||
  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;
 | 
			
		||||
  LatticeGaugeField Umu(UGrid); random(RNG4,Umu);
 | 
			
		||||
  std::vector<LatticeColourMatrix> U(4,UGrid);
 | 
			
		||||
 | 
			
		||||
  // Only one non-zero (y)
 | 
			
		||||
  Umu=zero;
 | 
			
		||||
  for(int nn=0;nn<Nd;nn++){
 | 
			
		||||
    random(RNG4,U[nn]);
 | 
			
		||||
    if ( nn>0 ) 
 | 
			
		||||
      U[nn]=zero;
 | 
			
		||||
    PokeIndex<LorentzIndex>(Umu,U[nn],nn);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  RealD mass=0.1;
 | 
			
		||||
  RealD M5  =1.8;
 | 
			
		||||
  std::vector < std::complex<double>  > omegas;
 | 
			
		||||
#if 0
 | 
			
		||||
  for(int i=0;i<Ls;i++){
 | 
			
		||||
    double imag = 0.;
 | 
			
		||||
    if (i==0) imag=1.;
 | 
			
		||||
    if (i==Ls-1) imag=-1.;
 | 
			
		||||
    std::complex<double> temp (0.25+0.01*i, imag*0.01);
 | 
			
		||||
    omegas.push_back(temp);
 | 
			
		||||
  }
 | 
			
		||||
#else
 | 
			
		||||
  omegas.push_back( std::complex<double>(1.45806438985048,-0) );
 | 
			
		||||
  omegas.push_back( std::complex<double>(1.18231318389348,-0) );
 | 
			
		||||
  omegas.push_back( std::complex<double>(0.830951166685955,-0) );
 | 
			
		||||
  omegas.push_back( std::complex<double>(0.542352409156791,-0) );
 | 
			
		||||
  omegas.push_back( std::complex<double>(0.341985020453729,-0) );
 | 
			
		||||
  omegas.push_back( std::complex<double>(0.21137902619029,-0) );
 | 
			
		||||
  omegas.push_back( std::complex<double>(0.126074299502912,-0) );
 | 
			
		||||
  omegas.push_back( std::complex<double>(0.0990136651962626,-0) );
 | 
			
		||||
  omegas.push_back( std::complex<double>(0.0686324988446592,0.0550658530827402) );
 | 
			
		||||
  omegas.push_back( std::complex<double>(0.0686324988446592,-0.0550658530827402) );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  ZMobiusFermionR Ddwf(Umu, *FGrid, *FrbGrid, *UGrid, *UrbGrid, mass, M5, omegas,1.,0.);
 | 
			
		||||
//  DomainWallFermionR Ddwf(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5);
 | 
			
		||||
 | 
			
		||||
  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<<GridLogMessage<<"=========================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"= Testing that Meo + Moe + Moo + Mee = Munprec "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=========================================================="<<std::endl;
 | 
			
		||||
 | 
			
		||||
  pickCheckerboard(Even,src_e,src);
 | 
			
		||||
  pickCheckerboard(Odd,src_o,src);
 | 
			
		||||
 | 
			
		||||
  Ddwf.Meooe(src_e,r_o);  std::cout<<GridLogMessage<<"Applied Meo"<<std::endl;
 | 
			
		||||
  Ddwf.Meooe(src_o,r_e);  std::cout<<GridLogMessage<<"Applied Moe"<<std::endl;
 | 
			
		||||
  setCheckerboard(r_eo,r_o);
 | 
			
		||||
  setCheckerboard(r_eo,r_e);
 | 
			
		||||
 | 
			
		||||
  Ddwf.Mooee(src_e,r_e);  std::cout<<GridLogMessage<<"Applied Mee"<<std::endl;
 | 
			
		||||
  Ddwf.Mooee(src_o,r_o);  std::cout<<GridLogMessage<<"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<<GridLogMessage << r_eo<<std::endl;
 | 
			
		||||
  //  std::cout<<GridLogMessage << ref <<std::endl;
 | 
			
		||||
 | 
			
		||||
  err= ref - r_eo;
 | 
			
		||||
  std::cout<<GridLogMessage << "EO norm diff   "<< norm2(err)<< " "<<norm2(ref)<< " " << norm2(r_eo) <<std::endl;
 | 
			
		||||
    
 | 
			
		||||
  LatticeComplex cerr(FGrid);
 | 
			
		||||
  cerr = localInnerProduct(err,err);
 | 
			
		||||
  //  std::cout<<GridLogMessage << cerr<<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"= Test MooeeDagger is the dagger of Mooee by requiring                "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=  < phi | Deo | chi > * = < chi | Deo^dag| phi>  "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<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.Mooee(chi_e,dchi_o);
 | 
			
		||||
  Ddwf.Mooee(chi_o,dchi_e);
 | 
			
		||||
  Ddwf.MooeeDag(phi_e,dphi_o);
 | 
			
		||||
  Ddwf.MooeeDag(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<<GridLogMessage <<"e "<<pDce<<" "<<cDpe <<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"o "<<pDco<<" "<<cDpo <<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage <<"pDce - conj(cDpo) "<< pDce-conj(cDpo) <<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"pDco - conj(cDpe) "<< pDco-conj(cDpe) <<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"= Test Ddagger is the dagger of D by requiring                "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=  < phi | Deo | chi > * = < chi | Deo^dag| phi>  "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  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);
 | 
			
		||||
 | 
			
		||||
  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<<GridLogMessage <<"e "<<pDce<<" "<<cDpe <<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"o "<<pDco<<" "<<cDpo <<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage <<"pDce - conj(cDpo) "<< pDce-conj(cDpo) <<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"pDco - conj(cDpe) "<< pDco-conj(cDpe) <<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"= Test MeeInv Mee = 1                                         "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<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<<GridLogMessage << "norm diff   "<< norm2(err)<< std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"= Test MeeInvDag MeeDag = 1                                   "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<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<<GridLogMessage << "norm diff   "<< norm2(err)<< std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"= Test MpcDagMpc is Hermitian              "<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage<<"=============================================================="<<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;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  SchurDiagMooeeOperator<ZMobiusFermionR,LatticeFermion> HermOpEO(Ddwf);
 | 
			
		||||
  HermOpEO.MpcDagMpc(chi_e,dchi_e,t1,t2);
 | 
			
		||||
  HermOpEO.MpcDagMpc(chi_o,dchi_o,t1,t2);
 | 
			
		||||
 | 
			
		||||
  HermOpEO.MpcDagMpc(phi_e,dphi_e,t1,t2);
 | 
			
		||||
  HermOpEO.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<<GridLogMessage <<"e "<<pDce<<" "<<cDpe <<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"o "<<pDco<<" "<<cDpo <<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage <<"pDce - conj(cDpo) "<< pDco-conj(cDpo) <<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"pDco - conj(cDpe) "<< pDce-conj(cDpe) <<std::endl;
 | 
			
		||||
  
 | 
			
		||||
  Grid_finalize();
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user