mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-10-30 11:34:32 +00:00 
			
		
		
		
	Compare commits
	
		
			20 Commits
		
	
	
		
			bugfix/dmi
			...
			feature/CG
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 70068cff51 | ||
|  | 85c055fa30 | ||
|  | 90fedbd2af | ||
|  | ec0c53fa68 | ||
|  | 6ceee102e8 | ||
|  | 6e57bdb6b3 | ||
|  | 4c11e36d3d | ||
|  | 9977c53035 | ||
|  | 3a74fec62f | ||
|  | 8fb0a13f39 | ||
|  | 14a1406f54 | ||
|  | 538e64e5b4 | ||
|  | b2dc17e160 | ||
|  | afbbcd2194 | ||
|  | d4e0b11bb1 | ||
|  | 7144ee7ae8 | ||
|  | f1908c7bc9 | ||
|  | 036ec31c48 | ||
|  | 53f240200e | ||
|  | 9720c9ba3f | 
							
								
								
									
										13
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -9,7 +9,6 @@ | |||||||
| ################ | ################ | ||||||
| *~ | *~ | ||||||
| *# | *# | ||||||
| *.sublime-* |  | ||||||
|  |  | ||||||
| # Precompiled Headers # | # Precompiled Headers # | ||||||
| ####################### | ####################### | ||||||
| @@ -105,15 +104,3 @@ lib/fftw/* | |||||||
| ################## | ################## | ||||||
| m4/lt* | m4/lt* | ||||||
| m4/libtool.m4 | m4/libtool.m4 | ||||||
|  |  | ||||||
| # Buck files # |  | ||||||
| ############## |  | ||||||
| .buck* |  | ||||||
| buck-out |  | ||||||
| BUCK |  | ||||||
| make-bin-BUCK.sh |  | ||||||
|  |  | ||||||
| # generated sources # |  | ||||||
| ##################### |  | ||||||
| lib/qcd/spin/gamma-gen/*.h |  | ||||||
| lib/qcd/spin/gamma-gen/*.cc |  | ||||||
| @@ -102,5 +102,5 @@ script: | |||||||
|     - ../configure --enable-precision=single --enable-simd=SSE4 --enable-comms=mpi-auto |     - ../configure --enable-precision=single --enable-simd=SSE4 --enable-comms=mpi-auto | ||||||
|     - make -j4 |     - make -j4 | ||||||
|     - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then mpirun.openmpi -n 2 ./benchmarks/Benchmark_dwf --threads 1 --mpi 2.1.1.1; fi |     - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then mpirun.openmpi -n 2 ./benchmarks/Benchmark_dwf --threads 1 --mpi 2.1.1.1; fi | ||||||
|  |     - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then mpirun -n 2 ./benchmarks/Benchmark_dwf --threads 1 --mpi 2.1.1.1; fi | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| # additional include paths necessary to compile the C++ library | # additional include paths necessary to compile the C++ library | ||||||
| SUBDIRS = lib benchmarks tests extras | SUBDIRS = lib benchmarks tests | ||||||
|  |  | ||||||
| include $(top_srcdir)/doxygen.inc | include $(top_srcdir)/doxygen.inc | ||||||
|  |  | ||||||
|   | |||||||
| @@ -48,9 +48,9 @@ int main (int argc, char ** argv) | |||||||
|   std::cout<<GridLogMessage << "= Benchmarking concurrent halo exchange in "<<nmu<<" dimensions"<<std::endl; |   std::cout<<GridLogMessage << "= Benchmarking concurrent halo exchange in "<<nmu<<" dimensions"<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; |   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<" Ls  "<<"\t\t"<<"bytes"<<"\t\t"<<"MB/s uni"<<"\t\t"<<"MB/s bidi"<<std::endl; |   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<" Ls  "<<"\t\t"<<"bytes"<<"\t\t"<<"MB/s uni"<<"\t\t"<<"MB/s bidi"<<std::endl; | ||||||
|   int maxlat=24; |   int maxlat=16; | ||||||
|   for(int lat=4;lat<=maxlat;lat+=4){ |   for(int lat=4;lat<=maxlat;lat+=2){ | ||||||
|     for(int Ls=8;Ls<=32;Ls*=2){ |     for(int Ls=1;Ls<=16;Ls*=2){ | ||||||
|  |  | ||||||
|       std::vector<int> latt_size  ({lat*mpi_layout[0], |       std::vector<int> latt_size  ({lat*mpi_layout[0], | ||||||
|       				    lat*mpi_layout[1], |       				    lat*mpi_layout[1], | ||||||
| @@ -124,8 +124,8 @@ int main (int argc, char ** argv) | |||||||
|   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<" Ls  "<<"\t\t"<<"bytes"<<"\t\t"<<"MB/s uni"<<"\t\t"<<"MB/s bidi"<<std::endl; |   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<" Ls  "<<"\t\t"<<"bytes"<<"\t\t"<<"MB/s uni"<<"\t\t"<<"MB/s bidi"<<std::endl; | ||||||
|  |  | ||||||
|  |  | ||||||
|   for(int lat=4;lat<=maxlat;lat+=4){ |   for(int lat=4;lat<=maxlat;lat+=2){ | ||||||
|     for(int Ls=8;Ls<=32;Ls*=2){ |     for(int Ls=1;Ls<=16;Ls*=2){ | ||||||
|  |  | ||||||
|       std::vector<int> latt_size  ({lat,lat,lat,lat}); |       std::vector<int> latt_size  ({lat,lat,lat,lat}); | ||||||
|  |  | ||||||
| @@ -194,14 +194,14 @@ int main (int argc, char ** argv) | |||||||
|   }   |   }   | ||||||
|  |  | ||||||
|  |  | ||||||
|   Nloop=10; |   Nloop=100; | ||||||
|   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; |   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "= Benchmarking concurrent STENCIL halo exchange in "<<nmu<<" dimensions"<<std::endl; |   std::cout<<GridLogMessage << "= Benchmarking concurrent STENCIL halo exchange in "<<nmu<<" dimensions"<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; |   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<" Ls  "<<"\t\t"<<"bytes"<<"\t\t"<<"MB/s uni"<<"\t\t"<<"MB/s bidi"<<std::endl; |   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<" Ls  "<<"\t\t"<<"bytes"<<"\t\t"<<"MB/s uni"<<"\t\t"<<"MB/s bidi"<<std::endl; | ||||||
|  |  | ||||||
|   for(int lat=4;lat<=maxlat;lat+=4){ |   for(int lat=4;lat<=maxlat;lat+=2){ | ||||||
|     for(int Ls=8;Ls<=32;Ls*=2){ |     for(int Ls=1;Ls<=16;Ls*=2){ | ||||||
|  |  | ||||||
|       std::vector<int> latt_size  ({lat*mpi_layout[0], |       std::vector<int> latt_size  ({lat*mpi_layout[0], | ||||||
|       				    lat*mpi_layout[1], |       				    lat*mpi_layout[1], | ||||||
| @@ -281,8 +281,8 @@ int main (int argc, char ** argv) | |||||||
|   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; |   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<" Ls  "<<"\t\t"<<"bytes"<<"\t\t"<<"MB/s uni"<<"\t\t"<<"MB/s bidi"<<std::endl; |   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<" Ls  "<<"\t\t"<<"bytes"<<"\t\t"<<"MB/s uni"<<"\t\t"<<"MB/s bidi"<<std::endl; | ||||||
|  |  | ||||||
|   for(int lat=4;lat<=maxlat;lat+=4){ |   for(int lat=4;lat<=maxlat;lat+=2){ | ||||||
|     for(int Ls=8;Ls<=32;Ls*=2){ |     for(int Ls=1;Ls<=16;Ls*=2){ | ||||||
|  |  | ||||||
|       std::vector<int> latt_size  ({lat*mpi_layout[0], |       std::vector<int> latt_size  ({lat*mpi_layout[0], | ||||||
|       				    lat*mpi_layout[1], |       				    lat*mpi_layout[1], | ||||||
| @@ -324,8 +324,8 @@ int main (int argc, char ** argv) | |||||||
| 					    (void *)&rbuf[mu][0], | 					    (void *)&rbuf[mu][0], | ||||||
| 					    recv_from_rank, | 					    recv_from_rank, | ||||||
| 					    bytes); | 					    bytes); | ||||||
| 	    Grid.StencilSendToRecvFromComplete(requests); | 	    //	    Grid.StencilSendToRecvFromComplete(requests); | ||||||
| 	    requests.resize(0); | 	    //	    requests.resize(0); | ||||||
|  |  | ||||||
| 	    comm_proc = mpi_layout[mu]-1; | 	    comm_proc = mpi_layout[mu]-1; | ||||||
| 	   | 	   | ||||||
|   | |||||||
| @@ -37,27 +37,27 @@ struct scal { | |||||||
|   d internal; |   d internal; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   Gamma::Algebra Gmu [] = { |   Gamma::GammaMatrix Gmu [] = { | ||||||
|     Gamma::Algebra::GammaX, |     Gamma::GammaX, | ||||||
|     Gamma::Algebra::GammaY, |     Gamma::GammaY, | ||||||
|     Gamma::Algebra::GammaZ, |     Gamma::GammaZ, | ||||||
|     Gamma::Algebra::GammaT |     Gamma::GammaT | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
| typedef WilsonFermion5D<DomainWallVec5dImplR> WilsonFermion5DR; | typedef WilsonFermion5D<DomainWallVec5dImplR> WilsonFermion5DR; | ||||||
| typedef WilsonFermion5D<DomainWallVec5dImplF> WilsonFermion5DF; | typedef WilsonFermion5D<DomainWallVec5dImplF> WilsonFermion5DF; | ||||||
| typedef WilsonFermion5D<DomainWallVec5dImplD> WilsonFermion5DD; | typedef WilsonFermion5D<DomainWallVec5dImplD> WilsonFermion5DD; | ||||||
|  |  | ||||||
|  |  | ||||||
| int main (int argc, char ** argv) | int main (int argc, char ** argv) | ||||||
| { | { | ||||||
|   Grid_init(&argc,&argv); |   Grid_init(&argc,&argv); | ||||||
|  |  | ||||||
|  |  | ||||||
|   int threads = GridThread::GetThreads(); |   int threads = GridThread::GetThreads(); | ||||||
|   std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl; |   std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl; | ||||||
|  |  | ||||||
|   std::vector<int> latt4 = GridDefaultLatt(); |   std::vector<int> latt4 = GridDefaultLatt(); | ||||||
|   const int Ls=16; |   const int Ls=8; | ||||||
|   GridCartesian         * UGrid   = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi()); |   GridCartesian         * UGrid   = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi()); | ||||||
|   GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid); |   GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid); | ||||||
|   GridCartesian         * FGrid   = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid); |   GridCartesian         * FGrid   = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid); | ||||||
| @@ -72,65 +72,34 @@ int main (int argc, char ** argv) | |||||||
|   std::vector<int> seeds4({1,2,3,4}); |   std::vector<int> seeds4({1,2,3,4}); | ||||||
|   std::vector<int> seeds5({5,6,7,8}); |   std::vector<int> seeds5({5,6,7,8}); | ||||||
|  |  | ||||||
|   std::cout << GridLogMessage << "Initialising 4d RNG" << std::endl; |  | ||||||
|   GridParallelRNG          RNG4(UGrid);  RNG4.SeedFixedIntegers(seeds4); |   GridParallelRNG          RNG4(UGrid);  RNG4.SeedFixedIntegers(seeds4); | ||||||
|   std::cout << GridLogMessage << "Initialising 5d RNG" << std::endl; |  | ||||||
|   GridParallelRNG          RNG5(FGrid);  RNG5.SeedFixedIntegers(seeds5); |   GridParallelRNG          RNG5(FGrid);  RNG5.SeedFixedIntegers(seeds5); | ||||||
|   std::cout << GridLogMessage << "Initialised RNGs" << std::endl; |  | ||||||
|  |  | ||||||
|   LatticeFermion src   (FGrid); random(RNG5,src); |   LatticeFermion src   (FGrid); random(RNG5,src); | ||||||
| #if 0 |  | ||||||
|   src = zero; |  | ||||||
|   { |  | ||||||
|     std::vector<int> origin({0,0,0,latt4[2]-1,0}); |  | ||||||
|     SpinColourVectorF tmp; |  | ||||||
|     tmp=zero; |  | ||||||
|     tmp()(0)(0)=Complex(-2.0,0.0); |  | ||||||
|     std::cout << " source site 0 " << tmp<<std::endl; |  | ||||||
|     pokeSite(tmp,src,origin); |  | ||||||
|   } |  | ||||||
| #else |  | ||||||
|   RealD N2 = 1.0/::sqrt(norm2(src)); |  | ||||||
|   src = src*N2; |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   LatticeFermion result(FGrid); result=zero; |   LatticeFermion result(FGrid); result=zero; | ||||||
|   LatticeFermion    ref(FGrid);    ref=zero; |   LatticeFermion    ref(FGrid);    ref=zero; | ||||||
|   LatticeFermion    tmp(FGrid); |   LatticeFermion    tmp(FGrid); | ||||||
|   LatticeFermion    err(FGrid); |   LatticeFermion    err(FGrid); | ||||||
|  |  | ||||||
|   std::cout << GridLogMessage << "Drawing gauge field" << std::endl; |  | ||||||
|   LatticeGaugeField Umu(UGrid);  |   LatticeGaugeField Umu(UGrid);  | ||||||
|   SU3::HotConfiguration(RNG4,Umu);  |   random(RNG4,Umu); | ||||||
|   std::cout << GridLogMessage << "Random gauge initialised " << std::endl; |  | ||||||
| #if 0 |  | ||||||
|   Umu=1.0; |  | ||||||
|   for(int mu=0;mu<Nd;mu++){ |  | ||||||
|     LatticeColourMatrix ttmp(UGrid); |  | ||||||
|     ttmp = PeekIndex<LorentzIndex>(Umu,mu); |  | ||||||
|     //    if (mu !=2 ) ttmp = 0; |  | ||||||
|     //    ttmp = ttmp* pow(10.0,mu); |  | ||||||
|     PokeIndex<LorentzIndex>(Umu,ttmp,mu); |  | ||||||
|   } |  | ||||||
|   std::cout << GridLogMessage << "Forced to diagonal " << std::endl; |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|   //////////////////////////////////// |  | ||||||
|   // Naive wilson implementation |  | ||||||
|   //////////////////////////////////// |  | ||||||
|   // replicate across fifth dimension |  | ||||||
|   LatticeGaugeField Umu5d(FGrid);  |   LatticeGaugeField Umu5d(FGrid);  | ||||||
|   std::vector<LatticeColourMatrix> U(4,FGrid); |  | ||||||
|  |   // replicate across fifth dimension | ||||||
|   for(int ss=0;ss<Umu._grid->oSites();ss++){ |   for(int ss=0;ss<Umu._grid->oSites();ss++){ | ||||||
|     for(int s=0;s<Ls;s++){ |     for(int s=0;s<Ls;s++){ | ||||||
|       Umu5d._odata[Ls*ss+s] = Umu._odata[ss]; |       Umu5d._odata[Ls*ss+s] = Umu._odata[ss]; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   //////////////////////////////////// | ||||||
|  |   // Naive wilson implementation | ||||||
|  |   //////////////////////////////////// | ||||||
|  |   std::vector<LatticeColourMatrix> U(4,FGrid); | ||||||
|   for(int mu=0;mu<Nd;mu++){ |   for(int mu=0;mu<Nd;mu++){ | ||||||
|     U[mu] = PeekIndex<LorentzIndex>(Umu5d,mu); |     U[mu] = PeekIndex<LorentzIndex>(Umu5d,mu); | ||||||
|   } |   } | ||||||
|   std::cout << GridLogMessage << "Setting up Cshift based reference " << std::endl; |  | ||||||
|  |  | ||||||
|   if (1) |   if (1) | ||||||
|   { |   { | ||||||
| @@ -152,7 +121,6 @@ int main (int argc, char ** argv) | |||||||
|  |  | ||||||
|   RealD NP = UGrid->_Nprocessors; |   RealD NP = UGrid->_Nprocessors; | ||||||
|  |  | ||||||
|   std::cout << GridLogMessage << "Creating action operator " << std::endl; |  | ||||||
|   DomainWallFermionR Dw(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5); |   DomainWallFermionR Dw(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5); | ||||||
|  |  | ||||||
|   std::cout << GridLogMessage<< "*****************************************************************" <<std::endl; |   std::cout << GridLogMessage<< "*****************************************************************" <<std::endl; | ||||||
| @@ -168,11 +136,10 @@ int main (int argc, char ** argv) | |||||||
|   if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptInlineAsm ) std::cout << GridLogMessage<< "* Using Asm Nc=3   WilsonKernels" <<std::endl; |   if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptInlineAsm ) std::cout << GridLogMessage<< "* Using Asm Nc=3   WilsonKernels" <<std::endl; | ||||||
|   std::cout << GridLogMessage<< "*****************************************************************" <<std::endl; |   std::cout << GridLogMessage<< "*****************************************************************" <<std::endl; | ||||||
|  |  | ||||||
|   int ncall =1000; |   int ncall =100; | ||||||
|   if (1) { |   if (1) { | ||||||
|     FGrid->Barrier(); |     FGrid->Barrier(); | ||||||
|     Dw.ZeroCounters(); |     Dw.ZeroCounters(); | ||||||
|     Dw.Dhop(src,result,0); |  | ||||||
|     double t0=usecond(); |     double t0=usecond(); | ||||||
|     for(int i=0;i<ncall;i++){ |     for(int i=0;i<ncall;i++){ | ||||||
|       __SSC_START; |       __SSC_START; | ||||||
| @@ -186,22 +153,12 @@ int main (int argc, char ** argv) | |||||||
|     double flops=1344*volume*ncall; |     double flops=1344*volume*ncall; | ||||||
|  |  | ||||||
|     std::cout<<GridLogMessage << "Called Dw "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl; |     std::cout<<GridLogMessage << "Called Dw "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl; | ||||||
|     //    std::cout<<GridLogMessage << "norm result "<< norm2(result)<<std::endl; |     std::cout<<GridLogMessage << "norm result "<< norm2(result)<<std::endl; | ||||||
|     //    std::cout<<GridLogMessage << "norm ref    "<< norm2(ref)<<std::endl; |     std::cout<<GridLogMessage << "norm ref    "<< norm2(ref)<<std::endl; | ||||||
|     std::cout<<GridLogMessage << "mflop/s =   "<< flops/(t1-t0)<<std::endl; |     std::cout<<GridLogMessage << "mflop/s =   "<< flops/(t1-t0)<<std::endl; | ||||||
|     std::cout<<GridLogMessage << "mflop/s per rank =  "<< flops/(t1-t0)/NP<<std::endl; |     std::cout<<GridLogMessage << "mflop/s per rank =  "<< flops/(t1-t0)/NP<<std::endl; | ||||||
|     err = ref-result;  |     err = ref-result;  | ||||||
|     std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<<std::endl; |     std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<<std::endl; | ||||||
|  |  | ||||||
|     /* |  | ||||||
|     if(( norm2(err)>1.0e-4) ) {  |  | ||||||
|       std::cout << "RESULT\n " << result<<std::endl; |  | ||||||
|       std::cout << "REF   \n " << ref   <<std::endl; |  | ||||||
|       std::cout << "ERR   \n " << err   <<std::endl; |  | ||||||
|       FGrid->Barrier(); |  | ||||||
|       exit(-1); |  | ||||||
|     } |  | ||||||
|     */ |  | ||||||
|     assert (norm2(err)< 1.0e-4 ); |     assert (norm2(err)< 1.0e-4 ); | ||||||
|     Dw.Report(); |     Dw.Report(); | ||||||
|   } |   } | ||||||
| @@ -226,12 +183,20 @@ int main (int argc, char ** argv) | |||||||
|  |  | ||||||
|     WilsonFermion5DR sDw(Umu,*sFGrid,*sFrbGrid,*sUGrid,*sUrbGrid,M5); |     WilsonFermion5DR sDw(Umu,*sFGrid,*sFrbGrid,*sUGrid,*sUrbGrid,M5); | ||||||
|    |    | ||||||
|     localConvert(src,ssrc); |     for(int x=0;x<latt4[0];x++){ | ||||||
|  |     for(int y=0;y<latt4[1];y++){ | ||||||
|  |     for(int z=0;z<latt4[2];z++){ | ||||||
|  |     for(int t=0;t<latt4[3];t++){ | ||||||
|  |     for(int s=0;s<Ls;s++){ | ||||||
|  |       std::vector<int> site({s,x,y,z,t}); | ||||||
|  |       SpinColourVector tmp; | ||||||
|  |       peekSite(tmp,src,site); | ||||||
|  |       pokeSite(tmp,ssrc,site); | ||||||
|  |     }}}}} | ||||||
|     std::cout<<GridLogMessage<< "src norms "<< norm2(src)<<" " <<norm2(ssrc)<<std::endl; |     std::cout<<GridLogMessage<< "src norms "<< norm2(src)<<" " <<norm2(ssrc)<<std::endl; | ||||||
|     FGrid->Barrier(); |     FGrid->Barrier(); | ||||||
|     sDw.Dhop(ssrc,sresult,0); |  | ||||||
|     sDw.ZeroCounters(); |  | ||||||
|     double t0=usecond(); |     double t0=usecond(); | ||||||
|  |     sDw.ZeroCounters(); | ||||||
|     for(int i=0;i<ncall;i++){ |     for(int i=0;i<ncall;i++){ | ||||||
|       __SSC_START; |       __SSC_START; | ||||||
|       sDw.Dhop(ssrc,sresult,0); |       sDw.Dhop(ssrc,sresult,0); | ||||||
| @@ -245,47 +210,46 @@ int main (int argc, char ** argv) | |||||||
|     std::cout<<GridLogMessage << "Called Dw s_inner "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl; |     std::cout<<GridLogMessage << "Called Dw s_inner "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl; | ||||||
|     std::cout<<GridLogMessage << "mflop/s =   "<< flops/(t1-t0)<<std::endl; |     std::cout<<GridLogMessage << "mflop/s =   "<< flops/(t1-t0)<<std::endl; | ||||||
|     std::cout<<GridLogMessage << "mflop/s per rank =  "<< flops/(t1-t0)/NP<<std::endl; |     std::cout<<GridLogMessage << "mflop/s per rank =  "<< flops/(t1-t0)/NP<<std::endl; | ||||||
|     //    std::cout<<GridLogMessage<< "res norms "<< norm2(result)<<" " <<norm2(sresult)<<std::endl; |  | ||||||
|     sDw.Report(); |     sDw.Report(); | ||||||
|  |    | ||||||
|  |     if(0){ | ||||||
|  |       for(int i=0;i< PerformanceCounter::NumTypes(); i++ ){ | ||||||
|  | 	sDw.Dhop(ssrc,sresult,0); | ||||||
|  | 	PerformanceCounter Counter(i); | ||||||
|  | 	Counter.Start(); | ||||||
|  | 	sDw.Dhop(ssrc,sresult,0); | ||||||
|  | 	Counter.Stop(); | ||||||
|  | 	Counter.Report(); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     std::cout<<GridLogMessage<< "res norms "<< norm2(result)<<" " <<norm2(sresult)<<std::endl; | ||||||
|  |  | ||||||
|     RealD sum=0; |     RealD sum=0; | ||||||
|  |     for(int x=0;x<latt4[0];x++){ | ||||||
|     err=zero; |     for(int y=0;y<latt4[1];y++){ | ||||||
|     localConvert(sresult,err); |     for(int z=0;z<latt4[2];z++){ | ||||||
|     err = err - ref; |     for(int t=0;t<latt4[3];t++){ | ||||||
|     sum = norm2(err); |     for(int s=0;s<Ls;s++){ | ||||||
|     std::cout<<GridLogMessage<<" difference between normal ref and simd is "<<sum<<std::endl; |       std::vector<int> site({s,x,y,z,t}); | ||||||
|     if(sum > 1.0e-4 ){ |       SpinColourVector normal, simd; | ||||||
|       std::cout<< "sD REF\n " <<ref << std::endl; |       peekSite(normal,result,site); | ||||||
|       std::cout<< "sD ERR   \n " <<err  <<std::endl; |       peekSite(simd,sresult,site); | ||||||
|     } |       sum=sum+norm2(normal-simd); | ||||||
|     //    assert(sum < 1.0e-4); |       if (norm2(normal-simd) > 1.0e-6 ) { | ||||||
|  | 	std::cout << "site "<<x<<","<<y<<","<<z<<","<<t<<","<<s<<" "<<norm2(normal-simd)<<std::endl; | ||||||
|     err=zero; | 	std::cout << "site "<<x<<","<<y<<","<<z<<","<<t<<","<<s<<" normal "<<normal<<std::endl; | ||||||
|     localConvert(sresult,err); | 	std::cout << "site "<<x<<","<<y<<","<<z<<","<<t<<","<<s<<" simd   "<<simd<<std::endl; | ||||||
|     err = err - result; |  | ||||||
|     sum = norm2(err); |  | ||||||
|     std::cout<<GridLogMessage<<" difference between normal result and simd is "<<sum<<std::endl; |  | ||||||
|     if(sum > 1.0e-4 ){ |  | ||||||
|       std::cout<< "sD REF\n " <<result << std::endl; |  | ||||||
|       std::cout<< "sD ERR   \n " << err  <<std::endl; |  | ||||||
|       } |       } | ||||||
|  |     }}}}} | ||||||
|  |     std::cout<<GridLogMessage<<" difference between normal and simd is "<<sum<<std::endl; | ||||||
|     assert (sum< 1.0e-4 ); |     assert (sum< 1.0e-4 ); | ||||||
|  |  | ||||||
|  |  | ||||||
|     if (1) { |     if (1) { | ||||||
|       std::cout << GridLogMessage<< "*********************************************************" <<std::endl; |  | ||||||
|       std::cout << GridLogMessage<< "* Benchmarking WilsonFermion5D<DomainWallVec5dImplR>::DhopEO "<<std::endl; |  | ||||||
|       std::cout << GridLogMessage<< "* Vectorising fifth dimension by "<<vComplex::Nsimd()<<std::endl; |  | ||||||
|       if ( sizeof(Real)==4 )   std::cout << GridLogMessage<< "* SINGLE precision "<<std::endl; |  | ||||||
|       if ( sizeof(Real)==8 )   std::cout << GridLogMessage<< "* DOUBLE precision "<<std::endl; |  | ||||||
|       if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptGeneric   )  |  | ||||||
| 	std::cout << GridLogMessage<< "* Using GENERIC Nc WilsonKernels" <<std::endl; |  | ||||||
|       if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptHandUnroll)  |  | ||||||
| 	std::cout << GridLogMessage<< "* Using Nc=3       WilsonKernels" <<std::endl; |  | ||||||
|       if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptInlineAsm )  |  | ||||||
| 	std::cout << GridLogMessage<< "* Using Asm Nc=3   WilsonKernels" <<std::endl; |  | ||||||
|       std::cout << GridLogMessage<< "*********************************************************" <<std::endl; |  | ||||||
|  |  | ||||||
|       LatticeFermion sr_eo(sFGrid); |       LatticeFermion sr_eo(sFGrid); | ||||||
|  |  | ||||||
|       LatticeFermion ssrc_e (sFrbGrid); |       LatticeFermion ssrc_e (sFrbGrid); | ||||||
|       LatticeFermion ssrc_o (sFrbGrid); |       LatticeFermion ssrc_o (sFrbGrid); | ||||||
|       LatticeFermion sr_e   (sFrbGrid); |       LatticeFermion sr_e   (sFrbGrid); | ||||||
| @@ -293,23 +257,33 @@ int main (int argc, char ** argv) | |||||||
|  |  | ||||||
|       pickCheckerboard(Even,ssrc_e,ssrc); |       pickCheckerboard(Even,ssrc_e,ssrc); | ||||||
|       pickCheckerboard(Odd,ssrc_o,ssrc); |       pickCheckerboard(Odd,ssrc_o,ssrc); | ||||||
|       //      setCheckerboard(sr_eo,ssrc_o); |  | ||||||
|       //      setCheckerboard(sr_eo,ssrc_e); |       setCheckerboard(sr_eo,ssrc_o); | ||||||
|  |       setCheckerboard(sr_eo,ssrc_e); | ||||||
|  |  | ||||||
|       sr_e = zero; |       sr_e = zero; | ||||||
|       sr_o = zero; |       sr_o = zero; | ||||||
|  |  | ||||||
|  |       std::cout << GridLogMessage<< "*********************************************************" <<std::endl; | ||||||
|  |       std::cout << GridLogMessage<< "* Benchmarking WilsonFermion5D<DomainWallVec5dImplR>::DhopEO "<<std::endl; | ||||||
|  |       std::cout << GridLogMessage<< "* Vectorising fifth dimension by "<<vComplex::Nsimd()<<std::endl; | ||||||
|  |       if ( sizeof(Real)==4 )   std::cout << GridLogMessage<< "* SINGLE precision "<<std::endl; | ||||||
|  |       if ( sizeof(Real)==8 )   std::cout << GridLogMessage<< "* DOUBLE precision "<<std::endl; | ||||||
|  |       if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptGeneric   ) std::cout << GridLogMessage<< "* Using GENERIC Nc WilsonKernels" <<std::endl; | ||||||
|  |       if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptHandUnroll) std::cout << GridLogMessage<< "* Using Nc=3       WilsonKernels" <<std::endl; | ||||||
|  |       if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptInlineAsm ) std::cout << GridLogMessage<< "* Using Asm Nc=3   WilsonKernels" <<std::endl; | ||||||
|  |       std::cout << GridLogMessage<< "*********************************************************" <<std::endl; | ||||||
|  |  | ||||||
|       FGrid->Barrier(); |       FGrid->Barrier(); | ||||||
|       sDw.DhopEO(ssrc_o, sr_e, DaggerNo); |  | ||||||
|       sDw.ZeroCounters(); |       sDw.ZeroCounters(); | ||||||
|       //      sDw.stat.init("DhopEO"); |       sDw.stat.init("DhopEO"); | ||||||
|       double t0=usecond(); |       double t0=usecond(); | ||||||
|       for (int i = 0; i < ncall; i++) { |       for (int i = 0; i < ncall; i++) { | ||||||
|         sDw.DhopEO(ssrc_o, sr_e, DaggerNo); |         sDw.DhopEO(ssrc_o, sr_e, DaggerNo); | ||||||
|       } |       } | ||||||
|       double t1=usecond(); |       double t1=usecond(); | ||||||
|       FGrid->Barrier(); |       FGrid->Barrier(); | ||||||
|       //      sDw.stat.print(); |       sDw.stat.print(); | ||||||
|  |  | ||||||
|       double volume=Ls;  for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu]; |       double volume=Ls;  for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu]; | ||||||
|       double flops=(1344.0*volume*ncall)/2; |       double flops=(1344.0*volume*ncall)/2; | ||||||
| @@ -324,26 +298,22 @@ int main (int argc, char ** argv) | |||||||
|  |  | ||||||
|       pickCheckerboard(Even,ssrc_e,sresult); |       pickCheckerboard(Even,ssrc_e,sresult); | ||||||
|       pickCheckerboard(Odd ,ssrc_o,sresult); |       pickCheckerboard(Odd ,ssrc_o,sresult); | ||||||
|  |  | ||||||
|       ssrc_e = ssrc_e - sr_e; |       ssrc_e = ssrc_e - sr_e; | ||||||
|       RealD error = norm2(ssrc_e); |       RealD error = norm2(ssrc_e); | ||||||
|       std::cout<<GridLogMessage << "sE norm diff   "<< norm2(ssrc_e)<< "  vec nrm"<<norm2(sr_e) <<std::endl; |  | ||||||
|  |  | ||||||
|  |       std::cout<<GridLogMessage << "sE norm diff   "<< norm2(ssrc_e)<< "  vec nrm"<<norm2(sr_e) <<std::endl; | ||||||
|       ssrc_o = ssrc_o - sr_o; |       ssrc_o = ssrc_o - sr_o; | ||||||
|  |  | ||||||
|       error+= norm2(ssrc_o); |       error+= norm2(ssrc_o); | ||||||
|       std::cout<<GridLogMessage << "sO norm diff   "<< norm2(ssrc_o)<< "  vec nrm"<<norm2(sr_o) <<std::endl; |       std::cout<<GridLogMessage << "sO norm diff   "<< norm2(ssrc_o)<< "  vec nrm"<<norm2(sr_o) <<std::endl; | ||||||
|  |       if(error>1.0e-4) {  | ||||||
|       if(( error>1.0e-4) ) {  |  | ||||||
| 	setCheckerboard(ssrc,ssrc_o); | 	setCheckerboard(ssrc,ssrc_o); | ||||||
| 	setCheckerboard(ssrc,ssrc_e); | 	setCheckerboard(ssrc,ssrc_e); | ||||||
| 	std::cout<< "DIFF\n " <<ssrc << std::endl; | 	std::cout<< ssrc << std::endl; | ||||||
| 	setCheckerboard(ssrc,sr_o); |  | ||||||
| 	setCheckerboard(ssrc,sr_e); |  | ||||||
| 	std::cout<< "CBRESULT\n " <<ssrc << std::endl; |  | ||||||
| 	std::cout<< "RESULT\n " <<sresult<< std::endl; |  | ||||||
|       } |       } | ||||||
|       assert(error<1.0e-4); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   if (1) |   if (1) | ||||||
| @@ -351,7 +321,7 @@ int main (int argc, char ** argv) | |||||||
|     ref = zero; |     ref = zero; | ||||||
|     for(int mu=0;mu<Nd;mu++){ |     for(int mu=0;mu<Nd;mu++){ | ||||||
|  |  | ||||||
|       //    ref =  src - Gamma(Gamma::Algebra::GammaX)* src ; // 1+gamma_x |       //    ref =  src - Gamma(Gamma::GammaX)* src ; // 1+gamma_x | ||||||
|       tmp = U[mu]*Cshift(src,mu+1,1); |       tmp = U[mu]*Cshift(src,mu+1,1); | ||||||
|       for(int i=0;i<ref._odata.size();i++){ |       for(int i=0;i<ref._odata.size();i++){ | ||||||
|   ref._odata[i]+= tmp._odata[i] + Gamma(Gmu[mu])*tmp._odata[i]; ; |   ref._odata[i]+= tmp._odata[i] + Gamma(Gmu[mu])*tmp._odata[i]; ; | ||||||
| @@ -365,19 +335,14 @@ int main (int argc, char ** argv) | |||||||
|     } |     } | ||||||
|     ref = -0.5*ref; |     ref = -0.5*ref; | ||||||
|   } |   } | ||||||
|   //  dump=1; |  | ||||||
|   Dw.Dhop(src,result,1); |   Dw.Dhop(src,result,1); | ||||||
|   std::cout << GridLogMessage << "Compare to naive wilson implementation Dag to verify correctness" << std::endl; |   std::cout << GridLogMessage << "Compare to naive wilson implementation Dag to verify correctness" << std::endl; | ||||||
|   std::cout<<GridLogMessage << "Called DwDag"<<std::endl; |   std::cout<<GridLogMessage << "Called DwDag"<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "norm dag result "<< norm2(result)<<std::endl; |   std::cout<<GridLogMessage << "norm result "<< norm2(result)<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "norm dag ref    "<< norm2(ref)<<std::endl; |   std::cout<<GridLogMessage << "norm ref    "<< norm2(ref)<<std::endl; | ||||||
|   err = ref-result;  |   err = ref-result;  | ||||||
|   std::cout<<GridLogMessage << "norm dag diff   "<< norm2(err)<<std::endl; |   std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<<std::endl; | ||||||
|   if((norm2(err)>1.0e-4)){ |   assert(norm2(err)<1.0e-4); | ||||||
| 	std::cout<< "DAG RESULT\n "  <<ref     << std::endl; |  | ||||||
| 	std::cout<< "DAG sRESULT\n " <<result  << std::endl; |  | ||||||
| 	std::cout<< "DAG ERR   \n "  << err    <<std::endl; |  | ||||||
|   } |  | ||||||
|   LatticeFermion src_e (FrbGrid); |   LatticeFermion src_e (FrbGrid); | ||||||
|   LatticeFermion src_o (FrbGrid); |   LatticeFermion src_o (FrbGrid); | ||||||
|   LatticeFermion r_e   (FrbGrid); |   LatticeFermion r_e   (FrbGrid); | ||||||
| @@ -385,18 +350,13 @@ int main (int argc, char ** argv) | |||||||
|   LatticeFermion r_eo  (FGrid); |   LatticeFermion r_eo  (FGrid); | ||||||
|  |  | ||||||
|  |  | ||||||
|   std::cout<<GridLogMessage << "Calling Deo and Doe and //assert Deo+Doe == Dunprec"<<std::endl; |   std::cout<<GridLogMessage << "Calling Deo and Doe and assert Deo+Doe == Dunprec"<<std::endl; | ||||||
|   pickCheckerboard(Even,src_e,src); |   pickCheckerboard(Even,src_e,src); | ||||||
|   pickCheckerboard(Odd,src_o,src); |   pickCheckerboard(Odd,src_o,src); | ||||||
|  |  | ||||||
|   std::cout<<GridLogMessage << "src_e"<<norm2(src_e)<<std::endl; |   std::cout<<GridLogMessage << "src_e"<<norm2(src_e)<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "src_o"<<norm2(src_o)<<std::endl; |   std::cout<<GridLogMessage << "src_o"<<norm2(src_o)<<std::endl; | ||||||
|  |  | ||||||
|  |  | ||||||
|   // S-direction is INNERMOST and takes no part in the parity. |  | ||||||
|   static int Opt;  // these are a temporary hack |  | ||||||
|   static int Comms;  // these are a temporary hack |  | ||||||
|  |  | ||||||
|   std::cout << GridLogMessage<< "*********************************************************" <<std::endl; |   std::cout << GridLogMessage<< "*********************************************************" <<std::endl; | ||||||
|   std::cout << GridLogMessage<< "* Benchmarking DomainWallFermionR::DhopEO                "<<std::endl; |   std::cout << GridLogMessage<< "* Benchmarking DomainWallFermionR::DhopEO                "<<std::endl; | ||||||
|   std::cout << GridLogMessage<< "* Vectorising space-time by "<<vComplex::Nsimd()<<std::endl; |   std::cout << GridLogMessage<< "* Vectorising space-time by "<<vComplex::Nsimd()<<std::endl; | ||||||
| @@ -409,7 +369,6 @@ int main (int argc, char ** argv) | |||||||
|   { |   { | ||||||
|     Dw.ZeroCounters(); |     Dw.ZeroCounters(); | ||||||
|     FGrid->Barrier(); |     FGrid->Barrier(); | ||||||
|     Dw.DhopEO(src_o,r_e,DaggerNo); |  | ||||||
|     double t0=usecond(); |     double t0=usecond(); | ||||||
|     for(int i=0;i<ncall;i++){ |     for(int i=0;i<ncall;i++){ | ||||||
|       Dw.DhopEO(src_o,r_e,DaggerNo); |       Dw.DhopEO(src_o,r_e,DaggerNo); | ||||||
| @@ -437,19 +396,14 @@ int main (int argc, char ** argv) | |||||||
|  |  | ||||||
|   err = r_eo-result;  |   err = r_eo-result;  | ||||||
|   std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<<std::endl; |   std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<<std::endl; | ||||||
|   if((norm2(err)>1.0e-4)){ |   assert(norm2(err)<1.0e-4); | ||||||
| 	std::cout<< "Deo RESULT\n " <<r_eo << std::endl; |  | ||||||
| 	std::cout<< "Deo REF\n " <<result  << std::endl; |  | ||||||
| 	std::cout<< "Deo ERR   \n " << err <<std::endl; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   pickCheckerboard(Even,src_e,err); |   pickCheckerboard(Even,src_e,err); | ||||||
|   pickCheckerboard(Odd,src_o,err); |   pickCheckerboard(Odd,src_o,err); | ||||||
|   std::cout<<GridLogMessage << "norm diff even  "<< norm2(src_e)<<std::endl; |   std::cout<<GridLogMessage << "norm diff even  "<< norm2(src_e)<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "norm diff odd   "<< norm2(src_o)<<std::endl; |   std::cout<<GridLogMessage << "norm diff odd   "<< norm2(src_o)<<std::endl; | ||||||
|  |   assert(norm2(src_e)<1.0e-4); | ||||||
|   //assert(norm2(src_e)<1.0e-4); |   assert(norm2(src_o)<1.0e-4); | ||||||
|   //assert(norm2(src_o)<1.0e-4); |  | ||||||
|  |  | ||||||
|   Grid_finalize(); |   Grid_finalize(); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -37,11 +37,11 @@ struct scal { | |||||||
|   d internal; |   d internal; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   Gamma::Algebra Gmu [] = { |   Gamma::GammaMatrix Gmu [] = { | ||||||
|     Gamma::Algebra::GammaX, |     Gamma::GammaX, | ||||||
|     Gamma::Algebra::GammaY, |     Gamma::GammaY, | ||||||
|     Gamma::Algebra::GammaZ, |     Gamma::GammaZ, | ||||||
|     Gamma::Algebra::GammaT |     Gamma::GammaT | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
| void benchDw(std::vector<int> & L, int Ls, int threads, int report =0 ); | void benchDw(std::vector<int> & L, int Ls, int threads, int report =0 ); | ||||||
|   | |||||||
| @@ -66,8 +66,7 @@ int main (int argc, char ** argv) | |||||||
|  |  | ||||||
|     Vec tsum; tsum = zero; |     Vec tsum; tsum = zero; | ||||||
|  |  | ||||||
|     GridParallelRNG          pRNG(&Grid);       |     GridParallelRNG          pRNG(&Grid);      pRNG.SeedRandomDevice(); | ||||||
|     pRNG.SeedFixedIntegers(std::vector<int>({56,17,89,101})); |  | ||||||
|  |  | ||||||
|     std::vector<double> stop(threads); |     std::vector<double> stop(threads); | ||||||
|     Vector<Vec> sum(threads); |     Vector<Vec> sum(threads); | ||||||
| @@ -78,7 +77,8 @@ int main (int argc, char ** argv) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     double start=usecond(); |     double start=usecond(); | ||||||
|     parallel_for(int t=0;t<threads;t++){ | PARALLEL_FOR_LOOP | ||||||
|  |     for(int t=0;t<threads;t++){ | ||||||
|  |  | ||||||
|       sum[t] = x[t]._odata[0]; |       sum[t] = x[t]._odata[0]; | ||||||
|       for(int i=0;i<Nloop;i++){ |       for(int i=0;i<Nloop;i++){ | ||||||
|   | |||||||
| @@ -65,7 +65,7 @@ int main (int argc, char ** argv) | |||||||
|  |  | ||||||
|       uint64_t Nloop=NLOOP; |       uint64_t Nloop=NLOOP; | ||||||
|  |  | ||||||
|       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}); |       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedRandomDevice(); | ||||||
|  |  | ||||||
|       LatticeVec z(&Grid); //random(pRNG,z); |       LatticeVec z(&Grid); //random(pRNG,z); | ||||||
|       LatticeVec x(&Grid); //random(pRNG,x); |       LatticeVec x(&Grid); //random(pRNG,x); | ||||||
| @@ -100,7 +100,7 @@ int main (int argc, char ** argv) | |||||||
|       int vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; |       int vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; | ||||||
|       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); |       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|  |  | ||||||
|       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}); |       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedRandomDevice(); | ||||||
|  |  | ||||||
|       LatticeVec z(&Grid); //random(pRNG,z); |       LatticeVec z(&Grid); //random(pRNG,z); | ||||||
|       LatticeVec x(&Grid); //random(pRNG,x); |       LatticeVec x(&Grid); //random(pRNG,x); | ||||||
| @@ -138,7 +138,7 @@ int main (int argc, char ** argv) | |||||||
|  |  | ||||||
|       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); |       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|  |  | ||||||
|       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}); |       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedRandomDevice(); | ||||||
|  |  | ||||||
|       LatticeVec z(&Grid); //random(pRNG,z); |       LatticeVec z(&Grid); //random(pRNG,z); | ||||||
|       LatticeVec x(&Grid); //random(pRNG,x); |       LatticeVec x(&Grid); //random(pRNG,x); | ||||||
| @@ -173,7 +173,7 @@ int main (int argc, char ** argv) | |||||||
|       uint64_t Nloop=NLOOP; |       uint64_t Nloop=NLOOP; | ||||||
|       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); |       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|  |  | ||||||
|       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}); |       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedRandomDevice(); | ||||||
|       LatticeVec z(&Grid); //random(pRNG,z); |       LatticeVec z(&Grid); //random(pRNG,z); | ||||||
|       LatticeVec x(&Grid); //random(pRNG,x); |       LatticeVec x(&Grid); //random(pRNG,x); | ||||||
|       LatticeVec y(&Grid); //random(pRNG,y); |       LatticeVec y(&Grid); //random(pRNG,y); | ||||||
|   | |||||||
| @@ -113,36 +113,6 @@ int main (int argc, char ** argv) | |||||||
|     std::cout<<GridLogMessage << "Called " #A " "<< (t1-t0)/ncall<<" us"<<std::endl;\ |     std::cout<<GridLogMessage << "Called " #A " "<< (t1-t0)/ncall<<" us"<<std::endl;\ | ||||||
|     std::cout<<GridLogMessage << "******************"<<std::endl; |     std::cout<<GridLogMessage << "******************"<<std::endl; | ||||||
|  |  | ||||||
| #define BENCH_ZDW(A,in,out)			\ |  | ||||||
|     zDw.CayleyZeroCounters();			\ |  | ||||||
|     zDw. A (in,out);				\ |  | ||||||
|     FGrid->Barrier();				\ |  | ||||||
|     t0=usecond();				\ |  | ||||||
|     for(int i=0;i<ncall;i++){			\ |  | ||||||
|       zDw. A (in,out);				\ |  | ||||||
|     }						\ |  | ||||||
|     t1=usecond();				\ |  | ||||||
|     FGrid->Barrier();				\ |  | ||||||
|     zDw.CayleyReport();							\ |  | ||||||
|     std::cout<<GridLogMessage << "Called ZDw " #A " "<< (t1-t0)/ncall<<" us"<<std::endl;\ |  | ||||||
|     std::cout<<GridLogMessage << "******************"<<std::endl; |  | ||||||
|  |  | ||||||
| #define BENCH_DW_SSC(A,in,out)			\ |  | ||||||
|     Dw.CayleyZeroCounters();			\ |  | ||||||
|     Dw. A (in,out);				\ |  | ||||||
|     FGrid->Barrier();				\ |  | ||||||
|     t0=usecond();				\ |  | ||||||
|     for(int i=0;i<ncall;i++){			\ |  | ||||||
|       __SSC_START ;				\ |  | ||||||
|       Dw. A (in,out);				\ |  | ||||||
|       __SSC_STOP ;				\ |  | ||||||
|     }						\ |  | ||||||
|     t1=usecond();				\ |  | ||||||
|     FGrid->Barrier();				\ |  | ||||||
|     Dw.CayleyReport();					\ |  | ||||||
|     std::cout<<GridLogMessage << "Called " #A " "<< (t1-t0)/ncall<<" us"<<std::endl;\ |  | ||||||
|     std::cout<<GridLogMessage << "******************"<<std::endl; |  | ||||||
|  |  | ||||||
| #define BENCH_DW_MEO(A,in,out)			\ | #define BENCH_DW_MEO(A,in,out)			\ | ||||||
|     Dw.CayleyZeroCounters();			\ |     Dw.CayleyZeroCounters();			\ | ||||||
|     Dw. A (in,out,0);				\ |     Dw. A (in,out,0);				\ | ||||||
| @@ -178,15 +148,9 @@ int main (int argc, char ** argv) | |||||||
|     LatticeFermion sref(sFGrid); |     LatticeFermion sref(sFGrid); | ||||||
|     LatticeFermion result(sFGrid); |     LatticeFermion result(sFGrid); | ||||||
|  |  | ||||||
|  |  | ||||||
|     std::cout<<GridLogMessage << "Constructing Vec5D Dw "<<std::endl; |     std::cout<<GridLogMessage << "Constructing Vec5D Dw "<<std::endl; | ||||||
|     DomainWallFermionVec5dR Dw(Umu,*sFGrid,*sFrbGrid,*sUGrid,*sUrbGrid,mass,M5); |     DomainWallFermionVec5dR Dw(Umu,*sFGrid,*sFrbGrid,*sUGrid,*sUrbGrid,mass,M5); | ||||||
|  |  | ||||||
|     RealD b=1.5;// Scale factor b+c=2, b-c=1 |  | ||||||
|     RealD c=0.5; |  | ||||||
|     std::vector<ComplexD> gamma(Ls,std::complex<double>(1.0,0.0)); |  | ||||||
|     ZMobiusFermionVec5dR zDw(Umu,*sFGrid,*sFrbGrid,*sUGrid,*sUrbGrid,mass,M5,gamma,b,c); |  | ||||||
|  |  | ||||||
|     std::cout<<GridLogMessage << "Calling Dhop "<<std::endl; |     std::cout<<GridLogMessage << "Calling Dhop "<<std::endl; | ||||||
|     FGrid->Barrier(); |     FGrid->Barrier(); | ||||||
|  |  | ||||||
| @@ -209,13 +173,10 @@ int main (int argc, char ** argv) | |||||||
|  |  | ||||||
|     BENCH_DW_MEO(Dhop    ,src,result); |     BENCH_DW_MEO(Dhop    ,src,result); | ||||||
|     BENCH_DW_MEO(DhopEO  ,src_o,r_e); |     BENCH_DW_MEO(DhopEO  ,src_o,r_e); | ||||||
|     BENCH_DW_SSC(Meooe   ,src_o,r_e); |     BENCH_DW(Meooe   ,src_o,r_e); | ||||||
|     BENCH_DW(Mooee   ,src_o,r_o); |     BENCH_DW(Mooee   ,src_o,r_o); | ||||||
|     BENCH_DW(MooeeInv,src_o,r_o); |     BENCH_DW(MooeeInv,src_o,r_o); | ||||||
|  |  | ||||||
|     BENCH_ZDW(Mooee   ,src_o,r_o); |  | ||||||
|     BENCH_ZDW(MooeeInv,src_o,r_o); |  | ||||||
|  |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   Grid_finalize(); |   Grid_finalize(); | ||||||
|   | |||||||
| @@ -1,134 +0,0 @@ | |||||||
|     /************************************************************************************* |  | ||||||
|  |  | ||||||
|     Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
|     Source file: ./benchmarks/Benchmark_staggered.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;  |  | ||||||
|   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; |  | ||||||
|   LatticeGaugeField Umu(&Grid); random(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) |  | ||||||
| #if 0 |  | ||||||
|   Umu=zero; |  | ||||||
|   Complex cone(1.0,0.0); |  | ||||||
|   for(int nn=0;nn<Nd;nn++){ |  | ||||||
|     random(pRNG,U[nn]); |  | ||||||
|     if(1) { |  | ||||||
|       if (nn!=2) { U[nn]=zero; std::cout<<GridLogMessage << "zeroing gauge field in dir "<<nn<<std::endl; } |  | ||||||
|       //      else       { U[nn]= cone;std::cout<<GridLogMessage << "unit gauge field in dir "<<nn<<std::endl; } |  | ||||||
|       else       { std::cout<<GridLogMessage << "random gauge field in dir "<<nn<<std::endl; } |  | ||||||
|     } |  | ||||||
|     PokeIndex<LorentzIndex>(Umu,U[nn],nn); |  | ||||||
|   } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|   for(int mu=0;mu<Nd;mu++){ |  | ||||||
|     U[mu] = PeekIndex<LorentzIndex>(Umu,mu); |  | ||||||
|   } |  | ||||||
|   ref = zero; |  | ||||||
|   /*   |  | ||||||
|   { // Naive wilson implementation |  | ||||||
|     ref = zero; |  | ||||||
|     for(int mu=0;mu<Nd;mu++){ |  | ||||||
|       //    ref =  src + Gamma(Gamma::GammaX)* src ; // 1-gamma_x |  | ||||||
|       tmp = U[mu]*Cshift(src,mu,1); |  | ||||||
|       for(int i=0;i<ref._odata.size();i++){ |  | ||||||
| 	ref._odata[i]+= tmp._odata[i] - Gamma(Gmu[mu])*tmp._odata[i]; ; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       tmp =adj(U[mu])*src; |  | ||||||
|       tmp =Cshift(tmp,mu,-1); |  | ||||||
|       for(int i=0;i<ref._odata.size();i++){ |  | ||||||
| 	ref._odata[i]+= tmp._odata[i] + Gamma(Gmu[mu])*tmp._odata[i]; ; |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   ref = -0.5*ref; |  | ||||||
|   */ |  | ||||||
|  |  | ||||||
|   RealD mass=0.1; |  | ||||||
|   RealD c1=9.0/8.0; |  | ||||||
|   RealD c2=-1.0/24.0; |  | ||||||
|   RealD u0=1.0; |  | ||||||
|   ImprovedStaggeredFermionR Ds(Umu,Umu,Grid,RBGrid,mass,c1,c2,u0,params); |  | ||||||
|    |  | ||||||
|   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 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; |  | ||||||
|  |  | ||||||
|   Grid_finalize(); |  | ||||||
| } |  | ||||||
| @@ -55,7 +55,7 @@ int main (int argc, char ** argv) | |||||||
|       std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); |       std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); | ||||||
|       int vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; |       int vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; | ||||||
|       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); |       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}); |       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedRandomDevice(); | ||||||
|  |  | ||||||
|       LatticeColourMatrix z(&Grid);// random(pRNG,z); |       LatticeColourMatrix z(&Grid);// random(pRNG,z); | ||||||
|       LatticeColourMatrix x(&Grid);// random(pRNG,x); |       LatticeColourMatrix x(&Grid);// random(pRNG,x); | ||||||
| @@ -88,7 +88,7 @@ int main (int argc, char ** argv) | |||||||
|       int vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; |       int vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; | ||||||
|  |  | ||||||
|       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); |       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}); |       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedRandomDevice(); | ||||||
|  |  | ||||||
|       LatticeColourMatrix z(&Grid); //random(pRNG,z); |       LatticeColourMatrix z(&Grid); //random(pRNG,z); | ||||||
|       LatticeColourMatrix x(&Grid); //random(pRNG,x); |       LatticeColourMatrix x(&Grid); //random(pRNG,x); | ||||||
| @@ -119,7 +119,7 @@ int main (int argc, char ** argv) | |||||||
|       int vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; |       int vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; | ||||||
|  |  | ||||||
|       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); |       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}); |       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedRandomDevice(); | ||||||
|  |  | ||||||
|       LatticeColourMatrix z(&Grid); //random(pRNG,z); |       LatticeColourMatrix z(&Grid); //random(pRNG,z); | ||||||
|       LatticeColourMatrix x(&Grid); //random(pRNG,x); |       LatticeColourMatrix x(&Grid); //random(pRNG,x); | ||||||
| @@ -150,7 +150,7 @@ int main (int argc, char ** argv) | |||||||
|       int vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; |       int vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; | ||||||
|  |  | ||||||
|       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); |       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}); |       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedRandomDevice(); | ||||||
|  |  | ||||||
|       LatticeColourMatrix z(&Grid); //random(pRNG,z); |       LatticeColourMatrix z(&Grid); //random(pRNG,z); | ||||||
|       LatticeColourMatrix x(&Grid); //random(pRNG,x); |       LatticeColourMatrix x(&Grid); //random(pRNG,x); | ||||||
|   | |||||||
| @@ -37,11 +37,11 @@ struct scal { | |||||||
|   d internal; |   d internal; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   Gamma::Algebra Gmu [] = { |   Gamma::GammaMatrix Gmu [] = { | ||||||
|     Gamma::Algebra::GammaX, |     Gamma::GammaX, | ||||||
|     Gamma::Algebra::GammaY, |     Gamma::GammaY, | ||||||
|     Gamma::Algebra::GammaZ, |     Gamma::GammaZ, | ||||||
|     Gamma::Algebra::GammaT |     Gamma::GammaT | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
| bool overlapComms = false; | bool overlapComms = false; | ||||||
| @@ -69,7 +69,7 @@ int main (int argc, char ** argv) | |||||||
|   std::vector<int> seeds({1,2,3,4}); |   std::vector<int> seeds({1,2,3,4}); | ||||||
|   GridParallelRNG          pRNG(&Grid); |   GridParallelRNG          pRNG(&Grid); | ||||||
|   pRNG.SeedFixedIntegers(seeds); |   pRNG.SeedFixedIntegers(seeds); | ||||||
|   //  pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}); |   //  pRNG.SeedRandomDevice(); | ||||||
|  |  | ||||||
|   LatticeFermion src   (&Grid); random(pRNG,src); |   LatticeFermion src   (&Grid); random(pRNG,src); | ||||||
|   LatticeFermion result(&Grid); result=zero; |   LatticeFermion result(&Grid); result=zero; | ||||||
| @@ -106,7 +106,7 @@ int main (int argc, char ** argv) | |||||||
|   { // Naive wilson implementation |   { // Naive wilson implementation | ||||||
|     ref = zero; |     ref = zero; | ||||||
|     for(int mu=0;mu<Nd;mu++){ |     for(int mu=0;mu<Nd;mu++){ | ||||||
|       //    ref =  src + Gamma(Gamma::Algebra::GammaX)* src ; // 1-gamma_x |       //    ref =  src + Gamma(Gamma::GammaX)* src ; // 1-gamma_x | ||||||
|       tmp = U[mu]*Cshift(src,mu,1); |       tmp = U[mu]*Cshift(src,mu,1); | ||||||
|       for(int i=0;i<ref._odata.size();i++){ |       for(int i=0;i<ref._odata.size();i++){ | ||||||
| 	ref._odata[i]+= tmp._odata[i] - Gamma(Gmu[mu])*tmp._odata[i]; ; | 	ref._odata[i]+= tmp._odata[i] - Gamma(Gmu[mu])*tmp._odata[i]; ; | ||||||
| @@ -159,7 +159,7 @@ int main (int argc, char ** argv) | |||||||
|     ref = zero; |     ref = zero; | ||||||
|     for(int mu=0;mu<Nd;mu++){ |     for(int mu=0;mu<Nd;mu++){ | ||||||
|  |  | ||||||
|       //    ref =  src - Gamma(Gamma::Algebra::GammaX)* src ; // 1+gamma_x |       //    ref =  src - Gamma(Gamma::GammaX)* src ; // 1+gamma_x | ||||||
|       tmp = U[mu]*Cshift(src,mu,1); |       tmp = U[mu]*Cshift(src,mu,1); | ||||||
|       for(int i=0;i<ref._odata.size();i++){ |       for(int i=0;i<ref._odata.size();i++){ | ||||||
| 	ref._odata[i]+= tmp._odata[i] + Gamma(Gmu[mu])*tmp._odata[i]; ; | 	ref._odata[i]+= tmp._odata[i] + Gamma(Gmu[mu])*tmp._odata[i]; ; | ||||||
|   | |||||||
| @@ -30,11 +30,11 @@ struct scal { | |||||||
|   d internal; |   d internal; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| Gamma::Algebra Gmu [] = { | Gamma::GammaMatrix Gmu [] = { | ||||||
|     Gamma::Algebra::GammaX, |   Gamma::GammaX, | ||||||
|     Gamma::Algebra::GammaY, |   Gamma::GammaY, | ||||||
|     Gamma::Algebra::GammaZ, |   Gamma::GammaZ, | ||||||
|     Gamma::Algebra::GammaT |   Gamma::GammaT | ||||||
| }; | }; | ||||||
|  |  | ||||||
| bool overlapComms = false; | bool overlapComms = false; | ||||||
|   | |||||||
							
								
								
									
										27
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								configure.ac
									
									
									
									
									
								
							| @@ -6,7 +6,7 @@ AC_CANONICAL_TARGET | |||||||
| AM_INIT_AUTOMAKE(subdir-objects) | AM_INIT_AUTOMAKE(subdir-objects) | ||||||
| AC_CONFIG_MACRO_DIR([m4]) | AC_CONFIG_MACRO_DIR([m4]) | ||||||
| AC_CONFIG_SRCDIR([lib/Grid.h]) | AC_CONFIG_SRCDIR([lib/Grid.h]) | ||||||
| AC_CONFIG_HEADERS([lib/Config.h],[sed -i 's|PACKAGE_|GRID_|' lib/Config.h]) | AC_CONFIG_HEADERS([lib/Config.h]) | ||||||
| m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) | m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) | ||||||
|  |  | ||||||
| ############### Checks for programs | ############### Checks for programs | ||||||
| @@ -99,13 +99,6 @@ case ${ac_MKL} in | |||||||
|         AC_DEFINE([USE_MKL], [1], [Define to 1 if you use the Intel MKL]);; |         AC_DEFINE([USE_MKL], [1], [Define to 1 if you use the Intel MKL]);; | ||||||
| esac | esac | ||||||
|  |  | ||||||
| ############### HDF5 |  | ||||||
| AC_ARG_WITH([hdf5], |  | ||||||
|     [AS_HELP_STRING([--with-hdf5=prefix], |  | ||||||
|     [try this for a non-standard install prefix of the HDF5 library])], |  | ||||||
|     [AM_CXXFLAGS="-I$with_hdf5/include $AM_CXXFLAGS"] |  | ||||||
|     [AM_LDFLAGS="-L$with_hdf5/lib $AM_LDFLAGS"]) |  | ||||||
|  |  | ||||||
| ############### first-touch | ############### first-touch | ||||||
| AC_ARG_ENABLE([numa], | AC_ARG_ENABLE([numa], | ||||||
|     [AC_HELP_STRING([--enable-numa=yes|no|prefix], [enable first touch numa opt])],  |     [AC_HELP_STRING([--enable-numa=yes|no|prefix], [enable first touch numa opt])],  | ||||||
| @@ -152,12 +145,6 @@ AC_SEARCH_LIBS([fftw_execute], [fftw3], | |||||||
|                [AC_DEFINE([HAVE_FFTW], [1], [Define to 1 if you have the `FFTW' library])] |                [AC_DEFINE([HAVE_FFTW], [1], [Define to 1 if you have the `FFTW' library])] | ||||||
|                [have_fftw=true]) |                [have_fftw=true]) | ||||||
|  |  | ||||||
| AC_SEARCH_LIBS([H5Fopen], [hdf5_cpp], |  | ||||||
|                [AC_DEFINE([HAVE_HDF5], [1], [Define to 1 if you have the `HDF5' library])] |  | ||||||
|                [have_hdf5=true] |  | ||||||
|                [LIBS="${LIBS} -lhdf5"], [], [-lhdf5]) |  | ||||||
| AM_CONDITIONAL(BUILD_HDF5, [ test "${have_hdf5}X" == "trueX" ]) |  | ||||||
|  |  | ||||||
| CXXFLAGS=$CXXFLAGS_CPY | CXXFLAGS=$CXXFLAGS_CPY | ||||||
| LDFLAGS=$LDFLAGS_CPY | LDFLAGS=$LDFLAGS_CPY | ||||||
|  |  | ||||||
| @@ -319,9 +306,9 @@ AM_CONDITIONAL(BUILD_COMMS_MPI3L, [ test "${comms_type}X" == "mpi3lX" ] ) | |||||||
| AM_CONDITIONAL(BUILD_COMMS_NONE,  [ test "${comms_type}X" == "noneX" ]) | AM_CONDITIONAL(BUILD_COMMS_NONE,  [ test "${comms_type}X" == "noneX" ]) | ||||||
|  |  | ||||||
| ############### RNG selection | ############### RNG selection | ||||||
| AC_ARG_ENABLE([rng],[AC_HELP_STRING([--enable-rng=ranlux48|mt19937|sitmo],\ | AC_ARG_ENABLE([rng],[AC_HELP_STRING([--enable-rng=ranlux48|mt19937],\ | ||||||
| 	            [Select Random Number Generator to be used])],\ | 	            [Select Random Number Generator to be used])],\ | ||||||
| 	            [ac_RNG=${enable_rng}],[ac_RNG=sitmo]) | 	            [ac_RNG=${enable_rng}],[ac_RNG=ranlux48]) | ||||||
|  |  | ||||||
| case ${ac_RNG} in | case ${ac_RNG} in | ||||||
|      ranlux48) |      ranlux48) | ||||||
| @@ -330,9 +317,6 @@ case ${ac_RNG} in | |||||||
|      mt19937) |      mt19937) | ||||||
|       AC_DEFINE([RNG_MT19937],[1],[RNG_MT19937] ) |       AC_DEFINE([RNG_MT19937],[1],[RNG_MT19937] ) | ||||||
|      ;; |      ;; | ||||||
|      sitmo) |  | ||||||
|       AC_DEFINE([RNG_SITMO],[1],[RNG_SITMO] ) |  | ||||||
|      ;; |  | ||||||
|      *) |      *) | ||||||
|       AC_MSG_ERROR([${ac_RNG} unsupported --enable-rng option]);  |       AC_MSG_ERROR([${ac_RNG} unsupported --enable-rng option]);  | ||||||
|      ;; |      ;; | ||||||
| @@ -397,14 +381,10 @@ AC_CONFIG_FILES(tests/IO/Makefile) | |||||||
| AC_CONFIG_FILES(tests/core/Makefile) | AC_CONFIG_FILES(tests/core/Makefile) | ||||||
| AC_CONFIG_FILES(tests/debug/Makefile) | AC_CONFIG_FILES(tests/debug/Makefile) | ||||||
| AC_CONFIG_FILES(tests/forces/Makefile) | AC_CONFIG_FILES(tests/forces/Makefile) | ||||||
| AC_CONFIG_FILES(tests/hadrons/Makefile) |  | ||||||
| AC_CONFIG_FILES(tests/hmc/Makefile) | AC_CONFIG_FILES(tests/hmc/Makefile) | ||||||
| AC_CONFIG_FILES(tests/solver/Makefile) | AC_CONFIG_FILES(tests/solver/Makefile) | ||||||
| AC_CONFIG_FILES(tests/qdpxx/Makefile) | AC_CONFIG_FILES(tests/qdpxx/Makefile) | ||||||
| AC_CONFIG_FILES(tests/testu01/Makefile) |  | ||||||
| AC_CONFIG_FILES(benchmarks/Makefile) | AC_CONFIG_FILES(benchmarks/Makefile) | ||||||
| AC_CONFIG_FILES(extras/Makefile) |  | ||||||
| AC_CONFIG_FILES(extras/Hadrons/Makefile) |  | ||||||
| AC_OUTPUT | AC_OUTPUT | ||||||
|  |  | ||||||
| echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| @@ -427,7 +407,6 @@ RNG choice                  : ${ac_RNG} | |||||||
| GMP                         : `if test "x$have_gmp" = xtrue; then echo yes; else echo no; fi` | GMP                         : `if test "x$have_gmp" = xtrue; then echo yes; else echo no; fi` | ||||||
| LAPACK                      : ${ac_LAPACK} | LAPACK                      : ${ac_LAPACK} | ||||||
| FFTW                        : `if test "x$have_fftw" = xtrue; then echo yes; else echo no; fi` | FFTW                        : `if test "x$have_fftw" = xtrue; then echo yes; else echo no; fi` | ||||||
| HDF5                        : `if test "x$have_hdf5" = xtrue; then echo yes; else echo no; fi` |  | ||||||
| build DOXYGEN documentation : `if test "$DX_FLAG_doc" = '1'; then echo yes; else echo no; fi` | build DOXYGEN documentation : `if test "$DX_FLAG_doc" = '1'; then echo yes; else echo no; fi` | ||||||
| ----- BUILD FLAGS ------------------------------------- | ----- BUILD FLAGS ------------------------------------- | ||||||
| CXXFLAGS: | CXXFLAGS: | ||||||
|   | |||||||
| @@ -1,317 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Application.cc |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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/Hadrons/Application.hpp> |  | ||||||
| #include <Grid/Hadrons/GeneticScheduler.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace QCD; |  | ||||||
| using namespace Hadrons; |  | ||||||
|  |  | ||||||
| #define BIG_SEP "===============" |  | ||||||
| #define SEP     "---------------" |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                       Application implementation                           * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructors //////////////////////////////////////////////////////////////// |  | ||||||
| Application::Application(void) |  | ||||||
| { |  | ||||||
|     LOG(Message) << "Modules available:" << std::endl; |  | ||||||
|     auto list = ModuleFactory::getInstance().getBuilderList(); |  | ||||||
|     for (auto &m: list) |  | ||||||
|     { |  | ||||||
|         LOG(Message) << "  " << m << std::endl; |  | ||||||
|     } |  | ||||||
|     auto dim = GridDefaultLatt(), mpi = GridDefaultMpi(), loc(dim); |  | ||||||
|     locVol_ = 1; |  | ||||||
|     for (unsigned int d = 0; d < dim.size(); ++d) |  | ||||||
|     { |  | ||||||
|         loc[d]  /= mpi[d]; |  | ||||||
|         locVol_ *= loc[d]; |  | ||||||
|     } |  | ||||||
|     LOG(Message) << "Global lattice: " << dim << std::endl; |  | ||||||
|     LOG(Message) << "MPI partition : " << mpi << std::endl; |  | ||||||
|     LOG(Message) << "Local lattice : " << loc << std::endl; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| Application::Application(const Application::GlobalPar &par) |  | ||||||
| : Application() |  | ||||||
| { |  | ||||||
|     setPar(par); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| Application::Application(const std::string parameterFileName) |  | ||||||
| : Application() |  | ||||||
| { |  | ||||||
|     parameterFileName_ = parameterFileName; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // environment shortcut //////////////////////////////////////////////////////// |  | ||||||
| Environment & Application::env(void) const |  | ||||||
| { |  | ||||||
|     return Environment::getInstance(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // access ////////////////////////////////////////////////////////////////////// |  | ||||||
| void Application::setPar(const Application::GlobalPar &par) |  | ||||||
| { |  | ||||||
|     par_ = par; |  | ||||||
|     env().setSeed(strToVec<int>(par_.seed)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| const Application::GlobalPar & Application::getPar(void) |  | ||||||
| { |  | ||||||
|     return par_; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execute ///////////////////////////////////////////////////////////////////// |  | ||||||
| void Application::run(void) |  | ||||||
| { |  | ||||||
|     if (!parameterFileName_.empty() and (env().getNModule() == 0)) |  | ||||||
|     { |  | ||||||
|         parseParameterFile(parameterFileName_); |  | ||||||
|     } |  | ||||||
|     if (!scheduled_) |  | ||||||
|     { |  | ||||||
|         schedule(); |  | ||||||
|     } |  | ||||||
|     printSchedule(); |  | ||||||
|     configLoop(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // parse parameter file //////////////////////////////////////////////////////// |  | ||||||
| class ObjectId: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(ObjectId, |  | ||||||
|                                     std::string, name, |  | ||||||
|                                     std::string, type); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| void Application::parseParameterFile(const std::string parameterFileName) |  | ||||||
| { |  | ||||||
|     XmlReader reader(parameterFileName); |  | ||||||
|     GlobalPar par; |  | ||||||
|     ObjectId  id; |  | ||||||
|      |  | ||||||
|     LOG(Message) << "Building application from '" << parameterFileName << "'..." << std::endl; |  | ||||||
|     read(reader, "parameters", par); |  | ||||||
|     setPar(par); |  | ||||||
|     push(reader, "modules"); |  | ||||||
|     push(reader, "module"); |  | ||||||
|     do |  | ||||||
|     { |  | ||||||
|         read(reader, "id", id); |  | ||||||
|         env().createModule(id.name, id.type, reader); |  | ||||||
|     } while (reader.nextElement("module")); |  | ||||||
|     pop(reader); |  | ||||||
|     pop(reader); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Application::saveParameterFile(const std::string parameterFileName) |  | ||||||
| { |  | ||||||
|     XmlWriter          writer(parameterFileName); |  | ||||||
|     ObjectId           id; |  | ||||||
|     const unsigned int nMod = env().getNModule(); |  | ||||||
|      |  | ||||||
|     LOG(Message) << "Saving application to '" << parameterFileName << "'..." << std::endl; |  | ||||||
|     write(writer, "parameters", getPar()); |  | ||||||
|     push(writer, "modules"); |  | ||||||
|     for (unsigned int i = 0; i < nMod; ++i) |  | ||||||
|     { |  | ||||||
|         push(writer, "module"); |  | ||||||
|         id.name = env().getModuleName(i); |  | ||||||
|         id.type = env().getModule(i)->getRegisteredName(); |  | ||||||
|         write(writer, "id", id); |  | ||||||
|         env().getModule(i)->saveParameters(writer, "options"); |  | ||||||
|         pop(writer); |  | ||||||
|     } |  | ||||||
|     pop(writer); |  | ||||||
|     pop(writer); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // schedule computation //////////////////////////////////////////////////////// |  | ||||||
| #define MEM_MSG(size)\ |  | ||||||
| sizeString((size)*locVol_) << " (" << sizeString(size)  << "/site)" |  | ||||||
|  |  | ||||||
| #define DEFINE_MEMPEAK \ |  | ||||||
| auto memPeak = [this](const std::vector<unsigned int> &program)\ |  | ||||||
| {\ |  | ||||||
|     unsigned int memPeak;\ |  | ||||||
|     bool         msg;\ |  | ||||||
|     \ |  | ||||||
|     msg = HadronsLogMessage.isActive();\ |  | ||||||
|     HadronsLogMessage.Active(false);\ |  | ||||||
|     env().dryRun(true);\ |  | ||||||
|     memPeak = env().executeProgram(program);\ |  | ||||||
|     env().dryRun(false);\ |  | ||||||
|     env().freeAll();\ |  | ||||||
|     HadronsLogMessage.Active(true);\ |  | ||||||
|     \ |  | ||||||
|     return memPeak;\ |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Application::schedule(void) |  | ||||||
| { |  | ||||||
|     DEFINE_MEMPEAK; |  | ||||||
|      |  | ||||||
|     // build module dependency graph |  | ||||||
|     LOG(Message) << "Building module graph..." << std::endl; |  | ||||||
|     auto graph = env().makeModuleGraph(); |  | ||||||
|     auto con = graph.getConnectedComponents(); |  | ||||||
|      |  | ||||||
|     // constrained topological sort using a genetic algorithm |  | ||||||
|     LOG(Message) << "Scheduling computation..." << std::endl; |  | ||||||
|     LOG(Message) << "               #module= " << graph.size() << std::endl; |  | ||||||
|     LOG(Message) << "       population size= " << par_.genetic.popSize << std::endl; |  | ||||||
|     LOG(Message) << "       max. generation= " << par_.genetic.maxGen << std::endl; |  | ||||||
|     LOG(Message) << "  max. cst. generation= " << par_.genetic.maxCstGen << std::endl; |  | ||||||
|     LOG(Message) << "         mutation rate= " << par_.genetic.mutationRate << std::endl; |  | ||||||
|      |  | ||||||
|     unsigned int                               k = 0, gen, prevPeak, nCstPeak = 0; |  | ||||||
|     std::random_device                         rd; |  | ||||||
|     GeneticScheduler<unsigned int>::Parameters par; |  | ||||||
|      |  | ||||||
|     par.popSize      = par_.genetic.popSize; |  | ||||||
|     par.mutationRate = par_.genetic.mutationRate; |  | ||||||
|     par.seed         = rd(); |  | ||||||
|     memPeak_         = 0; |  | ||||||
|     CartesianCommunicator::BroadcastWorld(0, &(par.seed), sizeof(par.seed)); |  | ||||||
|     for (unsigned int i = 0; i < con.size(); ++i) |  | ||||||
|     { |  | ||||||
|         GeneticScheduler<unsigned int> scheduler(con[i], memPeak, par); |  | ||||||
|          |  | ||||||
|         gen = 0; |  | ||||||
|         do |  | ||||||
|         { |  | ||||||
|             LOG(Debug) << "Generation " << gen << ":" << std::endl; |  | ||||||
|             scheduler.nextGeneration(); |  | ||||||
|             if (gen != 0) |  | ||||||
|             { |  | ||||||
|                 if (prevPeak == scheduler.getMinValue()) |  | ||||||
|                 { |  | ||||||
|                     nCstPeak++; |  | ||||||
|                 } |  | ||||||
|                 else |  | ||||||
|                 { |  | ||||||
|                     nCstPeak = 0; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|              |  | ||||||
|             prevPeak = scheduler.getMinValue(); |  | ||||||
|             if (gen % 10 == 0) |  | ||||||
|             { |  | ||||||
|                 LOG(Iterative) << "Generation " << gen << ": " |  | ||||||
|                                << MEM_MSG(scheduler.getMinValue()) << std::endl; |  | ||||||
|             } |  | ||||||
|              |  | ||||||
|             gen++; |  | ||||||
|         } while ((gen < par_.genetic.maxGen) |  | ||||||
|                  and (nCstPeak < par_.genetic.maxCstGen)); |  | ||||||
|         auto &t = scheduler.getMinSchedule(); |  | ||||||
|         if (scheduler.getMinValue() > memPeak_) |  | ||||||
|         { |  | ||||||
|             memPeak_ = scheduler.getMinValue(); |  | ||||||
|         } |  | ||||||
|         for (unsigned int j = 0; j < t.size(); ++j) |  | ||||||
|         { |  | ||||||
|             program_.push_back(t[j]); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     scheduled_ = true; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Application::saveSchedule(const std::string filename) |  | ||||||
| { |  | ||||||
|     TextWriter               writer(filename); |  | ||||||
|     std::vector<std::string> program; |  | ||||||
|      |  | ||||||
|     if (!scheduled_) |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("Computation not scheduled"); |  | ||||||
|     } |  | ||||||
|     LOG(Message) << "Saving current schedule to '" << filename << "'..." |  | ||||||
|                  << std::endl; |  | ||||||
|     for (auto address: program_) |  | ||||||
|     { |  | ||||||
|         program.push_back(env().getModuleName(address)); |  | ||||||
|     } |  | ||||||
|     write(writer, "schedule", program); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Application::loadSchedule(const std::string filename) |  | ||||||
| { |  | ||||||
|     DEFINE_MEMPEAK; |  | ||||||
|      |  | ||||||
|     TextReader               reader(filename); |  | ||||||
|     std::vector<std::string> program; |  | ||||||
|      |  | ||||||
|     LOG(Message) << "Loading schedule from '" << filename << "'..." |  | ||||||
|                  << std::endl; |  | ||||||
|     read(reader, "schedule", program); |  | ||||||
|     program_.clear(); |  | ||||||
|     for (auto &name: program) |  | ||||||
|     { |  | ||||||
|         program_.push_back(env().getModuleAddress(name)); |  | ||||||
|     } |  | ||||||
|     scheduled_ = true; |  | ||||||
|     memPeak_   = memPeak(program_); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Application::printSchedule(void) |  | ||||||
| { |  | ||||||
|     if (!scheduled_) |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("Computation not scheduled"); |  | ||||||
|     } |  | ||||||
|     LOG(Message) << "Schedule (memory peak: " << MEM_MSG(memPeak_) << "):" |  | ||||||
|                  << std::endl; |  | ||||||
|     for (unsigned int i = 0; i < program_.size(); ++i) |  | ||||||
|     { |  | ||||||
|         LOG(Message) << std::setw(4) << i + 1 << ": " |  | ||||||
|                      << env().getModuleName(program_[i]) << std::endl; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // loop on configurations ////////////////////////////////////////////////////// |  | ||||||
| void Application::configLoop(void) |  | ||||||
| { |  | ||||||
|     auto range = par_.trajCounter; |  | ||||||
|      |  | ||||||
|     for (unsigned int t = range.start; t < range.end; t += range.step) |  | ||||||
|     { |  | ||||||
|         LOG(Message) << BIG_SEP << " Starting measurement for trajectory " << t |  | ||||||
|                      << " " << BIG_SEP << std::endl; |  | ||||||
|         env().setTrajectory(t); |  | ||||||
|         env().executeProgram(program_); |  | ||||||
|     } |  | ||||||
|     LOG(Message) << BIG_SEP << " End of measurement " << BIG_SEP << std::endl; |  | ||||||
|     env().freeAll(); |  | ||||||
| } |  | ||||||
| @@ -1,132 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Application.hpp |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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 */ |  | ||||||
|  |  | ||||||
| #ifndef Hadrons_Application_hpp_ |  | ||||||
| #define Hadrons_Application_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Environment.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                         Main program manager                               * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| class Application |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     class TrajRange: Serializable |  | ||||||
|     { |  | ||||||
|     public: |  | ||||||
|         GRID_SERIALIZABLE_CLASS_MEMBERS(TrajRange, |  | ||||||
|                                         unsigned int, start, |  | ||||||
|                                         unsigned int, end, |  | ||||||
|                                         unsigned int, step); |  | ||||||
|     }; |  | ||||||
|     class GeneticPar: Serializable |  | ||||||
|     { |  | ||||||
|     public: |  | ||||||
|         GeneticPar(void): |  | ||||||
|             popSize{20}, maxGen{1000}, maxCstGen{100}, mutationRate{.1} {}; |  | ||||||
|     public: |  | ||||||
|         GRID_SERIALIZABLE_CLASS_MEMBERS(GeneticPar, |  | ||||||
|                                         unsigned int, popSize, |  | ||||||
|                                         unsigned int, maxGen, |  | ||||||
|                                         unsigned int, maxCstGen, |  | ||||||
|                                         double      , mutationRate); |  | ||||||
|     }; |  | ||||||
|     class GlobalPar: Serializable |  | ||||||
|     { |  | ||||||
|     public: |  | ||||||
|         GRID_SERIALIZABLE_CLASS_MEMBERS(GlobalPar, |  | ||||||
|                                         TrajRange,   trajCounter, |  | ||||||
|                                         GeneticPar,  genetic, |  | ||||||
|                                         std::string, seed); |  | ||||||
|     }; |  | ||||||
| public: |  | ||||||
|     // constructors |  | ||||||
|     Application(void); |  | ||||||
|     Application(const GlobalPar &par); |  | ||||||
|     Application(const std::string parameterFileName); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~Application(void) = default; |  | ||||||
|     // access |  | ||||||
|     void              setPar(const GlobalPar &par); |  | ||||||
|     const GlobalPar & getPar(void); |  | ||||||
|     // module creation |  | ||||||
|     template <typename M> |  | ||||||
|     void createModule(const std::string name); |  | ||||||
|     template <typename M> |  | ||||||
|     void createModule(const std::string name, const typename M::Par &par); |  | ||||||
|     // execute |  | ||||||
|     void run(void); |  | ||||||
|     // XML parameter file I/O |  | ||||||
|     void parseParameterFile(const std::string parameterFileName); |  | ||||||
|     void saveParameterFile(const std::string parameterFileName); |  | ||||||
|     // schedule computation |  | ||||||
|     void schedule(void); |  | ||||||
|     void saveSchedule(const std::string filename); |  | ||||||
|     void loadSchedule(const std::string filename); |  | ||||||
|     void printSchedule(void); |  | ||||||
|     // loop on configurations |  | ||||||
|     void configLoop(void); |  | ||||||
| private: |  | ||||||
|     // environment shortcut |  | ||||||
|     Environment & env(void) const; |  | ||||||
| private: |  | ||||||
|     long unsigned int         locVol_; |  | ||||||
|     std::string               parameterFileName_{""}; |  | ||||||
|     GlobalPar                 par_; |  | ||||||
|     std::vector<unsigned int> program_; |  | ||||||
|     Environment::Size         memPeak_; |  | ||||||
|     bool                      scheduled_{false}; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                     Application template implementation                    * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // module creation ///////////////////////////////////////////////////////////// |  | ||||||
| template <typename M> |  | ||||||
| void Application::createModule(const std::string name) |  | ||||||
| { |  | ||||||
|     env().createModule<M>(name); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename M> |  | ||||||
| void Application::createModule(const std::string name, |  | ||||||
|                                const typename M::Par &par) |  | ||||||
| { |  | ||||||
|     env().createModule<M>(name, par); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Application_hpp_ |  | ||||||
| @@ -1,743 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Environment.cc |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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/Hadrons/Environment.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace QCD; |  | ||||||
| using namespace Hadrons; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                       Environment implementation                           * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| Environment::Environment(void) |  | ||||||
| { |  | ||||||
|     nd_ = GridDefaultLatt().size(); |  | ||||||
|     grid4d_.reset(SpaceTimeGrid::makeFourDimGrid( |  | ||||||
|         GridDefaultLatt(), GridDefaultSimd(nd_, vComplex::Nsimd()), |  | ||||||
|         GridDefaultMpi())); |  | ||||||
|     gridRb4d_.reset(SpaceTimeGrid::makeFourDimRedBlackGrid(grid4d_.get())); |  | ||||||
|     auto loc = getGrid()->LocalDimensions(); |  | ||||||
|     locVol_ = 1; |  | ||||||
|     for (unsigned int d = 0; d < loc.size(); ++d) |  | ||||||
|     { |  | ||||||
|         locVol_ *= loc[d]; |  | ||||||
|     } |  | ||||||
|     rng4d_.reset(new GridParallelRNG(grid4d_.get())); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // dry run ///////////////////////////////////////////////////////////////////// |  | ||||||
| void Environment::dryRun(const bool isDry) |  | ||||||
| { |  | ||||||
|     dryRun_ = isDry; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::isDryRun(void) const |  | ||||||
| { |  | ||||||
|     return dryRun_; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // trajectory number /////////////////////////////////////////////////////////// |  | ||||||
| void Environment::setTrajectory(const unsigned int traj) |  | ||||||
| { |  | ||||||
|     traj_ = traj; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| unsigned int Environment::getTrajectory(void) const |  | ||||||
| { |  | ||||||
|     return traj_; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // grids /////////////////////////////////////////////////////////////////////// |  | ||||||
| void Environment::createGrid(const unsigned int Ls) |  | ||||||
| { |  | ||||||
|     if (grid5d_.find(Ls) == grid5d_.end()) |  | ||||||
|     { |  | ||||||
|         auto g = getGrid(); |  | ||||||
|          |  | ||||||
|         grid5d_[Ls].reset(SpaceTimeGrid::makeFiveDimGrid(Ls, g)); |  | ||||||
|         gridRb5d_[Ls].reset(SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls, g)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| GridCartesian * Environment::getGrid(const unsigned int Ls) const |  | ||||||
| { |  | ||||||
|     try |  | ||||||
|     { |  | ||||||
|         if (Ls == 1) |  | ||||||
|         { |  | ||||||
|             return grid4d_.get(); |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             return grid5d_.at(Ls).get(); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     catch(std::out_of_range &) |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no grid with Ls= " << Ls); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| GridRedBlackCartesian * Environment::getRbGrid(const unsigned int Ls) const |  | ||||||
| { |  | ||||||
|     try |  | ||||||
|     { |  | ||||||
|         if (Ls == 1) |  | ||||||
|         { |  | ||||||
|             return gridRb4d_.get(); |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             return gridRb5d_.at(Ls).get(); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     catch(std::out_of_range &) |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no red-black 5D grid with Ls= " << Ls); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| unsigned int Environment::getNd(void) const |  | ||||||
| { |  | ||||||
|     return nd_; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // random number generator ///////////////////////////////////////////////////// |  | ||||||
| void Environment::setSeed(const std::vector<int> &seed) |  | ||||||
| { |  | ||||||
|     rng4d_->SeedFixedIntegers(seed); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| GridParallelRNG * Environment::get4dRng(void) const |  | ||||||
| { |  | ||||||
|     return rng4d_.get(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // module management /////////////////////////////////////////////////////////// |  | ||||||
| void Environment::pushModule(Environment::ModPt &pt) |  | ||||||
| { |  | ||||||
|     std::string name = pt->getName(); |  | ||||||
|      |  | ||||||
|     if (!hasModule(name)) |  | ||||||
|     { |  | ||||||
|         std::vector<unsigned int> inputAddress; |  | ||||||
|         unsigned int              address; |  | ||||||
|         ModuleInfo                m; |  | ||||||
|          |  | ||||||
|         m.data = std::move(pt); |  | ||||||
|         m.type = typeIdPt(*m.data.get()); |  | ||||||
|         m.name = name; |  | ||||||
|         auto input  = m.data->getInput(); |  | ||||||
|         for (auto &in: input) |  | ||||||
|         { |  | ||||||
|             if (!hasObject(in)) |  | ||||||
|             { |  | ||||||
|                 addObject(in , -1); |  | ||||||
|             } |  | ||||||
|             m.input.push_back(objectAddress_[in]); |  | ||||||
|         } |  | ||||||
|         auto output = m.data->getOutput(); |  | ||||||
|         module_.push_back(std::move(m)); |  | ||||||
|         address              = static_cast<unsigned int>(module_.size() - 1); |  | ||||||
|         moduleAddress_[name] = address; |  | ||||||
|         for (auto &out: output) |  | ||||||
|         { |  | ||||||
|             if (!hasObject(out)) |  | ||||||
|             { |  | ||||||
|                 addObject(out, address); |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 if (object_[objectAddress_[out]].module < 0) |  | ||||||
|                 { |  | ||||||
|                     object_[objectAddress_[out]].module = address; |  | ||||||
|                 } |  | ||||||
|                 else |  | ||||||
|                 { |  | ||||||
|                     HADRON_ERROR("object '" + out |  | ||||||
|                                  + "' is already produced by module '" |  | ||||||
|                                  + module_[object_[getObjectAddress(out)].module].name |  | ||||||
|                                  + "' (while pushing module '" + name + "')"); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("module '" + name + "' already exists"); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| unsigned int Environment::getNModule(void) const |  | ||||||
| { |  | ||||||
|     return module_.size(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Environment::createModule(const std::string name, const std::string type, |  | ||||||
|                                XmlReader &reader) |  | ||||||
| { |  | ||||||
|     auto &factory = ModuleFactory::getInstance(); |  | ||||||
|     auto pt       = factory.create(type, name); |  | ||||||
|      |  | ||||||
|     pt->parseParameters(reader, "options"); |  | ||||||
|     pushModule(pt); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ModuleBase * Environment::getModule(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (hasModule(address)) |  | ||||||
|     { |  | ||||||
|         return module_[address].data.get(); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no module with address " + std::to_string(address)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ModuleBase * Environment::getModule(const std::string name) const |  | ||||||
| { |  | ||||||
|     return getModule(getModuleAddress(name)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| unsigned int Environment::getModuleAddress(const std::string name) const |  | ||||||
| { |  | ||||||
|     if (hasModule(name)) |  | ||||||
|     { |  | ||||||
|         return moduleAddress_.at(name); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no module with name '" + name + "'"); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::string Environment::getModuleName(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (hasModule(address)) |  | ||||||
|     { |  | ||||||
|         return module_[address].name; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no module with address " + std::to_string(address)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::string Environment::getModuleType(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (hasModule(address)) |  | ||||||
|     { |  | ||||||
|         return typeName(module_[address].type); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no module with address " + std::to_string(address)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::string Environment::getModuleType(const std::string name) const |  | ||||||
| { |  | ||||||
|     return getModuleType(getModuleAddress(name)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::hasModule(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     return (address < module_.size()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::hasModule(const std::string name) const |  | ||||||
| { |  | ||||||
|     return (moduleAddress_.find(name) != moduleAddress_.end()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| Graph<unsigned int> Environment::makeModuleGraph(void) const |  | ||||||
| { |  | ||||||
|     Graph<unsigned int> moduleGraph; |  | ||||||
|      |  | ||||||
|     for (unsigned int i = 0; i < module_.size(); ++i) |  | ||||||
|     { |  | ||||||
|         moduleGraph.addVertex(i); |  | ||||||
|         for (auto &j: module_[i].input) |  | ||||||
|         { |  | ||||||
|             moduleGraph.addEdge(object_[j].module, i); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return moduleGraph; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #define BIG_SEP "===============" |  | ||||||
| #define SEP     "---------------" |  | ||||||
| #define MEM_MSG(size)\ |  | ||||||
| sizeString((size)*locVol_) << " (" << sizeString(size)  << "/site)" |  | ||||||
|  |  | ||||||
| Environment::Size |  | ||||||
| Environment::executeProgram(const std::vector<unsigned int> &p) |  | ||||||
| { |  | ||||||
|     Size                                memPeak = 0, sizeBefore, sizeAfter; |  | ||||||
|     std::vector<std::set<unsigned int>> freeProg; |  | ||||||
|     bool                                continueCollect, nothingFreed; |  | ||||||
|      |  | ||||||
|     // build garbage collection schedule |  | ||||||
|     freeProg.resize(p.size()); |  | ||||||
|     for (unsigned int i = 0; i < object_.size(); ++i) |  | ||||||
|     { |  | ||||||
|         auto pred = [i, this](const unsigned int j) |  | ||||||
|         { |  | ||||||
|             auto &in = module_[j].input; |  | ||||||
|             auto it  = std::find(in.begin(), in.end(), i); |  | ||||||
|              |  | ||||||
|             return (it != in.end()) or (j == object_[i].module); |  | ||||||
|         }; |  | ||||||
|         auto it = std::find_if(p.rbegin(), p.rend(), pred); |  | ||||||
|         if (it != p.rend()) |  | ||||||
|         { |  | ||||||
|             freeProg[p.rend() - it - 1].insert(i); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     // program execution |  | ||||||
|     for (unsigned int i = 0; i < p.size(); ++i) |  | ||||||
|     { |  | ||||||
|         // execute module |  | ||||||
|         if (!isDryRun()) |  | ||||||
|         { |  | ||||||
|             LOG(Message) << SEP << " Measurement step " << i+1 << "/" |  | ||||||
|                          << p.size() << " (module '" << module_[p[i]].name |  | ||||||
|                          << "') " << SEP << std::endl; |  | ||||||
|         } |  | ||||||
|         (*module_[p[i]].data)(); |  | ||||||
|         sizeBefore = getTotalSize(); |  | ||||||
|         // print used memory after execution |  | ||||||
|         if (!isDryRun()) |  | ||||||
|         { |  | ||||||
|             LOG(Message) << "Allocated objects: " << MEM_MSG(sizeBefore) |  | ||||||
|                          << std::endl; |  | ||||||
|         } |  | ||||||
|         if (sizeBefore > memPeak) |  | ||||||
|         { |  | ||||||
|             memPeak = sizeBefore; |  | ||||||
|         } |  | ||||||
|         // garbage collection for step i |  | ||||||
|         if (!isDryRun()) |  | ||||||
|         { |  | ||||||
|             LOG(Message) << "Garbage collection..." << std::endl; |  | ||||||
|         } |  | ||||||
|         nothingFreed = true; |  | ||||||
|         do |  | ||||||
|         { |  | ||||||
|             continueCollect = false; |  | ||||||
|             auto toFree = freeProg[i]; |  | ||||||
|             for (auto &j: toFree) |  | ||||||
|             { |  | ||||||
|                 // continue garbage collection while there are still |  | ||||||
|                 // objects without owners |  | ||||||
|                 continueCollect = continueCollect or !hasOwners(j); |  | ||||||
|                 if(freeObject(j)) |  | ||||||
|                 { |  | ||||||
|                     // if an object has been freed, remove it from |  | ||||||
|                     // the garbage collection schedule |  | ||||||
|                     freeProg[i].erase(j); |  | ||||||
|                     nothingFreed = false; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } while (continueCollect); |  | ||||||
|         // any remaining objects in step i garbage collection schedule |  | ||||||
|         // is scheduled for step i + 1 |  | ||||||
|         if (i + 1 < p.size()) |  | ||||||
|         { |  | ||||||
|             for (auto &j: freeProg[i]) |  | ||||||
|             { |  | ||||||
|                 freeProg[i + 1].insert(j); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         // print used memory after garbage collection if necessary |  | ||||||
|         if (!isDryRun()) |  | ||||||
|         { |  | ||||||
|             sizeAfter = getTotalSize(); |  | ||||||
|             if (sizeBefore != sizeAfter) |  | ||||||
|             { |  | ||||||
|                 LOG(Message) << "Allocated objects: " << MEM_MSG(sizeAfter) |  | ||||||
|                              << std::endl; |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 LOG(Message) << "Nothing to free" << std::endl; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return memPeak; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| Environment::Size Environment::executeProgram(const std::vector<std::string> &p) |  | ||||||
| { |  | ||||||
|     std::vector<unsigned int> pAddress; |  | ||||||
|      |  | ||||||
|     for (auto &n: p) |  | ||||||
|     { |  | ||||||
|         pAddress.push_back(getModuleAddress(n)); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return executeProgram(pAddress); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // general memory management /////////////////////////////////////////////////// |  | ||||||
| void Environment::addObject(const std::string name, const int moduleAddress) |  | ||||||
| { |  | ||||||
|     if (!hasObject(name)) |  | ||||||
|     { |  | ||||||
|         ObjInfo info; |  | ||||||
|          |  | ||||||
|         info.name   = name; |  | ||||||
|         info.module = moduleAddress; |  | ||||||
|         object_.push_back(std::move(info)); |  | ||||||
|         objectAddress_[name] = static_cast<unsigned int>(object_.size() - 1); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("object '" + name + "' already exists"); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Environment::registerObject(const unsigned int address, |  | ||||||
|                                  const unsigned int size, const unsigned int Ls) |  | ||||||
| { |  | ||||||
|     if (!hasRegisteredObject(address)) |  | ||||||
|     { |  | ||||||
|         if (hasObject(address)) |  | ||||||
|         { |  | ||||||
|             object_[address].size         = size; |  | ||||||
|             object_[address].Ls           = Ls; |  | ||||||
|             object_[address].isRegistered = true; |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             HADRON_ERROR("no object with address " + std::to_string(address)); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("object with address " + std::to_string(address) |  | ||||||
|                      + " already registered"); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Environment::registerObject(const std::string name, |  | ||||||
|                                  const unsigned int size, const unsigned int Ls) |  | ||||||
| { |  | ||||||
|     if (!hasObject(name)) |  | ||||||
|     { |  | ||||||
|         addObject(name); |  | ||||||
|     } |  | ||||||
|     registerObject(getObjectAddress(name), size, Ls); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| unsigned int Environment::getObjectAddress(const std::string name) const |  | ||||||
| { |  | ||||||
|     if (hasObject(name)) |  | ||||||
|     { |  | ||||||
|         return objectAddress_.at(name); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no object with name '" + name + "'"); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::string Environment::getObjectName(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         return object_[address].name; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no object with address " + std::to_string(address)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::string Environment::getObjectType(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (hasRegisteredObject(address)) |  | ||||||
|     { |  | ||||||
|         return typeName(object_[address].type); |  | ||||||
|     } |  | ||||||
|     else if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("object with address " + std::to_string(address) |  | ||||||
|                      + " exists but is not registered"); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no object with address " + std::to_string(address)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::string Environment::getObjectType(const std::string name) const |  | ||||||
| { |  | ||||||
|     return getObjectType(getObjectAddress(name)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| Environment::Size Environment::getObjectSize(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (hasRegisteredObject(address)) |  | ||||||
|     { |  | ||||||
|         return object_[address].size; |  | ||||||
|     } |  | ||||||
|     else if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("object with address " + std::to_string(address) |  | ||||||
|                      + " exists but is not registered"); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no object with address " + std::to_string(address)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| Environment::Size Environment::getObjectSize(const std::string name) const |  | ||||||
| { |  | ||||||
|     return getObjectSize(getObjectAddress(name)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| unsigned int Environment::getObjectLs(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (hasRegisteredObject(address)) |  | ||||||
|     { |  | ||||||
|         return object_[address].Ls; |  | ||||||
|     } |  | ||||||
|     else if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("object with address " + std::to_string(address) |  | ||||||
|                      + " exists but is not registered"); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no object with address " + std::to_string(address)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| unsigned int Environment::getObjectLs(const std::string name) const |  | ||||||
| { |  | ||||||
|     return getObjectLs(getObjectAddress(name)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::hasObject(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     return (address < object_.size()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::hasObject(const std::string name) const |  | ||||||
| { |  | ||||||
|     auto it = objectAddress_.find(name); |  | ||||||
|      |  | ||||||
|     return ((it != objectAddress_.end()) and hasObject(it->second)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::hasRegisteredObject(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         return object_[address].isRegistered; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::hasRegisteredObject(const std::string name) const |  | ||||||
| { |  | ||||||
|     if (hasObject(name)) |  | ||||||
|     { |  | ||||||
|         return hasRegisteredObject(getObjectAddress(name)); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::hasCreatedObject(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         return (object_[address].data != nullptr); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::hasCreatedObject(const std::string name) const |  | ||||||
| { |  | ||||||
|     if (hasObject(name)) |  | ||||||
|     { |  | ||||||
|         return hasCreatedObject(getObjectAddress(name)); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::isObject5d(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     return (getObjectLs(address) > 1); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::isObject5d(const std::string name) const |  | ||||||
| { |  | ||||||
|     return (getObjectLs(name) > 1); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| Environment::Size Environment::getTotalSize(void) const |  | ||||||
| { |  | ||||||
|     Environment::Size size = 0; |  | ||||||
|      |  | ||||||
|     for (auto &o: object_) |  | ||||||
|     { |  | ||||||
|         if (o.isRegistered) |  | ||||||
|         { |  | ||||||
|             size += o.size; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return size; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Environment::addOwnership(const unsigned int owner, |  | ||||||
|                                const unsigned int property) |  | ||||||
| { |  | ||||||
|     if (hasObject(property)) |  | ||||||
|     { |  | ||||||
|         object_[property].owners.insert(owner); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no object with address " + std::to_string(property)); |  | ||||||
|     } |  | ||||||
|     if (hasObject(owner)) |  | ||||||
|     { |  | ||||||
|         object_[owner].properties.insert(property); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no object with address " + std::to_string(owner)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Environment::addOwnership(const std::string owner, |  | ||||||
|                                const std::string property) |  | ||||||
| { |  | ||||||
|     addOwnership(getObjectAddress(owner), getObjectAddress(property)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::hasOwners(const unsigned int address) const |  | ||||||
| { |  | ||||||
|      |  | ||||||
|     if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         return (!object_[address].owners.empty()); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no object with address " + std::to_string(address)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::hasOwners(const std::string name) const |  | ||||||
| { |  | ||||||
|     return hasOwners(getObjectAddress(name)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::freeObject(const unsigned int address) |  | ||||||
| { |  | ||||||
|     if (!hasOwners(address)) |  | ||||||
|     { |  | ||||||
|         if (!isDryRun() and object_[address].isRegistered) |  | ||||||
|         { |  | ||||||
|             LOG(Message) << "Destroying object '" << object_[address].name |  | ||||||
|                          << "'" << std::endl; |  | ||||||
|         } |  | ||||||
|         for (auto &p: object_[address].properties) |  | ||||||
|         { |  | ||||||
|             object_[p].owners.erase(address); |  | ||||||
|         } |  | ||||||
|         object_[address].size         = 0; |  | ||||||
|         object_[address].Ls           = 0; |  | ||||||
|         object_[address].isRegistered = false; |  | ||||||
|         object_[address].type         = nullptr; |  | ||||||
|         object_[address].owners.clear(); |  | ||||||
|         object_[address].properties.clear(); |  | ||||||
|         object_[address].data.reset(nullptr); |  | ||||||
|          |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::freeObject(const std::string name) |  | ||||||
| { |  | ||||||
|     return freeObject(getObjectAddress(name)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Environment::freeAll(void) |  | ||||||
| { |  | ||||||
|     for (unsigned int i = 0; i < object_.size(); ++i) |  | ||||||
|     { |  | ||||||
|         freeObject(i); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Environment::printContent(void) |  | ||||||
| { |  | ||||||
|     LOG(Message) << "Modules: " << std::endl; |  | ||||||
|     for (unsigned int i = 0; i < module_.size(); ++i) |  | ||||||
|     { |  | ||||||
|         LOG(Message) << std::setw(4) << i << ": " |  | ||||||
|                      << getModuleName(i) << std::endl; |  | ||||||
|     } |  | ||||||
|     LOG(Message) << "Objects: " << std::endl; |  | ||||||
|     for (unsigned int i = 0; i < object_.size(); ++i) |  | ||||||
|     { |  | ||||||
|         LOG(Message) << std::setw(4) << i << ": " |  | ||||||
|                      << getObjectName(i) << std::endl; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,385 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Environment.hpp |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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 */ |  | ||||||
|  |  | ||||||
| #ifndef Hadrons_Environment_hpp_ |  | ||||||
| #define Hadrons_Environment_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Graph.hpp> |  | ||||||
|  |  | ||||||
| #ifndef SITE_SIZE_TYPE |  | ||||||
| #define SITE_SIZE_TYPE unsigned int |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                         Global environment                                 * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // forward declaration of Module |  | ||||||
| class ModuleBase; |  | ||||||
|  |  | ||||||
| class Object |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     Object(void) = default; |  | ||||||
|     virtual ~Object(void) = default; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| class Holder: public Object |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     Holder(void) = default; |  | ||||||
|     Holder(T *pt); |  | ||||||
|     virtual ~Holder(void) = default; |  | ||||||
|     T &       get(void) const; |  | ||||||
|     T *       getPt(void) const; |  | ||||||
|     void      reset(T *pt); |  | ||||||
| private: |  | ||||||
|     std::unique_ptr<T> objPt_{nullptr}; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| class Environment |  | ||||||
| { |  | ||||||
|     SINGLETON(Environment); |  | ||||||
| public: |  | ||||||
|     typedef SITE_SIZE_TYPE                         Size; |  | ||||||
|     typedef std::unique_ptr<ModuleBase>            ModPt; |  | ||||||
|     typedef std::unique_ptr<GridCartesian>         GridPt; |  | ||||||
|     typedef std::unique_ptr<GridRedBlackCartesian> GridRbPt; |  | ||||||
|     typedef std::unique_ptr<GridParallelRNG>       RngPt; |  | ||||||
|     typedef std::unique_ptr<LatticeBase>           LatticePt; |  | ||||||
| private: |  | ||||||
|     struct ModuleInfo |  | ||||||
|     { |  | ||||||
|         const std::type_info      *type{nullptr}; |  | ||||||
|         std::string               name; |  | ||||||
|         ModPt                     data{nullptr}; |  | ||||||
|         std::vector<unsigned int> input; |  | ||||||
|     }; |  | ||||||
|     struct ObjInfo |  | ||||||
|     { |  | ||||||
|         Size                    size{0}; |  | ||||||
|         unsigned int            Ls{0}; |  | ||||||
|         bool                    isRegistered{false}; |  | ||||||
|         const std::type_info    *type{nullptr}; |  | ||||||
|         std::string             name; |  | ||||||
|         int                     module{-1}; |  | ||||||
|         std::set<unsigned int>  owners, properties; |  | ||||||
|         std::unique_ptr<Object> data{nullptr}; |  | ||||||
|     }; |  | ||||||
| public: |  | ||||||
|     // dry run |  | ||||||
|     void                    dryRun(const bool isDry); |  | ||||||
|     bool                    isDryRun(void) const; |  | ||||||
|     // trajectory number |  | ||||||
|     void                    setTrajectory(const unsigned int traj); |  | ||||||
|     unsigned int            getTrajectory(void) const; |  | ||||||
|     // grids |  | ||||||
|     void                    createGrid(const unsigned int Ls); |  | ||||||
|     GridCartesian *         getGrid(const unsigned int Ls = 1) const; |  | ||||||
|     GridRedBlackCartesian * getRbGrid(const unsigned int Ls = 1) const; |  | ||||||
|     unsigned int            getNd(void) const; |  | ||||||
|     // random number generator |  | ||||||
|     void                    setSeed(const std::vector<int> &seed); |  | ||||||
|     GridParallelRNG *       get4dRng(void) const; |  | ||||||
|     // module management |  | ||||||
|     void                    pushModule(ModPt &pt); |  | ||||||
|     template <typename M> |  | ||||||
|     void                    createModule(const std::string name); |  | ||||||
|     template <typename M> |  | ||||||
|     void                    createModule(const std::string name, |  | ||||||
|                                          const typename M::Par &par); |  | ||||||
|     void                    createModule(const std::string name, |  | ||||||
|                                          const std::string type, |  | ||||||
|                                          XmlReader &reader); |  | ||||||
|     unsigned int            getNModule(void) const; |  | ||||||
|     ModuleBase *            getModule(const unsigned int address) const; |  | ||||||
|     ModuleBase *            getModule(const std::string name) const; |  | ||||||
|     template <typename M> |  | ||||||
|     M *                     getModule(const unsigned int address) const; |  | ||||||
|     template <typename M> |  | ||||||
|     M *                     getModule(const std::string name) const; |  | ||||||
|     unsigned int            getModuleAddress(const std::string name) const; |  | ||||||
|     std::string             getModuleName(const unsigned int address) const; |  | ||||||
|     std::string             getModuleType(const unsigned int address) const; |  | ||||||
|     std::string             getModuleType(const std::string name) const; |  | ||||||
|     bool                    hasModule(const unsigned int address) const; |  | ||||||
|     bool                    hasModule(const std::string name) const; |  | ||||||
|     Graph<unsigned int>     makeModuleGraph(void) const; |  | ||||||
|     Size                    executeProgram(const std::vector<unsigned int> &p); |  | ||||||
|     Size                    executeProgram(const std::vector<std::string> &p); |  | ||||||
|     // general memory management |  | ||||||
|     void                    addObject(const std::string name, |  | ||||||
|                                       const int moduleAddress = -1); |  | ||||||
|     void                    registerObject(const unsigned int address, |  | ||||||
|                                            const unsigned int size, |  | ||||||
|                                            const unsigned int Ls = 1); |  | ||||||
|     void                    registerObject(const std::string name, |  | ||||||
|                                            const unsigned int size, |  | ||||||
|                                            const unsigned int Ls = 1); |  | ||||||
|     template <typename T> |  | ||||||
|     unsigned int            lattice4dSize(void) const; |  | ||||||
|     template <typename T> |  | ||||||
|     void                    registerLattice(const unsigned int address, |  | ||||||
|                                             const unsigned int Ls = 1); |  | ||||||
|     template <typename T> |  | ||||||
|     void                    registerLattice(const std::string name, |  | ||||||
|                                             const unsigned int Ls = 1); |  | ||||||
|     template <typename T> |  | ||||||
|     void                    setObject(const unsigned int address, T *object); |  | ||||||
|     template <typename T> |  | ||||||
|     void                    setObject(const std::string name, T *object); |  | ||||||
|     template <typename T> |  | ||||||
|     T *                     getObject(const unsigned int address) const; |  | ||||||
|     template <typename T> |  | ||||||
|     T *                     getObject(const std::string name) const; |  | ||||||
|     template <typename T> |  | ||||||
|     T *                     createLattice(const unsigned int address); |  | ||||||
|     template <typename T> |  | ||||||
|     T *                     createLattice(const std::string name); |  | ||||||
|     unsigned int            getObjectAddress(const std::string name) const; |  | ||||||
|     std::string             getObjectName(const unsigned int address) const; |  | ||||||
|     std::string             getObjectType(const unsigned int address) const; |  | ||||||
|     std::string             getObjectType(const std::string name) const; |  | ||||||
|     Size                    getObjectSize(const unsigned int address) const; |  | ||||||
|     Size                    getObjectSize(const std::string name) const; |  | ||||||
|     unsigned int            getObjectLs(const unsigned int address) const; |  | ||||||
|     unsigned int            getObjectLs(const std::string name) const; |  | ||||||
|     bool                    hasObject(const unsigned int address) const; |  | ||||||
|     bool                    hasObject(const std::string name) const; |  | ||||||
|     bool                    hasRegisteredObject(const unsigned int address) const; |  | ||||||
|     bool                    hasRegisteredObject(const std::string name) const; |  | ||||||
|     bool                    hasCreatedObject(const unsigned int address) const; |  | ||||||
|     bool                    hasCreatedObject(const std::string name) const; |  | ||||||
|     bool                    isObject5d(const unsigned int address) const; |  | ||||||
|     bool                    isObject5d(const std::string name) const; |  | ||||||
|     Environment::Size       getTotalSize(void) const; |  | ||||||
|     void                    addOwnership(const unsigned int owner, |  | ||||||
|                                          const unsigned int property); |  | ||||||
|     void                    addOwnership(const std::string owner, |  | ||||||
|                                          const std::string property); |  | ||||||
|     bool                    hasOwners(const unsigned int address) const; |  | ||||||
|     bool                    hasOwners(const std::string name) const; |  | ||||||
|     bool                    freeObject(const unsigned int address); |  | ||||||
|     bool                    freeObject(const std::string name); |  | ||||||
|     void                    freeAll(void); |  | ||||||
|     void                    printContent(void); |  | ||||||
| private: |  | ||||||
|     // general |  | ||||||
|     bool                                   dryRun_{false}; |  | ||||||
|     unsigned int                           traj_, locVol_; |  | ||||||
|     // grids |  | ||||||
|     GridPt                                 grid4d_; |  | ||||||
|     std::map<unsigned int, GridPt>         grid5d_; |  | ||||||
|     GridRbPt                               gridRb4d_; |  | ||||||
|     std::map<unsigned int, GridRbPt>       gridRb5d_; |  | ||||||
|     unsigned int                           nd_; |  | ||||||
|     // random number generator |  | ||||||
|     RngPt                                  rng4d_; |  | ||||||
|     // module and related maps |  | ||||||
|     std::vector<ModuleInfo>                module_; |  | ||||||
|     std::map<std::string, unsigned int>    moduleAddress_; |  | ||||||
|     // lattice store |  | ||||||
|     std::map<unsigned int, LatticePt>      lattice_; |  | ||||||
|     // object store |  | ||||||
|     std::vector<ObjInfo>                   object_; |  | ||||||
|     std::map<std::string, unsigned int>    objectAddress_; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                       Holder template implementation                       * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename T> |  | ||||||
| Holder<T>::Holder(T *pt) |  | ||||||
| : objPt_(pt) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // access ////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename T> |  | ||||||
| T & Holder<T>::get(void) const |  | ||||||
| { |  | ||||||
|     return &objPt_.get(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| T * Holder<T>::getPt(void) const |  | ||||||
| { |  | ||||||
|     return objPt_.get(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| void Holder<T>::reset(T *pt) |  | ||||||
| { |  | ||||||
|     objPt_.reset(pt); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                     Environment template implementation                    * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // module management /////////////////////////////////////////////////////////// |  | ||||||
| template <typename M> |  | ||||||
| void Environment::createModule(const std::string name) |  | ||||||
| { |  | ||||||
|     ModPt pt(new M(name)); |  | ||||||
|      |  | ||||||
|     pushModule(pt); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename M> |  | ||||||
| void Environment::createModule(const std::string name, |  | ||||||
|                                const typename M::Par &par) |  | ||||||
| { |  | ||||||
|     ModPt pt(new M(name)); |  | ||||||
|      |  | ||||||
|     static_cast<M *>(pt.get())->setPar(par); |  | ||||||
|     pushModule(pt); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename M> |  | ||||||
| M * Environment::getModule(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (auto *pt = dynamic_cast<M *>(getModule(address))) |  | ||||||
|     { |  | ||||||
|         return pt; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("module '" + module_[address].name |  | ||||||
|                      + "' does not have type " + typeid(M).name() |  | ||||||
|                      + "(object type: " + getModuleType(address) + ")"); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename M> |  | ||||||
| M * Environment::getModule(const std::string name) const |  | ||||||
| { |  | ||||||
|     return getModule<M>(getModuleAddress(name)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| unsigned int Environment::lattice4dSize(void) const |  | ||||||
| { |  | ||||||
|     return sizeof(typename T::vector_object)/getGrid()->Nsimd(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| void Environment::registerLattice(const unsigned int address, |  | ||||||
|                                   const unsigned int Ls) |  | ||||||
| { |  | ||||||
|     createGrid(Ls); |  | ||||||
|     registerObject(address, Ls*lattice4dSize<T>(), Ls); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| void Environment::registerLattice(const std::string name, const unsigned int Ls) |  | ||||||
| { |  | ||||||
|     createGrid(Ls); |  | ||||||
|     registerObject(name, Ls*lattice4dSize<T>(), Ls); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| void Environment::setObject(const unsigned int address, T *object) |  | ||||||
| { |  | ||||||
|     if (hasRegisteredObject(address)) |  | ||||||
|     { |  | ||||||
|         object_[address].data.reset(new Holder<T>(object)); |  | ||||||
|         object_[address].type = &typeid(T); |  | ||||||
|     } |  | ||||||
|     else if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("object with address " + std::to_string(address) + |  | ||||||
|                      " exists but is not registered"); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no object with address " + std::to_string(address)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| void Environment::setObject(const std::string name, T *object) |  | ||||||
| { |  | ||||||
|     setObject(getObjectAddress(name), object); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| T * Environment::getObject(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (hasRegisteredObject(address)) |  | ||||||
|     { |  | ||||||
|         if (auto h = dynamic_cast<Holder<T> *>(object_[address].data.get())) |  | ||||||
|         { |  | ||||||
|             return h->getPt(); |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             HADRON_ERROR("object with address " + std::to_string(address) + |  | ||||||
|                          " does not have type '" + typeid(T).name() + |  | ||||||
|                          "' (has type '" + getObjectType(address) + "')"); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     else if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("object with address " + std::to_string(address) + |  | ||||||
|                      " exists but is not registered"); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no object with address " + std::to_string(address)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| T * Environment::getObject(const std::string name) const |  | ||||||
| { |  | ||||||
|     return getObject<T>(getObjectAddress(name)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| T * Environment::createLattice(const unsigned int address) |  | ||||||
| { |  | ||||||
|     GridCartesian *g = getGrid(getObjectLs(address)); |  | ||||||
|      |  | ||||||
|     setObject(address, new T(g)); |  | ||||||
|      |  | ||||||
|     return getObject<T>(address); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| T * Environment::createLattice(const std::string name) |  | ||||||
| { |  | ||||||
|     return createLattice<T>(getObjectAddress(name)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Environment_hpp_ |  | ||||||
| @@ -1,106 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Factory.hpp |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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 */ |  | ||||||
|  |  | ||||||
| #ifndef Hadrons_Factory_hpp_ |  | ||||||
| #define Hadrons_Factory_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                        abstract factory class                              * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| template <typename T> |  | ||||||
| class Factory |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     typedef std::function<std::unique_ptr<T>(const std::string)> Func; |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     Factory(void) = default; |  | ||||||
|     // destructor |  | ||||||
|     virtual ~Factory(void) = default; |  | ||||||
|     // registration |  | ||||||
|     void registerBuilder(const std::string type, const Func &f); |  | ||||||
|     // get builder list |  | ||||||
|     std::vector<std::string> getBuilderList(void) const; |  | ||||||
|     // factory |  | ||||||
|     std::unique_ptr<T> create(const std::string type, |  | ||||||
|                               const std::string name) const; |  | ||||||
| private: |  | ||||||
|     std::map<std::string, Func> builder_; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                         template implementation                            * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // registration //////////////////////////////////////////////////////////////// |  | ||||||
| template <typename T> |  | ||||||
| void Factory<T>::registerBuilder(const std::string type, const Func &f) |  | ||||||
| { |  | ||||||
|     builder_[type] = f; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // get module list ///////////////////////////////////////////////////////////// |  | ||||||
| template <typename T> |  | ||||||
| std::vector<std::string> Factory<T>::getBuilderList(void) const |  | ||||||
| { |  | ||||||
|     std::vector<std::string> list; |  | ||||||
|      |  | ||||||
|     for (auto &b: builder_) |  | ||||||
|     { |  | ||||||
|         list.push_back(b.first); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return list; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // factory ///////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename T> |  | ||||||
| std::unique_ptr<T> Factory<T>::create(const std::string type, |  | ||||||
|                                       const std::string name) const |  | ||||||
| { |  | ||||||
|     Func func; |  | ||||||
|      |  | ||||||
|     try |  | ||||||
|     { |  | ||||||
|         func = builder_.at(type); |  | ||||||
|     } |  | ||||||
|     catch (std::out_of_range &) |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("object of type '" + type + "' unknown"); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return func(name); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Factory_hpp_ |  | ||||||
| @@ -1,329 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/GeneticScheduler.hpp |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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 */ |  | ||||||
|  |  | ||||||
| #ifndef Hadrons_GeneticScheduler_hpp_ |  | ||||||
| #define Hadrons_GeneticScheduler_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Graph.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                   Scheduler based on a genetic algorithm                   * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| template <typename T> |  | ||||||
| class GeneticScheduler |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     typedef std::vector<T>                   Gene; |  | ||||||
|     typedef std::pair<Gene *, Gene *>        GenePair; |  | ||||||
|     typedef std::function<int(const Gene &)> ObjFunc; |  | ||||||
|     struct Parameters |  | ||||||
|     { |  | ||||||
|         double       mutationRate; |  | ||||||
|         unsigned int popSize, seed; |  | ||||||
|     }; |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     GeneticScheduler(Graph<T> &graph, const ObjFunc &func, |  | ||||||
|                      const Parameters &par); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~GeneticScheduler(void) = default; |  | ||||||
|     // access |  | ||||||
|     const Gene & getMinSchedule(void); |  | ||||||
|     int          getMinValue(void); |  | ||||||
|     // breed a new generation |  | ||||||
|     void nextGeneration(void); |  | ||||||
|     // heuristic benchmarks |  | ||||||
|     void benchmarkCrossover(const unsigned int nIt); |  | ||||||
|     // print population |  | ||||||
|     friend std::ostream & operator<<(std::ostream &out, |  | ||||||
|                                      const GeneticScheduler<T> &s) |  | ||||||
|     { |  | ||||||
|         out << "["; |  | ||||||
|         for (auto &p: s.population_) |  | ||||||
|         { |  | ||||||
|             out << p.first << ", "; |  | ||||||
|         } |  | ||||||
|         out << "\b\b]"; |  | ||||||
|          |  | ||||||
|         return out; |  | ||||||
|     } |  | ||||||
| private: |  | ||||||
|     // evolution steps |  | ||||||
|     void initPopulation(void); |  | ||||||
|     void doCrossover(void); |  | ||||||
|     void doMutation(void); |  | ||||||
|     // genetic operators |  | ||||||
|     GenePair selectPair(void); |  | ||||||
|     void     crossover(Gene &c1, Gene &c2, const Gene &p1, const Gene &p2); |  | ||||||
|     void     mutation(Gene &m, const Gene &c); |  | ||||||
|      |  | ||||||
| private: |  | ||||||
|     Graph<T>                 &graph_; |  | ||||||
|     const ObjFunc            &func_; |  | ||||||
|     const Parameters         par_; |  | ||||||
|     std::multimap<int, Gene> population_; |  | ||||||
|     std::mt19937             gen_; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                       template implementation                              * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename T> |  | ||||||
| GeneticScheduler<T>::GeneticScheduler(Graph<T> &graph, const ObjFunc &func, |  | ||||||
|                                       const Parameters &par) |  | ||||||
| : graph_(graph) |  | ||||||
| , func_(func) |  | ||||||
| , par_(par) |  | ||||||
| { |  | ||||||
|     gen_.seed(par_.seed); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // access ////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename T> |  | ||||||
| const typename GeneticScheduler<T>::Gene & |  | ||||||
| GeneticScheduler<T>::getMinSchedule(void) |  | ||||||
| { |  | ||||||
|     return population_.begin()->second; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| int GeneticScheduler<T>::getMinValue(void) |  | ||||||
| { |  | ||||||
|     return population_.begin()->first; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // breed a new generation ////////////////////////////////////////////////////// |  | ||||||
| template <typename T> |  | ||||||
| void GeneticScheduler<T>::nextGeneration(void) |  | ||||||
| { |  | ||||||
|     // random initialization of the population if necessary |  | ||||||
|     if (population_.size() != par_.popSize) |  | ||||||
|     { |  | ||||||
|         initPopulation(); |  | ||||||
|     } |  | ||||||
|     LOG(Debug) << "Starting population:\n" << *this << std::endl; |  | ||||||
|      |  | ||||||
|     // random mutations |  | ||||||
|     //PARALLEL_FOR_LOOP |  | ||||||
|     for (unsigned int i = 0; i < par_.popSize; ++i) |  | ||||||
|     { |  | ||||||
|         doMutation(); |  | ||||||
|     } |  | ||||||
|     LOG(Debug) << "After mutations:\n" << *this << std::endl; |  | ||||||
|      |  | ||||||
|     // mating |  | ||||||
|     //PARALLEL_FOR_LOOP |  | ||||||
|     for (unsigned int i = 0; i < par_.popSize/2; ++i) |  | ||||||
|     { |  | ||||||
|         doCrossover(); |  | ||||||
|     } |  | ||||||
|     LOG(Debug) << "After mating:\n" << *this << std::endl; |  | ||||||
|      |  | ||||||
|     // grim reaper |  | ||||||
|     auto it = population_.begin(); |  | ||||||
|      |  | ||||||
|     std::advance(it, par_.popSize); |  | ||||||
|     population_.erase(it, population_.end()); |  | ||||||
|     LOG(Debug) << "After grim reaper:\n" << *this << std::endl; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // evolution steps ///////////////////////////////////////////////////////////// |  | ||||||
| template <typename T> |  | ||||||
| void GeneticScheduler<T>::initPopulation(void) |  | ||||||
| { |  | ||||||
|     population_.clear(); |  | ||||||
|     for (unsigned int i = 0; i < par_.popSize; ++i) |  | ||||||
|     { |  | ||||||
|         auto p = graph_.topoSort(gen_); |  | ||||||
|          |  | ||||||
|         population_.insert(std::make_pair(func_(p), p)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| void GeneticScheduler<T>::doCrossover(void) |  | ||||||
| { |  | ||||||
|     auto p = selectPair(); |  | ||||||
|     Gene &p1 = *(p.first), &p2 = *(p.second); |  | ||||||
|     Gene c1, c2; |  | ||||||
|      |  | ||||||
|     crossover(c1, c2, p1, p2); |  | ||||||
|     PARALLEL_CRITICAL |  | ||||||
|     { |  | ||||||
|         population_.insert(std::make_pair(func_(c1), c1)); |  | ||||||
|         population_.insert(std::make_pair(func_(c2), c2)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| void GeneticScheduler<T>::doMutation(void) |  | ||||||
| { |  | ||||||
|     std::uniform_real_distribution<double>      mdis(0., 1.); |  | ||||||
|     std::uniform_int_distribution<unsigned int> pdis(0, population_.size() - 1); |  | ||||||
|      |  | ||||||
|     if (mdis(gen_) < par_.mutationRate) |  | ||||||
|     { |  | ||||||
|         Gene m; |  | ||||||
|         auto it = population_.begin(); |  | ||||||
|          |  | ||||||
|         std::advance(it, pdis(gen_)); |  | ||||||
|         mutation(m, it->second); |  | ||||||
|         PARALLEL_CRITICAL |  | ||||||
|         { |  | ||||||
|             population_.insert(std::make_pair(func_(m), m)); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // genetic operators /////////////////////////////////////////////////////////// |  | ||||||
| template <typename T> |  | ||||||
| typename GeneticScheduler<T>::GenePair GeneticScheduler<T>::selectPair(void) |  | ||||||
| { |  | ||||||
|     std::vector<double> prob; |  | ||||||
|     unsigned int        ind; |  | ||||||
|     Gene                *p1, *p2; |  | ||||||
|      |  | ||||||
|     for (auto &c: population_) |  | ||||||
|     { |  | ||||||
|         prob.push_back(1./c.first); |  | ||||||
|     } |  | ||||||
|     do |  | ||||||
|     { |  | ||||||
|         double probCpy; |  | ||||||
|          |  | ||||||
|         std::discrete_distribution<unsigned int> dis1(prob.begin(), prob.end()); |  | ||||||
|         auto rIt = population_.begin(); |  | ||||||
|         ind = dis1(gen_); |  | ||||||
|         std::advance(rIt, ind); |  | ||||||
|         p1 = &(rIt->second); |  | ||||||
|         probCpy   = prob[ind]; |  | ||||||
|         prob[ind] = 0.; |  | ||||||
|         std::discrete_distribution<unsigned int> dis2(prob.begin(), prob.end()); |  | ||||||
|         rIt = population_.begin(); |  | ||||||
|         std::advance(rIt, dis2(gen_)); |  | ||||||
|         p2 = &(rIt->second); |  | ||||||
|         prob[ind] = probCpy; |  | ||||||
|     } while (p1 == p2); |  | ||||||
|      |  | ||||||
|     return std::make_pair(p1, p2); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| void GeneticScheduler<T>::crossover(Gene &c1, Gene &c2, const Gene &p1, |  | ||||||
|                                     const Gene &p2) |  | ||||||
| { |  | ||||||
|     Gene                                        buf; |  | ||||||
|     std::uniform_int_distribution<unsigned int> dis(0, p1.size() - 1); |  | ||||||
|     unsigned int                                cut = dis(gen_); |  | ||||||
|      |  | ||||||
|     c1.clear(); |  | ||||||
|     buf = p2; |  | ||||||
|     for (unsigned int i = 0; i < cut; ++i) |  | ||||||
|     { |  | ||||||
|         c1.push_back(p1[i]); |  | ||||||
|         buf.erase(std::find(buf.begin(), buf.end(), p1[i])); |  | ||||||
|     } |  | ||||||
|     for (unsigned int i = 0; i < buf.size(); ++i) |  | ||||||
|     { |  | ||||||
|         c1.push_back(buf[i]); |  | ||||||
|     } |  | ||||||
|     c2.clear(); |  | ||||||
|     buf = p2; |  | ||||||
|     for (unsigned int i = cut; i < p1.size(); ++i) |  | ||||||
|     { |  | ||||||
|         buf.erase(std::find(buf.begin(), buf.end(), p1[i])); |  | ||||||
|     } |  | ||||||
|     for (unsigned int i = 0; i < buf.size(); ++i) |  | ||||||
|     { |  | ||||||
|         c2.push_back(buf[i]); |  | ||||||
|     } |  | ||||||
|     for (unsigned int i = cut; i < p1.size(); ++i) |  | ||||||
|     { |  | ||||||
|         c2.push_back(p1[i]); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| void GeneticScheduler<T>::mutation(Gene &m, const Gene &c) |  | ||||||
| { |  | ||||||
|     Gene                                        buf; |  | ||||||
|     std::uniform_int_distribution<unsigned int> dis(0, c.size() - 1); |  | ||||||
|     unsigned int                                cut = dis(gen_); |  | ||||||
|     Graph<T>                                    g1 = graph_, g2 = graph_; |  | ||||||
|      |  | ||||||
|     for (unsigned int i = 0; i < cut; ++i) |  | ||||||
|     { |  | ||||||
|         g1.removeVertex(c[i]); |  | ||||||
|     } |  | ||||||
|     for (unsigned int i = cut; i < c.size(); ++i) |  | ||||||
|     { |  | ||||||
|         g2.removeVertex(c[i]); |  | ||||||
|     } |  | ||||||
|     if (g1.size() > 0) |  | ||||||
|     { |  | ||||||
|         buf = g1.topoSort(gen_); |  | ||||||
|     } |  | ||||||
|     if (g2.size() > 0) |  | ||||||
|     { |  | ||||||
|         m = g2.topoSort(gen_); |  | ||||||
|     } |  | ||||||
|     for (unsigned int i = cut; i < c.size(); ++i) |  | ||||||
|     { |  | ||||||
|         m.push_back(buf[i - cut]); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| void GeneticScheduler<T>::benchmarkCrossover(const unsigned int nIt) |  | ||||||
| { |  | ||||||
|     Gene   p1, p2, c1, c2; |  | ||||||
|     double neg = 0., eq = 0., pos = 0., total; |  | ||||||
|     int    improvement; |  | ||||||
|      |  | ||||||
|     LOG(Message) << "Benchmarking crossover..." << std::endl; |  | ||||||
|     for (unsigned int i = 0; i < nIt; ++i) |  | ||||||
|     { |  | ||||||
|         p1 = graph_.topoSort(gen_); |  | ||||||
|         p2 = graph_.topoSort(gen_); |  | ||||||
|         crossover(c1, c2, p1, p2); |  | ||||||
|         improvement = (func_(c1) + func_(c2) - func_(p1) - func_(p2))/2; |  | ||||||
|         if (improvement < 0) neg++; else if (improvement == 0) eq++; else pos++; |  | ||||||
|     } |  | ||||||
|     total = neg + eq + pos; |  | ||||||
|     LOG(Message) << "  -: " << neg/total << "  =: " << eq/total |  | ||||||
|                  << "  +: " << pos/total << std::endl; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_GeneticScheduler_hpp_ |  | ||||||
| @@ -1,82 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Global.cc |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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/Hadrons/Global.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace QCD; |  | ||||||
| using namespace Hadrons; |  | ||||||
|  |  | ||||||
| HadronsLogger Hadrons::HadronsLogError(1,"Error"); |  | ||||||
| HadronsLogger Hadrons::HadronsLogWarning(1,"Warning"); |  | ||||||
| HadronsLogger Hadrons::HadronsLogMessage(1,"Message"); |  | ||||||
| HadronsLogger Hadrons::HadronsLogIterative(1,"Iterative"); |  | ||||||
| HadronsLogger Hadrons::HadronsLogDebug(1,"Debug"); |  | ||||||
|  |  | ||||||
| // pretty size formatting ////////////////////////////////////////////////////// |  | ||||||
| std::string Hadrons::sizeString(long unsigned int bytes) |  | ||||||
|  |  | ||||||
| { |  | ||||||
|     constexpr unsigned int bufSize = 256; |  | ||||||
|     const char             *suffixes[7] = {"", "K", "M", "G", "T", "P", "E"}; |  | ||||||
|     char                   buf[256]; |  | ||||||
|     long unsigned int      s     = 0; |  | ||||||
|     double                 count = bytes; |  | ||||||
|      |  | ||||||
|     while (count >= 1024 && s < 7) |  | ||||||
|     { |  | ||||||
|         s++; |  | ||||||
|         count /= 1024; |  | ||||||
|     } |  | ||||||
|     if (count - floor(count) == 0.0) |  | ||||||
|     { |  | ||||||
|         snprintf(buf, bufSize, "%d %sB", (int)count, suffixes[s]); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         snprintf(buf, bufSize, "%.1f %sB", count, suffixes[s]); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return std::string(buf); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // type utilities ////////////////////////////////////////////////////////////// |  | ||||||
| constexpr unsigned int maxNameSize = 1024u; |  | ||||||
|  |  | ||||||
| std::string Hadrons::typeName(const std::type_info *info) |  | ||||||
| { |  | ||||||
|     char        *buf; |  | ||||||
|     std::string name; |  | ||||||
|      |  | ||||||
|     buf  = abi::__cxa_demangle(info->name(), nullptr, nullptr, nullptr); |  | ||||||
|     name = buf; |  | ||||||
|     free(buf); |  | ||||||
|      |  | ||||||
|     return name; |  | ||||||
| } |  | ||||||
| @@ -1,150 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Global.hpp |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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 */ |  | ||||||
|  |  | ||||||
| #ifndef Hadrons_Global_hpp_ |  | ||||||
| #define Hadrons_Global_hpp_ |  | ||||||
|  |  | ||||||
| #include <set> |  | ||||||
| #include <stack> |  | ||||||
| #include <Grid/Grid.h> |  | ||||||
| #include <cxxabi.h> |  | ||||||
|  |  | ||||||
| #define BEGIN_HADRONS_NAMESPACE \ |  | ||||||
| namespace Grid {\ |  | ||||||
| using namespace QCD;\ |  | ||||||
| namespace Hadrons {\ |  | ||||||
| using Grid::operator<<; |  | ||||||
| #define END_HADRONS_NAMESPACE }} |  | ||||||
|  |  | ||||||
| #define BEGIN_MODULE_NAMESPACE(name)\ |  | ||||||
| namespace name {\ |  | ||||||
| using Grid::operator<<; |  | ||||||
| #define END_MODULE_NAMESPACE } |  | ||||||
|  |  | ||||||
| /* the 'using Grid::operator<<;' statement prevents a very nasty compilation |  | ||||||
|  * error with GCC 5 (clang & GCC 6 compile fine without it). |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| // FIXME: find a way to do that in a more general fashion |  | ||||||
| #ifndef FIMPL |  | ||||||
| #define FIMPL WilsonImplR |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| // type aliases |  | ||||||
| #define TYPE_ALIASES(FImpl, suffix)\ |  | ||||||
| typedef FermionOperator<FImpl>                       FMat##suffix;             \ |  | ||||||
| typedef typename FImpl::FermionField                 FermionField##suffix;     \ |  | ||||||
| typedef typename FImpl::PropagatorField              PropagatorField##suffix;  \ |  | ||||||
| typedef typename FImpl::SitePropagator               SitePropagator##suffix;   \ |  | ||||||
| typedef typename FImpl::DoubledGaugeField            DoubledGaugeField##suffix;\ |  | ||||||
| typedef std::function<void(FermionField##suffix &,                             \ |  | ||||||
|                       const FermionField##suffix &)> SolverFn##suffix; |  | ||||||
|  |  | ||||||
| // logger |  | ||||||
| class HadronsLogger: public Logger |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     HadronsLogger(int on, std::string nm): Logger("Hadrons", on, nm, |  | ||||||
|                                                   GridLogColours, "BLACK"){}; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| #define LOG(channel) std::cout << HadronsLog##channel |  | ||||||
| #define HADRON_ERROR(msg)\ |  | ||||||
| LOG(Error) << msg << " (" << __FUNCTION__ << " at " << __FILE__ << ":"\ |  | ||||||
|            << __LINE__ << ")" << std::endl;\ |  | ||||||
| abort(); |  | ||||||
|  |  | ||||||
| #define DEBUG_VAR(var) LOG(Debug) << #var << "= " << (var) << std::endl; |  | ||||||
|  |  | ||||||
| extern HadronsLogger HadronsLogError; |  | ||||||
| extern HadronsLogger HadronsLogWarning; |  | ||||||
| extern HadronsLogger HadronsLogMessage; |  | ||||||
| extern HadronsLogger HadronsLogIterative; |  | ||||||
| extern HadronsLogger HadronsLogDebug; |  | ||||||
|  |  | ||||||
| // singleton pattern |  | ||||||
| #define SINGLETON(name)\ |  | ||||||
| public:\ |  | ||||||
|     name(const name &e) = delete;\ |  | ||||||
|     void operator=(const name &e) = delete;\ |  | ||||||
|     static name & getInstance(void)\ |  | ||||||
|     {\ |  | ||||||
|         static name e;\ |  | ||||||
|         return e;\ |  | ||||||
|     }\ |  | ||||||
| private:\ |  | ||||||
|     name(void); |  | ||||||
|  |  | ||||||
| #define SINGLETON_DEFCTOR(name)\ |  | ||||||
| public:\ |  | ||||||
|     name(const name &e) = delete;\ |  | ||||||
|     void operator=(const name &e) = delete;\ |  | ||||||
|     static name & getInstance(void)\ |  | ||||||
|     {\ |  | ||||||
|         static name e;\ |  | ||||||
|         return e;\ |  | ||||||
|     }\ |  | ||||||
| private:\ |  | ||||||
|     name(void) = default; |  | ||||||
|  |  | ||||||
| // pretty size formating |  | ||||||
| std::string sizeString(long unsigned int bytes); |  | ||||||
|  |  | ||||||
| // type utilities |  | ||||||
| template <typename T> |  | ||||||
| const std::type_info * typeIdPt(const T &x) |  | ||||||
| { |  | ||||||
|     return &typeid(x); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::string typeName(const std::type_info *info); |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| const std::type_info * typeIdPt(void) |  | ||||||
| { |  | ||||||
|     return &typeid(T); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| std::string typeName(const T &x) |  | ||||||
| { |  | ||||||
|     return typeName(typeIdPt(x)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| std::string typeName(void) |  | ||||||
| { |  | ||||||
|     return typeName(typeIdPt<T>()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Global_hpp_ |  | ||||||
| @@ -1,760 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Graph.hpp |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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 */ |  | ||||||
|  |  | ||||||
| #ifndef Hadrons_Graph_hpp_ |  | ||||||
| #define Hadrons_Graph_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                          Oriented graph class                              * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // I/O for edges |  | ||||||
| template <typename T> |  | ||||||
| std::ostream & operator<<(std::ostream &out, const std::pair<T, T> &e) |  | ||||||
| { |  | ||||||
|     out << "\""  << e.first << "\" -> \"" << e.second << "\""; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // main class |  | ||||||
| template <typename T> |  | ||||||
| class Graph |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     typedef std::pair<T, T> Edge; |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     Graph(void); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~Graph(void) = default; |  | ||||||
|     // access |  | ||||||
|     void           addVertex(const T &value); |  | ||||||
|     void           addEdge(const Edge &e); |  | ||||||
|     void           addEdge(const T &start, const T &end); |  | ||||||
|     std::vector<T> getVertices(void) const; |  | ||||||
|     void           removeVertex(const T &value); |  | ||||||
|     void           removeEdge(const Edge &e); |  | ||||||
|     void           removeEdge(const T &start, const T &end); |  | ||||||
|     unsigned int   size(void) const; |  | ||||||
|     // tests |  | ||||||
|     bool gotValue(const T &value) const; |  | ||||||
|     // graph topological manipulations |  | ||||||
|     std::vector<T>              getAdjacentVertices(const T &value) const; |  | ||||||
|     std::vector<T>              getChildren(const T &value) const; |  | ||||||
|     std::vector<T>              getParents(const T &value) const; |  | ||||||
|     std::vector<T>              getRoots(void) const; |  | ||||||
|     std::vector<Graph<T>>       getConnectedComponents(void) const; |  | ||||||
|     std::vector<T>              topoSort(void); |  | ||||||
|     template <typename Gen> |  | ||||||
|     std::vector<T>              topoSort(Gen &gen); |  | ||||||
|     std::vector<std::vector<T>> allTopoSort(void); |  | ||||||
|     // I/O |  | ||||||
|     friend std::ostream & operator<<(std::ostream &out, const Graph<T> &g) |  | ||||||
|     { |  | ||||||
|         out << "{"; |  | ||||||
|         for (auto &e: g.edgeSet_) |  | ||||||
|         { |  | ||||||
|             out << e << ", "; |  | ||||||
|         } |  | ||||||
|         if (g.edgeSet_.size() != 0) |  | ||||||
|         { |  | ||||||
|             out << "\b\b"; |  | ||||||
|         } |  | ||||||
|         out << "}"; |  | ||||||
|          |  | ||||||
|         return out; |  | ||||||
|     } |  | ||||||
| private: |  | ||||||
|     // vertex marking |  | ||||||
|     void      mark(const T &value, const bool doMark = true); |  | ||||||
|     void      markAll(const bool doMark = true); |  | ||||||
|     void      unmark(const T &value); |  | ||||||
|     void      unmarkAll(void); |  | ||||||
|     bool      isMarked(const T &value) const; |  | ||||||
|     const T * getFirstMarked(const bool isMarked = true) const; |  | ||||||
|     template <typename Gen> |  | ||||||
|     const T * getRandomMarked(const bool isMarked, Gen &gen); |  | ||||||
|     const T * getFirstUnmarked(void) const; |  | ||||||
|     template <typename Gen> |  | ||||||
|     const T * getRandomUnmarked(Gen &gen); |  | ||||||
|     // prune marked/unmarked vertices |  | ||||||
|     void removeMarked(const bool isMarked = true); |  | ||||||
|     void removeUnmarked(void); |  | ||||||
|     // depth-first search marking |  | ||||||
|     void depthFirstSearch(void); |  | ||||||
|     void depthFirstSearch(const T &root); |  | ||||||
| private: |  | ||||||
|     std::map<T, bool>  isMarked_; |  | ||||||
|     std::set<Edge>     edgeSet_; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| // build depedency matrix from topological sorts |  | ||||||
| template <typename T> |  | ||||||
| std::map<T, std::map<T, bool>> |  | ||||||
| makeDependencyMatrix(const std::vector<std::vector<T>> &topSort); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                       template implementation                              * |  | ||||||
|  ****************************************************************************** |  | ||||||
|  * in all the following V is the number of vertex and E is the number of edge |  | ||||||
|  * in the worst case E = V^2 |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename T> |  | ||||||
| Graph<T>::Graph(void) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // access ////////////////////////////////////////////////////////////////////// |  | ||||||
| // complexity: log(V) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::addVertex(const T &value) |  | ||||||
| { |  | ||||||
|     isMarked_[value] = false; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::addEdge(const Edge &e) |  | ||||||
| { |  | ||||||
|     addVertex(e.first); |  | ||||||
|     addVertex(e.second); |  | ||||||
|     edgeSet_.insert(e); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::addEdge(const T &start, const T &end) |  | ||||||
| { |  | ||||||
|     addEdge(Edge(start, end)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| std::vector<T> Graph<T>::getVertices(void) const |  | ||||||
| { |  | ||||||
|     std::vector<T> vertex; |  | ||||||
|      |  | ||||||
|     for (auto &v: isMarked_) |  | ||||||
|     { |  | ||||||
|         vertex.push_back(v.first); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return vertex; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(V*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::removeVertex(const T &value) |  | ||||||
| { |  | ||||||
|     // remove vertex from the mark table |  | ||||||
|     auto vIt = isMarked_.find(value); |  | ||||||
|      |  | ||||||
|     if (vIt != isMarked_.end()) |  | ||||||
|     { |  | ||||||
|         isMarked_.erase(vIt); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("vertex " << value << " does not exists"); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // remove all edges containing the vertex |  | ||||||
|     auto pred = [&value](const Edge &e) |  | ||||||
|     { |  | ||||||
|         return ((e.first == value) or (e.second == value)); |  | ||||||
|     }; |  | ||||||
|     auto eIt = find_if(edgeSet_.begin(), edgeSet_.end(), pred); |  | ||||||
|      |  | ||||||
|     while (eIt != edgeSet_.end()) |  | ||||||
|     { |  | ||||||
|         edgeSet_.erase(eIt); |  | ||||||
|         eIt = find_if(edgeSet_.begin(), edgeSet_.end(), pred); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::removeEdge(const Edge &e) |  | ||||||
| { |  | ||||||
|     auto eIt = edgeSet_.find(e); |  | ||||||
|      |  | ||||||
|     if (eIt != edgeSet_.end()) |  | ||||||
|     { |  | ||||||
|         edgeSet_.erase(eIt); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("edge "  << e << " does not exists"); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::removeEdge(const T &start, const T &end) |  | ||||||
| { |  | ||||||
|     removeEdge(Edge(start, end)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(1) |  | ||||||
| template <typename T> |  | ||||||
| unsigned int Graph<T>::size(void) const |  | ||||||
| { |  | ||||||
|     return isMarked_.size(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // tests /////////////////////////////////////////////////////////////////////// |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| bool Graph<T>::gotValue(const T &value) const |  | ||||||
| { |  | ||||||
|     auto it = isMarked_.find(value); |  | ||||||
|      |  | ||||||
|     if (it == isMarked_.end()) |  | ||||||
|     { |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // vertex marking ////////////////////////////////////////////////////////////// |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::mark(const T &value, const bool doMark) |  | ||||||
| { |  | ||||||
|     if (gotValue(value)) |  | ||||||
|     { |  | ||||||
|         isMarked_[value] = doMark; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("vertex " << value << " does not exists"); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(V*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::markAll(const bool doMark) |  | ||||||
| { |  | ||||||
|     for (auto &v: isMarked_) |  | ||||||
|     { |  | ||||||
|         mark(v.first, doMark); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::unmark(const T &value) |  | ||||||
| { |  | ||||||
|     mark(value, false); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(V*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::unmarkAll(void) |  | ||||||
| { |  | ||||||
|     markAll(false); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| bool Graph<T>::isMarked(const T &value) const |  | ||||||
| { |  | ||||||
|     if (gotValue(value)) |  | ||||||
|     { |  | ||||||
|         return isMarked_.at(value); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("vertex " << value << " does not exists"); |  | ||||||
|          |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| const T * Graph<T>::getFirstMarked(const bool isMarked) const |  | ||||||
| { |  | ||||||
|     auto pred = [&isMarked](const std::pair<T, bool> &v) |  | ||||||
|     { |  | ||||||
|         return (v.second == isMarked); |  | ||||||
|     }; |  | ||||||
|     auto vIt = std::find_if(isMarked_.begin(), isMarked_.end(), pred); |  | ||||||
|      |  | ||||||
|     if (vIt != isMarked_.end()) |  | ||||||
|     { |  | ||||||
|         return &(vIt->first); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         return nullptr; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| template <typename Gen> |  | ||||||
| const T * Graph<T>::getRandomMarked(const bool isMarked, Gen &gen) |  | ||||||
| { |  | ||||||
|     auto pred = [&isMarked](const std::pair<T, bool> &v) |  | ||||||
|     { |  | ||||||
|         return (v.second == isMarked); |  | ||||||
|     }; |  | ||||||
|     std::uniform_int_distribution<unsigned int> dis(0, size() - 1); |  | ||||||
|     auto                                        rIt = isMarked_.begin(); |  | ||||||
|      |  | ||||||
|     std::advance(rIt, dis(gen)); |  | ||||||
|     auto vIt = std::find_if(rIt, isMarked_.end(), pred); |  | ||||||
|     if (vIt != isMarked_.end()) |  | ||||||
|     { |  | ||||||
|         return &(vIt->first); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         vIt = std::find_if(isMarked_.begin(), rIt, pred); |  | ||||||
|         if (vIt != rIt) |  | ||||||
|         { |  | ||||||
|             return &(vIt->first); |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             return nullptr; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| const T * Graph<T>::getFirstUnmarked(void) const |  | ||||||
| { |  | ||||||
|     return getFirstMarked(false); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| template <typename Gen> |  | ||||||
| const T * Graph<T>::getRandomUnmarked(Gen &gen) |  | ||||||
| { |  | ||||||
|     return getRandomMarked(false, gen); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // prune marked/unmarked vertices ////////////////////////////////////////////// |  | ||||||
| // complexity: O(V^2*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::removeMarked(const bool isMarked) |  | ||||||
| { |  | ||||||
|     auto isMarkedCopy = isMarked_; |  | ||||||
|      |  | ||||||
|     for (auto &v: isMarkedCopy) |  | ||||||
|     { |  | ||||||
|         if (v.second == isMarked) |  | ||||||
|         { |  | ||||||
|             removeVertex(v.first); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(V^2*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::removeUnmarked(void) |  | ||||||
| { |  | ||||||
|     removeMarked(false); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // depth-first search marking ////////////////////////////////////////////////// |  | ||||||
| // complexity: O(V*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::depthFirstSearch(void) |  | ||||||
| { |  | ||||||
|     depthFirstSearch(isMarked_.begin()->first); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(V*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::depthFirstSearch(const T &root) |  | ||||||
| { |  | ||||||
|     std::vector<T> adjacentVertex; |  | ||||||
|      |  | ||||||
|     mark(root); |  | ||||||
|     adjacentVertex = getAdjacentVertices(root); |  | ||||||
|     for (auto &v: adjacentVertex) |  | ||||||
|     { |  | ||||||
|         if (!isMarked(v)) |  | ||||||
|         { |  | ||||||
|             depthFirstSearch(v); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // graph topological manipulations ///////////////////////////////////////////// |  | ||||||
| // complexity: O(V*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| std::vector<T> Graph<T>::getAdjacentVertices(const T &value) const |  | ||||||
| { |  | ||||||
|     std::vector<T> adjacentVertex; |  | ||||||
|      |  | ||||||
|     auto pred = [&value](const Edge &e) |  | ||||||
|     { |  | ||||||
|         return ((e.first == value) or (e.second == value)); |  | ||||||
|     }; |  | ||||||
|     auto eIt = find_if(edgeSet_.begin(), edgeSet_.end(), pred); |  | ||||||
|      |  | ||||||
|     while (eIt != edgeSet_.end()) |  | ||||||
|     { |  | ||||||
|         if (eIt->first == value) |  | ||||||
|         { |  | ||||||
|             adjacentVertex.push_back((*eIt).second); |  | ||||||
|         } |  | ||||||
|         else if (eIt->second == value) |  | ||||||
|         { |  | ||||||
|             adjacentVertex.push_back((*eIt).first); |  | ||||||
|         } |  | ||||||
|         eIt = find_if(++eIt, edgeSet_.end(), pred); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return adjacentVertex; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(V*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| std::vector<T> Graph<T>::getChildren(const T &value) const |  | ||||||
| { |  | ||||||
|     std::vector<T> child; |  | ||||||
|      |  | ||||||
|     auto pred = [&value](const Edge &e) |  | ||||||
|     { |  | ||||||
|         return (e.first == value); |  | ||||||
|     }; |  | ||||||
|     auto eIt = find_if(edgeSet_.begin(), edgeSet_.end(), pred); |  | ||||||
|      |  | ||||||
|     while (eIt != edgeSet_.end()) |  | ||||||
|     { |  | ||||||
|         child.push_back((*eIt).second); |  | ||||||
|         eIt = find_if(++eIt, edgeSet_.end(), pred); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return child; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(V*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| std::vector<T> Graph<T>::getParents(const T &value) const |  | ||||||
| { |  | ||||||
|     std::vector<T> parent; |  | ||||||
|      |  | ||||||
|     auto pred = [&value](const Edge &e) |  | ||||||
|     { |  | ||||||
|         return (e.second == value); |  | ||||||
|     }; |  | ||||||
|     auto eIt = find_if(edgeSet_.begin(), edgeSet_.end(), pred); |  | ||||||
|      |  | ||||||
|     while (eIt != edgeSet_.end()) |  | ||||||
|     { |  | ||||||
|         parent.push_back((*eIt).first); |  | ||||||
|         eIt = find_if(++eIt, edgeSet_.end(), pred); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return parent; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(V^2*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| std::vector<T> Graph<T>::getRoots(void) const |  | ||||||
| { |  | ||||||
|     std::vector<T> root; |  | ||||||
|      |  | ||||||
|     for (auto &v: isMarked_) |  | ||||||
|     { |  | ||||||
|         auto parent = getParents(v.first); |  | ||||||
|          |  | ||||||
|         if (parent.size() == 0) |  | ||||||
|         { |  | ||||||
|             root.push_back(v.first); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return root; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(V^2*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| std::vector<Graph<T>> Graph<T>::getConnectedComponents(void) const |  | ||||||
| { |  | ||||||
|     std::vector<Graph<T>> res; |  | ||||||
|     Graph<T>              copy(*this); |  | ||||||
|      |  | ||||||
|     while (copy.size() > 0) |  | ||||||
|     { |  | ||||||
|         copy.depthFirstSearch(); |  | ||||||
|         res.push_back(copy); |  | ||||||
|         res.back().removeUnmarked(); |  | ||||||
|         res.back().unmarkAll(); |  | ||||||
|         copy.removeMarked(); |  | ||||||
|         copy.unmarkAll(); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return res; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // topological sort using a directed DFS algorithm |  | ||||||
| // complexity: O(V*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| std::vector<T> Graph<T>::topoSort(void) |  | ||||||
| { |  | ||||||
|     std::stack<T>     buf; |  | ||||||
|     std::vector<T>    res; |  | ||||||
|     const T           *vPt; |  | ||||||
|     std::map<T, bool> tmpMarked(isMarked_); |  | ||||||
|  |  | ||||||
|     // visit function |  | ||||||
|     std::function<void(const T &)> visit = [&](const T &v) |  | ||||||
|     { |  | ||||||
|         if (tmpMarked.at(v)) |  | ||||||
|         { |  | ||||||
|             HADRON_ERROR("cannot topologically sort a cyclic graph"); |  | ||||||
|         } |  | ||||||
|         if (!isMarked(v)) |  | ||||||
|         { |  | ||||||
|             std::vector<T> child = getChildren(v); |  | ||||||
|  |  | ||||||
|             tmpMarked[v] = true; |  | ||||||
|             for (auto &c: child) |  | ||||||
|             { |  | ||||||
|                 visit(c); |  | ||||||
|             } |  | ||||||
|             mark(v); |  | ||||||
|             tmpMarked[v] = false; |  | ||||||
|             buf.push(v); |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
|      |  | ||||||
|     // reset temporary marks |  | ||||||
|     for (auto &v: tmpMarked) |  | ||||||
|     { |  | ||||||
|         tmpMarked.at(v.first) = false; |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     // loop on unmarked vertices |  | ||||||
|     unmarkAll(); |  | ||||||
|     vPt = getFirstUnmarked(); |  | ||||||
|     while (vPt) |  | ||||||
|     { |  | ||||||
|         visit(*vPt); |  | ||||||
|         vPt = getFirstUnmarked(); |  | ||||||
|     } |  | ||||||
|     unmarkAll(); |  | ||||||
|      |  | ||||||
|     // create result vector |  | ||||||
|     while (!buf.empty()) |  | ||||||
|     { |  | ||||||
|         res.push_back(buf.top()); |  | ||||||
|         buf.pop(); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return res; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // random version of the topological sort |  | ||||||
| // complexity: O(V*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| template <typename Gen> |  | ||||||
| std::vector<T> Graph<T>::topoSort(Gen &gen) |  | ||||||
| { |  | ||||||
|     std::stack<T>     buf; |  | ||||||
|     std::vector<T>    res; |  | ||||||
|     const T           *vPt; |  | ||||||
|     std::map<T, bool> tmpMarked(isMarked_); |  | ||||||
|      |  | ||||||
|     // visit function |  | ||||||
|     std::function<void(const T &)> visit = [&](const T &v) |  | ||||||
|     { |  | ||||||
|         if (tmpMarked.at(v)) |  | ||||||
|         { |  | ||||||
|             HADRON_ERROR("cannot topologically sort a cyclic graph"); |  | ||||||
|         } |  | ||||||
|         if (!isMarked(v)) |  | ||||||
|         { |  | ||||||
|             std::vector<T> child = getChildren(v); |  | ||||||
|              |  | ||||||
|             tmpMarked[v] = true; |  | ||||||
|             std::shuffle(child.begin(), child.end(), gen); |  | ||||||
|             for (auto &c: child) |  | ||||||
|             { |  | ||||||
|                 visit(c); |  | ||||||
|             } |  | ||||||
|             mark(v); |  | ||||||
|             tmpMarked[v] = false; |  | ||||||
|             buf.push(v); |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
|      |  | ||||||
|     // reset temporary marks |  | ||||||
|     for (auto &v: tmpMarked) |  | ||||||
|     { |  | ||||||
|         tmpMarked.at(v.first) = false; |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     // loop on unmarked vertices |  | ||||||
|     unmarkAll(); |  | ||||||
|     vPt = getRandomUnmarked(gen); |  | ||||||
|     while (vPt) |  | ||||||
|     { |  | ||||||
|         visit(*vPt); |  | ||||||
|         vPt = getRandomUnmarked(gen); |  | ||||||
|     } |  | ||||||
|     unmarkAll(); |  | ||||||
|      |  | ||||||
|     // create result vector |  | ||||||
|     while (!buf.empty()) |  | ||||||
|     { |  | ||||||
|         res.push_back(buf.top()); |  | ||||||
|         buf.pop(); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return res; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // generate all possible topological sorts |  | ||||||
| // Y. L. Varol & D. Rotem, Comput. J. 24(1), pp. 83–84, 1981 |  | ||||||
| // http://comjnl.oupjournals.org/cgi/doi/10.1093/comjnl/24.1.83 |  | ||||||
| // complexity: O(V*log(V)) (from the paper, but really ?) |  | ||||||
| template <typename T> |  | ||||||
| std::vector<std::vector<T>> Graph<T>::allTopoSort(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::vector<T>>    res; |  | ||||||
|     std::map<T, std::map<T, bool>> iMat; |  | ||||||
|      |  | ||||||
|     // create incidence matrix |  | ||||||
|     for (auto &v1: isMarked_) |  | ||||||
|     for (auto &v2: isMarked_) |  | ||||||
|     { |  | ||||||
|         iMat[v1.first][v2.first] = false; |  | ||||||
|     } |  | ||||||
|     for (auto &v: isMarked_) |  | ||||||
|     { |  | ||||||
|         auto cVec = getChildren(v.first); |  | ||||||
|          |  | ||||||
|         for (auto &c: cVec) |  | ||||||
|         { |  | ||||||
|             iMat[v.first][c] = true; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     // generate initial topological sort |  | ||||||
|     res.push_back(topoSort()); |  | ||||||
|      |  | ||||||
|     // generate all other topological sorts by permutation |  | ||||||
|     std::vector<T>            p = res[0]; |  | ||||||
|     const unsigned int        n = size(); |  | ||||||
|     std::vector<unsigned int> loc(n); |  | ||||||
|     unsigned int              i, k, k1; |  | ||||||
|     T                         obj_k, obj_k1; |  | ||||||
|     bool                      isFinal; |  | ||||||
|      |  | ||||||
|     for (unsigned int j = 0; j < n; ++j) |  | ||||||
|     { |  | ||||||
|         loc[j] = j; |  | ||||||
|     } |  | ||||||
|     i = 0; |  | ||||||
|     while (i < n-1) |  | ||||||
|     { |  | ||||||
|         k      = loc[i]; |  | ||||||
|         k1     = k + 1; |  | ||||||
|         obj_k  = p[k]; |  | ||||||
|         if (k1 >= n) |  | ||||||
|         { |  | ||||||
|             isFinal = true; |  | ||||||
|             obj_k1  = obj_k; |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             isFinal = false; |  | ||||||
|             obj_k1  = p[k1]; |  | ||||||
|         } |  | ||||||
|         if (iMat[res[0][i]][obj_k1] or isFinal) |  | ||||||
|         { |  | ||||||
|             for (unsigned int l = k; l >= i + 1; --l) |  | ||||||
|             { |  | ||||||
|                 p[l]   = p[l-1]; |  | ||||||
|             } |  | ||||||
|             p[i]   = obj_k; |  | ||||||
|             loc[i] = i; |  | ||||||
|             i++; |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             p[k]   = obj_k1; |  | ||||||
|             p[k1]  = obj_k; |  | ||||||
|             loc[i] = k1; |  | ||||||
|             i      = 0; |  | ||||||
|             res.push_back(p); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return res; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // build depedency matrix from topological sorts /////////////////////////////// |  | ||||||
| // complexity: something like O(V^2*log(V!)) |  | ||||||
| template <typename T> |  | ||||||
| std::map<T, std::map<T, bool>> |  | ||||||
| makeDependencyMatrix(const std::vector<std::vector<T>> &topSort) |  | ||||||
| { |  | ||||||
|     std::map<T, std::map<T, bool>> m; |  | ||||||
|     const std::vector<T>           &vList = topSort[0]; |  | ||||||
|      |  | ||||||
|     for (auto &v1: vList) |  | ||||||
|     for (auto &v2: vList) |  | ||||||
|     { |  | ||||||
|         bool dep = true; |  | ||||||
|          |  | ||||||
|         for (auto &t: topSort) |  | ||||||
|         { |  | ||||||
|             auto i1 = std::find(t.begin(), t.end(), v1); |  | ||||||
|             auto i2 = std::find(t.begin(), t.end(), v2); |  | ||||||
|              |  | ||||||
|             dep = dep and (i1 - i2 > 0); |  | ||||||
|             if (!dep) break; |  | ||||||
|         } |  | ||||||
|         m[v1][v2] = dep; |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return m; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Graph_hpp_ |  | ||||||
| @@ -1,80 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/HadronsXmlRun.cc |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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/Hadrons/Application.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace QCD; |  | ||||||
| using namespace Hadrons; |  | ||||||
|  |  | ||||||
| int main(int argc, char *argv[]) |  | ||||||
| { |  | ||||||
|     // parse command line |  | ||||||
|     std::string parameterFileName, scheduleFileName = ""; |  | ||||||
|      |  | ||||||
|     if (argc < 2) |  | ||||||
|     { |  | ||||||
|         std::cerr << "usage: " << argv[0] << " <parameter file> [<precomputed schedule>] [Grid options]"; |  | ||||||
|         std::cerr << std::endl; |  | ||||||
|         std::exit(EXIT_FAILURE); |  | ||||||
|     } |  | ||||||
|     parameterFileName = argv[1]; |  | ||||||
|     if (argc > 2) |  | ||||||
|     { |  | ||||||
|         if (argv[2][0] != '-') |  | ||||||
|         { |  | ||||||
|             scheduleFileName = argv[2]; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     // initialization |  | ||||||
|     Grid_init(&argc, &argv); |  | ||||||
|     HadronsLogError.Active(GridLogError.isActive()); |  | ||||||
|     HadronsLogWarning.Active(GridLogWarning.isActive()); |  | ||||||
|     HadronsLogMessage.Active(GridLogMessage.isActive()); |  | ||||||
|     HadronsLogIterative.Active(GridLogIterative.isActive()); |  | ||||||
|     HadronsLogDebug.Active(GridLogDebug.isActive()); |  | ||||||
|     LOG(Message) << "Grid initialized" << std::endl; |  | ||||||
|      |  | ||||||
|     // execution |  | ||||||
|     Application application(parameterFileName); |  | ||||||
|      |  | ||||||
|     application.parseParameterFile(parameterFileName); |  | ||||||
|     if (!scheduleFileName.empty()) |  | ||||||
|     { |  | ||||||
|         application.loadSchedule(scheduleFileName); |  | ||||||
|     } |  | ||||||
|     application.run(); |  | ||||||
|      |  | ||||||
|     // epilogue |  | ||||||
|     LOG(Message) << "Grid is finalizing now" << std::endl; |  | ||||||
|     Grid_finalize(); |  | ||||||
|      |  | ||||||
|     return EXIT_SUCCESS; |  | ||||||
| } |  | ||||||
| @@ -1,72 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/HadronsXmlSchedule.cc |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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/Hadrons/Application.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace QCD; |  | ||||||
| using namespace Hadrons; |  | ||||||
|  |  | ||||||
| int main(int argc, char *argv[]) |  | ||||||
| { |  | ||||||
|     // parse command line |  | ||||||
|     std::string parameterFileName, scheduleFileName; |  | ||||||
|      |  | ||||||
|     if (argc < 3) |  | ||||||
|     { |  | ||||||
|         std::cerr << "usage: " << argv[0] << " <parameter file> <schedule output> [Grid options]"; |  | ||||||
|         std::cerr << std::endl; |  | ||||||
|         std::exit(EXIT_FAILURE); |  | ||||||
|     } |  | ||||||
|     parameterFileName = argv[1]; |  | ||||||
|     scheduleFileName  = argv[2]; |  | ||||||
|      |  | ||||||
|     // initialization |  | ||||||
|     Grid_init(&argc, &argv); |  | ||||||
|     HadronsLogError.Active(GridLogError.isActive()); |  | ||||||
|     HadronsLogWarning.Active(GridLogWarning.isActive()); |  | ||||||
|     HadronsLogMessage.Active(GridLogMessage.isActive()); |  | ||||||
|     HadronsLogIterative.Active(GridLogIterative.isActive()); |  | ||||||
|     HadronsLogDebug.Active(GridLogDebug.isActive()); |  | ||||||
|     LOG(Message) << "Grid initialized" << std::endl; |  | ||||||
|      |  | ||||||
|     // execution |  | ||||||
|     Application application; |  | ||||||
|      |  | ||||||
|     application.parseParameterFile(parameterFileName); |  | ||||||
|     application.schedule(); |  | ||||||
|     application.printSchedule(); |  | ||||||
|     application.saveSchedule(scheduleFileName); |  | ||||||
|      |  | ||||||
|     // epilogue |  | ||||||
|     LOG(Message) << "Grid is finalizing now" << std::endl; |  | ||||||
|     Grid_finalize(); |  | ||||||
|      |  | ||||||
|     return EXIT_SUCCESS; |  | ||||||
| } |  | ||||||
| @@ -1,29 +0,0 @@ | |||||||
| lib_LIBRARIES = libHadrons.a |  | ||||||
| bin_PROGRAMS  = HadronsXmlRun HadronsXmlSchedule |  | ||||||
|  |  | ||||||
| include modules.inc |  | ||||||
|  |  | ||||||
| libHadrons_a_SOURCES = \ |  | ||||||
|     $(modules_cc)      \ |  | ||||||
|     Application.cc     \ |  | ||||||
|     Environment.cc     \ |  | ||||||
|     Global.cc          \ |  | ||||||
|     Module.cc |  | ||||||
| libHadrons_adir = $(pkgincludedir)/Hadrons |  | ||||||
| nobase_libHadrons_a_HEADERS = \ |  | ||||||
| 	$(modules_hpp)            \ |  | ||||||
| 	Application.hpp           \ |  | ||||||
| 	Environment.hpp           \ |  | ||||||
| 	Factory.hpp               \ |  | ||||||
| 	GeneticScheduler.hpp      \ |  | ||||||
| 	Global.hpp                \ |  | ||||||
| 	Graph.hpp                 \ |  | ||||||
| 	Module.hpp                \ |  | ||||||
| 	Modules.hpp               \ |  | ||||||
| 	ModuleFactory.hpp |  | ||||||
|  |  | ||||||
| HadronsXmlRun_SOURCES = HadronsXmlRun.cc |  | ||||||
| HadronsXmlRun_LDADD   = libHadrons.a -lGrid |  | ||||||
|  |  | ||||||
| HadronsXmlSchedule_SOURCES = HadronsXmlSchedule.cc |  | ||||||
| HadronsXmlSchedule_LDADD   = libHadrons.a -lGrid |  | ||||||
| @@ -1,71 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Module.cc |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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/Hadrons/Module.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace QCD; |  | ||||||
| using namespace Hadrons; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                       ModuleBase implementation                            * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| ModuleBase::ModuleBase(const std::string name) |  | ||||||
| : name_(name) |  | ||||||
| , env_(Environment::getInstance()) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // access ////////////////////////////////////////////////////////////////////// |  | ||||||
| std::string ModuleBase::getName(void) const |  | ||||||
| { |  | ||||||
|     return name_; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| Environment & ModuleBase::env(void) const |  | ||||||
| { |  | ||||||
|     return env_; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // get factory registration name if available |  | ||||||
| std::string ModuleBase::getRegisteredName(void) |  | ||||||
| { |  | ||||||
|     HADRON_ERROR("module '" + getName() + "' has a type not registered" |  | ||||||
|                  + " in the factory"); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| void ModuleBase::operator()(void) |  | ||||||
| { |  | ||||||
|     setup(); |  | ||||||
|     if (!env().isDryRun()) |  | ||||||
|     { |  | ||||||
|         execute(); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,198 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Module.hpp |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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 */ |  | ||||||
|  |  | ||||||
| #ifndef Hadrons_Module_hpp_ |  | ||||||
| #define Hadrons_Module_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Environment.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| // module registration macros |  | ||||||
| #define MODULE_REGISTER(mod, base)\ |  | ||||||
| class mod: public base\ |  | ||||||
| {\ |  | ||||||
| public:\ |  | ||||||
|     typedef base Base;\ |  | ||||||
|     using Base::Base;\ |  | ||||||
|     virtual std::string getRegisteredName(void)\ |  | ||||||
|     {\ |  | ||||||
|         return std::string(#mod);\ |  | ||||||
|     }\ |  | ||||||
| };\ |  | ||||||
| class mod##ModuleRegistrar\ |  | ||||||
| {\ |  | ||||||
| public:\ |  | ||||||
|     mod##ModuleRegistrar(void)\ |  | ||||||
|     {\ |  | ||||||
|         ModuleFactory &modFac = ModuleFactory::getInstance();\ |  | ||||||
|         modFac.registerBuilder(#mod, [&](const std::string name)\ |  | ||||||
|                               {\ |  | ||||||
|                                   return std::unique_ptr<mod>(new mod(name));\ |  | ||||||
|                               });\ |  | ||||||
|     }\ |  | ||||||
| };\ |  | ||||||
| static mod##ModuleRegistrar mod##ModuleRegistrarInstance; |  | ||||||
|  |  | ||||||
| #define MODULE_REGISTER_NS(mod, base, ns)\ |  | ||||||
| class mod: public base\ |  | ||||||
| {\ |  | ||||||
| public:\ |  | ||||||
|     typedef base Base;\ |  | ||||||
|     using Base::Base;\ |  | ||||||
|     virtual std::string getRegisteredName(void)\ |  | ||||||
|     {\ |  | ||||||
|         return std::string(#ns "::" #mod);\ |  | ||||||
|     }\ |  | ||||||
| };\ |  | ||||||
| class ns##mod##ModuleRegistrar\ |  | ||||||
| {\ |  | ||||||
| public:\ |  | ||||||
|     ns##mod##ModuleRegistrar(void)\ |  | ||||||
|     {\ |  | ||||||
|         ModuleFactory &modFac = ModuleFactory::getInstance();\ |  | ||||||
|         modFac.registerBuilder(#ns "::" #mod, [&](const std::string name)\ |  | ||||||
|                               {\ |  | ||||||
|                                   return std::unique_ptr<ns::mod>(new ns::mod(name));\ |  | ||||||
|                               });\ |  | ||||||
|     }\ |  | ||||||
| };\ |  | ||||||
| static ns##mod##ModuleRegistrar ns##mod##ModuleRegistrarInstance; |  | ||||||
|  |  | ||||||
| #define ARG(...) __VA_ARGS__ |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                            Module class                                    * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // base class |  | ||||||
| class ModuleBase |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     ModuleBase(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~ModuleBase(void) = default; |  | ||||||
|     // access |  | ||||||
|     std::string getName(void) const; |  | ||||||
|     Environment &env(void) const; |  | ||||||
|     // get factory registration name if available |  | ||||||
|     virtual std::string getRegisteredName(void); |  | ||||||
|     // dependencies/products |  | ||||||
|     virtual std::vector<std::string> getInput(void) = 0; |  | ||||||
|     virtual std::vector<std::string> getOutput(void) = 0; |  | ||||||
|     // parse parameters |  | ||||||
|     virtual void parseParameters(XmlReader &reader, const std::string name) = 0; |  | ||||||
|     virtual void saveParameters(XmlWriter &writer, const std::string name) = 0; |  | ||||||
|     // setup |  | ||||||
|     virtual void setup(void) {}; |  | ||||||
|     // execution |  | ||||||
|     void operator()(void); |  | ||||||
|     virtual void execute(void) = 0; |  | ||||||
| private: |  | ||||||
|     std::string name_; |  | ||||||
|     Environment &env_; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| // derived class, templating the parameter class |  | ||||||
| template <typename P> |  | ||||||
| class Module: public ModuleBase |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     typedef P Par; |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     Module(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~Module(void) = default; |  | ||||||
|     // parse parameters |  | ||||||
|     virtual void parseParameters(XmlReader &reader, const std::string name); |  | ||||||
|     virtual void saveParameters(XmlWriter &writer, const std::string name); |  | ||||||
|     // parameter access |  | ||||||
|     const P & par(void) const; |  | ||||||
|     void      setPar(const P &par); |  | ||||||
| private: |  | ||||||
|     P par_; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| // no parameter type |  | ||||||
| class NoPar {}; |  | ||||||
|  |  | ||||||
| template <> |  | ||||||
| class Module<NoPar>: public ModuleBase |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     Module(const std::string name): ModuleBase(name) {}; |  | ||||||
|     // destructor |  | ||||||
|     virtual ~Module(void) = default; |  | ||||||
|     // parse parameters (do nothing) |  | ||||||
|     virtual void parseParameters(XmlReader &reader, const std::string name) {}; |  | ||||||
|     virtual void saveParameters(XmlWriter &writer, const std::string name) |  | ||||||
|     { |  | ||||||
|         push(writer, "options"); |  | ||||||
|         pop(writer); |  | ||||||
|     }; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                           Template implementation                          * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| template <typename P> |  | ||||||
| Module<P>::Module(const std::string name) |  | ||||||
| : ModuleBase(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| template <typename P> |  | ||||||
| void Module<P>::parseParameters(XmlReader &reader, const std::string name) |  | ||||||
| { |  | ||||||
|     read(reader, name, par_); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename P> |  | ||||||
| void Module<P>::saveParameters(XmlWriter &writer, const std::string name) |  | ||||||
| { |  | ||||||
|     write(writer, name, par_); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename P> |  | ||||||
| const P & Module<P>::par(void) const |  | ||||||
| { |  | ||||||
|     return par_; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename P> |  | ||||||
| void Module<P>::setPar(const P &par) |  | ||||||
| { |  | ||||||
|     par_ = par; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Module_hpp_ |  | ||||||
| @@ -1,49 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/ModuleFactory.hpp |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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 */ |  | ||||||
|  |  | ||||||
| #ifndef Hadrons_ModuleFactory_hpp_ |  | ||||||
| #define Hadrons_ModuleFactory_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Factory.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                            ModuleFactory                                   * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| class ModuleFactory: public Factory<ModuleBase> |  | ||||||
| { |  | ||||||
|     SINGLETON_DEFCTOR(ModuleFactory) |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_ModuleFactory_hpp_ |  | ||||||
| @@ -1,40 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules.hpp |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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/Hadrons/Modules/MAction/DWF.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules/MAction/Wilson.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules/MContraction/Baryon.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules/MContraction/Meson.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules/MGauge/Load.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules/MGauge/Random.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules/MGauge/Unit.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules/MSolver/RBPrecCG.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules/MSource/Point.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules/MSource/SeqGamma.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules/MSource/Z2.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules/Quark.hpp> |  | ||||||
| @@ -1,134 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MAction/DWF.hpp |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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 */ |  | ||||||
|  |  | ||||||
| #ifndef Hadrons_DWF_hpp_ |  | ||||||
| #define Hadrons_DWF_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                     Domain wall quark action                               * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(MAction) |  | ||||||
|  |  | ||||||
| class DWFPar: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(DWFPar, |  | ||||||
|                                     std::string, gauge, |  | ||||||
|                                     unsigned int, Ls, |  | ||||||
|                                     double      , mass, |  | ||||||
|                                     double      , M5); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| class TDWF: public Module<DWFPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     TYPE_ALIASES(FImpl,); |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TDWF(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TDWF(void) = default; |  | ||||||
|     // dependency relation |  | ||||||
|     virtual std::vector<std::string> getInput(void); |  | ||||||
|     virtual std::vector<std::string> getOutput(void); |  | ||||||
|     // setup |  | ||||||
|     virtual void setup(void); |  | ||||||
|     // execution |  | ||||||
|     virtual void execute(void); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MODULE_REGISTER_NS(DWF, TDWF<FIMPL>, MAction); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                        DWF template implementation                         * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| TDWF<FImpl>::TDWF(const std::string name) |  | ||||||
| : Module<DWFPar>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TDWF<FImpl>::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in = {par().gauge}; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TDWF<FImpl>::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TDWF<FImpl>::setup(void) |  | ||||||
| { |  | ||||||
|     unsigned int size; |  | ||||||
|      |  | ||||||
|     size = 2*env().template lattice4dSize<typename FImpl::DoubledGaugeField>(); |  | ||||||
|     env().registerObject(getName(), size, par().Ls); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TDWF<FImpl>::execute(void) |  | ||||||
| { |  | ||||||
|     LOG(Message) << "Setting up domain wall fermion matrix with m= " |  | ||||||
|                  << par().mass << ", M5= " << par().M5 << " and Ls= " |  | ||||||
|                  << par().Ls << " using gauge field '" << par().gauge << "'" |  | ||||||
|                  << std::endl; |  | ||||||
|     env().createGrid(par().Ls); |  | ||||||
|     auto &U      = *env().template getObject<LatticeGaugeField>(par().gauge); |  | ||||||
|     auto &g4     = *env().getGrid(); |  | ||||||
|     auto &grb4   = *env().getRbGrid(); |  | ||||||
|     auto &g5     = *env().getGrid(par().Ls); |  | ||||||
|     auto &grb5   = *env().getRbGrid(par().Ls); |  | ||||||
|     FMat *fMatPt = new DomainWallFermion<FImpl>(U, g5, grb5, g4, grb4, |  | ||||||
|                                                 par().mass, par().M5); |  | ||||||
|     env().setObject(getName(), fMatPt); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_DWF_hpp_ |  | ||||||
| @@ -1,126 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MAction/Wilson.hpp |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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 */ |  | ||||||
|  |  | ||||||
| #ifndef Hadrons_Wilson_hpp_ |  | ||||||
| #define Hadrons_Wilson_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                            TWilson quark action                            * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(MAction) |  | ||||||
|  |  | ||||||
| class WilsonPar: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(WilsonPar, |  | ||||||
|                                     std::string, gauge, |  | ||||||
|                                     double     , mass); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| class TWilson: public Module<WilsonPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     TYPE_ALIASES(FImpl,); |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TWilson(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TWilson(void) = default; |  | ||||||
|     // dependencies/products |  | ||||||
|     virtual std::vector<std::string> getInput(void); |  | ||||||
|     virtual std::vector<std::string> getOutput(void); |  | ||||||
|     // setup |  | ||||||
|     virtual void setup(void); |  | ||||||
|     // execution |  | ||||||
|     virtual void execute(void); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MODULE_REGISTER_NS(Wilson, TWilson<FIMPL>, MAction); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                     TWilson template implementation                        * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| TWilson<FImpl>::TWilson(const std::string name) |  | ||||||
| : Module<WilsonPar>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TWilson<FImpl>::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in = {par().gauge}; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TWilson<FImpl>::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TWilson<FImpl>::setup(void) |  | ||||||
| { |  | ||||||
|     unsigned int size; |  | ||||||
|      |  | ||||||
|     size = 2*env().template lattice4dSize<typename FImpl::DoubledGaugeField>(); |  | ||||||
|     env().registerObject(getName(), size); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TWilson<FImpl>::execute() |  | ||||||
| { |  | ||||||
|     LOG(Message) << "Setting up TWilson fermion matrix with m= " << par().mass |  | ||||||
|                  << " using gauge field '" << par().gauge << "'" << std::endl; |  | ||||||
|     auto &U      = *env().template getObject<LatticeGaugeField>(par().gauge); |  | ||||||
|     auto &grid   = *env().getGrid(); |  | ||||||
|     auto &gridRb = *env().getRbGrid(); |  | ||||||
|     FMat *fMatPt = new WilsonFermion<FImpl>(U, grid, gridRb, par().mass); |  | ||||||
|     env().setObject(getName(), fMatPt); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Wilson_hpp_ |  | ||||||
| @@ -1,131 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MContraction/Baryon.hpp |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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 */ |  | ||||||
|  |  | ||||||
| #ifndef Hadrons_Baryon_hpp_ |  | ||||||
| #define Hadrons_Baryon_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                               Baryon                                       * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(MContraction) |  | ||||||
|  |  | ||||||
| class BaryonPar: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(BaryonPar, |  | ||||||
|                                     std::string, q1, |  | ||||||
|                                     std::string, q2, |  | ||||||
|                                     std::string, q3, |  | ||||||
|                                     std::string, output); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl1, typename FImpl2, typename FImpl3> |  | ||||||
| class TBaryon: public Module<BaryonPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     TYPE_ALIASES(FImpl1, 1); |  | ||||||
|     TYPE_ALIASES(FImpl2, 2); |  | ||||||
|     TYPE_ALIASES(FImpl3, 3); |  | ||||||
|     class Result: Serializable |  | ||||||
|     { |  | ||||||
|     public: |  | ||||||
|         GRID_SERIALIZABLE_CLASS_MEMBERS(Result, |  | ||||||
|                                         std::vector<std::vector<std::vector<Complex>>>, corr); |  | ||||||
|     }; |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TBaryon(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TBaryon(void) = default; |  | ||||||
|     // dependency relation |  | ||||||
|     virtual std::vector<std::string> getInput(void); |  | ||||||
|     virtual std::vector<std::string> getOutput(void); |  | ||||||
|     // execution |  | ||||||
|     virtual void execute(void); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MODULE_REGISTER_NS(Baryon, ARG(TBaryon<FIMPL, FIMPL, FIMPL>), MContraction); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                         TBaryon implementation                             * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl1, typename FImpl2, typename FImpl3> |  | ||||||
| TBaryon<FImpl1, FImpl2, FImpl3>::TBaryon(const std::string name) |  | ||||||
| : Module<BaryonPar>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl1, typename FImpl2, typename FImpl3> |  | ||||||
| std::vector<std::string> TBaryon<FImpl1, FImpl2, FImpl3>::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> input = {par().q1, par().q2, par().q3}; |  | ||||||
|      |  | ||||||
|     return input; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename FImpl1, typename FImpl2, typename FImpl3> |  | ||||||
| std::vector<std::string> TBaryon<FImpl1, FImpl2, FImpl3>::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl1, typename FImpl2, typename FImpl3> |  | ||||||
| void TBaryon<FImpl1, FImpl2, FImpl3>::execute(void) |  | ||||||
| { |  | ||||||
|     LOG(Message) << "Computing baryon contractions '" << getName() << "' using" |  | ||||||
|                  << " quarks '" << par().q1 << "', '" << par().q2 << "', and '" |  | ||||||
|                  << par().q3 << "'" << std::endl; |  | ||||||
|      |  | ||||||
|     XmlWriter             writer(par().output); |  | ||||||
|     PropagatorField1      &q1 = *env().template getObject<PropagatorField1>(par().q1); |  | ||||||
|     PropagatorField2      &q2 = *env().template getObject<PropagatorField2>(par().q2); |  | ||||||
|     PropagatorField3      &q3 = *env().template getObject<PropagatorField3>(par().q2); |  | ||||||
|     LatticeComplex        c(env().getGrid()); |  | ||||||
|     Result                result; |  | ||||||
|      |  | ||||||
|     // FIXME: do contractions |  | ||||||
|      |  | ||||||
|     write(writer, "meson", result); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Baryon_hpp_ |  | ||||||
| @@ -1,137 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MContraction/Meson.hpp |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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 */ |  | ||||||
|  |  | ||||||
| #ifndef Hadrons_Meson_hpp_ |  | ||||||
| #define Hadrons_Meson_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                                TMeson                                       * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(MContraction) |  | ||||||
|  |  | ||||||
| class MesonPar: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(MesonPar, |  | ||||||
|                                     std::string,    q1, |  | ||||||
|                                     std::string,    q2, |  | ||||||
|                                     std::string,    output, |  | ||||||
|                                     Gamma::Algebra, gammaSource, |  | ||||||
|                                     Gamma::Algebra, gammaSink); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl1, typename FImpl2> |  | ||||||
| class TMeson: public Module<MesonPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     TYPE_ALIASES(FImpl1, 1); |  | ||||||
|     TYPE_ALIASES(FImpl2, 2); |  | ||||||
|     class Result: Serializable |  | ||||||
|     { |  | ||||||
|     public: |  | ||||||
|         GRID_SERIALIZABLE_CLASS_MEMBERS(Result, std::vector<Complex>, corr); |  | ||||||
|     }; |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TMeson(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TMeson(void) = default; |  | ||||||
|     // dependencies/products |  | ||||||
|     virtual std::vector<std::string> getInput(void); |  | ||||||
|     virtual std::vector<std::string> getOutput(void); |  | ||||||
|     // execution |  | ||||||
|     virtual void execute(void); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MODULE_REGISTER_NS(Meson, ARG(TMeson<FIMPL, FIMPL>), MContraction); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                           TMeson implementation                            * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl1, typename FImpl2> |  | ||||||
| TMeson<FImpl1, FImpl2>::TMeson(const std::string name) |  | ||||||
| : Module<MesonPar>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl1, typename FImpl2> |  | ||||||
| std::vector<std::string> TMeson<FImpl1, FImpl2>::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> input = {par().q1, par().q2}; |  | ||||||
|      |  | ||||||
|     return input; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename FImpl1, typename FImpl2> |  | ||||||
| std::vector<std::string> TMeson<FImpl1, FImpl2>::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> output = {getName()}; |  | ||||||
|      |  | ||||||
|     return output; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl1, typename FImpl2> |  | ||||||
| void TMeson<FImpl1, FImpl2>::execute(void) |  | ||||||
| { |  | ||||||
|     LOG(Message) << "Computing meson contractions '" << getName() << "' using" |  | ||||||
|                  << " quarks '" << par().q1 << "' and '" << par().q2 << "'" |  | ||||||
|                  << std::endl; |  | ||||||
|      |  | ||||||
|     XmlWriter             writer(par().output); |  | ||||||
|     PropagatorField1      &q1 = *env().template getObject<PropagatorField1>(par().q1); |  | ||||||
|     PropagatorField2      &q2 = *env().template getObject<PropagatorField2>(par().q2); |  | ||||||
|     LatticeComplex        c(env().getGrid()); |  | ||||||
|     Gamma                 gSrc(par().gammaSource), gSnk(par().gammaSink); |  | ||||||
|     Gamma                 g5(Gamma::Algebra::Gamma5); |  | ||||||
|     std::vector<TComplex> buf; |  | ||||||
|     Result                result; |  | ||||||
|      |  | ||||||
|     c = trace(gSnk*q1*adj(gSrc)*g5*adj(q2)*g5); |  | ||||||
|     sliceSum(c, buf, Tp); |  | ||||||
|     result.corr.resize(buf.size()); |  | ||||||
|     for (unsigned int t = 0; t < buf.size(); ++t) |  | ||||||
|     { |  | ||||||
|         result.corr[t] = TensorRemove(buf[t]); |  | ||||||
|     } |  | ||||||
|     write(writer, "meson", result); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Meson_hpp_ |  | ||||||
| @@ -1,78 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MGauge/Load.cc |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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/Hadrons/Modules/MGauge/Load.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace Hadrons; |  | ||||||
| using namespace MGauge; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
| *                           TLoad implementation                               * |  | ||||||
| ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| TLoad::TLoad(const std::string name) |  | ||||||
| : Module<LoadPar>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| std::vector<std::string> TLoad::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::vector<std::string> TLoad::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| void TLoad::setup(void) |  | ||||||
| { |  | ||||||
|     env().registerLattice<LatticeGaugeField>(getName()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| void TLoad::execute(void) |  | ||||||
| { |  | ||||||
|     NerscField  header; |  | ||||||
|     std::string fileName = par().file + "." |  | ||||||
|                            + std::to_string(env().getTrajectory()); |  | ||||||
|      |  | ||||||
|     LOG(Message) << "Loading NERSC configuration from file '" << fileName |  | ||||||
|                  << "'" << std::endl; |  | ||||||
|     LatticeGaugeField &U = *env().createLattice<LatticeGaugeField>(getName()); |  | ||||||
|     NerscIO::readConfiguration(U, header, fileName); |  | ||||||
|     LOG(Message) << "NERSC header:" << std::endl; |  | ||||||
|     dump_nersc_header(header, LOG(Message)); |  | ||||||
| } |  | ||||||
| @@ -1,73 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MGauge/Load.hpp |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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 */ |  | ||||||
|  |  | ||||||
| #ifndef Hadrons_Load_hpp_ |  | ||||||
| #define Hadrons_Load_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                         Load a NERSC configuration                         * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(MGauge) |  | ||||||
|  |  | ||||||
| class LoadPar: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(LoadPar, |  | ||||||
|                                     std::string, file); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| class TLoad: public Module<LoadPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TLoad(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TLoad(void) = default; |  | ||||||
|     // dependency relation |  | ||||||
|     virtual std::vector<std::string> getInput(void); |  | ||||||
|     virtual std::vector<std::string> getOutput(void); |  | ||||||
|     // setup |  | ||||||
|     virtual void setup(void); |  | ||||||
|     // execution |  | ||||||
|     virtual void execute(void); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MODULE_REGISTER_NS(Load, TLoad, MGauge); |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Load_hpp_ |  | ||||||
| @@ -1,69 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MGauge/Random.cc |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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/Hadrons/Modules/MGauge/Random.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace Hadrons; |  | ||||||
| using namespace MGauge; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
| *                           TRandom implementation                            * |  | ||||||
| ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| TRandom::TRandom(const std::string name) |  | ||||||
| : Module<NoPar>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| std::vector<std::string> TRandom::getInput(void) |  | ||||||
| { |  | ||||||
|     return std::vector<std::string>(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::vector<std::string> TRandom::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| void TRandom::setup(void) |  | ||||||
| { |  | ||||||
|     env().registerLattice<LatticeGaugeField>(getName()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| void TRandom::execute(void) |  | ||||||
| { |  | ||||||
|     LOG(Message) << "Generating random gauge configuration" << std::endl; |  | ||||||
|     LatticeGaugeField &U = *env().createLattice<LatticeGaugeField>(getName()); |  | ||||||
|     SU3::HotConfiguration(*env().get4dRng(), U); |  | ||||||
| } |  | ||||||
| @@ -1,66 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MGauge/Random.hpp |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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 */ |  | ||||||
|  |  | ||||||
| #ifndef Hadrons_Random_hpp_ |  | ||||||
| #define Hadrons_Random_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                             Random gauge                                   * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(MGauge) |  | ||||||
|  |  | ||||||
| class TRandom: public Module<NoPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TRandom(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TRandom(void) = default; |  | ||||||
|     // dependency relation |  | ||||||
|     virtual std::vector<std::string> getInput(void); |  | ||||||
|     virtual std::vector<std::string> getOutput(void); |  | ||||||
|     // setup |  | ||||||
|     virtual void setup(void); |  | ||||||
|     // execution |  | ||||||
|     virtual void execute(void); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MODULE_REGISTER_NS(Random, TRandom, MGauge); |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Random_hpp_ |  | ||||||
| @@ -1,69 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MGauge/Unit.cc |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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/Hadrons/Modules/MGauge/Unit.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace Hadrons; |  | ||||||
| using namespace MGauge; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
| *                            TUnit implementation                             * |  | ||||||
| ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| TUnit::TUnit(const std::string name) |  | ||||||
| : Module<NoPar>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| std::vector<std::string> TUnit::getInput(void) |  | ||||||
| { |  | ||||||
|     return std::vector<std::string>(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::vector<std::string> TUnit::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| void TUnit::setup(void) |  | ||||||
| { |  | ||||||
|     env().registerLattice<LatticeGaugeField>(getName()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| void TUnit::execute(void) |  | ||||||
| { |  | ||||||
|     LOG(Message) << "Creating unit gauge configuration" << std::endl; |  | ||||||
|     LatticeGaugeField &U = *env().createLattice<LatticeGaugeField>(getName()); |  | ||||||
|     SU3::ColdConfiguration(*env().get4dRng(), U); |  | ||||||
| } |  | ||||||
| @@ -1,66 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MGauge/Unit.hpp |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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 */ |  | ||||||
|  |  | ||||||
| #ifndef Hadrons_Unit_hpp_ |  | ||||||
| #define Hadrons_Unit_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                              Unit gauge                                    * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(MGauge) |  | ||||||
|  |  | ||||||
| class TUnit: public Module<NoPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TUnit(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TUnit(void) = default; |  | ||||||
|     // dependencies/products |  | ||||||
|     virtual std::vector<std::string> getInput(void); |  | ||||||
|     virtual std::vector<std::string> getOutput(void); |  | ||||||
|     // setup |  | ||||||
|     virtual void setup(void); |  | ||||||
|     // execution |  | ||||||
|     virtual void execute(void); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MODULE_REGISTER_NS(Unit, TUnit, MGauge); |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Unit_hpp_ |  | ||||||
| @@ -1,132 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MSolver/RBPrecCG.hpp |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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 */ |  | ||||||
|  |  | ||||||
| #ifndef Hadrons_RBPrecCG_hpp_ |  | ||||||
| #define Hadrons_RBPrecCG_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                     Schur red-black preconditioned CG                      * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(MSolver) |  | ||||||
|  |  | ||||||
| class RBPrecCGPar: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(RBPrecCGPar, |  | ||||||
|                                     std::string, action, |  | ||||||
|                                     double     , residual); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| class TRBPrecCG: public Module<RBPrecCGPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     TYPE_ALIASES(FImpl,); |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TRBPrecCG(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TRBPrecCG(void) = default; |  | ||||||
|     // dependencies/products |  | ||||||
|     virtual std::vector<std::string> getInput(void); |  | ||||||
|     virtual std::vector<std::string> getOutput(void); |  | ||||||
|     // setup |  | ||||||
|     virtual void setup(void); |  | ||||||
|     // execution |  | ||||||
|     virtual void execute(void); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MODULE_REGISTER_NS(RBPrecCG, TRBPrecCG<FIMPL>, MSolver); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                      TRBPrecCG template implementation                     * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| TRBPrecCG<FImpl>::TRBPrecCG(const std::string name) |  | ||||||
| : Module(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TRBPrecCG<FImpl>::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in = {par().action}; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TRBPrecCG<FImpl>::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TRBPrecCG<FImpl>::setup(void) |  | ||||||
| { |  | ||||||
|     auto Ls = env().getObjectLs(par().action); |  | ||||||
|      |  | ||||||
|     env().registerObject(getName(), 0, Ls); |  | ||||||
|     env().addOwnership(getName(), par().action); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TRBPrecCG<FImpl>::execute(void) |  | ||||||
| { |  | ||||||
|     auto &mat   = *(env().template getObject<FMat>(par().action)); |  | ||||||
|     auto solver = [&mat, this](FermionField &sol, const FermionField &source) |  | ||||||
|     { |  | ||||||
|         ConjugateGradient<FermionField>           cg(par().residual, 10000); |  | ||||||
|         SchurRedBlackDiagMooeeSolve<FermionField> schurSolver(cg); |  | ||||||
|          |  | ||||||
|         schurSolver(mat, source, sol); |  | ||||||
|     }; |  | ||||||
|      |  | ||||||
|     LOG(Message) << "setting up Schur red-black preconditioned CG for" |  | ||||||
|                  << " action '" << par().action << "' with residual " |  | ||||||
|                  << par().residual << std::endl; |  | ||||||
|     env().setObject(getName(), new SolverFn(solver)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_RBPrecCG_hpp_ |  | ||||||
| @@ -1,135 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MSource/Point.hpp |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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 */ |  | ||||||
|  |  | ||||||
| #ifndef Hadrons_Point_hpp_ |  | ||||||
| #define Hadrons_Point_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /* |  | ||||||
|   |  | ||||||
|  Point source |  | ||||||
|  ------------ |  | ||||||
|  * src_x = delta_x,position |  | ||||||
|   |  | ||||||
|  * options: |  | ||||||
|  - position: space-separated integer sequence (e.g. "0 1 1 0") |  | ||||||
|   |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                                  TPoint                                     * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(MSource) |  | ||||||
|  |  | ||||||
| class PointPar: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(PointPar, |  | ||||||
|                                     std::string, position); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| class TPoint: public Module<PointPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     TYPE_ALIASES(FImpl,); |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TPoint(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TPoint(void) = default; |  | ||||||
|     // dependency relation |  | ||||||
|     virtual std::vector<std::string> getInput(void); |  | ||||||
|     virtual std::vector<std::string> getOutput(void); |  | ||||||
|     // setup |  | ||||||
|     virtual void setup(void); |  | ||||||
|     // execution |  | ||||||
|     virtual void execute(void); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MODULE_REGISTER_NS(Point, TPoint<FIMPL>, MSource); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                       TPoint template implementation                       * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| TPoint<FImpl>::TPoint(const std::string name) |  | ||||||
| : Module<PointPar>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TPoint<FImpl>::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TPoint<FImpl>::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TPoint<FImpl>::setup(void) |  | ||||||
| { |  | ||||||
|     env().template registerLattice<PropagatorField>(getName()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TPoint<FImpl>::execute(void) |  | ||||||
| { |  | ||||||
|     std::vector<int> position = strToVec<int>(par().position); |  | ||||||
|     typename SitePropagator::scalar_object id; |  | ||||||
|      |  | ||||||
|     LOG(Message) << "Creating point source at position [" << par().position |  | ||||||
|                  << "]" << std::endl; |  | ||||||
|     PropagatorField &src = *env().template createLattice<PropagatorField>(getName()); |  | ||||||
|     id  = 1.; |  | ||||||
|     src = zero; |  | ||||||
|     pokeSite(id, src, position); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Point_hpp_ |  | ||||||
| @@ -1,163 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MSource/SeqGamma.hpp |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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 */ |  | ||||||
|  |  | ||||||
| #ifndef Hadrons_SeqGamma_hpp_ |  | ||||||
| #define Hadrons_SeqGamma_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /* |  | ||||||
|   |  | ||||||
|  Sequential source |  | ||||||
|  ----------------------------- |  | ||||||
|  * src_x = q_x * theta(x_3 - tA) * theta(tB - x_3) * gamma * exp(i x.mom) |  | ||||||
|   |  | ||||||
|  * options: |  | ||||||
|  - q: input propagator (string) |  | ||||||
|  - tA: begin timeslice (integer) |  | ||||||
|  - tB: end timesilce (integer) |  | ||||||
|  - gamma: gamma product to insert (integer) |  | ||||||
|  - mom: momentum insertion, space-separated float sequence (e.g ".1 .2 1. 0.") |  | ||||||
|   |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                         SeqGamma                                 * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(MSource) |  | ||||||
|  |  | ||||||
| class SeqGammaPar: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(SeqGammaPar, |  | ||||||
|                                     std::string,    q, |  | ||||||
|                                     unsigned int,   tA, |  | ||||||
|                                     unsigned int,   tB, |  | ||||||
|                                     Gamma::Algebra, gamma, |  | ||||||
|                                     std::string,    mom); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| class TSeqGamma: public Module<SeqGammaPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     TYPE_ALIASES(FImpl,); |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TSeqGamma(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TSeqGamma(void) = default; |  | ||||||
|     // dependency relation |  | ||||||
|     virtual std::vector<std::string> getInput(void); |  | ||||||
|     virtual std::vector<std::string> getOutput(void); |  | ||||||
|     // setup |  | ||||||
|     virtual void setup(void); |  | ||||||
|     // execution |  | ||||||
|     virtual void execute(void); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MODULE_REGISTER_NS(SeqGamma, TSeqGamma<FIMPL>, MSource); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                         TSeqGamma implementation                           * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| TSeqGamma<FImpl>::TSeqGamma(const std::string name) |  | ||||||
| : Module<SeqGammaPar>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TSeqGamma<FImpl>::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in = {par().q}; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TSeqGamma<FImpl>::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TSeqGamma<FImpl>::setup(void) |  | ||||||
| { |  | ||||||
|     env().template registerLattice<PropagatorField>(getName()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TSeqGamma<FImpl>::execute(void) |  | ||||||
| { |  | ||||||
|     if (par().tA == par().tB) |  | ||||||
|     { |  | ||||||
|         LOG(Message) << "Generating gamma_" << par().gamma |  | ||||||
|                      << " sequential source at t= " << par().tA << std::endl; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         LOG(Message) << "Generating gamma_" << par().gamma |  | ||||||
|                      << " sequential source for " |  | ||||||
|                      << par().tA << " <= t <= " << par().tB << std::endl; |  | ||||||
|     } |  | ||||||
|     PropagatorField &src = *env().template createLattice<PropagatorField>(getName()); |  | ||||||
|     PropagatorField &q   = *env().template getObject<PropagatorField>(par().q); |  | ||||||
|     Lattice<iScalar<vInteger>> t(env().getGrid()); |  | ||||||
|     LatticeComplex             ph(env().getGrid()), coor(env().getGrid()); |  | ||||||
|     Gamma                      g(par().gamma); |  | ||||||
|     std::vector<Real>          p; |  | ||||||
|     Complex                    i(0.0,1.0); |  | ||||||
|      |  | ||||||
|     p  = strToVec<Real>(par().mom); |  | ||||||
|     ph = zero; |  | ||||||
|     for(unsigned int mu = 0; mu < env().getNd(); mu++) |  | ||||||
|     { |  | ||||||
|         LatticeCoordinate(coor, mu); |  | ||||||
|         ph = ph + p[mu]*coor; |  | ||||||
|     } |  | ||||||
|     ph = exp(i*ph); |  | ||||||
|     LatticeCoordinate(t, Tp); |  | ||||||
|     src = where((t >= par().tA) and (t <= par().tB), ph*(g*q), 0.*q); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_SeqGamma_hpp_ |  | ||||||
| @@ -1,151 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MSource/Z2.hpp |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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 */ |  | ||||||
|  |  | ||||||
| #ifndef Hadrons_Z2_hpp_ |  | ||||||
| #define Hadrons_Z2_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /* |  | ||||||
|   |  | ||||||
|  Z_2 stochastic source |  | ||||||
|  ----------------------------- |  | ||||||
|  * src_x = eta_x * theta(x_3 - tA) * theta(tB - x_3) |  | ||||||
|   |  | ||||||
|  the eta_x are independent uniform random numbers in {+/- 1 +/- i} |  | ||||||
|   |  | ||||||
|  * options: |  | ||||||
|  - tA: begin timeslice (integer) |  | ||||||
|  - tB: end timesilce (integer) |  | ||||||
|   |  | ||||||
|  */ |  | ||||||
|   |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                          Z2 stochastic source                              * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(MSource) |  | ||||||
|  |  | ||||||
| class Z2Par: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(Z2Par, |  | ||||||
|                                     unsigned int, tA, |  | ||||||
|                                     unsigned int, tB); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| class TZ2: public Module<Z2Par> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     TYPE_ALIASES(FImpl,); |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TZ2(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TZ2(void) = default; |  | ||||||
|     // dependency relation |  | ||||||
|     virtual std::vector<std::string> getInput(void); |  | ||||||
|     virtual std::vector<std::string> getOutput(void); |  | ||||||
|     // setup |  | ||||||
|     virtual void setup(void); |  | ||||||
|     // execution |  | ||||||
|     virtual void execute(void); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MODULE_REGISTER_NS(Z2, TZ2<FIMPL>, MSource); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                       TZ2 template implementation                          * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| TZ2<FImpl>::TZ2(const std::string name) |  | ||||||
| : Module<Z2Par>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TZ2<FImpl>::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TZ2<FImpl>::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TZ2<FImpl>::setup(void) |  | ||||||
| { |  | ||||||
|     env().template registerLattice<PropagatorField>(getName()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TZ2<FImpl>::execute(void) |  | ||||||
| { |  | ||||||
|     Lattice<iScalar<vInteger>> t(env().getGrid()); |  | ||||||
|     LatticeComplex             eta(env().getGrid()); |  | ||||||
|     Complex                    shift(1., 1.); |  | ||||||
|      |  | ||||||
|     if (par().tA == par().tB) |  | ||||||
|     { |  | ||||||
|         LOG(Message) << "Generating Z_2 wall source at t= " << par().tA |  | ||||||
|         << std::endl; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         LOG(Message) << "Generating Z_2 band for " << par().tA << " <= t <= " |  | ||||||
|         << par().tB << std::endl; |  | ||||||
|     } |  | ||||||
|     PropagatorField &src = *env().template createLattice<PropagatorField>(getName()); |  | ||||||
|     LatticeCoordinate(t, Tp); |  | ||||||
|     bernoulli(*env().get4dRng(), eta); |  | ||||||
|     eta = (2.*eta - shift)*(1./::sqrt(2.)); |  | ||||||
|     eta = where((t >= par().tA) and (t <= par().tB), eta, 0.*eta); |  | ||||||
|     src = 1.; |  | ||||||
|     src = src*eta; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Z2_hpp_ |  | ||||||
| @@ -1,185 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/Quark.hpp |  | ||||||
|  |  | ||||||
| Copyright (C) 2015 |  | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> |  | ||||||
|  |  | ||||||
| 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 */ |  | ||||||
|  |  | ||||||
| #ifndef Hadrons_Quark_hpp_ |  | ||||||
| #define Hadrons_Quark_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                               TQuark                                       * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| class QuarkPar: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(QuarkPar, |  | ||||||
|                                     std::string, source, |  | ||||||
|                                     std::string, solver); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| class TQuark: public Module<QuarkPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     TYPE_ALIASES(FImpl,); |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TQuark(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TQuark(void) = default; |  | ||||||
|     // dependencies/products |  | ||||||
|     virtual std::vector<std::string> getInput(void); |  | ||||||
|     virtual std::vector<std::string> getOutput(void); |  | ||||||
|     // setup |  | ||||||
|     virtual void setup(void); |  | ||||||
|     // execution |  | ||||||
|     virtual void execute(void); |  | ||||||
| private: |  | ||||||
|     unsigned int Ls_; |  | ||||||
|     SolverFn     *solver_{nullptr}; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MODULE_REGISTER(Quark, TQuark<FIMPL>); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                          TQuark implementation                             * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| TQuark<FImpl>::TQuark(const std::string name) |  | ||||||
| : Module(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TQuark<FImpl>::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in = {par().source, par().solver}; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TQuark<FImpl>::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName(), getName() + "_5d"}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TQuark<FImpl>::setup(void) |  | ||||||
| { |  | ||||||
|     Ls_ = env().getObjectLs(par().solver); |  | ||||||
|     env().template registerLattice<PropagatorField>(getName()); |  | ||||||
|     if (Ls_ > 1) |  | ||||||
|     { |  | ||||||
|         env().template registerLattice<PropagatorField>(getName() + "_5d", Ls_); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TQuark<FImpl>::execute(void) |  | ||||||
| { |  | ||||||
|     LOG(Message) << "Computing quark propagator '" << getName() << "'" |  | ||||||
|                  << std::endl; |  | ||||||
|      |  | ||||||
|     FermionField    source(env().getGrid(Ls_)), sol(env().getGrid(Ls_)), |  | ||||||
|                     tmp(env().getGrid()); |  | ||||||
|     std::string     propName = (Ls_ == 1) ? getName() : (getName() + "_5d"); |  | ||||||
|     PropagatorField &prop    = *env().template createLattice<PropagatorField>(propName); |  | ||||||
|     PropagatorField &fullSrc = *env().template getObject<PropagatorField>(par().source); |  | ||||||
|     SolverFn        &solver  = *env().template getObject<SolverFn>(par().solver); |  | ||||||
|     if (Ls_ > 1) |  | ||||||
|     { |  | ||||||
|         env().template createLattice<PropagatorField>(getName()); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     LOG(Message) << "Inverting using solver '" << par().solver |  | ||||||
|                  << "' on source '" << par().source << "'" << std::endl; |  | ||||||
|     for (unsigned int s = 0; s < Ns; ++s) |  | ||||||
|     for (unsigned int c = 0; c < Nc; ++c) |  | ||||||
|     { |  | ||||||
|         LOG(Message) << "Inversion for spin= " << s << ", color= " << c |  | ||||||
|         << std::endl; |  | ||||||
|         // source conversion for 4D sources |  | ||||||
|         if (!env().isObject5d(par().source)) |  | ||||||
|         { |  | ||||||
|             if (Ls_ == 1) |  | ||||||
|             { |  | ||||||
|                 PropToFerm(source, fullSrc, s, c); |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 source = zero; |  | ||||||
|                 PropToFerm(tmp, fullSrc, s, c); |  | ||||||
|                 InsertSlice(tmp, source, 0, 0); |  | ||||||
|                 InsertSlice(tmp, source, Ls_-1, 0); |  | ||||||
|                 axpby_ssp_pplus(source, 0., source, 1., source, 0, 0); |  | ||||||
|                 axpby_ssp_pminus(source, 0., source, 1., source, Ls_-1, Ls_-1); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         // source conversion for 5D sources |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             if (Ls_ != env().getObjectLs(par().source)) |  | ||||||
|             { |  | ||||||
|                 HADRON_ERROR("Ls mismatch between quark action and source"); |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 PropToFerm(source, fullSrc, s, c); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         sol = zero; |  | ||||||
|         solver(sol, source); |  | ||||||
|         FermToProp(prop, sol, s, c); |  | ||||||
|         // create 4D propagators from 5D one if necessary |  | ||||||
|         if (Ls_ > 1) |  | ||||||
|         { |  | ||||||
|             PropagatorField &p4d = |  | ||||||
|                 *env().template getObject<PropagatorField>(getName()); |  | ||||||
|              |  | ||||||
|             axpby_ssp_pminus(sol, 0., sol, 1., sol, 0, 0); |  | ||||||
|             axpby_ssp_pplus(sol, 0., sol, 1., sol, 0, Ls_-1); |  | ||||||
|             ExtractSlice(tmp, sol, 0, 0); |  | ||||||
|             FermToProp(p4d, tmp, s, c); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Quark_hpp_ |  | ||||||
| @@ -1,39 +0,0 @@ | |||||||
| #include <Grid/Hadrons/Modules/___FILEBASENAME___.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace Hadrons; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
| *                  T___FILEBASENAME___ implementation                             * |  | ||||||
| ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| T___FILEBASENAME___::T___FILEBASENAME___(const std::string name) |  | ||||||
| : Module<___FILEBASENAME___Par>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| std::vector<std::string> T___FILEBASENAME___::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::vector<std::string> T___FILEBASENAME___::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| void T___FILEBASENAME___::setup(void) |  | ||||||
| { |  | ||||||
|  |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| void T___FILEBASENAME___::execute(void) |  | ||||||
| { |  | ||||||
|  |  | ||||||
| } |  | ||||||
| @@ -1,40 +0,0 @@ | |||||||
| #ifndef Hadrons____FILEBASENAME____hpp_ |  | ||||||
| #define Hadrons____FILEBASENAME____hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                         ___FILEBASENAME___                                 * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| class ___FILEBASENAME___Par: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(___FILEBASENAME___Par,  |  | ||||||
|                                     unsigned int, i); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| class T___FILEBASENAME___: public Module<___FILEBASENAME___Par> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     T___FILEBASENAME___(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~T___FILEBASENAME___(void) = default; |  | ||||||
|     // dependency relation |  | ||||||
|     virtual std::vector<std::string> getInput(void); |  | ||||||
|     virtual std::vector<std::string> getOutput(void); |  | ||||||
|     // setup |  | ||||||
|     virtual void setup(void); |  | ||||||
|     // execution |  | ||||||
|     virtual void execute(void); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MODULE_REGISTER(___FILEBASENAME___, T___FILEBASENAME___); |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons____FILEBASENAME____hpp_ |  | ||||||
| @@ -1,40 +0,0 @@ | |||||||
| #include <Grid/Hadrons/Modules/___NAMESPACE___/___FILEBASENAME___.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace Hadrons; |  | ||||||
| using namespace ___NAMESPACE___; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
| *                  T___FILEBASENAME___ implementation                             * |  | ||||||
| ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| T___FILEBASENAME___::T___FILEBASENAME___(const std::string name) |  | ||||||
| : Module<___FILEBASENAME___Par>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| std::vector<std::string> T___FILEBASENAME___::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::vector<std::string> T___FILEBASENAME___::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| void T___FILEBASENAME___::setup(void) |  | ||||||
| { |  | ||||||
|  |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| void T___FILEBASENAME___::execute(void) |  | ||||||
| { |  | ||||||
|  |  | ||||||
| } |  | ||||||
| @@ -1,44 +0,0 @@ | |||||||
| #ifndef Hadrons____FILEBASENAME____hpp_ |  | ||||||
| #define Hadrons____FILEBASENAME____hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                         ___FILEBASENAME___                                 * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(___NAMESPACE___) |  | ||||||
|  |  | ||||||
| class ___FILEBASENAME___Par: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(___FILEBASENAME___Par, |  | ||||||
|                                     unsigned int, i); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| class T___FILEBASENAME___: public Module<___FILEBASENAME___Par> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     T___FILEBASENAME___(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~T___FILEBASENAME___(void) = default; |  | ||||||
|     // dependency relation |  | ||||||
|     virtual std::vector<std::string> getInput(void); |  | ||||||
|     virtual std::vector<std::string> getOutput(void); |  | ||||||
|     // setup |  | ||||||
|     virtual void setup(void); |  | ||||||
|     // execution |  | ||||||
|     virtual void execute(void); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MODULE_REGISTER_NS(___FILEBASENAME___, T___FILEBASENAME___, ___NAMESPACE___); |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons____FILEBASENAME____hpp_ |  | ||||||
| @@ -1,81 +0,0 @@ | |||||||
| #ifndef Hadrons____FILEBASENAME____hpp_ |  | ||||||
| #define Hadrons____FILEBASENAME____hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                         ___FILEBASENAME___                                 * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| class ___FILEBASENAME___Par: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(___FILEBASENAME___Par, |  | ||||||
|                                     unsigned int, i); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| class T___FILEBASENAME___: public Module<___FILEBASENAME___Par> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     T___FILEBASENAME___(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~T___FILEBASENAME___(void) = default; |  | ||||||
|     // dependency relation |  | ||||||
|     virtual std::vector<std::string> getInput(void); |  | ||||||
|     virtual std::vector<std::string> getOutput(void); |  | ||||||
|     // setup |  | ||||||
|     virtual void setup(void); |  | ||||||
|     // execution |  | ||||||
|     virtual void execute(void); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MODULE_REGISTER(___FILEBASENAME___, T___FILEBASENAME___<FIMPL>); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                 T___FILEBASENAME___ implementation                             * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| T___FILEBASENAME___<FImpl>::T___FILEBASENAME___(const std::string name) |  | ||||||
| : Module<___FILEBASENAME___Par>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> T___FILEBASENAME___<FImpl>::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> T___FILEBASENAME___<FImpl>::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void T___FILEBASENAME___<FImpl>::setup(void) |  | ||||||
| { |  | ||||||
|      |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void T___FILEBASENAME___<FImpl>::execute(void) |  | ||||||
| { |  | ||||||
|      |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons____FILEBASENAME____hpp_ |  | ||||||
| @@ -1,85 +0,0 @@ | |||||||
| #ifndef Hadrons____FILEBASENAME____hpp_ |  | ||||||
| #define Hadrons____FILEBASENAME____hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                         ___FILEBASENAME___                                 * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(___NAMESPACE___) |  | ||||||
|  |  | ||||||
| class ___FILEBASENAME___Par: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(___FILEBASENAME___Par, |  | ||||||
|                                     unsigned int, i); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| class T___FILEBASENAME___: public Module<___FILEBASENAME___Par> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     T___FILEBASENAME___(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~T___FILEBASENAME___(void) = default; |  | ||||||
|     // dependency relation |  | ||||||
|     virtual std::vector<std::string> getInput(void); |  | ||||||
|     virtual std::vector<std::string> getOutput(void); |  | ||||||
|     // setup |  | ||||||
|     virtual void setup(void); |  | ||||||
|     // execution |  | ||||||
|     virtual void execute(void); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MODULE_REGISTER_NS(___FILEBASENAME___, T___FILEBASENAME___<FIMPL>, ___NAMESPACE___); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                 T___FILEBASENAME___ implementation                             * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| T___FILEBASENAME___<FImpl>::T___FILEBASENAME___(const std::string name) |  | ||||||
| : Module<___FILEBASENAME___Par>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> T___FILEBASENAME___<FImpl>::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> T___FILEBASENAME___<FImpl>::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void T___FILEBASENAME___<FImpl>::setup(void) |  | ||||||
| { |  | ||||||
|      |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void T___FILEBASENAME___<FImpl>::execute(void) |  | ||||||
| { |  | ||||||
|      |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons____FILEBASENAME____hpp_ |  | ||||||
| @@ -1,31 +0,0 @@ | |||||||
| #!/usr/bin/env bash |  | ||||||
|  |  | ||||||
| if (( $# != 1 && $# != 2)); then |  | ||||||
|     echo "usage: `basename $0` <module name> [<namespace>]" 1>&2 |  | ||||||
|     exit 1 |  | ||||||
| fi |  | ||||||
| NAME=$1 |  | ||||||
| NS=$2 |  | ||||||
|  |  | ||||||
| if (( $# == 1 )); then |  | ||||||
| 	if [ -e "Modules/${NAME}.cc" ] || [ -e "Modules/${NAME}.hpp" ]; then |  | ||||||
| 	    echo "error: files Modules/${NAME}.* already exists" 1>&2 |  | ||||||
| 	    exit 1 |  | ||||||
| 	fi |  | ||||||
| 	sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module.cc.template > Modules/${NAME}.cc |  | ||||||
| 	sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module.hpp.template > Modules/${NAME}.hpp |  | ||||||
| elif (( $# == 2 )); then |  | ||||||
| 	mkdir -p Modules/${NS} |  | ||||||
| 	if [ -e "Modules/${NS}/${NAME}.cc" ] || [ -e "Modules/${NS}/${NAME}.hpp" ]; then |  | ||||||
| 	    echo "error: files Modules/${NS}/${NAME}.* already exists" 1>&2 |  | ||||||
| 	    exit 1 |  | ||||||
| 	fi |  | ||||||
| 	TMPCC=".${NS}.${NAME}.tmp.cc" |  | ||||||
| 	TMPHPP=".${NS}.${NAME}.tmp.hpp" |  | ||||||
| 	sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module_in_NS.cc.template  > ${TMPCC} |  | ||||||
| 	sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module_in_NS.hpp.template > ${TMPHPP} |  | ||||||
| 	sed "s/___NAMESPACE___/${NS}/g" ${TMPCC}  > Modules/${NS}/${NAME}.cc |  | ||||||
| 	sed "s/___NAMESPACE___/${NS}/g" ${TMPHPP} > Modules/${NS}/${NAME}.hpp |  | ||||||
| 	rm -f ${TMPCC} ${TMPHPP} |  | ||||||
| fi |  | ||||||
| ./make_module_list.sh |  | ||||||
| @@ -1,28 +0,0 @@ | |||||||
| #!/usr/bin/env bash |  | ||||||
|  |  | ||||||
| if (( $# != 1 && $# != 2)); then |  | ||||||
|     echo "usage: `basename $0` <module name> [<namespace>]" 1>&2 |  | ||||||
|     exit 1 |  | ||||||
| fi |  | ||||||
| NAME=$1 |  | ||||||
| NS=$2 |  | ||||||
|  |  | ||||||
| if (( $# == 1 )); then |  | ||||||
| 	if [ -e "Modules/${NAME}.cc" ] || [ -e "Modules/${NAME}.hpp" ]; then |  | ||||||
| 	    echo "error: files Modules/${NAME}.* already exists" 1>&2 |  | ||||||
| 	    exit 1 |  | ||||||
| 	fi |  | ||||||
| 	sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module_tmp.hpp.template > Modules/${NAME}.hpp |  | ||||||
| elif (( $# == 2 )); then |  | ||||||
| 	mkdir -p Modules/${NS} |  | ||||||
| 	if [ -e "Modules/${NS}/${NAME}.cc" ] || [ -e "Modules/${NS}/${NAME}.hpp" ]; then |  | ||||||
| 	    echo "error: files Modules/${NS}/${NAME}.* already exists" 1>&2 |  | ||||||
| 	    exit 1 |  | ||||||
| 	fi |  | ||||||
| 	TMPCC=".${NS}.${NAME}.tmp.cc" |  | ||||||
| 	TMPHPP=".${NS}.${NAME}.tmp.hpp" |  | ||||||
| 	sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module_tmp_in_NS.hpp.template > ${TMPHPP} |  | ||||||
| 	sed "s/___NAMESPACE___/${NS}/g" ${TMPHPP} > Modules/${NS}/${NAME}.hpp |  | ||||||
| 	rm -f ${TMPCC} ${TMPHPP} |  | ||||||
| fi |  | ||||||
| ./make_module_list.sh |  | ||||||
| @@ -1,12 +0,0 @@ | |||||||
| #!/usr/bin/env bash |  | ||||||
|  |  | ||||||
| echo 'modules_cc =\' > modules.inc |  | ||||||
| find Modules -name '*.cc' -type f -print | sed 's/^/  /;$q;s/$/ \\/' >> modules.inc |  | ||||||
| echo '' >> modules.inc |  | ||||||
| echo 'modules_hpp =\' >> modules.inc |  | ||||||
| find Modules -name '*.hpp' -type f -print | sed 's/^/  /;$q;s/$/ \\/' >> modules.inc |  | ||||||
| echo '' >> modules.inc |  | ||||||
| rm -f Modules.hpp |  | ||||||
| for f in `find Modules -name '*.hpp'`; do |  | ||||||
| 	echo "#include <Grid/Hadrons/${f}>" >> Modules.hpp |  | ||||||
| done |  | ||||||
| @@ -1,19 +0,0 @@ | |||||||
| modules_cc =\ |  | ||||||
|   Modules/MGauge/Load.cc \ |  | ||||||
|   Modules/MGauge/Random.cc \ |  | ||||||
|   Modules/MGauge/Unit.cc |  | ||||||
|  |  | ||||||
| modules_hpp =\ |  | ||||||
|   Modules/MAction/DWF.hpp \ |  | ||||||
|   Modules/MAction/Wilson.hpp \ |  | ||||||
|   Modules/MContraction/Baryon.hpp \ |  | ||||||
|   Modules/MContraction/Meson.hpp \ |  | ||||||
|   Modules/MGauge/Load.hpp \ |  | ||||||
|   Modules/MGauge/Random.hpp \ |  | ||||||
|   Modules/MGauge/Unit.hpp \ |  | ||||||
|   Modules/MSolver/RBPrecCG.hpp \ |  | ||||||
|   Modules/MSource/Point.hpp \ |  | ||||||
|   Modules/MSource/SeqGamma.hpp \ |  | ||||||
|   Modules/MSource/Z2.hpp \ |  | ||||||
|   Modules/Quark.hpp |  | ||||||
|  |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| SUBDIRS = Hadrons |  | ||||||
| @@ -42,14 +42,15 @@ Author: Peter Boyle <paboyle@ph.ed.ac.uk> | |||||||
| #include <Grid/algorithms/iterative/ConjugateResidual.h> | #include <Grid/algorithms/iterative/ConjugateResidual.h> | ||||||
| #include <Grid/algorithms/iterative/NormalEquations.h> | #include <Grid/algorithms/iterative/NormalEquations.h> | ||||||
| #include <Grid/algorithms/iterative/SchurRedBlack.h> | #include <Grid/algorithms/iterative/SchurRedBlack.h> | ||||||
|  | 
 | ||||||
| #include <Grid/algorithms/iterative/ConjugateGradientMultiShift.h> | #include <Grid/algorithms/iterative/ConjugateGradientMultiShift.h> | ||||||
| #include <Grid/algorithms/iterative/ConjugateGradientMixedPrec.h> | #include <Grid/algorithms/iterative/ConjugateGradientMixedPrec.h> | ||||||
| 
 | 
 | ||||||
| // Lanczos support
 | // Lanczos support
 | ||||||
| #include <Grid/algorithms/iterative/MatrixUtils.h> | #include <Grid/algorithms/iterative/MatrixUtils.h> | ||||||
| #include <Grid/algorithms/iterative/ImplicitlyRestartedLanczos.h> | #include <Grid/algorithms/iterative/ImplicitlyRestartedLanczos.h> | ||||||
|  | 
 | ||||||
| #include <Grid/algorithms/CoarsenedMatrix.h> | #include <Grid/algorithms/CoarsenedMatrix.h> | ||||||
| #include <Grid/algorithms/FFT.h> |  | ||||||
| 
 | 
 | ||||||
| // Eigen/lanczos
 | // Eigen/lanczos
 | ||||||
| // EigCg
 | // EigCg
 | ||||||
| @@ -42,32 +42,9 @@ Author: Peter Boyle <paboyle@ph.ed.ac.uk> | |||||||
| 
 | 
 | ||||||
| namespace Grid { | namespace Grid { | ||||||
| 
 | 
 | ||||||
|   class PointerCache { |  | ||||||
|   private: |  | ||||||
| 
 |  | ||||||
|     static const int Ncache=8; |  | ||||||
|     static int victim; |  | ||||||
| 
 |  | ||||||
|     typedef struct {  |  | ||||||
|       void *address; |  | ||||||
|       size_t bytes; |  | ||||||
|       int valid; |  | ||||||
|     } PointerCacheEntry; |  | ||||||
|      |  | ||||||
|     static PointerCacheEntry Entries[Ncache]; |  | ||||||
| 
 |  | ||||||
|   public: |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     static void *Insert(void *ptr,size_t bytes) ; |  | ||||||
|     static void *Lookup(size_t bytes) ; |  | ||||||
| 
 |  | ||||||
|   }; |  | ||||||
| 
 |  | ||||||
| ////////////////////////////////////////////////////////////////////
 | ////////////////////////////////////////////////////////////////////
 | ||||||
| // A lattice of something, but assume the something is SIMDized.
 | // A lattice of something, but assume the something is SIMDized.
 | ||||||
| ////////////////////////////////////////////////////////////////////
 | ////////////////////////////////////////////////////////////////////
 | ||||||
| 
 |  | ||||||
| template<typename _Tp> | template<typename _Tp> | ||||||
| class alignedAllocator { | class alignedAllocator { | ||||||
| public:  | public:  | ||||||
| @@ -89,27 +66,27 @@ public: | |||||||
| 
 | 
 | ||||||
|   pointer allocate(size_type __n, const void* _p= 0) |   pointer allocate(size_type __n, const void* _p= 0) | ||||||
|   {  |   {  | ||||||
|     size_type bytes = __n*sizeof(_Tp); |  | ||||||
| 
 |  | ||||||
|     _Tp *ptr = (_Tp *) PointerCache::Lookup(bytes); |  | ||||||
|      |  | ||||||
| #ifdef HAVE_MM_MALLOC_H | #ifdef HAVE_MM_MALLOC_H | ||||||
|     if ( ptr == (_Tp *) NULL ) ptr = (_Tp *) _mm_malloc(bytes,128); |     _Tp * ptr = (_Tp *) _mm_malloc(__n*sizeof(_Tp),128); | ||||||
| #else | #else | ||||||
|     if ( ptr == (_Tp *) NULL ) ptr = (_Tp *) memalign(128,bytes); |     _Tp * ptr = (_Tp *) memalign(128,__n*sizeof(_Tp)); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  |     _Tp tmp; | ||||||
|  | #ifdef GRID_NUMA | ||||||
|  | #pragma omp parallel for schedule(static) | ||||||
|  |   for(int i=0;i<__n;i++){ | ||||||
|  |     ptr[i]=tmp; | ||||||
|  |   } | ||||||
|  | #endif  | ||||||
|     return ptr; |     return ptr; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   void deallocate(pointer __p, size_type __n) {  |   void deallocate(pointer __p, size_type) {  | ||||||
|     size_type bytes = __n * sizeof(_Tp); |  | ||||||
|     pointer __freeme = (pointer)PointerCache::Insert((void *)__p,bytes); |  | ||||||
| 
 |  | ||||||
| #ifdef HAVE_MM_MALLOC_H | #ifdef HAVE_MM_MALLOC_H | ||||||
|     if ( __freeme ) _mm_free((void *)__freeme);  |     _mm_free((void *)__p);  | ||||||
| #else | #else | ||||||
|     if ( __freeme ) free((void *)__freeme); |     free((void *)__p); | ||||||
| #endif | #endif | ||||||
|   } |   } | ||||||
|   void construct(pointer __p, const _Tp& __val) { }; |   void construct(pointer __p, const _Tp& __val) { }; | ||||||
| @@ -2,11 +2,11 @@ | |||||||
| 
 | 
 | ||||||
| Grid physics library, www.github.com/paboyle/Grid | Grid physics library, www.github.com/paboyle/Grid | ||||||
| 
 | 
 | ||||||
| Source file: ./lib/qcd/hmc/HMC.h | Source file: ./lib/Bitwise.cc | ||||||
| 
 | 
 | ||||||
| Copyright (C) 2015 | Copyright (C) 2016 | ||||||
| 
 | 
 | ||||||
| Author: Peter Boyle <paboyle@ph.ed.ac.uk> | Author: Guido Cossu <guido.cossu@ed.ac.uk> | ||||||
| 
 | 
 | ||||||
| This program is free software; you can redistribute it and/or modify | 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 | it under the terms of the GNU General Public License as published by | ||||||
| @@ -26,17 +26,24 @@ See the full license in the file "LICENSE" in the top level distribution | |||||||
| directory | directory | ||||||
| *************************************************************************************/ | *************************************************************************************/ | ||||||
| /*  END LEGAL */ | /*  END LEGAL */ | ||||||
| //--------------------------------------------------------------------
 | #include <iostream> | ||||||
| //--------------------------------------------------------------------
 | #include <Bitwise.h> | ||||||
| #ifndef HMC_AGGREGATE_INCLUDED | #include <bitset> | ||||||
| #define HMC_AGGREGATE_INCLUDED | #include <climits> | ||||||
| 
 | 
 | ||||||
| #include <string> | namespace Grid { | ||||||
| 
 | 
 | ||||||
| #include <Grid/qcd/hmc/HMC.h> | void show_binaryrep(const unsigned char* a, size_t size) { | ||||||
| // annoying location; should move this ?
 |   const unsigned char* beg = a; | ||||||
| #include <Grid/parallelIO/NerscIO.h> |   const unsigned char* end = a + size; | ||||||
| #include <Grid/qcd/hmc/NerscCheckpointer.h> |   unsigned int ctr = 0; | ||||||
| #include <Grid/qcd/hmc/HmcRunner.h> |   while (beg != end) { | ||||||
|  |     std::cout << std::bitset<CHAR_BIT>(*beg++) << ' '; | ||||||
|  |     ctr++; | ||||||
|  |     if (ctr % GRID_REAL_BYTES == 0) std::cout << '\n'; | ||||||
|  |   } | ||||||
|  |   std::cout << '\n'; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // namespace 
 | ||||||
| 
 | 
 | ||||||
| #endif |  | ||||||
							
								
								
									
										76
									
								
								lib/Bitwise.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								lib/Bitwise.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid | ||||||
|  |  | ||||||
|  | Source file: ./lib/Bitwise.h | ||||||
|  |  | ||||||
|  | Copyright (C) 2016 | ||||||
|  |  | ||||||
|  | Author: Guido Cossu <guido.cossu@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 */ | ||||||
|  | #ifndef GRID_BITWISE_H | ||||||
|  | #define GRID_BITWISE_H | ||||||
|  |  | ||||||
|  | #include <cassert> | ||||||
|  | #include <cfloat> | ||||||
|  | #include <bitset> | ||||||
|  | #include <climits> | ||||||
|  | #include <Config.h> | ||||||
|  |  | ||||||
|  | #ifdef GRID_DEFAULT_PRECISION_SINGLE | ||||||
|  | #define GRID_REAL_BYTES 4 | ||||||
|  | #endif | ||||||
|  | #ifdef GRID_DEFAULT_PRECISION_DOUBLE | ||||||
|  | #define GRID_REAL_BYTES 8 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace Grid { | ||||||
|  |  | ||||||
|  | void show_binaryrep(const unsigned char* a, size_t size); | ||||||
|  |  | ||||||
|  | template <typename T> | ||||||
|  | void show_binaryrep(const T& a) { | ||||||
|  |   const char* beg = reinterpret_cast<const char*>(&a); | ||||||
|  |   const char* end = beg + sizeof(a); | ||||||
|  |   unsigned int ctr = 0; | ||||||
|  |   while (beg != end) { | ||||||
|  |   	std::cout << std::bitset<CHAR_BIT>(*beg++) << ' '; | ||||||
|  |   	ctr++; | ||||||
|  |   	if (ctr % GRID_REAL_BYTES == 0) std::cout << '\n'; | ||||||
|  |   } | ||||||
|  |   std::cout << '\n'; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename T> | ||||||
|  | void bitwise_xor(T& l, T& r, unsigned char* xors) { | ||||||
|  |   assert(sizeof(l) == sizeof(r)); | ||||||
|  |   unsigned char* org = reinterpret_cast<unsigned char*>(&l); | ||||||
|  |   unsigned char* cur = reinterpret_cast<unsigned char*>(&r); | ||||||
|  |   int words = sizeof(l) / sizeof(*org); | ||||||
|  |   unsigned char result = 0; | ||||||
|  |   for (int w = 0; w < words; w++) xors[w] = (org[w] ^ cur[w]); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | }; // namespace  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										53
									
								
								lib/Grid.h
									
									
									
									
									
								
							
							
						
						
									
										53
									
								
								lib/Grid.h
									
									
									
									
									
								
							| @@ -38,10 +38,53 @@ Author: paboyle <paboyle@ph.ed.ac.uk> | |||||||
| #ifndef GRID_H | #ifndef GRID_H | ||||||
| #define GRID_H | #define GRID_H | ||||||
|  |  | ||||||
| #include <Grid/GridCore.h> | /////////////////// | ||||||
| #include <Grid/GridQCDcore.h> | // Std C++ dependencies | ||||||
| #include <Grid/qcd/action/Action.h> | /////////////////// | ||||||
| #include <Grid/qcd/smearing/Smearing.h> | #include <cassert> | ||||||
| #include <Grid/qcd/hmc/HMC_aggregate.h> | #include <complex> | ||||||
|  | #include <vector> | ||||||
|  | #include <iostream> | ||||||
|  | #include <iomanip> | ||||||
|  | #include <random> | ||||||
|  | #include <functional> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <signal.h> | ||||||
|  | #include <ctime> | ||||||
|  | #include <sys/time.h> | ||||||
|  | #include <chrono> | ||||||
|  |  | ||||||
|  | /////////////////// | ||||||
|  | // Grid headers | ||||||
|  | /////////////////// | ||||||
|  | #include <Grid/serialisation/Serialisation.h> | ||||||
|  | #include "Config.h" | ||||||
|  | #include <Grid/Timer.h> | ||||||
|  | #include <Grid/Bitwise.h> | ||||||
|  | #include <Grid/PerfCount.h> | ||||||
|  | #include <Grid/Log.h> | ||||||
|  | #include <Grid/AlignedAllocator.h> | ||||||
|  | #include <Grid/Simd.h> | ||||||
|  | #include <Grid/Threads.h> | ||||||
|  | #include <Grid/Lexicographic.h> | ||||||
|  | #include <Grid/Init.h> | ||||||
|  | #include <Grid/Communicator.h>  | ||||||
|  | #include <Grid/Cartesian.h>     | ||||||
|  | #include <Grid/Tensors.h>       | ||||||
|  | #include <Grid/Lattice.h>       | ||||||
|  | #include <Grid/Cshift.h>        | ||||||
|  | #include <Grid/Stencil.h>       | ||||||
|  | #include <Grid/Algorithms.h>    | ||||||
|  | #include <Grid/parallelIO/BinaryIO.h> | ||||||
|  | #include <Grid/FFT.h> | ||||||
|  |  | ||||||
|  | #include <Grid/qcd/QCD.h> | ||||||
|  | #include <Grid/parallelIO/NerscIO.h> | ||||||
|  | #include <Grid/qcd/hmc/NerscCheckpointer.h> | ||||||
|  | #include <Grid/qcd/hmc/HmcRunner.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -1,81 +0,0 @@ | |||||||
|     /************************************************************************************* |  | ||||||
|  |  | ||||||
|     Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
|     Source file: ./lib/Grid.h |  | ||||||
|  |  | ||||||
|     Copyright (C) 2015 |  | ||||||
|  |  | ||||||
| Author: Peter Boyle <paboyle@ph.ed.ac.uk> |  | ||||||
| Author: azusayamaguchi <ayamaguc@YAMAKAZE.local> |  | ||||||
| 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 */ |  | ||||||
| // |  | ||||||
| //  Grid.h |  | ||||||
| //  simd |  | ||||||
| // |  | ||||||
| //  Created by Peter Boyle on 09/05/2014. |  | ||||||
| //  Copyright (c) 2014 University of Edinburgh. All rights reserved. |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #ifndef GRID_BASE_H |  | ||||||
| #define GRID_BASE_H |  | ||||||
|  |  | ||||||
| /////////////////// |  | ||||||
| // Std C++ dependencies |  | ||||||
| /////////////////// |  | ||||||
| #include <cassert> |  | ||||||
| #include <complex> |  | ||||||
| #include <vector> |  | ||||||
| #include <iostream> |  | ||||||
| #include <iomanip> |  | ||||||
| #include <random> |  | ||||||
| #include <functional> |  | ||||||
| #include <stdio.h> |  | ||||||
| #include <stdlib.h> |  | ||||||
| #include <stdio.h> |  | ||||||
| #include <signal.h> |  | ||||||
| #include <ctime> |  | ||||||
| #include <sys/time.h> |  | ||||||
| #include <chrono> |  | ||||||
|  |  | ||||||
| /////////////////// |  | ||||||
| // Grid headers |  | ||||||
| /////////////////// |  | ||||||
| #include "Config.h" |  | ||||||
|  |  | ||||||
| #include <Grid/perfmon/Timer.h> |  | ||||||
| #include <Grid/perfmon/PerfCount.h> |  | ||||||
| #include <Grid/log/Log.h> |  | ||||||
| #include <Grid/allocator/AlignedAllocator.h> |  | ||||||
| #include <Grid/simd/Simd.h> |  | ||||||
| #include <Grid/serialisation/Serialisation.h> |  | ||||||
| #include <Grid/threads/Threads.h> |  | ||||||
| #include <Grid/util/Util.h> |  | ||||||
| #include <Grid/communicator/Communicator.h>  |  | ||||||
| #include <Grid/cartesian/Cartesian.h>     |  | ||||||
| #include <Grid/tensors/Tensors.h>       |  | ||||||
| #include <Grid/lattice/Lattice.h>       |  | ||||||
| #include <Grid/cshift/Cshift.h>        |  | ||||||
| #include <Grid/stencil/Stencil.h>       |  | ||||||
| #include <Grid/parallelIO/BinaryIO.h> |  | ||||||
| #include <Grid/algorithms/Algorithms.h>    |  | ||||||
|  |  | ||||||
| #endif |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| ../extras/Hadrons |  | ||||||
| @@ -41,13 +41,12 @@ Author: paboyle <paboyle@ph.ed.ac.uk> | |||||||
| #include <signal.h> | #include <signal.h> | ||||||
| #include <iostream> | #include <iostream> | ||||||
| #include <iterator> | #include <iterator> | ||||||
|  | #include <Grid.h> | ||||||
| #include <algorithm> | #include <algorithm> | ||||||
| #include <iterator> | #include <iterator> | ||||||
| #include <cstdlib> | #include <cstdlib> | ||||||
| #include <memory> | #include <memory> | ||||||
| 
 | 
 | ||||||
| #include <Grid/Grid.h> |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| #include <fenv.h> | #include <fenv.h> | ||||||
| #ifdef __APPLE__ | #ifdef __APPLE__ | ||||||
| @@ -220,57 +219,8 @@ void Grid_init(int *argc,char ***argv) | |||||||
|     CartesianCommunicator::MAX_MPI_SHM_BYTES = MB*1024*1024; |     CartesianCommunicator::MAX_MPI_SHM_BYTES = MB*1024*1024; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   if( GridCmdOptionExists(*argv,*argv+*argc,"--debug-signals") ){ |  | ||||||
|     Grid_debug_handler_init(); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   CartesianCommunicator::Init(argc,argv); |   CartesianCommunicator::Init(argc,argv); | ||||||
| 
 | 
 | ||||||
|   if( !GridCmdOptionExists(*argv,*argv+*argc,"--debug-stdout") ){ |  | ||||||
|     Grid_quiesce_nodes(); |  | ||||||
|   } else {  |  | ||||||
|     std::ostringstream fname; |  | ||||||
|     fname<<"Grid.stdout."; |  | ||||||
|     fname<<CartesianCommunicator::RankWorld(); |  | ||||||
|     freopen(fname.str().c_str(),"w",stdout); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   ////////////////////////////////////
 |  | ||||||
|   // Banner
 |  | ||||||
|   ////////////////////////////////////
 |  | ||||||
|   if ( CartesianCommunicator::RankWorld() == 0 ) {  |  | ||||||
|     std::cout <<std::endl; |  | ||||||
|     std::cout  << "__|__|__|__|__|__|__|__|__|__|__|__|__|__|__"<<std::endl;  |  | ||||||
|     std::cout  << "__|__|__|__|__|__|__|__|__|__|__|__|__|__|__"<<std::endl;  |  | ||||||
|     std::cout  << "__|_ |  |  |  |  |  |  |  |  |  |  |  | _|__"<<std::endl;  |  | ||||||
|     std::cout  << "__|_                                    _|__"<<std::endl;  |  | ||||||
|     std::cout  << "__|_   GGGG    RRRR    III    DDDD      _|__"<<std::endl; |  | ||||||
|     std::cout  << "__|_  G        R   R    I     D   D     _|__"<<std::endl; |  | ||||||
|     std::cout  << "__|_  G        R   R    I     D    D    _|__"<<std::endl; |  | ||||||
|     std::cout  << "__|_  G  GG    RRRR     I     D    D    _|__"<<std::endl; |  | ||||||
|     std::cout  << "__|_  G   G    R  R     I     D   D     _|__"<<std::endl; |  | ||||||
|     std::cout  << "__|_   GGGG    R   R   III    DDDD      _|__"<<std::endl; |  | ||||||
|     std::cout  << "__|_                                    _|__"<<std::endl;  |  | ||||||
|     std::cout  << "__|__|__|__|__|__|__|__|__|__|__|__|__|__|__"<<std::endl;  |  | ||||||
|     std::cout  << "__|__|__|__|__|__|__|__|__|__|__|__|__|__|__"<<std::endl;  |  | ||||||
|     std::cout  << "  |  |  |  |  |  |  |  |  |  |  |  |  |  |  "<<std::endl;  |  | ||||||
|     std::cout << std::endl; |  | ||||||
|     std::cout << std::endl; |  | ||||||
|     std::cout << "Copyright (C) 2015 Peter Boyle, Azusa Yamaguchi, Guido Cossu, Antonin Portelli and other authors"<<std::endl; |  | ||||||
|     std::cout << std::endl; |  | ||||||
|     std::cout << "This program is free software; you can redistribute it and/or modify"<<std::endl; |  | ||||||
|     std::cout << "it under the terms of the GNU General Public License as published by"<<std::endl; |  | ||||||
|     std::cout << "the Free Software Foundation; either version 2 of the License, or"<<std::endl; |  | ||||||
|     std::cout << "(at your option) any later version."<<std::endl; |  | ||||||
|     std::cout << std::endl; |  | ||||||
|     std::cout << "This program is distributed in the hope that it will be useful,"<<std::endl; |  | ||||||
|     std::cout << "but WITHOUT ANY WARRANTY; without even the implied warranty of"<<std::endl; |  | ||||||
|     std::cout << "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the"<<std::endl; |  | ||||||
|     std::cout << "GNU General Public License for more details."<<std::endl; |  | ||||||
|     std::cout << std::endl; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|   ////////////////////////////////////
 |   ////////////////////////////////////
 | ||||||
|   // Logging
 |   // Logging
 | ||||||
|   ////////////////////////////////////
 |   ////////////////////////////////////
 | ||||||
| @@ -280,6 +230,9 @@ void Grid_init(int *argc,char ***argv) | |||||||
|   GridCmdOptionCSL(defaultLog,logstreams); |   GridCmdOptionCSL(defaultLog,logstreams); | ||||||
|   GridLogConfigure(logstreams); |   GridLogConfigure(logstreams); | ||||||
| 
 | 
 | ||||||
|  |   if( !GridCmdOptionExists(*argv,*argv+*argc,"--debug-stdout") ){ | ||||||
|  |     Grid_quiesce_nodes(); | ||||||
|  |   } | ||||||
| 
 | 
 | ||||||
|   if( GridCmdOptionExists(*argv,*argv+*argc,"--log") ){ |   if( GridCmdOptionExists(*argv,*argv+*argc,"--log") ){ | ||||||
|     arg = GridCmdOptionPayload(*argv,*argv+*argc,"--log"); |     arg = GridCmdOptionPayload(*argv,*argv+*argc,"--log"); | ||||||
| @@ -295,67 +248,94 @@ void Grid_init(int *argc,char ***argv) | |||||||
|     std::cout<<GridLogMessage<<"  --help : this message"<<std::endl; |     std::cout<<GridLogMessage<<"  --help : this message"<<std::endl; | ||||||
|     std::cout<<GridLogMessage<<std::endl; |     std::cout<<GridLogMessage<<std::endl; | ||||||
|     std::cout<<GridLogMessage<<"Geometry:"<<std::endl; |     std::cout<<GridLogMessage<<"Geometry:"<<std::endl; | ||||||
|     std::cout<<GridLogMessage<<std::endl; |  | ||||||
|     std::cout<<GridLogMessage<<"  --mpi n.n.n.n   : default MPI decomposition"<<std::endl;     |     std::cout<<GridLogMessage<<"  --mpi n.n.n.n   : default MPI decomposition"<<std::endl;     | ||||||
|     std::cout<<GridLogMessage<<"  --threads n     : default number of OMP threads"<<std::endl; |     std::cout<<GridLogMessage<<"  --threads n     : default number of OMP threads"<<std::endl; | ||||||
|     std::cout<<GridLogMessage<<"  --grid n.n.n.n  : default Grid size"<<std::endl;     |     std::cout<<GridLogMessage<<"  --grid n.n.n.n  : default Grid size"<<std::endl;     | ||||||
|     std::cout<<GridLogMessage<<"  --shm  M        : allocate M megabytes of shared memory for comms"<<std::endl;     |     std::cout<<GridLogMessage<<"  --shm  M        : allocate M megabytes of shared memory for comms"<<std::endl;     | ||||||
|     std::cout<<GridLogMessage<<std::endl; |     std::cout<<GridLogMessage<<std::endl; | ||||||
|     std::cout<<GridLogMessage<<"Verbose and debug:"<<std::endl; |     std::cout<<GridLogMessage<<"Verbose and debug:"<<std::endl; | ||||||
|     std::cout<<GridLogMessage<<std::endl; |     std::cout<<GridLogMessage<<"  --log list      : comma separted list of streams from Error,Warning,Message,Performance,Iterative,Integrator,Debug,Colours"<<std::endl; | ||||||
|     std::cout<<GridLogMessage<<"  --log list      : comma separated list from Error,Warning,Message,Performance,Iterative,Integrator,Debug,Colours"<<std::endl; |  | ||||||
|     std::cout<<GridLogMessage<<"  --decomposition : report on default omp,mpi and simd decomposition"<<std::endl;     |     std::cout<<GridLogMessage<<"  --decomposition : report on default omp,mpi and simd decomposition"<<std::endl;     | ||||||
|     std::cout<<GridLogMessage<<"  --debug-signals : catch sigsegv and print a blame report"<<std::endl; |     std::cout<<GridLogMessage<<"  --debug-signals : catch sigsegv and print a blame report"<<std::endl; | ||||||
|     std::cout<<GridLogMessage<<"  --debug-stdout  : print stdout from EVERY node"<<std::endl;     |     std::cout<<GridLogMessage<<"  --debug-stdout  : print stdout from EVERY node"<<std::endl;     | ||||||
|     std::cout<<GridLogMessage<<"  --notimestamp   : suppress millisecond resolution stamps"<<std::endl;     |     std::cout<<GridLogMessage<<"  --notimestamp   : suppress millisecond resolution stamps"<<std::endl;     | ||||||
|     std::cout<<GridLogMessage<<std::endl; |     std::cout<<GridLogMessage<<std::endl; | ||||||
|     std::cout<<GridLogMessage<<"Performance:"<<std::endl; |     std::cout<<GridLogMessage<<"Performance:"<<std::endl; | ||||||
|     std::cout<<GridLogMessage<<std::endl; |  | ||||||
|     std::cout<<GridLogMessage<<"  --comms-isend   : Asynchronous MPI calls; several dirs at a time "<<std::endl;     |  | ||||||
|     std::cout<<GridLogMessage<<"  --comms-sendrecv: Synchronous MPI calls; one dirs at a time "<<std::endl;     |  | ||||||
|     std::cout<<GridLogMessage<<"  --comms-overlap : Overlap comms with compute "<<std::endl;     |  | ||||||
|     std::cout<<GridLogMessage<<std::endl; |  | ||||||
|     std::cout<<GridLogMessage<<"  --dslash-generic: Wilson kernel for generic Nc"<<std::endl;     |     std::cout<<GridLogMessage<<"  --dslash-generic: Wilson kernel for generic Nc"<<std::endl;     | ||||||
|     std::cout<<GridLogMessage<<"  --dslash-unroll : Wilson kernel for Nc=3"<<std::endl;     |     std::cout<<GridLogMessage<<"  --dslash-unroll : Wilson kernel for Nc=3"<<std::endl;     | ||||||
|     std::cout<<GridLogMessage<<"  --dslash-asm    : Wilson kernel for AVX512"<<std::endl;     |     std::cout<<GridLogMessage<<"  --dslash-asm    : Wilson kernel for AVX512"<<std::endl;     | ||||||
|     std::cout<<GridLogMessage<<std::endl; |  | ||||||
|     std::cout<<GridLogMessage<<"  --lebesgue      : Cache oblivious Lebesgue curve/Morton order/Z-graph stencil looping"<<std::endl;     |     std::cout<<GridLogMessage<<"  --lebesgue      : Cache oblivious Lebesgue curve/Morton order/Z-graph stencil looping"<<std::endl;     | ||||||
|     std::cout<<GridLogMessage<<"  --cacheblocking n.m.o.p : Hypercuboidal cache blocking"<<std::endl;     |     std::cout<<GridLogMessage<<"  --cacheblocking n.m.o.p : Hypercuboidal cache blocking"<<std::endl;     | ||||||
|     std::cout<<GridLogMessage<<std::endl; |     std::cout<<GridLogMessage<<std::endl; | ||||||
|     exit(EXIT_SUCCESS); |     exit(EXIT_SUCCESS); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   ////////////////////////////////////
 | ||||||
|  |   // Banner
 | ||||||
|  |   ////////////////////////////////////
 | ||||||
|  | 
 | ||||||
|  |   std::string COL_RED    = GridLogColours.colour["RED"]; | ||||||
|  |   std::string COL_PURPLE = GridLogColours.colour["PURPLE"]; | ||||||
|  |   std::string COL_BLACK  = GridLogColours.colour["BLACK"]; | ||||||
|  |   std::string COL_GREEN  = GridLogColours.colour["GREEN"]; | ||||||
|  |   std::string COL_BLUE   = GridLogColours.colour["BLUE"]; | ||||||
|  |   std::string COL_YELLOW = GridLogColours.colour["YELLOW"]; | ||||||
|  |   std::string COL_BACKGROUND = GridLogColours.colour["NORMAL"]; | ||||||
|  |    | ||||||
|  |   std::cout <<std::endl; | ||||||
|  |   std::cout <<COL_RED  << "__|__|__|__|__"<<             "|__|__|_"<<COL_PURPLE<<"_|__|__|"<<                "__|__|__|__|__"<<std::endl;  | ||||||
|  |   std::cout <<COL_RED  << "__|__|__|__|__"<<             "|__|__|_"<<COL_PURPLE<<"_|__|__|"<<                "__|__|__|__|__"<<std::endl;  | ||||||
|  |   std::cout <<COL_RED  << "__|_ |  |  |  "<<             "|  |  | "<<COL_PURPLE<<" |  |  |"<<                "  |  |  | _|__"<<std::endl;  | ||||||
|  |   std::cout <<COL_RED  << "__|_          "<<             "        "<<COL_PURPLE<<"        "<<                "          _|__"<<std::endl;  | ||||||
|  |   std::cout <<COL_RED  << "__|_  "<<COL_GREEN<<" GGGG   "<<COL_RED<<" RRRR   "<<COL_BLUE  <<" III    "<<COL_PURPLE<<"DDDD  "<<COL_PURPLE<<"    _|__"<<std::endl; | ||||||
|  |   std::cout <<COL_RED  << "__|_  "<<COL_GREEN<<"G       "<<COL_RED<<" R   R  "<<COL_BLUE  <<"  I     "<<COL_PURPLE<<"D   D "<<COL_PURPLE<<"    _|__"<<std::endl; | ||||||
|  |   std::cout <<COL_RED  << "__|_  "<<COL_GREEN<<"G       "<<COL_RED<<" R   R  "<<COL_BLUE  <<"  I     "<<COL_PURPLE<<"D    D"<<COL_PURPLE<<"    _|__"<<std::endl; | ||||||
|  |   std::cout <<COL_BLUE << "__|_  "<<COL_GREEN<<"G  GG   "<<COL_RED<<" RRRR   "<<COL_BLUE  <<"  I     "<<COL_PURPLE<<"D    D"<<COL_GREEN <<"    _|__"<<std::endl; | ||||||
|  |   std::cout <<COL_BLUE << "__|_  "<<COL_GREEN<<"G   G   "<<COL_RED<<" R  R   "<<COL_BLUE  <<"  I     "<<COL_PURPLE<<"D   D "<<COL_GREEN <<"    _|__"<<std::endl; | ||||||
|  |   std::cout <<COL_BLUE << "__|_  "<<COL_GREEN<<" GGGG   "<<COL_RED<<" R   R  "<<COL_BLUE  <<" III    "<<COL_PURPLE<<"DDDD  "<<COL_GREEN <<"    _|__"<<std::endl; | ||||||
|  |   std::cout <<COL_BLUE << "__|_          "<<             "        "<<COL_GREEN <<"        "<<                "          _|__"<<std::endl;  | ||||||
|  |   std::cout <<COL_BLUE << "__|__|__|__|__"<<             "|__|__|_"<<COL_GREEN <<"_|__|__|"<<                "__|__|__|__|__"<<std::endl;  | ||||||
|  |   std::cout <<COL_BLUE << "__|__|__|__|__"<<             "|__|__|_"<<COL_GREEN <<"_|__|__|"<<                "__|__|__|__|__"<<std::endl;  | ||||||
|  |   std::cout <<COL_BLUE << "  |  |  |  |  "<<             "|  |  | "<<COL_GREEN <<" |  |  |"<<                "  |  |  |  |  "<<std::endl;  | ||||||
|  |   std::cout << std::endl; | ||||||
|  |   std::cout << std::endl; | ||||||
|  |   std::cout <<COL_YELLOW<< std::endl; | ||||||
|  |   std::cout << "Copyright (C) 2015 Peter Boyle, Azusa Yamaguchi, Guido Cossu, Antonin Portelli and other authors"<<std::endl; | ||||||
|  |   std::cout << std::endl; | ||||||
|  |   std::cout << "This program is free software; you can redistribute it and/or modify"<<std::endl; | ||||||
|  |   std::cout << "it under the terms of the GNU General Public License as published by"<<std::endl; | ||||||
|  |   std::cout << "the Free Software Foundation; either version 2 of the License, or"<<std::endl; | ||||||
|  |   std::cout << "(at your option) any later version."<<std::endl; | ||||||
|  |   std::cout << std::endl; | ||||||
|  |   std::cout << "This program is distributed in the hope that it will be useful,"<<std::endl; | ||||||
|  |   std::cout << "but WITHOUT ANY WARRANTY; without even the implied warranty of"<<std::endl; | ||||||
|  |   std::cout << "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the"<<std::endl; | ||||||
|  |   std::cout << "GNU General Public License for more details."<<std::endl; | ||||||
|  |   std::cout << COL_BACKGROUND <<std::endl; | ||||||
|  |   std::cout << std::endl; | ||||||
|  | 
 | ||||||
|   ////////////////////////////////////
 |   ////////////////////////////////////
 | ||||||
|   // Debug and performance options
 |   // Debug and performance options
 | ||||||
|   ////////////////////////////////////
 |   ////////////////////////////////////
 | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  |   if( GridCmdOptionExists(*argv,*argv+*argc,"--debug-signals") ){ | ||||||
|  |     Grid_debug_handler_init(); | ||||||
|  |   } | ||||||
|   if( GridCmdOptionExists(*argv,*argv+*argc,"--dslash-unroll") ){ |   if( GridCmdOptionExists(*argv,*argv+*argc,"--dslash-unroll") ){ | ||||||
|     QCD::WilsonKernelsStatic::Opt=QCD::WilsonKernelsStatic::OptHandUnroll; |     QCD::WilsonKernelsStatic::Opt=QCD::WilsonKernelsStatic::OptHandUnroll; | ||||||
|     QCD::StaggeredKernelsStatic::Opt=QCD::StaggeredKernelsStatic::OptHandUnroll; |  | ||||||
|   } |   } | ||||||
|   if( GridCmdOptionExists(*argv,*argv+*argc,"--dslash-asm") ){ |   if( GridCmdOptionExists(*argv,*argv+*argc,"--dslash-asm") ){ | ||||||
|     QCD::WilsonKernelsStatic::Opt=QCD::WilsonKernelsStatic::OptInlineAsm; |     QCD::WilsonKernelsStatic::Opt=QCD::WilsonKernelsStatic::OptInlineAsm; | ||||||
|     QCD::StaggeredKernelsStatic::Opt=QCD::StaggeredKernelsStatic::OptInlineAsm; |  | ||||||
|   } |   } | ||||||
|   if( GridCmdOptionExists(*argv,*argv+*argc,"--dslash-generic") ){ |   if( GridCmdOptionExists(*argv,*argv+*argc,"--dslash-generic") ){ | ||||||
|     QCD::WilsonKernelsStatic::Opt=QCD::WilsonKernelsStatic::OptGeneric; |     QCD::WilsonKernelsStatic::Opt=QCD::WilsonKernelsStatic::OptGeneric; | ||||||
|     QCD::StaggeredKernelsStatic::Opt=QCD::StaggeredKernelsStatic::OptGeneric; |  | ||||||
|   } |  | ||||||
|   if( GridCmdOptionExists(*argv,*argv+*argc,"--comms-overlap") ){ |  | ||||||
|     QCD::WilsonKernelsStatic::Comms = QCD::WilsonKernelsStatic::CommsAndCompute; |  | ||||||
|   } else { |  | ||||||
|     QCD::WilsonKernelsStatic::Comms = QCD::WilsonKernelsStatic::CommsThenCompute; |  | ||||||
|   } |  | ||||||
|   if( GridCmdOptionExists(*argv,*argv+*argc,"--comms-concurrent") ){ |  | ||||||
|     CartesianCommunicator::SetCommunicatorPolicy(CartesianCommunicator::CommunicatorPolicyConcurrent); |  | ||||||
|   } |  | ||||||
|   if( GridCmdOptionExists(*argv,*argv+*argc,"--comms-sequential") ){ |  | ||||||
|     CartesianCommunicator::SetCommunicatorPolicy(CartesianCommunicator::CommunicatorPolicySequential); |  | ||||||
|   } |   } | ||||||
|   if( GridCmdOptionExists(*argv,*argv+*argc,"--lebesgue") ){ |   if( GridCmdOptionExists(*argv,*argv+*argc,"--lebesgue") ){ | ||||||
|     LebesgueOrder::UseLebesgueOrder=1; |     LebesgueOrder::UseLebesgueOrder=1; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|   if( GridCmdOptionExists(*argv,*argv+*argc,"--cacheblocking") ){ |   if( GridCmdOptionExists(*argv,*argv+*argc,"--cacheblocking") ){ | ||||||
|     arg= GridCmdOptionPayload(*argv,*argv+*argc,"--cacheblocking"); |     arg= GridCmdOptionPayload(*argv,*argv+*argc,"--cacheblocking"); | ||||||
|     GridCmdOptionIntVector(arg,LebesgueOrder::Block); |     GridCmdOptionIntVector(arg,LebesgueOrder::Block); | ||||||
| @@ -393,25 +373,23 @@ void Grid_finalize(void) | |||||||
|   MPI_Finalize(); |   MPI_Finalize(); | ||||||
|   Grid_unquiesce_nodes(); |   Grid_unquiesce_nodes(); | ||||||
| #endif | #endif | ||||||
| #if defined (GRID_COMMS_SHMEM) |  | ||||||
|   shmem_finalize(); |  | ||||||
| #endif |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void * Grid_backtrace_buffer[_NBACKTRACE]; | void * Grid_backtrace_buffer[_NBACKTRACE]; | ||||||
| 
 | 
 | ||||||
| void Grid_sa_signal_handler(int sig,siginfo_t *si,void * ptr) | void Grid_sa_signal_handler(int sig,siginfo_t *si,void * ptr) | ||||||
| { | { | ||||||
|   fprintf(stderr,"Caught signal %d\n",si->si_signo); |   printf("Caught signal %d\n",si->si_signo); | ||||||
|   fprintf(stderr,"  mem address %llx\n",(unsigned long long)si->si_addr); |   printf("  mem address %llx\n",(unsigned long long)si->si_addr); | ||||||
|   fprintf(stderr,"         code %d\n",si->si_code); |   printf("         code %d\n",si->si_code); | ||||||
|  | 
 | ||||||
|   // Linux/Posix
 |   // Linux/Posix
 | ||||||
| #ifdef __linux__ | #ifdef __linux__ | ||||||
|   // And x86 64bit
 |   // And x86 64bit
 | ||||||
| #ifdef __x86_64__ | #ifdef __x86_64__ | ||||||
|   ucontext_t * uc= (ucontext_t *)ptr; |   ucontext_t * uc= (ucontext_t *)ptr; | ||||||
|   struct sigcontext *sc = (struct sigcontext *)&uc->uc_mcontext; |   struct sigcontext *sc = (struct sigcontext *)&uc->uc_mcontext; | ||||||
|   fprintf(stderr,"  instruction %llx\n",(unsigned long long)sc->rip); |   printf("  instruction %llx\n",(unsigned long long)sc->rip); | ||||||
| #define REG(A)  printf("  %s %lx\n",#A,sc-> A); | #define REG(A)  printf("  %s %lx\n",#A,sc-> A); | ||||||
|   REG(rdi); |   REG(rdi); | ||||||
|   REG(rsi); |   REG(rsi); | ||||||
| @@ -434,11 +412,7 @@ void Grid_sa_signal_handler(int sig,siginfo_t *si,void * ptr) | |||||||
|   REG(r15); |   REG(r15); | ||||||
| #endif | #endif | ||||||
| #endif | #endif | ||||||
|   fflush(stderr); |   BACKTRACE(); | ||||||
|   BACKTRACEFP(stderr); |  | ||||||
|   fprintf(stderr,"Called backtrace\n"); |  | ||||||
|   fflush(stdout); |  | ||||||
|   fflush(stderr); |  | ||||||
|   exit(0); |   exit(0); | ||||||
|   return; |   return; | ||||||
| }; | }; | ||||||
| @@ -451,11 +425,9 @@ void Grid_debug_handler_init(void) | |||||||
|   sa.sa_flags    = SA_SIGINFO; |   sa.sa_flags    = SA_SIGINFO; | ||||||
|   sigaction(SIGSEGV,&sa,NULL); |   sigaction(SIGSEGV,&sa,NULL); | ||||||
|   sigaction(SIGTRAP,&sa,NULL); |   sigaction(SIGTRAP,&sa,NULL); | ||||||
|   sigaction(SIGBUS,&sa,NULL); |  | ||||||
| 
 | 
 | ||||||
|   feenableexcept( FE_INVALID|FE_OVERFLOW|FE_DIVBYZERO); |   feenableexcept( FE_INVALID|FE_OVERFLOW|FE_DIVBYZERO); | ||||||
| 
 | 
 | ||||||
|   sigaction(SIGFPE,&sa,NULL); |   sigaction(SIGFPE,&sa,NULL); | ||||||
|   sigaction(SIGKILL,&sa,NULL); |  | ||||||
| } | } | ||||||
| } | } | ||||||
| @@ -29,10 +29,9 @@ See the full license in the file "LICENSE" in the top level distribution | |||||||
| directory | directory | ||||||
| *************************************************************************************/ | *************************************************************************************/ | ||||||
| /*  END LEGAL */ | /*  END LEGAL */ | ||||||
| #include <Grid/GridCore.h> | #include <Grid.h> | ||||||
| 
 | 
 | ||||||
| #include <cxxabi.h> | #include <cxxabi.h> | ||||||
| #include <memory> |  | ||||||
| 
 | 
 | ||||||
| namespace Grid { | namespace Grid { | ||||||
| 
 | 
 | ||||||
| @@ -101,7 +100,7 @@ void Grid_quiesce_nodes(void) { | |||||||
|   me = shmem_my_pe(); |   me = shmem_my_pe(); | ||||||
| #endif | #endif | ||||||
|   if (me) { |   if (me) { | ||||||
|     std::cout.setstate(std::ios::badbit); |     std::cout.setstate(std::ios::badbit);// mute all nodes except 0
 | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @@ -110,7 +110,7 @@ public: | |||||||
|   friend std::ostream& operator<< (std::ostream& stream, Logger& log){ |   friend std::ostream& operator<< (std::ostream& stream, Logger& log){ | ||||||
| 
 | 
 | ||||||
|     if ( log.active ) { |     if ( log.active ) { | ||||||
|       stream << log.background()<< std::setw(10) << std::left << log.topName << log.background()<< " : "; |       stream << log.background()<< log.topName << log.background()<< " : "; | ||||||
|       stream << log.colour() <<std::setw(14) << std::left << log.name << log.background() << " : "; |       stream << log.colour() <<std::setw(14) << std::left << log.name << log.background() << " : "; | ||||||
|       if ( log.timestamp ) { |       if ( log.timestamp ) { | ||||||
| 	StopWatch.Stop(); | 	StopWatch.Stop(); | ||||||
| @@ -1,5 +1,4 @@ | |||||||
| extra_sources= | extra_sources= | ||||||
| extra_headers= |  | ||||||
| if BUILD_COMMS_MPI | if BUILD_COMMS_MPI | ||||||
|   extra_sources+=communicator/Communicator_mpi.cc |   extra_sources+=communicator/Communicator_mpi.cc | ||||||
|   extra_sources+=communicator/Communicator_base.cc |   extra_sources+=communicator/Communicator_base.cc | ||||||
| @@ -25,12 +24,6 @@ if BUILD_COMMS_NONE | |||||||
|   extra_sources+=communicator/Communicator_base.cc |   extra_sources+=communicator/Communicator_base.cc | ||||||
| endif | endif | ||||||
|  |  | ||||||
| if BUILD_HDF5 |  | ||||||
|   extra_sources+=serialisation/Hdf5IO.cc  |  | ||||||
|   extra_headers+=serialisation/Hdf5IO.h |  | ||||||
|   extra_headers+=serialisation/Hdf5Type.h |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| # | # | ||||||
| # Libraries | # Libraries | ||||||
| # | # | ||||||
| @@ -39,9 +32,6 @@ include Eigen.inc | |||||||
|  |  | ||||||
| lib_LIBRARIES = libGrid.a | lib_LIBRARIES = libGrid.a | ||||||
|  |  | ||||||
| CCFILES += $(extra_sources) | libGrid_a_SOURCES              = $(CCFILES) $(extra_sources) | ||||||
| HFILES  += $(extra_headers) |  | ||||||
|  |  | ||||||
| libGrid_a_SOURCES              = $(CCFILES) |  | ||||||
| libGrid_adir                   = $(pkgincludedir) | libGrid_adir                   = $(pkgincludedir) | ||||||
| nobase_dist_pkginclude_HEADERS = $(HFILES) $(eigen_files) Config.h | nobase_dist_pkginclude_HEADERS = $(HFILES) $(eigen_files) Config.h | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								lib/Old/Endeavour.tgz
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								lib/Old/Endeavour.tgz
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										154
									
								
								lib/Old/Tensor_peek.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								lib/Old/Tensor_peek.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,154 @@ | |||||||
|  |     /************************************************************************************* | ||||||
|  |  | ||||||
|  |     Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  |     Source file: ./lib/Old/Tensor_peek.h | ||||||
|  |  | ||||||
|  |     Copyright (C) 2015 | ||||||
|  |  | ||||||
|  | Author: Peter Boyle <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 */ | ||||||
|  | #ifndef GRID_MATH_PEEK_H | ||||||
|  | #define GRID_MATH_PEEK_H | ||||||
|  | namespace Grid { | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Peek on a specific index; returns a scalar in that index, tensor inherits rest | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // If we hit the right index, return scalar with no further recursion | ||||||
|  |  | ||||||
|  | //template<int Level> inline ComplexF peekIndex(const ComplexF arg) { return arg;} | ||||||
|  | //template<int Level> inline ComplexD peekIndex(const ComplexD arg) { return arg;} | ||||||
|  | //template<int Level> inline RealF peekIndex(const RealF arg) { return arg;} | ||||||
|  | //template<int Level> inline RealD peekIndex(const RealD arg) { return arg;} | ||||||
|  | #if 0 | ||||||
|  | // Scalar peek, no indices | ||||||
|  | template<int Level,class vtype,typename std::enable_if< iScalar<vtype>::TensorLevel == Level >::type * =nullptr> inline  | ||||||
|  |   auto peekIndex(const iScalar<vtype> &arg) ->  iScalar<vtype>  | ||||||
|  | { | ||||||
|  |   return arg; | ||||||
|  | } | ||||||
|  | // Vector peek, one index | ||||||
|  | template<int Level,class vtype,int N,typename std::enable_if< iScalar<vtype>::TensorLevel == Level >::type * =nullptr> inline  | ||||||
|  |   auto peekIndex(const iVector<vtype,N> &arg,int i) -> iScalar<vtype> // Index matches | ||||||
|  | { | ||||||
|  |   iScalar<vtype> ret;                              // return scalar | ||||||
|  |   ret._internal = arg._internal[i]; | ||||||
|  |   return ret; | ||||||
|  | } | ||||||
|  | // Matrix peek, two indices | ||||||
|  | template<int Level,class vtype,int N,typename std::enable_if< iScalar<vtype>::TensorLevel == Level >::type * =nullptr> inline  | ||||||
|  |   auto peekIndex(const iMatrix<vtype,N> &arg,int i,int j) ->  iScalar<vtype> | ||||||
|  | { | ||||||
|  |   iScalar<vtype> ret;                              // return scalar | ||||||
|  |   ret._internal = arg._internal[i][j]; | ||||||
|  |   return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ///////////// | ||||||
|  | // No match peek for scalar,vector,matrix must forward on either 0,1,2 args. Must have 9 routines with notvalue | ||||||
|  | ///////////// | ||||||
|  | // scalar | ||||||
|  | template<int Level,class vtype,typename std::enable_if< iScalar<vtype>::TensorLevel != Level >::type * =nullptr> inline  | ||||||
|  |   auto peekIndex(const iScalar<vtype> &arg) -> iScalar<decltype(peekIndex<Level>(arg._internal))> | ||||||
|  | { | ||||||
|  |   iScalar<decltype(peekIndex<Level>(arg._internal))> ret; | ||||||
|  |   ret._internal= peekIndex<Level>(arg._internal); | ||||||
|  |   return ret; | ||||||
|  | } | ||||||
|  | template<int Level,class vtype, typename std::enable_if< iScalar<vtype>::TensorLevel != Level >::type * =nullptr> inline  | ||||||
|  |   auto peekIndex(const iScalar<vtype> &arg,int i) ->  iScalar<decltype(peekIndex<Level>(arg._internal,i))>  | ||||||
|  | { | ||||||
|  |   iScalar<decltype(peekIndex<Level>(arg._internal,i))> ret; | ||||||
|  |   ret._internal=peekIndex<Level>(arg._internal,i); | ||||||
|  |   return ret; | ||||||
|  | } | ||||||
|  | template<int Level,class vtype, typename std::enable_if< iScalar<vtype>::TensorLevel != Level >::type * =nullptr> inline  | ||||||
|  |   auto peekIndex(const iScalar<vtype> &arg,int i,int j) ->  iScalar<decltype(peekIndex<Level>(arg._internal,i,j))> | ||||||
|  | { | ||||||
|  |   iScalar<decltype(peekIndex<Level>(arg._internal,i,j))> ret; | ||||||
|  |   ret._internal=peekIndex<Level>(arg._internal,i,j); | ||||||
|  |   return ret; | ||||||
|  | } | ||||||
|  | // vector | ||||||
|  | template<int Level,class vtype,int N, typename std::enable_if< iScalar<vtype>::TensorLevel != Level >::type * =nullptr> inline  | ||||||
|  | auto peekIndex(const iVector<vtype,N> &arg) ->   iVector<decltype(peekIndex<Level>(arg._internal[0])),N> | ||||||
|  | { | ||||||
|  |   iVector<decltype(peekIndex<Level>(arg._internal[0])),N> ret; | ||||||
|  |   for(int ii=0;ii<N;ii++){ | ||||||
|  |     ret._internal[ii]=peekIndex<Level>(arg._internal[ii]); | ||||||
|  |   } | ||||||
|  |   return ret; | ||||||
|  | } | ||||||
|  | template<int Level,class vtype,int N, typename std::enable_if< iScalar<vtype>::TensorLevel != Level >::type * =nullptr> inline  | ||||||
|  |   auto peekIndex(const iVector<vtype,N> &arg,int i) ->  iVector<decltype(peekIndex<Level>(arg._internal[0],i)),N> | ||||||
|  | { | ||||||
|  |   iVector<decltype(peekIndex<Level>(arg._internal[0],i)),N> ret; | ||||||
|  |   for(int ii=0;ii<N;ii++){ | ||||||
|  |     ret._internal[ii]=peekIndex<Level>(arg._internal[ii],i); | ||||||
|  |   } | ||||||
|  |   return ret; | ||||||
|  | } | ||||||
|  | template<int Level,class vtype,int N, typename std::enable_if< iScalar<vtype>::TensorLevel != Level >::type * =nullptr> inline  | ||||||
|  |   auto peekIndex(const iVector<vtype,N> &arg,int i,int j) ->  iVector<decltype(peekIndex<Level>(arg._internal[0],i,j)),N>  | ||||||
|  | { | ||||||
|  |   iVector<decltype(peekIndex<Level>(arg._internal[0],i,j)),N> ret; | ||||||
|  |   for(int ii=0;ii<N;ii++){ | ||||||
|  |     ret._internal[ii]=peekIndex<Level>(arg._internal[ii],i,j); | ||||||
|  |   } | ||||||
|  |   return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // matrix | ||||||
|  | template<int Level,class vtype,int N, typename std::enable_if< iScalar<vtype>::TensorLevel != Level >::type * =nullptr> inline  | ||||||
|  | auto peekIndex(const iMatrix<vtype,N> &arg) ->   iMatrix<decltype(peekIndex<Level>(arg._internal[0][0])),N>  | ||||||
|  | { | ||||||
|  |   iMatrix<decltype(peekIndex<Level>(arg._internal[0][0])),N> ret; | ||||||
|  |   for(int ii=0;ii<N;ii++){ | ||||||
|  |   for(int jj=0;jj<N;jj++){ | ||||||
|  |     ret._internal[ii][jj]=peekIndex<Level>(arg._internal[ii][jj]);// Could avoid this because peeking a scalar is dumb | ||||||
|  |   }} | ||||||
|  |   return ret; | ||||||
|  | } | ||||||
|  | template<int Level,class vtype,int N, typename std::enable_if< iScalar<vtype>::TensorLevel != Level >::type * =nullptr> inline  | ||||||
|  |   auto peekIndex(const iMatrix<vtype,N> &arg,int i) ->   iMatrix<decltype(peekIndex<Level>(arg._internal[0][0],i)),N> | ||||||
|  | { | ||||||
|  |   iMatrix<decltype(peekIndex<Level>(arg._internal[0][0],i)),N> ret; | ||||||
|  |   for(int ii=0;ii<N;ii++){ | ||||||
|  |   for(int jj=0;jj<N;jj++){ | ||||||
|  |     ret._internal[ii][jj]=peekIndex<Level>(arg._internal[ii][jj],i); | ||||||
|  |   }} | ||||||
|  |   return ret; | ||||||
|  | } | ||||||
|  | template<int Level,class vtype,int N, typename std::enable_if< iScalar<vtype>::TensorLevel != Level >::type * =nullptr> inline  | ||||||
|  |   auto peekIndex(const iMatrix<vtype,N> &arg,int i,int j) ->   iMatrix<decltype(peekIndex<Level>(arg._internal[0][0],i,j)),N> | ||||||
|  | { | ||||||
|  |   iMatrix<decltype(peekIndex<Level>(arg._internal[0][0],i,j)),N> ret; | ||||||
|  |   for(int ii=0;ii<N;ii++){ | ||||||
|  |   for(int jj=0;jj<N;jj++){ | ||||||
|  |     ret._internal[ii][jj]=peekIndex<Level>(arg._internal[ii][jj],i,j); | ||||||
|  |   }} | ||||||
|  |   return ret; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
|  | #endif | ||||||
							
								
								
									
										127
									
								
								lib/Old/Tensor_poke.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								lib/Old/Tensor_poke.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,127 @@ | |||||||
|  |     /************************************************************************************* | ||||||
|  |  | ||||||
|  |     Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  |     Source file: ./lib/Old/Tensor_poke.h | ||||||
|  |  | ||||||
|  |     Copyright (C) 2015 | ||||||
|  |  | ||||||
|  | Author: Peter Boyle <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 */ | ||||||
|  | #ifndef GRID_MATH_POKE_H | ||||||
|  | #define GRID_MATH_POKE_H | ||||||
|  | namespace Grid { | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Poke a specific index;  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | #if 0 | ||||||
|  | // Scalar poke | ||||||
|  | template<int Level,class vtype,typename std::enable_if< iScalar<vtype>::TensorLevel == Level >::type * =nullptr> inline  | ||||||
|  |   void pokeIndex(iScalar<vtype> &ret, const iScalar<vtype> &arg) | ||||||
|  | { | ||||||
|  |   ret._internal = arg._internal; | ||||||
|  | } | ||||||
|  | // Vector poke, one index | ||||||
|  | template<int Level,class vtype,int N,typename std::enable_if< iScalar<vtype>::TensorLevel == Level >::type * =nullptr> inline  | ||||||
|  |   void pokeIndex(iVector<vtype,N> &ret, const iScalar<vtype> &arg,int i) | ||||||
|  | { | ||||||
|  |   ret._internal[i] = arg._internal; | ||||||
|  | } | ||||||
|  | //Matrix poke, two indices | ||||||
|  | template<int Level,class vtype,int N,typename std::enable_if< iScalar<vtype>::TensorLevel == Level >::type * =nullptr> inline  | ||||||
|  |   void pokeIndex(iMatrix<vtype,N> &ret, const iScalar<vtype> &arg,int i,int j) | ||||||
|  | { | ||||||
|  |   ret._internal[i][j] = arg._internal; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ///////////// | ||||||
|  | // No match poke for scalar,vector,matrix must forward on either 0,1,2 args. Must have 9 routines with notvalue | ||||||
|  | ///////////// | ||||||
|  | // scalar | ||||||
|  | template<int Level,class vtype,typename std::enable_if< iScalar<vtype>::TensorLevel != Level >::type * =nullptr> inline  | ||||||
|  | void pokeIndex(iScalar<vtype> &ret, const iScalar<decltype(peekIndex<Level>(ret._internal))>  &arg) | ||||||
|  | { | ||||||
|  |   pokeIndex<Level>(ret._internal,arg._internal); | ||||||
|  | } | ||||||
|  | template<int Level,class vtype,typename std::enable_if< iScalar<vtype>::TensorLevel != Level >::type * =nullptr> inline  | ||||||
|  |   void pokeIndex(iScalar<vtype> &ret, const iScalar<decltype(peekIndex<Level>(ret._internal,0))> &arg, int i) | ||||||
|  | 		  | ||||||
|  | { | ||||||
|  |   pokeIndex<Level>(ret._internal,arg._internal,i); | ||||||
|  | } | ||||||
|  | template<int Level,class vtype,typename std::enable_if< iScalar<vtype>::TensorLevel != Level >::type * =nullptr> inline  | ||||||
|  |   void pokeIndex(iScalar<vtype> &ret, const iScalar<decltype(peekIndex<Level>(ret._internal,0,0))> &arg,int i,int j) | ||||||
|  | { | ||||||
|  |   pokeIndex<Level>(ret._internal,arg._internal,i,j); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Vector | ||||||
|  | template<int Level,class vtype,int N,typename std::enable_if< iScalar<vtype>::TensorLevel != Level >::type * =nullptr> inline  | ||||||
|  |   void pokeIndex(iVector<vtype,N> &ret, iVector<decltype(peekIndex<Level>(ret._internal)),N>  &arg) | ||||||
|  | { | ||||||
|  |   for(int ii=0;ii<N;ii++){ | ||||||
|  |     pokeIndex<Level>(ret._internal[ii],arg._internal[ii]); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | template<int Level,class vtype,int N,typename std::enable_if< iScalar<vtype>::TensorLevel != Level >::type * =nullptr> inline  | ||||||
|  |   void pokeIndex(iVector<vtype,N> &ret, const iVector<decltype(peekIndex<Level>(ret._internal,0)),N> &arg,int i) | ||||||
|  | { | ||||||
|  |   for(int ii=0;ii<N;ii++){ | ||||||
|  |     pokeIndex<Level>(ret._internal[ii],arg._internal[ii],i); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | template<int Level,class vtype,int N,typename std::enable_if< iScalar<vtype>::TensorLevel != Level >::type * =nullptr> inline  | ||||||
|  |   void pokeIndex(iVector<vtype,N> &ret, const iVector<decltype(peekIndex<Level>(ret._internal,0,0)),N> &arg,int i,int j) | ||||||
|  | { | ||||||
|  |   for(int ii=0;ii<N;ii++){ | ||||||
|  |     pokeIndex<Level>(ret._internal[ii],arg._internal[ii],i,j); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Matrix | ||||||
|  | template<int Level,class vtype,int N,typename std::enable_if< iScalar<vtype>::TensorLevel != Level >::type * =nullptr> inline  | ||||||
|  |   void pokeIndex(iMatrix<vtype,N> &ret, const iMatrix<decltype(peekIndex<Level>(ret._internal)),N> &arg)		  | ||||||
|  | { | ||||||
|  |   for(int ii=0;ii<N;ii++){ | ||||||
|  |   for(int jj=0;jj<N;jj++){ | ||||||
|  |     pokeIndex<Level>(ret._internal[ii][jj],arg._internal[ii][jj]); | ||||||
|  |   }} | ||||||
|  | } | ||||||
|  | template<int Level,class vtype,int N,typename std::enable_if< iScalar<vtype>::TensorLevel != Level >::type * =nullptr> inline  | ||||||
|  |   void pokeIndex(iMatrix<vtype,N> &ret, const iMatrix<decltype(peekIndex<Level>(ret._internal,0)),N> &arg,int i) | ||||||
|  | { | ||||||
|  |   for(int ii=0;ii<N;ii++){ | ||||||
|  |   for(int jj=0;jj<N;jj++){ | ||||||
|  |     pokeIndex<Level>(ret._internal[ii][jj],arg._internal[ii][jj],i); | ||||||
|  |   }} | ||||||
|  | } | ||||||
|  | template<int Level,class vtype,int N,typename std::enable_if< iScalar<vtype>::TensorLevel != Level >::type * =nullptr> inline  | ||||||
|  |   void pokeIndex(iMatrix<vtype,N> &ret, const iMatrix<decltype(peekIndex<Level>(ret._internal,0,0)),N> &arg, int i,int j) | ||||||
|  | { | ||||||
|  |   for(int ii=0;ii<N;ii++){ | ||||||
|  |   for(int jj=0;jj<N;jj++){ | ||||||
|  |     pokeIndex<Level>(ret._internal[ii][jj],arg._internal[ii][jj],i,j); | ||||||
|  |   }} | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | } | ||||||
|  | #endif | ||||||
| @@ -26,8 +26,8 @@ Author: paboyle <paboyle@ph.ed.ac.uk> | |||||||
|     *************************************************************************************/ |     *************************************************************************************/ | ||||||
|     /*  END LEGAL */ |     /*  END LEGAL */ | ||||||
| 
 | 
 | ||||||
| #include <Grid/GridCore.h> | #include <Grid.h> | ||||||
| #include <Grid/perfmon/PerfCount.h> | #include <PerfCount.h> | ||||||
| 
 | 
 | ||||||
| namespace Grid { | namespace Grid { | ||||||
| 
 | 
 | ||||||
| @@ -172,7 +172,7 @@ public: | |||||||
|     const char * name = PerformanceCounterConfigs[PCT].name; |     const char * name = PerformanceCounterConfigs[PCT].name; | ||||||
|     fd = perf_event_open(&pe, 0, -1, -1, 0); // pid 0, cpu -1 current process any cpu. group -1
 |     fd = perf_event_open(&pe, 0, -1, -1, 0); // pid 0, cpu -1 current process any cpu. group -1
 | ||||||
|     if (fd == -1) { |     if (fd == -1) { | ||||||
|       fprintf(stderr, "Error opening leader %llx for event %s\n",(long long) pe.config,name); |       fprintf(stderr, "Error opening leader %llx for event %s\n", pe.config,name); | ||||||
|       perror("Error is"); |       perror("Error is"); | ||||||
|     } |     } | ||||||
|     int norm = PerformanceCounterConfigs[PCT].normalisation; |     int norm = PerformanceCounterConfigs[PCT].normalisation; | ||||||
| @@ -181,7 +181,7 @@ public: | |||||||
|     name = PerformanceCounterConfigs[norm].name; |     name = PerformanceCounterConfigs[norm].name; | ||||||
|     cyclefd = perf_event_open(&pe, 0, -1, -1, 0); // pid 0, cpu -1 current process any cpu. group -1
 |     cyclefd = perf_event_open(&pe, 0, -1, -1, 0); // pid 0, cpu -1 current process any cpu. group -1
 | ||||||
|     if (cyclefd == -1) { |     if (cyclefd == -1) { | ||||||
|       fprintf(stderr, "Error opening leader %llx for event %s\n",(long long) pe.config,name); |       fprintf(stderr, "Error opening leader %llx for event %s\n", pe.config,name); | ||||||
|       perror("Error is"); |       perror("Error is"); | ||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
| @@ -205,13 +205,12 @@ public: | |||||||
|   void Stop(void) { |   void Stop(void) { | ||||||
|     count=0; |     count=0; | ||||||
|     cycles=0; |     cycles=0; | ||||||
|     size_t ign; |  | ||||||
| #ifdef __linux__ | #ifdef __linux__ | ||||||
|     if ( fd!= -1) { |     if ( fd!= -1) { | ||||||
|       ::ioctl(fd, PERF_EVENT_IOC_DISABLE, 0); |       ::ioctl(fd, PERF_EVENT_IOC_DISABLE, 0); | ||||||
|       ::ioctl(cyclefd, PERF_EVENT_IOC_DISABLE, 0); |       ::ioctl(cyclefd, PERF_EVENT_IOC_DISABLE, 0); | ||||||
|       ign=::read(fd, &count, sizeof(long long)); |       ::read(fd, &count, sizeof(long long)); | ||||||
|       ign=::read(cyclefd, &cycles, sizeof(long long)); |       ::read(cyclefd, &cycles, sizeof(long long)); | ||||||
|     } |     } | ||||||
|     elapsed = cyclecount() - begin; |     elapsed = cyclecount() - begin; | ||||||
| #else | #else | ||||||
| @@ -172,8 +172,8 @@ namespace Grid { | |||||||
| 
 | 
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #include <Grid/simd/Grid_vector_types.h> | #include "simd/Grid_vector_types.h" | ||||||
| #include <Grid/simd/Grid_vector_unops.h> | #include "simd/Grid_vector_unops.h" | ||||||
| 
 | 
 | ||||||
| namespace Grid { | namespace Grid { | ||||||
|   // Default precision
 |   // Default precision
 | ||||||
| @@ -1,9 +1,11 @@ | |||||||
| #include <Grid/GridCore.h> | #include <Grid.h> | ||||||
| #include <Grid/perfmon/PerfCount.h> | #include <PerfCount.h> | ||||||
| #include <Grid/perfmon/Stat.h> | #include <Stat.h> | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| namespace Grid {  | namespace Grid {  | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| bool PmuStat::pmu_initialized=false; | bool PmuStat::pmu_initialized=false; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @@ -28,8 +28,10 @@ | |||||||
|  #ifndef GRID_STENCIL_H |  #ifndef GRID_STENCIL_H | ||||||
|  #define GRID_STENCIL_H |  #define GRID_STENCIL_H | ||||||
| 
 | 
 | ||||||
|  |  #include <thread> | ||||||
|  | 
 | ||||||
|  #include <Grid/stencil/Lebesgue.h>   // subdir aggregate |  #include <Grid/stencil/Lebesgue.h>   // subdir aggregate | ||||||
| #define NEW_XYZT_GATHER | 
 | ||||||
|  //////////////////////////////////////////////////////////////////////////////////////////
 |  //////////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  // Must not lose sight that goal is to be able to construct really efficient
 |  // Must not lose sight that goal is to be able to construct really efficient
 | ||||||
|  // gather to a point stencil code. CSHIFT is not the best way, so need
 |  // gather to a point stencil code. CSHIFT is not the best way, so need
 | ||||||
| @@ -68,48 +70,50 @@ | |||||||
| 
 | 
 | ||||||
| namespace Grid { | namespace Grid { | ||||||
| 
 | 
 | ||||||
| ///////////////////////////////////////////////////////////////////
 | inline void Gather_plane_simple_table_compute (GridBase *grid,int dimension,int plane,int cbmask, | ||||||
| // Gather for when there *is* need to SIMD split with compression
 | 					       int off,std::vector<std::pair<int,int> > & table) | ||||||
| ///////////////////////////////////////////////////////////////////
 |  | ||||||
| void Gather_plane_table_compute (GridBase *grid,int dimension,int plane,int cbmask, |  | ||||||
| 					int off,std::vector<std::pair<int,int> > & table); |  | ||||||
| 
 |  | ||||||
| template<class vobj,class cobj,class compressor>  |  | ||||||
| void Gather_plane_simple_table (std::vector<std::pair<int,int> >& table,const Lattice<vobj> &rhs,cobj *buffer,compressor &compress, int off,int so)   __attribute__((noinline)); |  | ||||||
| 
 |  | ||||||
| template<class vobj,class cobj,class compressor>  |  | ||||||
| void Gather_plane_simple_table (std::vector<std::pair<int,int> >& table,const Lattice<vobj> &rhs,cobj *buffer,compressor &compress, int off,int so) |  | ||||||
| { | { | ||||||
|   int num=table.size(); |   table.resize(0); | ||||||
|   parallel_for(int i=0;i<num;i++){ |   int rd = grid->_rdimensions[dimension]; | ||||||
|     vstream(buffer[off+table[i].first],compress(rhs._odata[so+table[i].second])); | 
 | ||||||
|  |   if ( !grid->CheckerBoarded(dimension) ) { | ||||||
|  |     cbmask = 0x3; | ||||||
|  |   } | ||||||
|  |   int so= plane*grid->_ostride[dimension]; // base offset for start of plane 
 | ||||||
|  |   int e1=grid->_slice_nblock[dimension]; | ||||||
|  |   int e2=grid->_slice_block[dimension]; | ||||||
|  | 
 | ||||||
|  |   int stride=grid->_slice_stride[dimension]; | ||||||
|  |   if ( cbmask == 0x3 ) {  | ||||||
|  |     table.resize(e1*e2); | ||||||
|  |     for(int n=0;n<e1;n++){ | ||||||
|  |       for(int b=0;b<e2;b++){ | ||||||
|  | 	int o  = n*stride; | ||||||
|  | 	int bo = n*e2; | ||||||
|  | 	table[bo+b]=std::pair<int,int>(bo+b,o+b); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } else {  | ||||||
|  |      int bo=0; | ||||||
|  |      table.resize(e1*e2/2); | ||||||
|  |      for(int n=0;n<e1;n++){ | ||||||
|  |        for(int b=0;b<e2;b++){ | ||||||
|  | 	 int o  = n*stride; | ||||||
|  | 	 int ocb=1<<grid->CheckerBoardFromOindexTable(o+b); | ||||||
|  | 	 if ( ocb &cbmask ) { | ||||||
|  | 	   table[bo]=std::pair<int,int>(bo,o+b); bo++; | ||||||
|  | 	 } | ||||||
|  |        } | ||||||
|  |      } | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ///////////////////////////////////////////////////////////////////
 | template<class vobj,class cobj,class compressor> void  | ||||||
| // Gather for when there *is* need to SIMD split with compression
 | Gather_plane_simple_table (std::vector<std::pair<int,int> >& table,const Lattice<vobj> &rhs,cobj *buffer,compressor &compress, int off,int so) | ||||||
| ///////////////////////////////////////////////////////////////////
 |  | ||||||
| template<class cobj,class vobj,class compressor> |  | ||||||
| void Gather_plane_exchange_table(const Lattice<vobj> &rhs, |  | ||||||
| 				 std::vector<cobj *> pointers,int dimension,int plane,int cbmask,compressor &compress,int type) __attribute__((noinline)); |  | ||||||
| 
 |  | ||||||
| template<class cobj,class vobj,class compressor> |  | ||||||
| void Gather_plane_exchange_table(std::vector<std::pair<int,int> >& table,const Lattice<vobj> &rhs, |  | ||||||
| 				 std::vector<cobj *> pointers,int dimension,int plane,int cbmask, |  | ||||||
| 				 compressor &compress,int type) |  | ||||||
| { | { | ||||||
|   assert( (table.size()&0x1)==0); | PARALLEL_FOR_LOOP      | ||||||
|   int num=table.size()/2; |      for(int i=0;i<table.size();i++){ | ||||||
|   int so  = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane 
 |        buffer[off+table[i].first]=compress(rhs._odata[so+table[i].second]); | ||||||
|   parallel_for(int j=0;j<num;j++){ |  | ||||||
|     //    buffer[off+table[i].first]=compress(rhs._odata[so+table[i].second]);
 |  | ||||||
|     cobj temp1 =compress(rhs._odata[so+table[2*j].second]); |  | ||||||
|     cobj temp2 =compress(rhs._odata[so+table[2*j+1].second]); |  | ||||||
|     cobj temp3; |  | ||||||
|     cobj temp4; |  | ||||||
|     exchange(temp3,temp4,temp1,temp2,type); |  | ||||||
|     vstream(pointers[0][j],temp3); |  | ||||||
|     vstream(pointers[1][j],temp4); |  | ||||||
|      } |      } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @@ -121,8 +125,6 @@ struct StencilEntry { | |||||||
|   uint32_t _around_the_world; //256 bits, 32 bytes, 1/2 cacheline
 |   uint32_t _around_the_world; //256 bits, 32 bytes, 1/2 cacheline
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| //extern int dump;
 |  | ||||||
| 
 |  | ||||||
| template<class vobj,class cobj> | template<class vobj,class cobj> | ||||||
| class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal fill in.
 | class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal fill in.
 | ||||||
|  public: |  public: | ||||||
| @@ -157,6 +159,7 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
|     p.to_rank  = to; |     p.to_rank  = to; | ||||||
|     p.from_rank= from; |     p.from_rank= from; | ||||||
|     p.bytes    = bytes; |     p.bytes    = bytes; | ||||||
|  |     comms_bytes+=2.0*bytes; | ||||||
|     Packets.push_back(p); |     Packets.push_back(p); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| @@ -165,45 +168,36 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
|     reqs.resize(Packets.size()); |     reqs.resize(Packets.size()); | ||||||
|     commtime-=usecond(); |     commtime-=usecond(); | ||||||
|     for(int i=0;i<Packets.size();i++){ |     for(int i=0;i<Packets.size();i++){ | ||||||
|       comms_bytes+=_grid->StencilSendToRecvFromBegin(reqs[i], | 	_grid->StencilSendToRecvFromBegin(reqs[i], | ||||||
|  | 					  Packets[i].send_buf, | ||||||
|  | 					  Packets[i].to_rank, | ||||||
|  | 					  Packets[i].recv_buf, | ||||||
|  | 					  Packets[i].from_rank, | ||||||
|  | 					  Packets[i].bytes); | ||||||
|  | 	/*
 | ||||||
|  |       }else{ | ||||||
|  | 	_grid->SendToRecvFromBegin(reqs[i], | ||||||
| 				   Packets[i].send_buf, | 				   Packets[i].send_buf, | ||||||
| 				   Packets[i].to_rank, | 				   Packets[i].to_rank, | ||||||
| 				   Packets[i].recv_buf, | 				   Packets[i].recv_buf, | ||||||
| 				   Packets[i].from_rank, | 				   Packets[i].from_rank, | ||||||
| 				   Packets[i].bytes); | 				   Packets[i].bytes); | ||||||
|  |       } | ||||||
|  | 	*/ | ||||||
|     } |     } | ||||||
|     commtime+=usecond(); |     commtime+=usecond(); | ||||||
|   } |   } | ||||||
|   void CommunicateComplete(std::vector<std::vector<CommsRequest_t> > &reqs) |   void CommunicateComplete(std::vector<std::vector<CommsRequest_t> > &reqs) | ||||||
|   { |   { | ||||||
|     commtime-=usecond(); |     commtime-=usecond(); | ||||||
|  | 
 | ||||||
|     for(int i=0;i<Packets.size();i++){ |     for(int i=0;i<Packets.size();i++){ | ||||||
|  |       //      if( ShmDirectCopy ) 
 | ||||||
| 	_grid->StencilSendToRecvFromComplete(reqs[i]); | 	_grid->StencilSendToRecvFromComplete(reqs[i]); | ||||||
|  | 	//      else 
 | ||||||
|  | 	//	_grid->SendToRecvFromComplete(reqs[i]);
 | ||||||
|     } |     } | ||||||
|     _grid->StencilBarrier();// Synch shared memory on a single nodes
 |  | ||||||
|     commtime+=usecond(); |     commtime+=usecond(); | ||||||
|     /*
 |  | ||||||
|     int dump=1; |  | ||||||
|     if(dump){ |  | ||||||
|       for(int i=0;i<Packets.size();i++){ |  | ||||||
| 	cobj * ptr  = (cobj *) Packets[i].recv_buf; |  | ||||||
| 	uint64_t num=Packets[i].bytes/sizeof(cobj); |  | ||||||
| 	  std::cout << " CommunicateComplete " << i<< " / " << Packets.size()<< " num " << num <<std::endl; |  | ||||||
| 	  std::stringstream ss; |  | ||||||
| 	  ss<<"recvbuf"; |  | ||||||
| 	  for(int d=0;d<_grid->_ndimension;d++){ |  | ||||||
| 	    ss<<"."<<_grid->_processor_coor[d]; |  | ||||||
| 	  } |  | ||||||
| 	  ss<<"_mu_"<<i; |  | ||||||
| 	  std::string fname(ss.str()); |  | ||||||
| 	  std::ofstream fout(fname); |  | ||||||
| 	  for(int k=0;k<num;k++) { |  | ||||||
| 	    fout << i<<" "<<k<<" "<<ptr[k]<<std::endl; |  | ||||||
| 	  } |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|     dump =0; |  | ||||||
| */ |  | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   ///////////////////////////////////////////
 |   ///////////////////////////////////////////
 | ||||||
| @@ -212,18 +206,14 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
|   struct Merge { |   struct Merge { | ||||||
|     cobj * mpointer; |     cobj * mpointer; | ||||||
|     std::vector<scalar_object *> rpointers; |     std::vector<scalar_object *> rpointers; | ||||||
|     std::vector<cobj *> vpointers; |  | ||||||
|     Integer buffer_size; |     Integer buffer_size; | ||||||
|     Integer packet_id; |     Integer packet_id; | ||||||
|     Integer exchange; |  | ||||||
|     Integer type; |  | ||||||
|   }; |   }; | ||||||
|    |    | ||||||
|   std::vector<Merge> Mergers; |   std::vector<Merge> Mergers; | ||||||
| 
 | 
 | ||||||
|   void AddMerge(cobj *merge_p,std::vector<scalar_object *> &rpointers,Integer buffer_size,Integer packet_id) { |   void AddMerge(cobj *merge_p,std::vector<scalar_object *> &rpointers,Integer buffer_size,Integer packet_id) { | ||||||
|     Merge m; |     Merge m; | ||||||
|     m.exchange = 0; |  | ||||||
|     m.mpointer = merge_p; |     m.mpointer = merge_p; | ||||||
|     m.rpointers= rpointers; |     m.rpointers= rpointers; | ||||||
|     m.buffer_size = buffer_size; |     m.buffer_size = buffer_size; | ||||||
| @@ -231,48 +221,17 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
|     Mergers.push_back(m); |     Mergers.push_back(m); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   void AddMergeNew(cobj *merge_p,std::vector<cobj *> &rpointers,Integer buffer_size,Integer packet_id,Integer type) { |  | ||||||
|     Merge m; |  | ||||||
|     m.exchange = 1; |  | ||||||
|     m.type     = type; |  | ||||||
|     m.mpointer = merge_p; |  | ||||||
|     m.vpointers= rpointers; |  | ||||||
|     m.buffer_size = buffer_size; |  | ||||||
|     m.packet_id   = packet_id; |  | ||||||
|     Mergers.push_back(m); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   void CommsMerge(void ) {  |   void CommsMerge(void ) {  | ||||||
| 
 | 
 | ||||||
|     for(int i=0;i<Mergers.size();i++){	 |     for(int i=0;i<Mergers.size();i++){	 | ||||||
|  |        | ||||||
|       mergetime-=usecond(); |       mergetime-=usecond(); | ||||||
| 
 | PARALLEL_FOR_LOOP | ||||||
|       //      std::cout << "Merge " <<i << std::endl;
 |       for(int o=0;o<Mergers[i].buffer_size;o++){ | ||||||
|       //      std::stringstream ss;
 |  | ||||||
|       //      ss<<"mergebuf";
 |  | ||||||
|       //      for(int d=0;d<_grid->_ndimension;d++){
 |  | ||||||
|       //	ss<<"."<<_grid->_processor_coor[d];
 |  | ||||||
|       //      }
 |  | ||||||
|       //      ss<<"_m_"<<i;
 |  | ||||||
|       //      std::string fname(ss.str());
 |  | ||||||
|       //      std::ofstream fout(fname);
 |  | ||||||
| 
 |  | ||||||
|       if ( Mergers[i].exchange == 0 ) {  |  | ||||||
| 	parallel_for(int o=0;o<Mergers[i].buffer_size;o++){ |  | ||||||
| 	merge1(Mergers[i].mpointer[o],Mergers[i].rpointers,o); | 	merge1(Mergers[i].mpointer[o],Mergers[i].rpointers,o); | ||||||
| 	  //	fout<<o<<" "<<Mergers[i].mpointer[o]<<std::endl;
 |  | ||||||
| 	} |  | ||||||
|       } else {  |  | ||||||
| 	parallel_for(int o=0;o<Mergers[i].buffer_size/2;o++){ |  | ||||||
| 	  exchange(Mergers[i].mpointer[2*o],Mergers[i].mpointer[2*o+1], |  | ||||||
| 		   Mergers[i].vpointers[0][o],Mergers[i].vpointers[1][o],Mergers[i].type); |  | ||||||
| 	  //	  cobj temp1,temp2;
 |  | ||||||
| 	  //	  exchange(temp1,temp2,Mergers[i].vpointers[0][o],Mergers[i].vpointers[1][o],Mergers[i].type);
 |  | ||||||
| 	  //	  vstream(Mergers[i].mpointer[2*o],temp1);
 |  | ||||||
| 	  //	  vstream(Mergers[i].mpointer[2*o+1],temp2);
 |  | ||||||
| 	} |  | ||||||
|       } |       } | ||||||
|       mergetime+=usecond(); |       mergetime+=usecond(); | ||||||
|  | 
 | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| @@ -336,8 +295,6 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
|   // depending on comms target
 |   // depending on comms target
 | ||||||
|   cobj* u_recv_buf_p; |   cobj* u_recv_buf_p; | ||||||
|   cobj* u_send_buf_p; |   cobj* u_send_buf_p; | ||||||
|   std::vector<cobj *> new_simd_send_buf; |  | ||||||
|   std::vector<cobj *> new_simd_recv_buf; |  | ||||||
|   std::vector<scalar_object *> u_simd_send_buf; |   std::vector<scalar_object *> u_simd_send_buf; | ||||||
|   std::vector<scalar_object *> u_simd_recv_buf; |   std::vector<scalar_object *> u_simd_recv_buf; | ||||||
| 
 | 
 | ||||||
| @@ -384,11 +341,6 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
|   void Report(void) { |   void Report(void) { | ||||||
| #define PRINTIT(A)	\ | #define PRINTIT(A)	\ | ||||||
|  std::cout << GridLogMessage << " Stencil " << #A << " "<< A/calls<<std::endl; |  std::cout << GridLogMessage << " Stencil " << #A << " "<< A/calls<<std::endl; | ||||||
| 
 |  | ||||||
|     RealD NP = _grid->_Nprocessors; |  | ||||||
|     RealD NN = _grid->NodeCount(); |  | ||||||
| 
 |  | ||||||
|     _grid->GlobalSum(commtime);    commtime/=NP; |  | ||||||
|     if ( calls > 0. ) { |     if ( calls > 0. ) { | ||||||
|       std::cout << GridLogMessage << " Stencil calls "<<calls<<std::endl; |       std::cout << GridLogMessage << " Stencil calls "<<calls<<std::endl; | ||||||
|       PRINTIT(halogtime); |       PRINTIT(halogtime); | ||||||
| @@ -398,8 +350,7 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
|       if(comms_bytes>1.0){ |       if(comms_bytes>1.0){ | ||||||
| 	PRINTIT(comms_bytes); | 	PRINTIT(comms_bytes); | ||||||
| 	PRINTIT(commtime); | 	PRINTIT(commtime); | ||||||
| 	std::cout << GridLogMessage << " Stencil " << comms_bytes/commtime/1000. << " GB/s per rank"<<std::endl; | 	std::cout << GridLogMessage << " Stencil " << comms_bytes/commtime/1000. << " GB/s "<<std::endl; | ||||||
| 	std::cout << GridLogMessage << " Stencil " << comms_bytes/commtime/1000.*NP/NN << " GB/s per node"<<std::endl; |  | ||||||
|       } |       } | ||||||
|       PRINTIT(jointime); |       PRINTIT(jointime); | ||||||
|       PRINTIT(spintime); |       PRINTIT(spintime); | ||||||
| @@ -443,9 +394,7 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
|        |        | ||||||
|       _checkerboard = checkerboard; |       _checkerboard = checkerboard; | ||||||
|        |        | ||||||
|       //////////////////////////
 |  | ||||||
|       // the permute type
 |       // the permute type
 | ||||||
|       //////////////////////////
 |  | ||||||
|       int simd_layout     = _grid->_simd_layout[dimension]; |       int simd_layout     = _grid->_simd_layout[dimension]; | ||||||
|       int comm_dim        = _grid->_processors[dimension] >1 ; |       int comm_dim        = _grid->_processors[dimension] >1 ; | ||||||
|       int splice_dim      = _grid->_simd_layout[dimension]>1 && (comm_dim); |       int splice_dim      = _grid->_simd_layout[dimension]>1 && (comm_dim); | ||||||
| @@ -455,11 +404,9 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
|        |        | ||||||
|       int sshift[2]; |       int sshift[2]; | ||||||
|        |        | ||||||
|       //////////////////////////
 |  | ||||||
|       // Underlying approach. For each local site build
 |       // Underlying approach. For each local site build
 | ||||||
|       // up a table containing the npoint "neighbours" and whether they 
 |       // up a table containing the npoint "neighbours" and whether they 
 | ||||||
|       // live in lattice or a comms buffer.
 |       // live in lattice or a comms buffer.
 | ||||||
|       //////////////////////////
 |  | ||||||
|       if ( !comm_dim ) { |       if ( !comm_dim ) { | ||||||
| 	sshift[0] = _grid->CheckerBoardShiftForCB(_checkerboard,dimension,shift,Even); | 	sshift[0] = _grid->CheckerBoardShiftForCB(_checkerboard,dimension,shift,Even); | ||||||
| 	sshift[1] = _grid->CheckerBoardShiftForCB(_checkerboard,dimension,shift,Odd); | 	sshift[1] = _grid->CheckerBoardShiftForCB(_checkerboard,dimension,shift,Odd); | ||||||
| @@ -470,11 +417,11 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
| 	  Local(point,dimension,shift,0x1);// if checkerboard is unfavourable take two passes
 | 	  Local(point,dimension,shift,0x1);// if checkerboard is unfavourable take two passes
 | ||||||
| 	  Local(point,dimension,shift,0x2);// both with block stride loop iteration
 | 	  Local(point,dimension,shift,0x2);// both with block stride loop iteration
 | ||||||
| 	} | 	} | ||||||
|       } else {  |       } else { // All permute extract done in comms phase prior to Stencil application
 | ||||||
| 	// All permute extract done in comms phase prior to Stencil application
 |  | ||||||
| 	//        So tables are the same whether comm_dim or splice_dim
 | 	//        So tables are the same whether comm_dim or splice_dim
 | ||||||
| 	sshift[0] = _grid->CheckerBoardShiftForCB(_checkerboard,dimension,shift,Even); | 	sshift[0] = _grid->CheckerBoardShiftForCB(_checkerboard,dimension,shift,Even); | ||||||
| 	sshift[1] = _grid->CheckerBoardShiftForCB(_checkerboard,dimension,shift,Odd); | 	sshift[1] = _grid->CheckerBoardShiftForCB(_checkerboard,dimension,shift,Odd); | ||||||
|  | 	 | ||||||
| 	if ( sshift[0] == sshift[1] ) { | 	if ( sshift[0] == sshift[1] ) { | ||||||
| 	  Comms(point,dimension,shift,0x3); | 	  Comms(point,dimension,shift,0x3); | ||||||
| 	} else { | 	} else { | ||||||
| @@ -493,21 +440,13 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
| 
 | 
 | ||||||
|     u_simd_send_buf.resize(Nsimd); |     u_simd_send_buf.resize(Nsimd); | ||||||
|     u_simd_recv_buf.resize(Nsimd); |     u_simd_recv_buf.resize(Nsimd); | ||||||
|     new_simd_send_buf.resize(Nsimd); | 
 | ||||||
|     new_simd_recv_buf.resize(Nsimd); |  | ||||||
|     u_send_buf_p=(cobj *)_grid->ShmBufferMalloc(_unified_buffer_size*sizeof(cobj)); |     u_send_buf_p=(cobj *)_grid->ShmBufferMalloc(_unified_buffer_size*sizeof(cobj)); | ||||||
|     u_recv_buf_p=(cobj *)_grid->ShmBufferMalloc(_unified_buffer_size*sizeof(cobj)); |     u_recv_buf_p=(cobj *)_grid->ShmBufferMalloc(_unified_buffer_size*sizeof(cobj)); | ||||||
| #ifdef NEW_XYZT_GATHER |  | ||||||
|     for(int l=0;l<2;l++){ |  | ||||||
|       new_simd_recv_buf[l] = (cobj *)_grid->ShmBufferMalloc(_unified_buffer_size*sizeof(cobj)); |  | ||||||
|       new_simd_send_buf[l] = (cobj *)_grid->ShmBufferMalloc(_unified_buffer_size*sizeof(cobj)); |  | ||||||
|     } |  | ||||||
| #else |  | ||||||
|     for(int l=0;l<Nsimd;l++){ |     for(int l=0;l<Nsimd;l++){ | ||||||
|       u_simd_recv_buf[l] = (scalar_object *)_grid->ShmBufferMalloc(_unified_buffer_size*sizeof(scalar_object)); |       u_simd_recv_buf[l] = (scalar_object *)_grid->ShmBufferMalloc(_unified_buffer_size*sizeof(scalar_object)); | ||||||
|       u_simd_send_buf[l] = (scalar_object *)_grid->ShmBufferMalloc(_unified_buffer_size*sizeof(scalar_object)); |       u_simd_send_buf[l] = (scalar_object *)_grid->ShmBufferMalloc(_unified_buffer_size*sizeof(scalar_object)); | ||||||
|     } |     } | ||||||
| #endif |  | ||||||
| 
 | 
 | ||||||
|     PrecomputeByteOffsets(); |     PrecomputeByteOffsets(); | ||||||
|   } |   } | ||||||
| @@ -574,11 +513,9 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
|     assert(shift>=0); |     assert(shift>=0); | ||||||
|     assert(shift<fd); |     assert(shift<fd); | ||||||
|      |      | ||||||
|     // done in reduced dims, so SIMD factored
 |     int buffer_size = _grid->_slice_nblock[dimension]*_grid->_slice_block[dimension]; // done in reduced dims, so SIMD factored
 | ||||||
|     int buffer_size = _grid->_slice_nblock[dimension]*_grid->_slice_block[dimension];  |  | ||||||
|      |      | ||||||
|     _comm_buf_size[point] = buffer_size; // Size of _one_ plane. Multiple planes may be gathered and
 |     _comm_buf_size[point] = buffer_size; // Size of _one_ plane. Multiple planes may be gathered and
 | ||||||
| 
 |  | ||||||
|     // send to one or more remote nodes.
 |     // send to one or more remote nodes.
 | ||||||
|      |      | ||||||
|     int cb= (cbmask==0x2)? Odd : Even; |     int cb= (cbmask==0x2)? Odd : Even; | ||||||
| @@ -741,10 +678,13 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
|     calls++; |     calls++; | ||||||
|     Mergers.resize(0); |     Mergers.resize(0); | ||||||
|     Packets.resize(0); |     Packets.resize(0); | ||||||
|  |     _grid->StencilBarrier(); | ||||||
|     HaloGather(source,compress); |     HaloGather(source,compress); | ||||||
|     this->CommunicateBegin(reqs); |     this->CommunicateBegin(reqs); | ||||||
|  |     _grid->StencilBarrier(); | ||||||
|     this->CommunicateComplete(reqs); |     this->CommunicateComplete(reqs); | ||||||
|     CommsMerge();  |     _grid->StencilBarrier(); | ||||||
|  |     CommsMerge(); // spins
 | ||||||
|   } |   } | ||||||
|    |    | ||||||
|   template<class compressor> void HaloGatherDir(const Lattice<vobj> &source,compressor &compress,int point,int & face_idx) |   template<class compressor> void HaloGatherDir(const Lattice<vobj> &source,compressor &compress,int point,int & face_idx) | ||||||
| @@ -775,13 +715,7 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
|       if ( sshift[0] == sshift[1] ) { |       if ( sshift[0] == sshift[1] ) { | ||||||
| 	if (splice_dim) { | 	if (splice_dim) { | ||||||
| 	  splicetime-=usecond(); | 	  splicetime-=usecond(); | ||||||
| 	  //	  GatherSimd(source,dimension,shift,0x3,compress,face_idx);
 |  | ||||||
| 	  //	  std::cout << "GatherSimdNew"<<std::endl;
 |  | ||||||
| #ifdef NEW_XYZT_GATHER |  | ||||||
| 	  GatherSimdNew(source,dimension,shift,0x3,compress,face_idx); |  | ||||||
| #else  |  | ||||||
| 	  GatherSimd(source,dimension,shift,0x3,compress,face_idx); | 	  GatherSimd(source,dimension,shift,0x3,compress,face_idx); | ||||||
| #endif |  | ||||||
| 	  splicetime+=usecond(); | 	  splicetime+=usecond(); | ||||||
| 	} else {  | 	} else {  | ||||||
| 	  nosplicetime-=usecond(); | 	  nosplicetime-=usecond(); | ||||||
| @@ -791,14 +725,8 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
|       } else { |       } else { | ||||||
| 	if(splice_dim){ | 	if(splice_dim){ | ||||||
| 	  splicetime-=usecond(); | 	  splicetime-=usecond(); | ||||||
| 	  //	  std::cout << "GatherSimdNew2calls"<<std::endl;
 |  | ||||||
| #ifdef NEW_XYZT_GATHER |  | ||||||
| 	  GatherSimdNew(source,dimension,shift,0x1,compress,face_idx);// if checkerboard is unfavourable take two passes
 |  | ||||||
| 	  GatherSimdNew(source,dimension,shift,0x2,compress,face_idx);// both with block stride loop iteration
 |  | ||||||
| #else  |  | ||||||
| 	  GatherSimd(source,dimension,shift,0x1,compress,face_idx);// if checkerboard is unfavourable take two passes
 | 	  GatherSimd(source,dimension,shift,0x1,compress,face_idx);// if checkerboard is unfavourable take two passes
 | ||||||
| 	  GatherSimd(source,dimension,shift,0x2,compress,face_idx);// both with block stride loop iteration
 | 	  GatherSimd(source,dimension,shift,0x2,compress,face_idx);// both with block stride loop iteration
 | ||||||
| #endif |  | ||||||
| 	  splicetime+=usecond(); | 	  splicetime+=usecond(); | ||||||
| 	} else { | 	} else { | ||||||
| 	  nosplicetime-=usecond(); | 	  nosplicetime-=usecond(); | ||||||
| @@ -813,8 +741,6 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
|   template<class compressor> |   template<class compressor> | ||||||
|   void HaloGather(const Lattice<vobj> &source,compressor &compress) |   void HaloGather(const Lattice<vobj> &source,compressor &compress) | ||||||
|   { |   { | ||||||
|     _grid->StencilBarrier();// Synch shared memory on a single nodes
 |  | ||||||
| 
 |  | ||||||
|     // conformable(source._grid,_grid);
 |     // conformable(source._grid,_grid);
 | ||||||
|     assert(source._grid==_grid); |     assert(source._grid==_grid); | ||||||
|     halogtime-=usecond(); |     halogtime-=usecond(); | ||||||
| @@ -875,12 +801,12 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
| 	if ( !face_table_computed ) { | 	if ( !face_table_computed ) { | ||||||
| 	  t_table-=usecond(); | 	  t_table-=usecond(); | ||||||
| 	  face_table.resize(face_idx+1); | 	  face_table.resize(face_idx+1); | ||||||
| 	  Gather_plane_table_compute ((GridBase *)_grid,dimension,sx,cbmask,u_comm_offset,face_table[face_idx]); | 	  Gather_plane_simple_table_compute ((GridBase *)_grid,dimension,sx,cbmask,u_comm_offset, | ||||||
| 	  //	  std::cout << " face table size "<<face_idx <<" " <<  face_table[face_idx].size() <<" computed buffer size "<< words <<
 | 					     face_table[face_idx]); | ||||||
| 	  //		    " bytes = " << bytes <<std::endl;
 |  | ||||||
| 	  t_table+=usecond(); | 	  t_table+=usecond(); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
|  | 	 | ||||||
| 	int rank           = _grid->_processor; | 	int rank           = _grid->_processor; | ||||||
| 	int recv_from_rank; | 	int recv_from_rank; | ||||||
| 	int xmit_to_rank; | 	int xmit_to_rank; | ||||||
| @@ -892,12 +818,15 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
| 	/////////////////////////////////////////////////////////
 | 	/////////////////////////////////////////////////////////
 | ||||||
| 	// try the direct copy if possible
 | 	// try the direct copy if possible
 | ||||||
| 	/////////////////////////////////////////////////////////
 | 	/////////////////////////////////////////////////////////
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| 	cobj *send_buf = (cobj *)_grid->ShmBufferTranslate(xmit_to_rank,u_recv_buf_p); | 	cobj *send_buf = (cobj *)_grid->ShmBufferTranslate(xmit_to_rank,u_recv_buf_p); | ||||||
| 	if ( send_buf==NULL ) {  | 	if ( send_buf==NULL ) {  | ||||||
| 	  send_buf = u_send_buf_p; | 	  send_buf = u_send_buf_p; | ||||||
| 	} | 	} | ||||||
| 	 | 	//	std::cout << " send_bufs  "<<std::hex<< send_buf <<" ubp "<<u_send_buf_p <<std::dec<<std::endl;
 | ||||||
| 	t_data-=usecond(); | 	t_data-=usecond(); | ||||||
|  | 	assert(u_send_buf_p!=NULL); | ||||||
| 	assert(send_buf!=NULL); | 	assert(send_buf!=NULL); | ||||||
| 	Gather_plane_simple_table         (face_table[face_idx],rhs,send_buf,compress,u_comm_offset,so);  face_idx++; | 	Gather_plane_simple_table         (face_table[face_idx],rhs,send_buf,compress,u_comm_offset,so);  face_idx++; | ||||||
| 	t_data+=usecond(); | 	t_data+=usecond(); | ||||||
| @@ -947,8 +876,6 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
|     std::vector<scalar_object *> rpointers(Nsimd); |     std::vector<scalar_object *> rpointers(Nsimd); | ||||||
|     std::vector<scalar_object *> spointers(Nsimd); |     std::vector<scalar_object *> spointers(Nsimd); | ||||||
|      |      | ||||||
|     //    std::cout << "GatherSimd " << dimension << " shift "<<shift<<std::endl;
 |  | ||||||
| 
 |  | ||||||
|     ///////////////////////////////////////////
 |     ///////////////////////////////////////////
 | ||||||
|     // Work out what to send where
 |     // Work out what to send where
 | ||||||
|     ///////////////////////////////////////////
 |     ///////////////////////////////////////////
 | ||||||
| @@ -975,10 +902,10 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
| 
 | 
 | ||||||
| 	for(int i=0;i<Nsimd;i++){ | 	for(int i=0;i<Nsimd;i++){ | ||||||
| 	   | 	   | ||||||
| 	  // FIXME -  This logic is hard coded to simd_layout==2 and not allowing >2
 | 	  // FIXME 
 | ||||||
| 	  //	  for(int w=0;w<buffer_size;w++){
 | 	  // This logic is hard coded to simd_layout ==2 and not allowing >2
 | ||||||
| 	  //	    std::cout << "GatherSimd<"<<Nsimd<<"> : lane " << i <<" elem "<<w<<" "<< u_simd_send_buf[i ][u_comm_offset+w]<<std::endl;
 | 	  //		std::cout << "GatherSimd : lane 1st elem " << i << u_simd_send_buf[i ][u_comm_offset]<<std::endl;
 | ||||||
| 	  //	  }
 | 	   | ||||||
| 	  int inner_bit = (Nsimd>>(permute_type+1)); | 	  int inner_bit = (Nsimd>>(permute_type+1)); | ||||||
| 	  int ic= (i&inner_bit)? 1:0; | 	  int ic= (i&inner_bit)? 1:0; | ||||||
| 	   | 	   | ||||||
| @@ -1003,9 +930,8 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
| 	     | 	     | ||||||
| 	    _grid->ShiftedRanks(dimension,nbr_proc,xmit_to_rank,recv_from_rank);  | 	    _grid->ShiftedRanks(dimension,nbr_proc,xmit_to_rank,recv_from_rank);  | ||||||
|   |   | ||||||
| 	    // shm == receive pointer         if offnode
 |  | ||||||
| 	    // shm == Translate[send pointer] if on node -- my view of his send pointer
 |  | ||||||
| 	    scalar_object *shm = (scalar_object *) _grid->ShmBufferTranslate(recv_from_rank,sp); | 	    scalar_object *shm = (scalar_object *) _grid->ShmBufferTranslate(recv_from_rank,sp); | ||||||
|  | 	    //	    if ((ShmDirectCopy==0)||(shm==NULL)) { 
 | ||||||
| 	    if (shm==NULL) {  | 	    if (shm==NULL) {  | ||||||
| 	      shm = rp; | 	      shm = rp; | ||||||
| 	    }  | 	    }  | ||||||
| @@ -1030,133 +956,6 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|    |    | ||||||
| 
 |  | ||||||
|   template<class compressor> |  | ||||||
|   void  GatherSimdNew(const Lattice<vobj> &rhs,int dimension,int shift,int cbmask,compressor &compress,int & face_idx) |  | ||||||
|   { |  | ||||||
|     const int Nsimd = _grid->Nsimd(); |  | ||||||
| 
 |  | ||||||
|     const int maxl =2;// max layout in a direction
 |  | ||||||
|     int fd = _grid->_fdimensions[dimension]; |  | ||||||
|     int rd = _grid->_rdimensions[dimension]; |  | ||||||
|     int ld = _grid->_ldimensions[dimension]; |  | ||||||
|     int pd              = _grid->_processors[dimension]; |  | ||||||
|     int simd_layout     = _grid->_simd_layout[dimension]; |  | ||||||
|     int comm_dim        = _grid->_processors[dimension] >1 ; |  | ||||||
|     assert(comm_dim==1); |  | ||||||
|     // This will not work with a rotate dim
 |  | ||||||
|     assert(simd_layout==maxl); |  | ||||||
|     assert(shift>=0); |  | ||||||
|     assert(shift<fd); |  | ||||||
| 
 |  | ||||||
|     int permute_type=_grid->PermuteType(dimension); |  | ||||||
|     //    std::cout << "SimdNew permute type "<<permute_type<<std::endl;
 |  | ||||||
| 
 |  | ||||||
|     ///////////////////////////////////////////////
 |  | ||||||
|     // Simd direction uses an extract/merge pair
 |  | ||||||
|     ///////////////////////////////////////////////
 |  | ||||||
|     int buffer_size = _grid->_slice_nblock[dimension]*_grid->_slice_block[dimension]; |  | ||||||
|     int words = sizeof(cobj)/sizeof(vector_type); |  | ||||||
|      |  | ||||||
|     assert(cbmask==0x3); // Fixme think there is a latent bug if not true
 |  | ||||||
|      |  | ||||||
|     int reduced_buffer_size = buffer_size; |  | ||||||
|     if (cbmask != 0x3) reduced_buffer_size=buffer_size>>1; |  | ||||||
| 
 |  | ||||||
|     int bytes = (reduced_buffer_size*sizeof(cobj))/simd_layout; |  | ||||||
|     assert(bytes*simd_layout == reduced_buffer_size*sizeof(cobj)); |  | ||||||
| 
 |  | ||||||
|     std::vector<cobj *> rpointers(maxl); |  | ||||||
|     std::vector<cobj *> spointers(maxl); |  | ||||||
| 
 |  | ||||||
|     ///////////////////////////////////////////
 |  | ||||||
|     // Work out what to send where
 |  | ||||||
|     ///////////////////////////////////////////
 |  | ||||||
|      |  | ||||||
|     int cb    = (cbmask==0x2)? Odd : Even; |  | ||||||
|     int sshift= _grid->CheckerBoardShiftForCB(rhs.checkerboard,dimension,shift,cb); |  | ||||||
|      |  | ||||||
|     // loop over outer coord planes orthog to dim
 |  | ||||||
|     for(int x=0;x<rd;x++){        |  | ||||||
|        |  | ||||||
|       int any_offnode = ( ((x+sshift)%fd) >= rd ); |  | ||||||
| 
 |  | ||||||
|       if ( any_offnode ) { |  | ||||||
| 
 |  | ||||||
| 	 |  | ||||||
| 	for(int i=0;i<maxl;i++){        |  | ||||||
| 	  spointers[i] = (cobj *) &new_simd_send_buf[i][u_comm_offset]; |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	int sx   = (x+sshift)%rd; |  | ||||||
| 
 |  | ||||||
| 	//	if ( cbmask==0x3 ) { 
 |  | ||||||
| 	//	  std::vector<std::pair<int,int> > table;
 |  | ||||||
| 	t_table-=usecond(); |  | ||||||
| 	if ( !face_table_computed ) { |  | ||||||
| 	  face_table.resize(face_idx+1); |  | ||||||
| 	  Gather_plane_table_compute ((GridBase *)_grid,dimension,sx,cbmask,u_comm_offset,face_table[face_idx]); |  | ||||||
| 	  //	  std::cout << " face table size "<<face_idx <<" " <<  face_table[face_idx].size() <<" computed buffer size "<< reduced_buffer_size <<
 |  | ||||||
| 	  //		    " bytes = "<<bytes <<std::endl;
 |  | ||||||
| 	} |  | ||||||
| 	t_table+=usecond(); |  | ||||||
| 	gathermtime-=usecond(); |  | ||||||
| 	Gather_plane_exchange_table(face_table[face_idx],rhs,spointers,dimension,sx,cbmask,compress,permute_type);  face_idx++; |  | ||||||
| 	gathermtime+=usecond(); |  | ||||||
|        |  | ||||||
| 	//spointers[0] -- low
 |  | ||||||
| 	//spointers[1] -- high
 |  | ||||||
| 
 |  | ||||||
| 	for(int i=0;i<maxl;i++){ |  | ||||||
| 
 |  | ||||||
| 	  int my_coor  = rd*i + x;            // self explanatory
 |  | ||||||
| 	  int nbr_coor = my_coor+sshift;      // self explanatory
 |  | ||||||
| 
 |  | ||||||
| 	  int nbr_proc = ((nbr_coor)/ld) % pd;// relative shift in processors
 |  | ||||||
| 	  int nbr_lcoor= (nbr_coor%ld);       // local plane coor on neighbour node
 |  | ||||||
| 	  int nbr_ic   = (nbr_lcoor)/rd;      // inner coord of peer simd lane "i"
 |  | ||||||
| 	  int nbr_ox   = (nbr_lcoor%rd);      // outer coord of peer "x"
 |  | ||||||
| 
 |  | ||||||
| 	  int nbr_plane = nbr_ic; |  | ||||||
| 	  assert (sx == nbr_ox); |  | ||||||
| 
 |  | ||||||
| 	  auto rp = &new_simd_recv_buf[i        ][u_comm_offset]; |  | ||||||
| 	  auto sp = &new_simd_send_buf[nbr_plane][u_comm_offset]; |  | ||||||
| 
 |  | ||||||
| 	  if(nbr_proc){ |  | ||||||
| 
 |  | ||||||
| 	    int recv_from_rank; |  | ||||||
| 	    int xmit_to_rank; |  | ||||||
| 	     |  | ||||||
| 	    _grid->ShiftedRanks(dimension,nbr_proc,xmit_to_rank,recv_from_rank);  |  | ||||||
|   |  | ||||||
| 	    // shm == receive pointer         if offnode
 |  | ||||||
| 	    // shm == Translate[send pointer] if on node -- my view of his send pointer
 |  | ||||||
| 	    cobj *shm = (cobj *) _grid->ShmBufferTranslate(recv_from_rank,sp); |  | ||||||
| 	    if (shm==NULL) {  |  | ||||||
| 	      shm = rp; |  | ||||||
| 	    } |  | ||||||
| 
 |  | ||||||
| 	    // if Direct, StencilSendToRecvFrom will suppress copy to a peer on node
 |  | ||||||
| 	    // assuming above pointer flip
 |  | ||||||
| 	    AddPacket((void *)sp,(void *)rp,xmit_to_rank,recv_from_rank,bytes); |  | ||||||
| 
 |  | ||||||
| 	    rpointers[i] = shm; |  | ||||||
| 	     |  | ||||||
| 	  } else {  |  | ||||||
| 	     |  | ||||||
| 	    rpointers[i] = sp; |  | ||||||
| 	     |  | ||||||
| 	  } |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	AddMergeNew(&u_recv_buf_p[u_comm_offset],rpointers,reduced_buffer_size,Packets.size()-1,permute_type); |  | ||||||
| 
 |  | ||||||
| 	u_comm_offset     +=buffer_size; |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|    |  | ||||||
| }; | }; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| @@ -37,23 +37,24 @@ Author: paboyle <paboyle@ph.ed.ac.uk> | |||||||
| 
 | 
 | ||||||
| #ifdef GRID_OMP | #ifdef GRID_OMP | ||||||
| #include <omp.h> | #include <omp.h> | ||||||
| 
 | #ifdef GRID_NUMA | ||||||
|   #define PARALLEL_FOR_LOOP        _Pragma("omp parallel for schedule(static)") |   #define PARALLEL_FOR_LOOP        _Pragma("omp parallel for schedule(static)") | ||||||
|   #define PARALLEL_FOR_LOOP_INTERN _Pragma("omp for schedule(static)") |   #define PARALLEL_FOR_LOOP_INTERN _Pragma("omp for schedule(static)") | ||||||
|  |   #else | ||||||
|  |   #define PARALLEL_FOR_LOOP        _Pragma("omp parallel for schedule(runtime)") | ||||||
|  |   #define PARALLEL_FOR_LOOP_INTERN _Pragma("omp for schedule(runtime)") | ||||||
|  | #endif | ||||||
| #define PARALLEL_NESTED_LOOP2    _Pragma("omp parallel for collapse(2)") | #define PARALLEL_NESTED_LOOP2    _Pragma("omp parallel for collapse(2)") | ||||||
| #define PARALLEL_REGION          _Pragma("omp parallel") | #define PARALLEL_REGION          _Pragma("omp parallel") | ||||||
| #define PARALLEL_CRITICAL     _Pragma("omp critical") | #define PARALLEL_FOR_LOOP_STATIC _Pragma("omp parallel for schedule(static)") | ||||||
| #else | #else | ||||||
| #define PARALLEL_FOR_LOOP | #define PARALLEL_FOR_LOOP | ||||||
| #define PARALLEL_FOR_LOOP_INTERN | #define PARALLEL_FOR_LOOP_INTERN | ||||||
| #define PARALLEL_NESTED_LOOP2 | #define PARALLEL_NESTED_LOOP2 | ||||||
| #define PARALLEL_REGION | #define PARALLEL_REGION | ||||||
| #define PARALLEL_CRITICAL | #define PARALLEL_FOR_LOOP_STATIC | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #define parallel_for       PARALLEL_FOR_LOOP for |  | ||||||
| #define parallel_for_nest2 PARALLEL_NESTED_LOOP2 for |  | ||||||
| 
 |  | ||||||
| namespace Grid { | namespace Grid { | ||||||
| 
 | 
 | ||||||
|   // Introduce a class to gain deterministic bit reproducible reduction.
 |   // Introduce a class to gain deterministic bit reproducible reduction.
 | ||||||
| @@ -267,7 +267,8 @@ namespace Grid { | |||||||
|       SimpleCompressor<siteVector> compressor; |       SimpleCompressor<siteVector> compressor; | ||||||
|       Stencil.HaloExchange(in,compressor); |       Stencil.HaloExchange(in,compressor); | ||||||
|  |  | ||||||
|       parallel_for(int ss=0;ss<Grid()->oSites();ss++){ | PARALLEL_FOR_LOOP | ||||||
|  |       for(int ss=0;ss<Grid()->oSites();ss++){ | ||||||
|         siteVector res = zero; |         siteVector res = zero; | ||||||
| 	siteVector nbr; | 	siteVector nbr; | ||||||
| 	int ptype; | 	int ptype; | ||||||
| @@ -379,7 +380,8 @@ namespace Grid { | |||||||
| 	  Subspace.ProjectToSubspace(oProj,oblock); | 	  Subspace.ProjectToSubspace(oProj,oblock); | ||||||
| 	  //	  blockProject(iProj,iblock,Subspace.subspace); | 	  //	  blockProject(iProj,iblock,Subspace.subspace); | ||||||
| 	  //	  blockProject(oProj,oblock,Subspace.subspace); | 	  //	  blockProject(oProj,oblock,Subspace.subspace); | ||||||
| 	  parallel_for(int ss=0;ss<Grid()->oSites();ss++){ | PARALLEL_FOR_LOOP | ||||||
|  | 	  for(int ss=0;ss<Grid()->oSites();ss++){ | ||||||
| 	    for(int j=0;j<nbasis;j++){ | 	    for(int j=0;j<nbasis;j++){ | ||||||
| 	      if( disp!= 0 ) { | 	      if( disp!= 0 ) { | ||||||
| 		A[p]._odata[ss](j,i) = oProj._odata[ss](j); | 		A[p]._odata[ss](j,i) = oProj._odata[ss](j); | ||||||
| @@ -425,7 +427,7 @@ namespace Grid { | |||||||
| 	A[p]=zero; | 	A[p]=zero; | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       GridParallelRNG  RNG(Grid()); RNG.SeedFixedIntegers(std::vector<int>({55,72,19,17,34})); |       GridParallelRNG  RNG(Grid()); RNG.SeedRandomDevice(); | ||||||
|       Lattice<iScalar<CComplex> > val(Grid()); random(RNG,val); |       Lattice<iScalar<CComplex> > val(Grid()); random(RNG,val); | ||||||
|  |  | ||||||
|       Complex one(1.0); |       Complex one(1.0); | ||||||
|   | |||||||
| @@ -25,7 +25,7 @@ Author: Azusa Yamaguchi <ayamaguc@staffmail.ed.ac.uk> | |||||||
|     See the full license in the file "LICENSE" in the top level distribution directory |     See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|     *************************************************************************************/ |     *************************************************************************************/ | ||||||
|     /*  END LEGAL */ |     /*  END LEGAL */ | ||||||
| #include <Grid/GridCore.h> | #include <Grid.h> | ||||||
|  |  | ||||||
| namespace Grid { | namespace Grid { | ||||||
| double MultiShiftFunction::approx(double x) | double MultiShiftFunction::approx(double x) | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ | |||||||
| #include<iomanip> | #include<iomanip> | ||||||
| #include<cassert> | #include<cassert> | ||||||
|  |  | ||||||
| #include<Grid/algorithms/approx/Remez.h> | #include<algorithms/approx/Remez.h> | ||||||
|  |  | ||||||
| // Constructor | // Constructor | ||||||
| AlgRemez::AlgRemez(double lower, double upper, long precision)  | AlgRemez::AlgRemez(double lower, double upper, long precision)  | ||||||
|   | |||||||
| @@ -9,6 +9,7 @@ Copyright (C) 2015 | |||||||
| Author: Azusa Yamaguchi <ayamaguc@staffmail.ed.ac.uk> | Author: Azusa Yamaguchi <ayamaguc@staffmail.ed.ac.uk> | ||||||
| Author: Peter Boyle <paboyle@ph.ed.ac.uk> | Author: Peter Boyle <paboyle@ph.ed.ac.uk> | ||||||
| Author: paboyle <paboyle@ph.ed.ac.uk> | Author: paboyle <paboyle@ph.ed.ac.uk> | ||||||
|  | Author: Guido Cossu <guido.cossu@ed.ac.uk> | ||||||
|  |  | ||||||
| This program is free software; you can redistribute it and/or modify | 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 | it under the terms of the GNU General Public License as published by | ||||||
| @@ -33,6 +34,21 @@ directory | |||||||
|  |  | ||||||
| namespace Grid { | namespace Grid { | ||||||
|  |  | ||||||
|  | struct CG_state { | ||||||
|  |   bool do_repro; | ||||||
|  |   std::vector<RealD> residuals; | ||||||
|  |  | ||||||
|  |   CG_state() {reset();} | ||||||
|  |  | ||||||
|  |   void reset(){ | ||||||
|  |     do_repro = false; | ||||||
|  |     residuals.clear(); | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | enum CGexec_mode{ Default, ReproducibilityTest }; | ||||||
|  |  | ||||||
| ///////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////// | ||||||
| // Base classes for iterative processes based on operators | // Base classes for iterative processes based on operators | ||||||
| // single input vec, single output vec. | // single input vec, single output vec. | ||||||
| @@ -45,12 +61,30 @@ class ConjugateGradient : public OperatorFunction<Field> { | |||||||
|                            // Defaults true. |                            // Defaults true. | ||||||
|   RealD Tolerance; |   RealD Tolerance; | ||||||
|   Integer MaxIterations; |   Integer MaxIterations; | ||||||
|   Integer IterationsToComplete; //Number of iterations the CG took to finish. Filled in upon completion |  | ||||||
|  |  | ||||||
|   ConjugateGradient(RealD tol, Integer maxit, bool err_on_no_conv = true) |   // Reproducibility controls | ||||||
|       : Tolerance(tol), |   bool ReproTest; | ||||||
|         MaxIterations(maxit), |   CG_state CGState; //to check reproducibility by repeating the CG | ||||||
|         ErrorOnNoConverge(err_on_no_conv){}; |   ReproducibilityState<typename Field::vector_object> ReprTest; // for the inner proucts | ||||||
|  |  | ||||||
|  |   // Constructor | ||||||
|  |   ConjugateGradient(RealD tol, Integer maxit, CGexec_mode Mode = Default) | ||||||
|  |     : Tolerance(tol),MaxIterations(maxit){ | ||||||
|  |     switch(Mode) | ||||||
|  |     { | ||||||
|  |       case Default  :  | ||||||
|  |       ErrorOnNoConverge = true; | ||||||
|  |       ReproTest = false; | ||||||
|  |       case ReproducibilityTest : | ||||||
|  |       ErrorOnNoConverge = false; | ||||||
|  |       ReproTest = true;  | ||||||
|  |     } | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   void set_reproducibility_interval(unsigned int interval){ | ||||||
|  |     ReprTest.interval = interval; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |  | ||||||
|   void operator()(LinearOperatorBase<Field> &Linop, const Field &src, |   void operator()(LinearOperatorBase<Field> &Linop, const Field &src, | ||||||
|                   Field &psi) { |                   Field &psi) { | ||||||
| @@ -62,34 +96,37 @@ class ConjugateGradient : public OperatorFunction<Field> { | |||||||
|     Field p(src); |     Field p(src); | ||||||
|     Field mmp(src); |     Field mmp(src); | ||||||
|     Field r(src); |     Field r(src); | ||||||
|  |     Field psi_start(psi);// save for the repro test | ||||||
|  |  | ||||||
|  |     if (CGState.do_repro && ReproTest) | ||||||
|  |         std::cout << GridLogMessage << "Starting reproducibility test, full check every " | ||||||
|  |                   << ReprTest.interval << " calls" << std::endl; | ||||||
|  |  | ||||||
|  |     if(!ReprTest.do_check) | ||||||
|  |         ReprTest.reset(); | ||||||
|  |     ReprTest.enable_reprocheck=ReproTest; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     // Initial residual computation & set up |     // Initial residual computation & set up | ||||||
|     RealD guess = norm2(psi); |     RealD guess = norm2(psi, ReprTest); | ||||||
|     assert(std::isnan(guess) == 0); |     assert(std::isnan(guess) == 0); | ||||||
|  |  | ||||||
|      |     Linop.HermOpAndNorm(psi, mmp, d, b);// eventually split this for the norm check | ||||||
|     Linop.HermOpAndNorm(psi, mmp, d, b); |  | ||||||
|      |  | ||||||
|      |      | ||||||
|     r = src - mmp; |     r = src - mmp; | ||||||
|     p = r; |     p = r; | ||||||
|  |  | ||||||
|     a = norm2(p); |     a = norm2(p, ReprTest); | ||||||
|     cp = a; |     cp = a; | ||||||
|     ssq = norm2(src); |     ssq = norm2(src, ReprTest); | ||||||
|  |  | ||||||
|     std::cout << GridLogIterative << std::setprecision(4) |     std::cout << GridLogIterative << "ConjugateGradient: guess " << guess << std::endl; | ||||||
|               << "ConjugateGradient: guess " << guess << std::endl; |     std::cout << GridLogIterative << "ConjugateGradient:   src " << ssq << std::endl; | ||||||
|     std::cout << GridLogIterative << std::setprecision(4) |     std::cout << GridLogIterative << "ConjugateGradient:    mp " << d << std::endl; | ||||||
|               << "ConjugateGradient:   src " << ssq << std::endl; |     std::cout << GridLogIterative << "ConjugateGradient:   mmp " << b << std::endl; | ||||||
|     std::cout << GridLogIterative << std::setprecision(4) |     std::cout << GridLogIterative << "ConjugateGradient:  cp,r " << cp << std::endl; | ||||||
|               << "ConjugateGradient:    mp " << d << std::endl; |     std::cout << GridLogIterative << "ConjugateGradient:     p " << a << std::endl; | ||||||
|     std::cout << GridLogIterative << std::setprecision(4) |  | ||||||
|               << "ConjugateGradient:   mmp " << b << std::endl; |  | ||||||
|     std::cout << GridLogIterative << std::setprecision(4) |  | ||||||
|               << "ConjugateGradient:  cp,r " << cp << std::endl; |  | ||||||
|     std::cout << GridLogIterative << std::setprecision(4) |  | ||||||
|               << "ConjugateGradient:     p " << a << std::endl; |  | ||||||
|  |  | ||||||
|     RealD rsq = Tolerance * Tolerance * ssq; |     RealD rsq = Tolerance * Tolerance * ssq; | ||||||
|  |  | ||||||
| @@ -109,10 +146,10 @@ class ConjugateGradient : public OperatorFunction<Field> { | |||||||
|     SolverTimer.Start(); |     SolverTimer.Start(); | ||||||
|     int k; |     int k; | ||||||
|     for (k = 1; k <= MaxIterations; k++) { |     for (k = 1; k <= MaxIterations; k++) { | ||||||
|       c = cp; |       c = cp;// old residual | ||||||
|  |  | ||||||
|       MatrixTimer.Start(); |       MatrixTimer.Start(); | ||||||
|       Linop.HermOpAndNorm(p, mmp, d, qq); |       Linop.HermOpAndNorm(p, mmp, d, qq);// mmp = Ap, d=pAp | ||||||
|       MatrixTimer.Stop(); |       MatrixTimer.Stop(); | ||||||
|  |  | ||||||
|       LinalgTimer.Start(); |       LinalgTimer.Start(); | ||||||
| @@ -120,14 +157,31 @@ class ConjugateGradient : public OperatorFunction<Field> { | |||||||
|       //  ComplexD dck  = innerProduct(p,mmp); |       //  ComplexD dck  = innerProduct(p,mmp); | ||||||
|  |  | ||||||
|       a = c / d; |       a = c / d; | ||||||
|       b_pred = a * (a * qq - d) / c; |       b_pred = a * (a * qq - d) / c;// a check | ||||||
|  |  | ||||||
|       cp = axpy_norm(r, -a, mmp, r); |  | ||||||
|  |       axpy(r, -a, mmp, r);// new residual r = r_old - a * Ap | ||||||
|  |       cp = norm2(r, ReprTest); // bookkeeping this norm | ||||||
|  |       if (ReproTest && !CGState.do_repro) { | ||||||
|  |         CGState.residuals.push_back(cp);  // save residuals state | ||||||
|  |                 std::cout << GridLogIterative << "ReproTest: Saving state" << std::endl; | ||||||
|  |         } | ||||||
|  |       if (ReproTest && CGState.do_repro){ | ||||||
|  |         // check that the residual agrees with the previous run | ||||||
|  |         std::cout << GridLogIterative << "ReproTest: Checking state k=" << k << std::endl; | ||||||
|  |         if (cp != CGState.residuals[k-1]){ | ||||||
|  |                 std::cout << GridLogMessage << "Failing reproducibility test"; | ||||||
|  |                 std::cout << GridLogMessage << " at k=" << k << std::endl; | ||||||
|  |                 std::cout << GridLogMessage << "saved residual = " << CGState.residuals[k-1]  | ||||||
|  |                         << " cp = " << cp << std::endl; | ||||||
|  |                 exit(1);  // exit after the first failure | ||||||
|  |         } | ||||||
|  |       } | ||||||
|       b = cp / c; |       b = cp / c; | ||||||
|  |  | ||||||
|       // Fuse these loops ; should be really easy |       // Fuse these loops ; should be really easy | ||||||
|       psi = a * p + psi; |       psi = a * p + psi; // update solution | ||||||
|       p = p * b + r; |       p = p * b + r;  // update search direction | ||||||
|  |  | ||||||
|       LinalgTimer.Stop(); |       LinalgTimer.Stop(); | ||||||
|       std::cout << GridLogIterative << "ConjugateGradient: Iteration " << k |       std::cout << GridLogIterative << "ConjugateGradient: Iteration " << k | ||||||
| @@ -157,14 +211,29 @@ class ConjugateGradient : public OperatorFunction<Field> { | |||||||
|         std::cout << std::endl; |         std::cout << std::endl; | ||||||
|  |  | ||||||
|         if (ErrorOnNoConverge) assert(true_residual / Tolerance < 10000.0); |         if (ErrorOnNoConverge) assert(true_residual / Tolerance < 10000.0); | ||||||
| 	IterationsToComplete = k;	 |  | ||||||
|  |         if (! (CGState.do_repro && ReproTest)){ | ||||||
|  |                 CGState.do_repro = true; | ||||||
|  |                 ReprTest.do_check = true; | ||||||
|  |                 ReprTest.reset_counter(); | ||||||
|  |                 this->operator()(Linop, src, psi_start);// run the repro test | ||||||
|  |                 if (ReprTest.success) | ||||||
|  |                 	std::cout << GridLogMessage << "Reproducibility test passed" << std::endl; | ||||||
|  |                 else{ | ||||||
|  |                 	std::cout << GridLogMessage << "Reproducibility test failed" << std::endl; | ||||||
|  |                 	exit(1); | ||||||
|  |                 } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Clear state | ||||||
|  |         CGState.reset(); | ||||||
|  |         ReprTest.reset(); | ||||||
|         return; |         return; | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     std::cout << GridLogMessage << "ConjugateGradient did NOT converge" |     std::cout << GridLogMessage << "ConjugateGradient did NOT converge" | ||||||
|               << std::endl; |               << std::endl; | ||||||
|     if (ErrorOnNoConverge) assert(0); |     if (ErrorOnNoConverge) assert(0); | ||||||
|     IterationsToComplete = k; |  | ||||||
|   } |   } | ||||||
| }; | }; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -35,7 +35,6 @@ namespace Grid { | |||||||
|   class MixedPrecisionConjugateGradient : public LinearFunction<FieldD> { |   class MixedPrecisionConjugateGradient : public LinearFunction<FieldD> { | ||||||
|   public:                                                 |   public:                                                 | ||||||
|     RealD   Tolerance; |     RealD   Tolerance; | ||||||
|     RealD   InnerTolerance; //Initial tolerance for inner CG. Defaults to Tolerance but can be changed |  | ||||||
|     Integer MaxInnerIterations; |     Integer MaxInnerIterations; | ||||||
|     Integer MaxOuterIterations; |     Integer MaxOuterIterations; | ||||||
|     GridBase* SinglePrecGrid; //Grid for single-precision fields |     GridBase* SinglePrecGrid; //Grid for single-precision fields | ||||||
| @@ -43,16 +42,12 @@ namespace Grid { | |||||||
|     LinearOperatorBase<FieldF> &Linop_f; |     LinearOperatorBase<FieldF> &Linop_f; | ||||||
|     LinearOperatorBase<FieldD> &Linop_d; |     LinearOperatorBase<FieldD> &Linop_d; | ||||||
|  |  | ||||||
|     Integer TotalInnerIterations; //Number of inner CG iterations |  | ||||||
|     Integer TotalOuterIterations; //Number of restarts |  | ||||||
|     Integer TotalFinalStepIterations; //Number of CG iterations in final patch-up step |  | ||||||
|  |  | ||||||
|     //Option to speed up *inner single precision* solves using a LinearFunction that produces a guess |     //Option to speed up *inner single precision* solves using a LinearFunction that produces a guess | ||||||
|     LinearFunction<FieldF> *guesser; |     LinearFunction<FieldF> *guesser; | ||||||
|      |      | ||||||
|     MixedPrecisionConjugateGradient(RealD tol, Integer maxinnerit, Integer maxouterit, GridBase* _sp_grid, LinearOperatorBase<FieldF> &_Linop_f, LinearOperatorBase<FieldD> &_Linop_d) : |     MixedPrecisionConjugateGradient(RealD tol, Integer maxinnerit, Integer maxouterit, GridBase* _sp_grid, LinearOperatorBase<FieldF> &_Linop_f, LinearOperatorBase<FieldD> &_Linop_d) : | ||||||
|       Linop_f(_Linop_f), Linop_d(_Linop_d), |       Linop_f(_Linop_f), Linop_d(_Linop_d), | ||||||
|       Tolerance(tol), InnerTolerance(tol), MaxInnerIterations(maxinnerit), MaxOuterIterations(maxouterit), SinglePrecGrid(_sp_grid), |       Tolerance(tol), MaxInnerIterations(maxinnerit), MaxOuterIterations(maxouterit), SinglePrecGrid(_sp_grid), | ||||||
|       OuterLoopNormMult(100.), guesser(NULL){ }; |       OuterLoopNormMult(100.), guesser(NULL){ }; | ||||||
|  |  | ||||||
|     void useGuesser(LinearFunction<FieldF> &g){ |     void useGuesser(LinearFunction<FieldF> &g){ | ||||||
| @@ -60,8 +55,6 @@ namespace Grid { | |||||||
|     } |     } | ||||||
|    |    | ||||||
|     void operator() (const FieldD &src_d_in, FieldD &sol_d){ |     void operator() (const FieldD &src_d_in, FieldD &sol_d){ | ||||||
|       TotalInnerIterations = 0; |  | ||||||
| 	 |  | ||||||
|       GridStopWatch TotalTimer; |       GridStopWatch TotalTimer; | ||||||
|       TotalTimer.Start(); |       TotalTimer.Start(); | ||||||
|      |      | ||||||
| @@ -81,7 +74,7 @@ namespace Grid { | |||||||
|       FieldD src_d(DoublePrecGrid); |       FieldD src_d(DoublePrecGrid); | ||||||
|       src_d = src_d_in; //source for next inner iteration, computed from residual during operation |       src_d = src_d_in; //source for next inner iteration, computed from residual during operation | ||||||
|      |      | ||||||
|       RealD inner_tol = InnerTolerance; |       RealD inner_tol = Tolerance; | ||||||
|      |      | ||||||
|       FieldF src_f(SinglePrecGrid); |       FieldF src_f(SinglePrecGrid); | ||||||
|       src_f.checkerboard = cb; |       src_f.checkerboard = cb; | ||||||
| @@ -96,9 +89,7 @@ namespace Grid { | |||||||
|  |  | ||||||
|       GridStopWatch PrecChangeTimer; |       GridStopWatch PrecChangeTimer; | ||||||
|      |      | ||||||
|       Integer &outer_iter = TotalOuterIterations; //so it will be equal to the final iteration count |       for(Integer outer_iter = 0; outer_iter < MaxOuterIterations; outer_iter++){ | ||||||
|        |  | ||||||
|       for(outer_iter = 0; outer_iter < MaxOuterIterations; outer_iter++){ |  | ||||||
| 	//Compute double precision rsd and also new RHS vector. | 	//Compute double precision rsd and also new RHS vector. | ||||||
| 	Linop_d.HermOp(sol_d, tmp_d); | 	Linop_d.HermOp(sol_d, tmp_d); | ||||||
| 	RealD norm = axpy_norm(src_d, -1., tmp_d, src_d_in); //src_d is residual vector | 	RealD norm = axpy_norm(src_d, -1., tmp_d, src_d_in); //src_d is residual vector | ||||||
| @@ -126,7 +117,6 @@ namespace Grid { | |||||||
| 	InnerCGtimer.Start(); | 	InnerCGtimer.Start(); | ||||||
| 	CG_f(Linop_f, src_f, sol_f); | 	CG_f(Linop_f, src_f, sol_f); | ||||||
| 	InnerCGtimer.Stop(); | 	InnerCGtimer.Stop(); | ||||||
| 	TotalInnerIterations += CG_f.IterationsToComplete; |  | ||||||
|        |        | ||||||
| 	//Convert sol back to double and add to double prec solution | 	//Convert sol back to double and add to double prec solution | ||||||
| 	PrecChangeTimer.Start(); | 	PrecChangeTimer.Start(); | ||||||
| @@ -141,11 +131,9 @@ namespace Grid { | |||||||
|      |      | ||||||
|       ConjugateGradient<FieldD> CG_d(Tolerance, MaxInnerIterations); |       ConjugateGradient<FieldD> CG_d(Tolerance, MaxInnerIterations); | ||||||
|       CG_d(Linop_d, src_d_in, sol_d); |       CG_d(Linop_d, src_d_in, sol_d); | ||||||
|       TotalFinalStepIterations = CG_d.IterationsToComplete; |  | ||||||
|  |  | ||||||
|       TotalTimer.Stop(); |       TotalTimer.Stop(); | ||||||
|       std::cout<<GridLogMessage<<"MixedPrecisionConjugateGradient: Inner CG iterations " << TotalInnerIterations << " Restarts " << TotalOuterIterations << " Final CG iterations " << TotalFinalStepIterations << std::endl; |       std::cout<<GridLogMessage<<"MixedPrecisionConjugateGradient: Total " << TotalTimer.Elapsed() << " Precision change " << PrecChangeTimer.Elapsed() << " Inner CG total " << InnerCGtimer.Elapsed() << std::endl; | ||||||
|       std::cout<<GridLogMessage<<"MixedPrecisionConjugateGradient: Total time " << TotalTimer.Elapsed() << " Precision change " << PrecChangeTimer.Elapsed() << " Inner CG total " << InnerCGtimer.Elapsed() << std::endl; |  | ||||||
|     } |     } | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -31,16 +31,11 @@ Author: paboyle <paboyle@ph.ed.ac.uk> | |||||||
|  |  | ||||||
| #include <string.h> //memset | #include <string.h> //memset | ||||||
| #ifdef USE_LAPACK | #ifdef USE_LAPACK | ||||||
| #ifdef USE_MKL |  | ||||||
| #include<mkl_lapack.h> |  | ||||||
| #else |  | ||||||
| void LAPACK_dstegr(char *jobz, char *range, int *n, double *d, double *e, | void LAPACK_dstegr(char *jobz, char *range, int *n, double *d, double *e, | ||||||
|                    double *vl, double *vu, int *il, int *iu, double *abstol, |                    double *vl, double *vu, int *il, int *iu, double *abstol, | ||||||
|                    int *m, double *w, double *z, int *ldz, int *isuppz, |                    int *m, double *w, double *z, int *ldz, int *isuppz, | ||||||
|                    double *work, int *lwork, int *iwork, int *liwork, |                    double *work, int *lwork, int *iwork, int *liwork, | ||||||
|                    int *info); |                    int *info); | ||||||
| //#include <lapacke/lapacke.h> |  | ||||||
| #endif |  | ||||||
| #endif | #endif | ||||||
| #include "DenseMatrix.h" | #include "DenseMatrix.h" | ||||||
| #include "EigenSort.h" | #include "EigenSort.h" | ||||||
| @@ -64,16 +59,15 @@ public: | |||||||
|  |  | ||||||
|     int Nstop;   // Number of evecs checked for convergence |     int Nstop;   // Number of evecs checked for convergence | ||||||
|     int Nk;      // Number of converged sought |     int Nk;      // Number of converged sought | ||||||
|     int Np;      // Np -- Number of spare vecs in kryloc space |     int Np;      // Np -- Number of spare vecs in krylov space | ||||||
|     int Nm;      // Nm -- total number of vectors |     int Nm;      // Nm -- total number of vectors | ||||||
|  |  | ||||||
|  |  | ||||||
|     RealD OrthoTime; |  | ||||||
|  |  | ||||||
|     RealD eresid; |     RealD eresid; | ||||||
|  |  | ||||||
|     SortEigen<Field> _sort; |     SortEigen<Field> _sort; | ||||||
|  |  | ||||||
|  | //    GridCartesian &_fgrid; | ||||||
|  |  | ||||||
|     LinearOperatorBase<Field> &_Linop; |     LinearOperatorBase<Field> &_Linop; | ||||||
|  |  | ||||||
|     OperatorFunction<Field>   &_poly; |     OperatorFunction<Field>   &_poly; | ||||||
| @@ -130,23 +124,23 @@ public: | |||||||
|  |  | ||||||
|       GridBase *grid = evec[0]._grid; |       GridBase *grid = evec[0]._grid; | ||||||
|       Field w(grid); |       Field w(grid); | ||||||
|       std::cout<<GridLogMessage << "RitzMatrix "<<std::endl; |       std::cout << "RitzMatrix "<<std::endl; | ||||||
|       for(int i=0;i<k;i++){ |       for(int i=0;i<k;i++){ | ||||||
| 	_poly(_Linop,evec[i],w); | 	_poly(_Linop,evec[i],w); | ||||||
| 	std::cout<<GridLogMessage << "["<<i<<"] "; | 	std::cout << "["<<i<<"] "; | ||||||
| 	for(int j=0;j<k;j++){ | 	for(int j=0;j<k;j++){ | ||||||
| 	  ComplexD in = innerProduct(evec[j],w); | 	  ComplexD in = innerProduct(evec[j],w); | ||||||
| 	  if ( fabs((double)i-j)>1 ) {  | 	  if ( fabs((double)i-j)>1 ) {  | ||||||
| 	    if (abs(in) >1.0e-9 )  {  | 	    if (abs(in) >1.0e-9 )  {  | ||||||
| 	      std::cout<<GridLogMessage<<"oops"<<std::endl; | 	      std::cout<<"oops"<<std::endl; | ||||||
| 	      abort(); | 	      abort(); | ||||||
| 	    } else  | 	    } else  | ||||||
| 	      std::cout<<GridLogMessage << " 0 "; | 	      std::cout << " 0 "; | ||||||
| 	  } else {  | 	  } else {  | ||||||
| 	    std::cout<<GridLogMessage << " "<<in<<" "; | 	    std::cout << " "<<in<<" "; | ||||||
| 	  } | 	  } | ||||||
| 	} | 	} | ||||||
| 	std::cout<<GridLogMessage << std::endl; | 	std::cout << std::endl; | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -180,10 +174,10 @@ public: | |||||||
|       RealD beta = normalise(w); // 6. βk+1 := ∥wk∥2. If βk+1 = 0 then Stop |       RealD beta = normalise(w); // 6. βk+1 := ∥wk∥2. If βk+1 = 0 then Stop | ||||||
|                                  // 7. vk+1 := wk/βk+1 |                                  // 7. vk+1 := wk/βk+1 | ||||||
|  |  | ||||||
| 	std::cout<<GridLogMessage << "alpha = " << zalph << " beta "<<beta<<std::endl; | //	std::cout << "alpha = " << zalph << " beta "<<beta<<std::endl; | ||||||
|       const RealD tiny = 1.0e-20; |       const RealD tiny = 1.0e-20; | ||||||
|       if ( beta < tiny ) {  |       if ( beta < tiny ) {  | ||||||
| 	std::cout<<GridLogMessage << " beta is tiny "<<beta<<std::endl; | 	std::cout << " beta is tiny "<<beta<<std::endl; | ||||||
|      } |      } | ||||||
|       lmd[k] = alph; |       lmd[k] = alph; | ||||||
|       lme[k]  = beta; |       lme[k]  = beta; | ||||||
| @@ -259,7 +253,6 @@ public: | |||||||
|     } |     } | ||||||
|  |  | ||||||
| #ifdef USE_LAPACK | #ifdef USE_LAPACK | ||||||
| #define LAPACK_INT long long |  | ||||||
|     void diagonalize_lapack(DenseVector<RealD>& lmd, |     void diagonalize_lapack(DenseVector<RealD>& lmd, | ||||||
| 		     DenseVector<RealD>& lme,  | 		     DenseVector<RealD>& lme,  | ||||||
| 		     int N1, | 		     int N1, | ||||||
| @@ -269,7 +262,7 @@ public: | |||||||
|   const int size = Nm; |   const int size = Nm; | ||||||
| //  tevals.resize(size); | //  tevals.resize(size); | ||||||
| //  tevecs.resize(size); | //  tevecs.resize(size); | ||||||
|   LAPACK_INT NN = N1; |   int NN = N1; | ||||||
|   double evals_tmp[NN]; |   double evals_tmp[NN]; | ||||||
|   double evec_tmp[NN][NN]; |   double evec_tmp[NN][NN]; | ||||||
|   memset(evec_tmp[0],0,sizeof(double)*NN*NN); |   memset(evec_tmp[0],0,sizeof(double)*NN*NN); | ||||||
| @@ -283,19 +276,19 @@ public: | |||||||
|         if (i==j) evals_tmp[i] = lmd[i]; |         if (i==j) evals_tmp[i] = lmd[i]; | ||||||
|         if (j==(i-1)) EE[j] = lme[j]; |         if (j==(i-1)) EE[j] = lme[j]; | ||||||
|       } |       } | ||||||
|   LAPACK_INT evals_found; |   int evals_found; | ||||||
|   LAPACK_INT lwork = ( (18*NN) > (1+4*NN+NN*NN)? (18*NN):(1+4*NN+NN*NN)) ; |   int lwork = ( (18*NN) > (1+4*NN+NN*NN)? (18*NN):(1+4*NN+NN*NN)) ; | ||||||
|   LAPACK_INT liwork =  3+NN*10 ; |   int liwork =  3+NN*10 ; | ||||||
|   LAPACK_INT iwork[liwork]; |   int iwork[liwork]; | ||||||
|   double work[lwork]; |   double work[lwork]; | ||||||
|   LAPACK_INT isuppz[2*NN]; |   int isuppz[2*NN]; | ||||||
|   char jobz = 'V'; // calculate evals & evecs |   char jobz = 'V'; // calculate evals & evecs | ||||||
|   char range = 'I'; // calculate all evals |   char range = 'I'; // calculate all evals | ||||||
|   //    char range = 'A'; // calculate all evals |   //    char range = 'A'; // calculate all evals | ||||||
|   char uplo = 'U'; // refer to upper half of original matrix |   char uplo = 'U'; // refer to upper half of original matrix | ||||||
|   char compz = 'I'; // Compute eigenvectors of tridiagonal matrix |   char compz = 'I'; // Compute eigenvectors of tridiagonal matrix | ||||||
|   int ifail[NN]; |   int ifail[NN]; | ||||||
|   long long info; |   int info; | ||||||
| //  int total = QMP_get_number_of_nodes(); | //  int total = QMP_get_number_of_nodes(); | ||||||
| //  int node = QMP_get_node_number(); | //  int node = QMP_get_node_number(); | ||||||
| //  GridBase *grid = evec[0]._grid; | //  GridBase *grid = evec[0]._grid; | ||||||
| @@ -303,18 +296,14 @@ public: | |||||||
|   int node = grid->_processor; |   int node = grid->_processor; | ||||||
|   int interval = (NN/total)+1; |   int interval = (NN/total)+1; | ||||||
|   double vl = 0.0, vu = 0.0; |   double vl = 0.0, vu = 0.0; | ||||||
|   LAPACK_INT il = interval*node+1 , iu = interval*(node+1); |   int il = interval*node+1 , iu = interval*(node+1); | ||||||
|   if (iu > NN)  iu=NN; |   if (iu > NN)  iu=NN; | ||||||
|   double tol = 0.0; |   double tol = 0.0; | ||||||
|     if (1) { |     if (1) { | ||||||
|       memset(evals_tmp,0,sizeof(double)*NN); |       memset(evals_tmp,0,sizeof(double)*NN); | ||||||
|       if ( il <= NN){ |       if ( il <= NN){ | ||||||
|         printf("total=%d node=%d il=%d iu=%d\n",total,node,il,iu); |         printf("total=%d node=%d il=%d iu=%d\n",total,node,il,iu); | ||||||
| #ifdef USE_MKL |  | ||||||
|         dstegr(&jobz, &range, &NN, |  | ||||||
| #else |  | ||||||
|         LAPACK_dstegr(&jobz, &range, &NN, |         LAPACK_dstegr(&jobz, &range, &NN, | ||||||
| #endif |  | ||||||
|             (double*)DD, (double*)EE, |             (double*)DD, (double*)EE, | ||||||
|             &vl, &vu, &il, &iu, // these four are ignored if second parameteris 'A' |             &vl, &vu, &il, &iu, // these four are ignored if second parameteris 'A' | ||||||
|             &tol, // tolerance |             &tol, // tolerance | ||||||
| @@ -346,7 +335,6 @@ public: | |||||||
|       lmd [NN-1-i]=evals_tmp[i]; |       lmd [NN-1-i]=evals_tmp[i]; | ||||||
|   } |   } | ||||||
| } | } | ||||||
| #undef LAPACK_INT  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -377,14 +365,12 @@ public: | |||||||
| //	diagonalize_lapack(lmd2,lme2,Nm2,Nm,Qt,grid); | //	diagonalize_lapack(lmd2,lme2,Nm2,Nm,Qt,grid); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|       int Niter = 10000*N1; |       int Niter = 100*N1; | ||||||
|       int kmin = 1; |       int kmin = 1; | ||||||
|       int kmax = N2; |       int kmax = N2; | ||||||
|       // (this should be more sophisticated) |       // (this should be more sophisticated) | ||||||
|  |  | ||||||
|       for(int iter=0; ; ++iter){ |       for(int iter=0; iter<Niter; ++iter){ | ||||||
|       if ( (iter+1)%(100*N1)==0)  |  | ||||||
|       std::cout<<GridLogMessage << "[QL method] Not converged - iteration "<<iter+1<<"\n"; |  | ||||||
|  |  | ||||||
| 	// determination of 2x2 leading submatrix | 	// determination of 2x2 leading submatrix | ||||||
| 	RealD dsub = lmd[kmax-1]-lmd[kmax-2]; | 	RealD dsub = lmd[kmax-1]-lmd[kmax-2]; | ||||||
| @@ -413,11 +399,11 @@ public: | |||||||
|         _sort.push(lmd3,N2); |         _sort.push(lmd3,N2); | ||||||
|         _sort.push(lmd2,N2); |         _sort.push(lmd2,N2); | ||||||
|          for(int k=0; k<N2; ++k){ |          for(int k=0; k<N2; ++k){ | ||||||
| 	    if (fabs(lmd2[k] - lmd3[k]) >SMALL)  std::cout<<GridLogMessage <<"lmd(qr) lmd(lapack) "<< k << ": " << lmd2[k] <<" "<< lmd3[k] <<std::endl; | 	    if (fabs(lmd2[k] - lmd3[k]) >SMALL)  std::cout <<"lmd(qr) lmd(lapack) "<< k << ": " << lmd2[k] <<" "<< lmd3[k] <<std::endl; | ||||||
| //	    if (fabs(lme2[k] - lme[k]) >SMALL)  std::cout<<GridLogMessage <<"lme(qr)-lme(lapack) "<< k << ": " << lme2[k] - lme[k] <<std::endl; | //	    if (fabs(lme2[k] - lme[k]) >SMALL)  std::cout <<"lme(qr)-lme(lapack) "<< k << ": " << lme2[k] - lme[k] <<std::endl; | ||||||
| 	  } | 	  } | ||||||
|          for(int k=0; k<N1*N1; ++k){ |          for(int k=0; k<N1*N1; ++k){ | ||||||
| //	    if (fabs(Qt2[k] - Qt[k]) >SMALL)  std::cout<<GridLogMessage <<"Qt(qr)-Qt(lapack) "<< k << ": " << Qt2[k] - Qt[k] <<std::endl; | //	    if (fabs(Qt2[k] - Qt[k]) >SMALL)  std::cout <<"Qt(qr)-Qt(lapack) "<< k << ": " << Qt2[k] - Qt[k] <<std::endl; | ||||||
| 	} | 	} | ||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
| @@ -432,7 +418,7 @@ public: | |||||||
| 	  } | 	  } | ||||||
| 	} | 	} | ||||||
|       } |       } | ||||||
|       std::cout<<GridLogMessage << "[QL method] Error - Too many iteration: "<<Niter<<"\n"; |       std::cout << "[QL method] Error - Too many iteration: "<<Niter<<"\n"; | ||||||
|       abort(); |       abort(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -449,7 +435,6 @@ public: | |||||||
| 		       DenseVector<Field>& evec, | 		       DenseVector<Field>& evec, | ||||||
| 		       int k) | 		       int k) | ||||||
|     { |     { | ||||||
|       double t0=-usecond()/1e6; |  | ||||||
|       typedef typename Field::scalar_type MyComplex; |       typedef typename Field::scalar_type MyComplex; | ||||||
|       MyComplex ip; |       MyComplex ip; | ||||||
|  |  | ||||||
| @@ -468,8 +453,6 @@ public: | |||||||
| 	w = w - ip * evec[j]; | 	w = w - ip * evec[j]; | ||||||
|       } |       } | ||||||
|       normalise(w); |       normalise(w); | ||||||
|       t0+=usecond()/1e6; |  | ||||||
|       OrthoTime +=t0; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     void setUnit_Qt(int Nm, DenseVector<RealD> &Qt) { |     void setUnit_Qt(int Nm, DenseVector<RealD> &Qt) { | ||||||
| @@ -503,10 +486,10 @@ until convergence | |||||||
| 	GridBase *grid = evec[0]._grid; | 	GridBase *grid = evec[0]._grid; | ||||||
| 	assert(grid == src._grid); | 	assert(grid == src._grid); | ||||||
|  |  | ||||||
| 	std::cout<<GridLogMessage << " -- Nk = " << Nk << " Np = "<< Np << std::endl; | 	std::cout << " -- Nk = " << Nk << " Np = "<< Np << std::endl; | ||||||
| 	std::cout<<GridLogMessage << " -- Nm = " << Nm << std::endl; | 	std::cout << " -- Nm = " << Nm << std::endl; | ||||||
| 	std::cout<<GridLogMessage << " -- size of eval   = " << eval.size() << std::endl; | 	std::cout << " -- size of eval   = " << eval.size() << std::endl; | ||||||
| 	std::cout<<GridLogMessage << " -- size of evec  = " << evec.size() << std::endl; | 	std::cout << " -- size of evec  = " << evec.size() << std::endl; | ||||||
| 	 | 	 | ||||||
| 	assert(Nm == evec.size() && Nm == eval.size()); | 	assert(Nm == evec.size() && Nm == eval.size()); | ||||||
| 	 | 	 | ||||||
| @@ -517,7 +500,6 @@ until convergence | |||||||
| 	DenseVector<int>   Iconv(Nm); | 	DenseVector<int>   Iconv(Nm); | ||||||
|  |  | ||||||
| 	DenseVector<Field>  B(Nm,grid); // waste of space replicating | 	DenseVector<Field>  B(Nm,grid); // waste of space replicating | ||||||
| //	DenseVector<Field>  Btemp(Nm,grid); // waste of space replicating |  | ||||||
| 	 | 	 | ||||||
| 	Field f(grid); | 	Field f(grid); | ||||||
| 	Field v(grid); | 	Field v(grid); | ||||||
| @@ -533,48 +515,35 @@ until convergence | |||||||
| 	// (uniform vector) Why not src?? | 	// (uniform vector) Why not src?? | ||||||
| 	//	evec[0] = 1.0; | 	//	evec[0] = 1.0; | ||||||
| 	evec[0] = src; | 	evec[0] = src; | ||||||
| 	std:: cout<<GridLogMessage <<"norm2(src)= " << norm2(src)<<std::endl; | 	std:: cout <<"norm2(src)= " << norm2(src)<<std::endl; | ||||||
| // << src._grid  << std::endl; | // << src._grid  << std::endl; | ||||||
| 	normalise(evec[0]); | 	normalise(evec[0]); | ||||||
| 	std:: cout<<GridLogMessage <<"norm2(evec[0])= " << norm2(evec[0]) <<std::endl; | 	std:: cout <<"norm2(evec[0])= " << norm2(evec[0]) <<std::endl; | ||||||
| // << evec[0]._grid << std::endl; | // << evec[0]._grid << std::endl; | ||||||
| 	 | 	 | ||||||
| 	// Initial Nk steps | 	// Initial Nk steps | ||||||
| 	OrthoTime=0.; |  | ||||||
| 	double t0=usecond()/1e6; |  | ||||||
| 	for(int k=0; k<Nk; ++k) step(eval,lme,evec,f,Nm,k); | 	for(int k=0; k<Nk; ++k) step(eval,lme,evec,f,Nm,k); | ||||||
| 	double t1=usecond()/1e6; | //	std:: cout <<"norm2(evec[1])= " << norm2(evec[1]) << std::endl; | ||||||
| 	std::cout<<GridLogMessage <<"IRL::Initial steps: "<<t1-t0<< "seconds"<<std::endl; t0=t1; | //	std:: cout <<"norm2(evec[2])= " << norm2(evec[2]) << std::endl; | ||||||
| 	std::cout<<GridLogMessage <<"IRL::Initial steps:OrthoTime "<<OrthoTime<< "seconds"<<std::endl; |  | ||||||
| //	std:: cout<<GridLogMessage <<"norm2(evec[1])= " << norm2(evec[1]) << std::endl; |  | ||||||
| //	std:: cout<<GridLogMessage <<"norm2(evec[2])= " << norm2(evec[2]) << std::endl; |  | ||||||
| 	RitzMatrix(evec,Nk); | 	RitzMatrix(evec,Nk); | ||||||
| 	t1=usecond()/1e6; |  | ||||||
| 	std::cout<<GridLogMessage <<"IRL::RitzMatrix: "<<t1-t0<< "seconds"<<std::endl; t0=t1; |  | ||||||
| 	for(int k=0; k<Nk; ++k){ | 	for(int k=0; k<Nk; ++k){ | ||||||
| //	std:: cout<<GridLogMessage <<"eval " << k << " " <<eval[k] << std::endl; | //	std:: cout <<"eval " << k << " " <<eval[k] << std::endl; | ||||||
| //	std:: cout<<GridLogMessage <<"lme " << k << " " << lme[k] << std::endl; | //	std:: cout <<"lme " << k << " " << lme[k] << std::endl; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Restarting loop begins | 	// Restarting loop begins | ||||||
| 	for(int iter = 0; iter<Niter; ++iter){ | 	for(int iter = 0; iter<Niter; ++iter){ | ||||||
|  |  | ||||||
| 	  std::cout<<GridLogMessage<<"\n Restart iteration = "<< iter << std::endl; | 	  std::cout<<"\n Restart iteration = "<< iter << std::endl; | ||||||
|  |  | ||||||
| 	  //  | 	  //  | ||||||
| 	  // Rudy does a sort first which looks very different. Getting fed up with sorting out the algo defs. | 	  // Rudy does a sort first which looks very different. Getting fed up with sorting out the algo defs. | ||||||
| 	  // We loop over  | 	  // We loop over  | ||||||
| 	  // | 	  // | ||||||
| 	OrthoTime=0.; |  | ||||||
| 	  for(int k=Nk; k<Nm; ++k) step(eval,lme,evec,f,Nm,k); | 	  for(int k=Nk; k<Nm; ++k) step(eval,lme,evec,f,Nm,k); | ||||||
| 	t1=usecond()/1e6; |  | ||||||
| 	std::cout<<GridLogMessage <<"IRL:: "<<Np <<" steps: "<<t1-t0<< "seconds"<<std::endl; t0=t1; |  | ||||||
| 	std::cout<<GridLogMessage <<"IRL::Initial steps:OrthoTime "<<OrthoTime<< "seconds"<<std::endl; |  | ||||||
| 	  f *= lme[Nm-1]; | 	  f *= lme[Nm-1]; | ||||||
|  |  | ||||||
| 	  RitzMatrix(evec,k2); | 	  RitzMatrix(evec,k2); | ||||||
| 	t1=usecond()/1e6; |  | ||||||
| 	std::cout<<GridLogMessage <<"IRL:: RitzMatrix: "<<t1-t0<< "seconds"<<std::endl; t0=t1; |  | ||||||
| 	   | 	   | ||||||
| 	  // getting eigenvalues | 	  // getting eigenvalues | ||||||
| 	  for(int k=0; k<Nm; ++k){ | 	  for(int k=0; k<Nm; ++k){ | ||||||
| @@ -583,27 +552,18 @@ until convergence | |||||||
| 	  } | 	  } | ||||||
| 	  setUnit_Qt(Nm,Qt); | 	  setUnit_Qt(Nm,Qt); | ||||||
| 	  diagonalize(eval2,lme2,Nm,Nm,Qt,grid); | 	  diagonalize(eval2,lme2,Nm,Nm,Qt,grid); | ||||||
| 	t1=usecond()/1e6; |  | ||||||
| 	std::cout<<GridLogMessage <<"IRL:: diagonalize: "<<t1-t0<< "seconds"<<std::endl; t0=t1; |  | ||||||
|  |  | ||||||
| 	  // sorting | 	  // sorting | ||||||
| 	  _sort.push(eval2,Nm); | 	  _sort.push(eval2,Nm); | ||||||
| 	t1=usecond()/1e6; |  | ||||||
| 	std::cout<<GridLogMessage <<"IRL:: eval sorting: "<<t1-t0<< "seconds"<<std::endl; t0=t1; |  | ||||||
| 	   | 	   | ||||||
| 	  // Implicitly shifted QR transformations | 	  // Implicitly shifted QR transformations | ||||||
| 	  setUnit_Qt(Nm,Qt); | 	  setUnit_Qt(Nm,Qt); | ||||||
| 	  for(int ip=0; ip<k2; ++ip){ |  | ||||||
| 	std::cout<<GridLogMessage << "eval "<< ip << " "<< eval2[ip] << std::endl; |  | ||||||
| 	} |  | ||||||
| 	  for(int ip=k2; ip<Nm; ++ip){  | 	  for(int ip=k2; ip<Nm; ++ip){  | ||||||
| 	std::cout<<GridLogMessage << "qr_decomp "<< ip << " "<< eval2[ip] << std::endl; | 	std::cout << "qr_decomp "<< ip << " "<< eval2[ip] << std::endl; | ||||||
| 	    qr_decomp(eval,lme,Nm,Nm,Qt,eval2[ip],k1,Nm); | 	    qr_decomp(eval,lme,Nm,Nm,Qt,eval2[ip],k1,Nm); | ||||||
| 		 | 		 | ||||||
| 	} | 	} | ||||||
| 	t1=usecond()/1e6; |      | ||||||
| 	std::cout<<GridLogMessage <<"IRL::qr_decomp: "<<t1-t0<< "seconds"<<std::endl; t0=t1; |  | ||||||
| if (0) {   |  | ||||||
| 	  for(int i=0; i<(Nk+1); ++i) B[i] = 0.0; | 	  for(int i=0; i<(Nk+1); ++i) B[i] = 0.0; | ||||||
| 	   | 	   | ||||||
| 	  for(int j=k1-1; j<k2+1; ++j){ | 	  for(int j=k1-1; j<k2+1; ++j){ | ||||||
| @@ -611,30 +571,6 @@ if (0) { | |||||||
| 	    B[j].checkerboard = evec[k].checkerboard; | 	    B[j].checkerboard = evec[k].checkerboard; | ||||||
| 	      B[j] += Qt[k+Nm*j] * evec[k]; | 	      B[j] += Qt[k+Nm*j] * evec[k]; | ||||||
| 	    } | 	    } | ||||||
| 	  } |  | ||||||
| 	t1=usecond()/1e6; |  | ||||||
| 	std::cout<<GridLogMessage <<"IRL::QR Rotate: "<<t1-t0<< "seconds"<<std::endl; t0=t1; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| if (1) { |  | ||||||
| 	for(int i=0; i<(Nk+1); ++i) { |  | ||||||
| 		B[i] = 0.0; |  | ||||||
| 	  	B[i].checkerboard = evec[0].checkerboard; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	int j_block = 24; int k_block=24; |  | ||||||
| PARALLEL_FOR_LOOP |  | ||||||
| 	for(int ss=0;ss < grid->oSites();ss++){ |  | ||||||
| 	for(int jj=k1-1; jj<k2+1; jj += j_block) |  | ||||||
| 	for(int kk=0; kk<Nm; kk += k_block) |  | ||||||
| 	for(int j=jj; (j<(k2+1)) && j<(jj+j_block); ++j){ |  | ||||||
| 	for(int k=kk; (k<Nm) && k<(kk+k_block) ; ++k){ |  | ||||||
| 	    B[j]._odata[ss] +=Qt[k+Nm*j] * evec[k]._odata[ss];  |  | ||||||
| 	} |  | ||||||
| 	} |  | ||||||
| 	} |  | ||||||
| 	t1=usecond()/1e6; |  | ||||||
| 	std::cout<<GridLogMessage <<"IRL::QR rotation: "<<t1-t0<< "seconds"<<std::endl; t0=t1; |  | ||||||
| 	  } | 	  } | ||||||
| 	  for(int j=k1-1; j<k2+1; ++j) evec[j] = B[j]; | 	  for(int j=k1-1; j<k2+1; ++j) evec[j] = B[j]; | ||||||
|  |  | ||||||
| @@ -643,7 +579,7 @@ PARALLEL_FOR_LOOP | |||||||
| 	  f += lme[k2-1] * evec[k2]; | 	  f += lme[k2-1] * evec[k2]; | ||||||
| 	  beta_k = norm2(f); | 	  beta_k = norm2(f); | ||||||
| 	  beta_k = sqrt(beta_k); | 	  beta_k = sqrt(beta_k); | ||||||
| 	  std::cout<<GridLogMessage<<" beta(k) = "<<beta_k<<std::endl; | 	  std::cout<<" beta(k) = "<<beta_k<<std::endl; | ||||||
|  |  | ||||||
| 	  RealD betar = 1.0/beta_k; | 	  RealD betar = 1.0/beta_k; | ||||||
| 	  evec[k2] = betar * f; | 	  evec[k2] = betar * f; | ||||||
| @@ -656,10 +592,7 @@ PARALLEL_FOR_LOOP | |||||||
| 	  } | 	  } | ||||||
| 	  setUnit_Qt(Nm,Qt); | 	  setUnit_Qt(Nm,Qt); | ||||||
| 	  diagonalize(eval2,lme2,Nk,Nm,Qt,grid); | 	  diagonalize(eval2,lme2,Nk,Nm,Qt,grid); | ||||||
| 	t1=usecond()/1e6; |  | ||||||
| 	std::cout<<GridLogMessage <<"IRL::diagonalize: "<<t1-t0<< "seconds"<<std::endl; t0=t1; |  | ||||||
| 	   | 	   | ||||||
| if (0) { |  | ||||||
| 	  for(int k = 0; k<Nk; ++k) B[k]=0.0; | 	  for(int k = 0; k<Nk; ++k) B[k]=0.0; | ||||||
| 	   | 	   | ||||||
| 	  for(int j = 0; j<Nk; ++j){ | 	  for(int j = 0; j<Nk; ++j){ | ||||||
| @@ -667,34 +600,12 @@ if (0) { | |||||||
| 	    B[j].checkerboard = evec[k].checkerboard; | 	    B[j].checkerboard = evec[k].checkerboard; | ||||||
| 	      B[j] += Qt[k+j*Nm] * evec[k]; | 	      B[j] += Qt[k+j*Nm] * evec[k]; | ||||||
| 	    } | 	    } | ||||||
| 	    std::cout<<GridLogMessage << "norm(B["<<j<<"])="<<norm2(B[j])<<std::endl; | //	    std::cout << "norm(B["<<j<<"])="<<norm2(B[j])<<std::endl; | ||||||
| 	  } |  | ||||||
| 	t1=usecond()/1e6; |  | ||||||
| 	std::cout<<GridLogMessage <<"IRL::Convergence rotation: "<<t1-t0<< "seconds"<<std::endl; t0=t1; |  | ||||||
| } |  | ||||||
| if (1) { |  | ||||||
| 	for(int i=0; i<(Nk+1); ++i) { |  | ||||||
| 		B[i] = 0.0; |  | ||||||
| 	  	B[i].checkerboard = evec[0].checkerboard; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	int j_block = 24; int k_block=24; |  | ||||||
| PARALLEL_FOR_LOOP |  | ||||||
| 	for(int ss=0;ss < grid->oSites();ss++){ |  | ||||||
| 	for(int jj=0; jj<Nk; jj += j_block) |  | ||||||
| 	for(int kk=0; kk<Nk; kk += k_block) |  | ||||||
| 	for(int j=jj; (j<Nk) && j<(jj+j_block); ++j){ |  | ||||||
| 	for(int k=kk; (k<Nk) && k<(kk+k_block) ; ++k){ |  | ||||||
| 	    B[j]._odata[ss] +=Qt[k+Nm*j] * evec[k]._odata[ss];  |  | ||||||
| 	} |  | ||||||
| 	} |  | ||||||
| 	} |  | ||||||
| 	t1=usecond()/1e6; |  | ||||||
| 	std::cout<<GridLogMessage <<"IRL::convergence rotation : "<<t1-t0<< "seconds"<<std::endl; t0=t1; |  | ||||||
| 	  } | 	  } | ||||||
|  | //	_sort.push(eval2,B,Nk); | ||||||
|  |  | ||||||
| 	  Nconv = 0; | 	  Nconv = 0; | ||||||
| 	  //	  std::cout<<GridLogMessage << std::setiosflags(std::ios_base::scientific); | 	  //	  std::cout << std::setiosflags(std::ios_base::scientific); | ||||||
| 	  for(int i=0; i<Nk; ++i){ | 	  for(int i=0; i<Nk; ++i){ | ||||||
|  |  | ||||||
| //	    _poly(_Linop,B[i],v); | //	    _poly(_Linop,B[i],v); | ||||||
| @@ -702,16 +613,14 @@ PARALLEL_FOR_LOOP | |||||||
| 	     | 	     | ||||||
| 	    RealD vnum = real(innerProduct(B[i],v)); // HermOp. | 	    RealD vnum = real(innerProduct(B[i],v)); // HermOp. | ||||||
| 	    RealD vden = norm2(B[i]); | 	    RealD vden = norm2(B[i]); | ||||||
| 	    RealD vv0 = norm2(v); |  | ||||||
| 	    eval2[i] = vnum/vden; | 	    eval2[i] = vnum/vden; | ||||||
| 	    v -= eval2[i]*B[i]; | 	    v -= eval2[i]*B[i]; | ||||||
| 	    RealD vv = norm2(v); | 	    RealD vv = norm2(v); | ||||||
| 	     | 	     | ||||||
| 	    std::cout.precision(13); | 	    std::cout.precision(13); | ||||||
| 	    std::cout<<GridLogMessage << "[" << std::setw(3)<< std::setiosflags(std::ios_base::right) <<i<<"] "; | 	    std::cout << "[" << std::setw(3)<< std::setiosflags(std::ios_base::right) <<i<<"] "; | ||||||
| 	    std::cout << "eval = "<<std::setw(25)<< std::setiosflags(std::ios_base::left)<< eval2[i]; | 	    std::cout << "eval = "<<std::setw(25)<< std::setiosflags(std::ios_base::left)<< eval2[i]; | ||||||
| 	    std::cout<<"|H B[i] - eval[i]B[i]|^2 "<< std::setw(25)<< std::setiosflags(std::ios_base::right)<< vv; | 	    std::cout <<" |H B[i] - eval[i]B[i]|^2 "<< std::setw(25)<< std::setiosflags(std::ios_base::right)<< vv<< std::endl; | ||||||
| 	    std::cout<<" "<< vnum/(sqrt(vden)*sqrt(vv0)) << std::endl; |  | ||||||
| 	     | 	     | ||||||
| 	// change the criteria as evals are supposed to be sorted, all evals smaller(larger) than Nstop should have converged | 	// change the criteria as evals are supposed to be sorted, all evals smaller(larger) than Nstop should have converged | ||||||
| 	    if((vv<eresid*eresid) && (i == Nconv) ){ | 	    if((vv<eresid*eresid) && (i == Nconv) ){ | ||||||
| @@ -720,19 +629,17 @@ PARALLEL_FOR_LOOP | |||||||
| 	    } | 	    } | ||||||
|  |  | ||||||
| 	  }  // i-loop end | 	  }  // i-loop end | ||||||
| 	  //	  std::cout<<GridLogMessage << std::resetiosflags(std::ios_base::scientific); | 	  //	  std::cout << std::resetiosflags(std::ios_base::scientific); | ||||||
| 	t1=usecond()/1e6; |  | ||||||
| 	std::cout<<GridLogMessage <<"IRL::convergence testing: "<<t1-t0<< "seconds"<<std::endl; t0=t1; |  | ||||||
|  |  | ||||||
|  |  | ||||||
| 	  std::cout<<GridLogMessage<<" #modes converged: "<<Nconv<<std::endl; | 	  std::cout<<" #modes converged: "<<Nconv<<std::endl; | ||||||
|  |  | ||||||
| 	  if( Nconv>=Nstop ){ | 	  if( Nconv>=Nstop ){ | ||||||
| 	    goto converged; | 	    goto converged; | ||||||
| 	  } | 	  } | ||||||
| 	} // end of iter loop | 	} // end of iter loop | ||||||
| 	 | 	 | ||||||
| 	std::cout<<GridLogMessage<<"\n NOT converged.\n"; | 	std::cout<<"\n NOT converged.\n"; | ||||||
| 	abort(); | 	abort(); | ||||||
| 	 | 	 | ||||||
|       converged: |       converged: | ||||||
| @@ -745,10 +652,10 @@ PARALLEL_FOR_LOOP | |||||||
|        } |        } | ||||||
|       _sort.push(eval,evec,Nconv); |       _sort.push(eval,evec,Nconv); | ||||||
|  |  | ||||||
|       std::cout<<GridLogMessage << "\n Converged\n Summary :\n"; |       std::cout << "\n Converged\n Summary :\n"; | ||||||
|       std::cout<<GridLogMessage << " -- Iterations  = "<< Nconv  << "\n"; |       std::cout << " -- Iterations  = "<< Nconv  << "\n"; | ||||||
|       std::cout<<GridLogMessage << " -- beta(k)     = "<< beta_k << "\n"; |       std::cout << " -- beta(k)     = "<< beta_k << "\n"; | ||||||
|       std::cout<<GridLogMessage << " -- Nconv       = "<< Nconv  << "\n"; |       std::cout << " -- Nconv       = "<< Nconv  << "\n"; | ||||||
|      } |      } | ||||||
|  |  | ||||||
|     ///////////////////////////////////////////////// |     ///////////////////////////////////////////////// | ||||||
| @@ -771,25 +678,25 @@ PARALLEL_FOR_LOOP | |||||||
| 	} | 	} | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       std::cout<<GridLogMessage<<"Lanczos_Factor start/end " <<start <<"/"<<end<<std::endl; |       std::cout<<"Lanczos_Factor start/end " <<start <<"/"<<end<<std::endl; | ||||||
|  |  | ||||||
|       // Starting from scratch, bq[0] contains a random vector and |bq[0]| = 1 |       // Starting from scratch, bq[0] contains a random vector and |bq[0]| = 1 | ||||||
|       int first; |       int first; | ||||||
|       if(start == 0){ |       if(start == 0){ | ||||||
|  |  | ||||||
| 	std::cout<<GridLogMessage << "start == 0\n"; //TESTING | 	std::cout << "start == 0\n"; //TESTING | ||||||
|  |  | ||||||
| 	_poly(_Linop,bq[0],bf); | 	_poly(_Linop,bq[0],bf); | ||||||
|  |  | ||||||
| 	alpha = real(innerProduct(bq[0],bf));//alpha =  bq[0]^dag A bq[0] | 	alpha = real(innerProduct(bq[0],bf));//alpha =  bq[0]^dag A bq[0] | ||||||
|  |  | ||||||
| 	std::cout<<GridLogMessage << "alpha = " << alpha << std::endl; | 	std::cout << "alpha = " << alpha << std::endl; | ||||||
| 	 | 	 | ||||||
| 	bf = bf - alpha * bq[0];  //bf =  A bq[0] - alpha bq[0] | 	bf = bf - alpha * bq[0];  //bf =  A bq[0] - alpha bq[0] | ||||||
|  |  | ||||||
| 	H[0][0]=alpha; | 	H[0][0]=alpha; | ||||||
|  |  | ||||||
| 	std::cout<<GridLogMessage << "Set H(0,0) to " << H[0][0] << std::endl; | 	std::cout << "Set H(0,0) to " << H[0][0] << std::endl; | ||||||
|  |  | ||||||
| 	first = 1; | 	first = 1; | ||||||
|  |  | ||||||
| @@ -809,19 +716,19 @@ PARALLEL_FOR_LOOP | |||||||
|  |  | ||||||
| 	beta = 0;sqbt = 0; | 	beta = 0;sqbt = 0; | ||||||
|  |  | ||||||
| 	std::cout<<GridLogMessage << "cont is true so setting beta to zero\n"; | 	std::cout << "cont is true so setting beta to zero\n"; | ||||||
|  |  | ||||||
|       }	else { |       }	else { | ||||||
|  |  | ||||||
| 	beta = norm2(bf); | 	beta = norm2(bf); | ||||||
| 	sqbt = sqrt(beta); | 	sqbt = sqrt(beta); | ||||||
|  |  | ||||||
| 	std::cout<<GridLogMessage << "beta = " << beta << std::endl; | 	std::cout << "beta = " << beta << std::endl; | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       for(int j=first;j<end;j++){ |       for(int j=first;j<end;j++){ | ||||||
|  |  | ||||||
| 	std::cout<<GridLogMessage << "Factor j " << j <<std::endl; | 	std::cout << "Factor j " << j <<std::endl; | ||||||
|  |  | ||||||
| 	if(cont){ // switches to factoring; understand start!=0 and initial bf value is right. | 	if(cont){ // switches to factoring; understand start!=0 and initial bf value is right. | ||||||
| 	  bq[j] = bf; cont = false; | 	  bq[j] = bf; cont = false; | ||||||
| @@ -844,7 +751,7 @@ PARALLEL_FOR_LOOP | |||||||
|  |  | ||||||
| 	beta = fnorm; | 	beta = fnorm; | ||||||
| 	sqbt = sqrt(beta); | 	sqbt = sqrt(beta); | ||||||
| 	std::cout<<GridLogMessage << "alpha = " << alpha << " fnorm = " << fnorm << '\n'; | 	std::cout << "alpha = " << alpha << " fnorm = " << fnorm << '\n'; | ||||||
|  |  | ||||||
| 	///Iterative refinement of orthogonality V = [ bq[0]  bq[1]  ...  bq[M] ] | 	///Iterative refinement of orthogonality V = [ bq[0]  bq[1]  ...  bq[M] ] | ||||||
| 	int re = 0; | 	int re = 0; | ||||||
| @@ -879,8 +786,8 @@ PARALLEL_FOR_LOOP | |||||||
| 	  bck = sqrt( nmbex ); | 	  bck = sqrt( nmbex ); | ||||||
| 	  re++; | 	  re++; | ||||||
| 	} | 	} | ||||||
| 	std::cout<<GridLogMessage << "Iteratively refined orthogonality, changes alpha\n"; | 	std::cout << "Iteratively refined orthogonality, changes alpha\n"; | ||||||
| 	if(re > 1) std::cout<<GridLogMessage << "orthagonality refined " << re << " times" <<std::endl; | 	if(re > 1) std::cout << "orthagonality refined " << re << " times" <<std::endl; | ||||||
| 	H[j][j]=alpha; | 	H[j][j]=alpha; | ||||||
|       } |       } | ||||||
|  |  | ||||||
| @@ -895,13 +802,11 @@ PARALLEL_FOR_LOOP | |||||||
|  |  | ||||||
|     void ImplicitRestart(int TM, DenseVector<RealD> &evals,  DenseVector<DenseVector<RealD> > &evecs, DenseVector<Field> &bq, Field &bf, int cont) |     void ImplicitRestart(int TM, DenseVector<RealD> &evals,  DenseVector<DenseVector<RealD> > &evecs, DenseVector<Field> &bq, Field &bf, int cont) | ||||||
|     { |     { | ||||||
|       std::cout<<GridLogMessage << "ImplicitRestart begin. Eigensort starting\n"; |       std::cout << "ImplicitRestart begin. Eigensort starting\n"; | ||||||
|  |  | ||||||
|       DenseMatrix<RealD> H; Resize(H,Nm,Nm); |       DenseMatrix<RealD> H; Resize(H,Nm,Nm); | ||||||
|  |  | ||||||
| #ifndef USE_LAPACK |  | ||||||
|       EigenSort(evals, evecs); |       EigenSort(evals, evecs); | ||||||
| #endif |  | ||||||
|  |  | ||||||
|       ///Assign shifts |       ///Assign shifts | ||||||
|       int K=Nk; |       int K=Nk; | ||||||
| @@ -924,15 +829,15 @@ PARALLEL_FOR_LOOP | |||||||
|       /// Shifted H defines a new K step Arnoldi factorization |       /// Shifted H defines a new K step Arnoldi factorization | ||||||
|       RealD  beta = H[ff][ff-1];  |       RealD  beta = H[ff][ff-1];  | ||||||
|       RealD  sig  = Q[TM - 1][ff - 1]; |       RealD  sig  = Q[TM - 1][ff - 1]; | ||||||
|       std::cout<<GridLogMessage << "beta = " << beta << " sig = " << real(sig) <<std::endl; |       std::cout << "beta = " << beta << " sig = " << real(sig) <<std::endl; | ||||||
|  |  | ||||||
|       std::cout<<GridLogMessage << "TM = " << TM << " "; |       std::cout << "TM = " << TM << " "; | ||||||
|       std::cout<<GridLogMessage << norm2(bq[0]) << " -- before" <<std::endl; |       std::cout << norm2(bq[0]) << " -- before" <<std::endl; | ||||||
|  |  | ||||||
|       /// q -> q Q |       /// q -> q Q | ||||||
|       times_real(bq, Q, TM); |       times_real(bq, Q, TM); | ||||||
|  |  | ||||||
|       std::cout<<GridLogMessage << norm2(bq[0]) << " -- after " << ff <<std::endl; |       std::cout << norm2(bq[0]) << " -- after " << ff <<std::endl; | ||||||
|       bf =  beta* bq[ff] + sig* bf; |       bf =  beta* bq[ff] + sig* bf; | ||||||
|  |  | ||||||
|       /// Do the rest of the factorization |       /// Do the rest of the factorization | ||||||
| @@ -956,7 +861,7 @@ PARALLEL_FOR_LOOP | |||||||
|       int ff = Lanczos_Factor(0, M, cont, bq,bf,H); // 0--M to begin with |       int ff = Lanczos_Factor(0, M, cont, bq,bf,H); // 0--M to begin with | ||||||
|  |  | ||||||
|       if(ff < M) { |       if(ff < M) { | ||||||
| 	std::cout<<GridLogMessage << "Krylov: aborting ff "<<ff <<" "<<M<<std::endl; | 	std::cout << "Krylov: aborting ff "<<ff <<" "<<M<<std::endl; | ||||||
| 	abort(); // Why would this happen? | 	abort(); // Why would this happen? | ||||||
|       } |       } | ||||||
|  |  | ||||||
| @@ -965,7 +870,7 @@ PARALLEL_FOR_LOOP | |||||||
|  |  | ||||||
|       for(int it = 0; it < Niter && (converged < Nk); ++it) { |       for(int it = 0; it < Niter && (converged < Nk); ++it) { | ||||||
|  |  | ||||||
| 	std::cout<<GridLogMessage << "Krylov: Iteration --> " << it << std::endl; | 	std::cout << "Krylov: Iteration --> " << it << std::endl; | ||||||
| 	int lock_num = lock ? converged : 0; | 	int lock_num = lock ? converged : 0; | ||||||
| 	DenseVector<RealD> tevals(M - lock_num ); | 	DenseVector<RealD> tevals(M - lock_num ); | ||||||
| 	DenseMatrix<RealD> tevecs; Resize(tevecs,M - lock_num,M - lock_num); | 	DenseMatrix<RealD> tevecs; Resize(tevecs,M - lock_num,M - lock_num); | ||||||
| @@ -981,7 +886,7 @@ PARALLEL_FOR_LOOP | |||||||
|       Wilkinson<RealD>(H, evals, evecs, small);  |       Wilkinson<RealD>(H, evals, evecs, small);  | ||||||
|       //      Check(); |       //      Check(); | ||||||
|  |  | ||||||
|       std::cout<<GridLogMessage << "Done  "<<std::endl; |       std::cout << "Done  "<<std::endl; | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -1046,7 +951,7 @@ PARALLEL_FOR_LOOP | |||||||
| 		  DenseVector<RealD> &tevals, DenseVector<DenseVector<RealD> > &tevecs,  | 		  DenseVector<RealD> &tevals, DenseVector<DenseVector<RealD> > &tevecs,  | ||||||
| 		  int lock, int converged) | 		  int lock, int converged) | ||||||
|     { |     { | ||||||
|       std::cout<<GridLogMessage << "Converged " << converged << " so far." << std::endl; |       std::cout << "Converged " << converged << " so far." << std::endl; | ||||||
|       int lock_num = lock ? converged : 0; |       int lock_num = lock ? converged : 0; | ||||||
|       int M = Nm; |       int M = Nm; | ||||||
|  |  | ||||||
| @@ -1061,9 +966,7 @@ PARALLEL_FOR_LOOP | |||||||
|       RealD small=1.0e-16; |       RealD small=1.0e-16; | ||||||
|       Wilkinson<RealD>(AH, tevals, tevecs, small); |       Wilkinson<RealD>(AH, tevals, tevecs, small); | ||||||
|  |  | ||||||
| #ifndef USE_LAPACK |  | ||||||
|       EigenSort(tevals, tevecs); |       EigenSort(tevals, tevecs); | ||||||
| #endif |  | ||||||
|  |  | ||||||
|       RealD resid_nrm=  norm2(bf); |       RealD resid_nrm=  norm2(bf); | ||||||
|  |  | ||||||
| @@ -1074,7 +977,7 @@ PARALLEL_FOR_LOOP | |||||||
| 	RealD diff = 0; | 	RealD diff = 0; | ||||||
| 	diff = abs( tevecs[i][Nm - 1 - lock_num] ) * resid_nrm; | 	diff = abs( tevecs[i][Nm - 1 - lock_num] ) * resid_nrm; | ||||||
|  |  | ||||||
| 	std::cout<<GridLogMessage << "residual estimate " << SS-1-i << " " << diff << " of (" << tevals[i] << ")" << std::endl; | 	std::cout << "residual estimate " << SS-1-i << " " << diff << " of (" << tevals[i] << ")" << std::endl; | ||||||
|  |  | ||||||
| 	if(diff < converged) { | 	if(diff < converged) { | ||||||
|  |  | ||||||
| @@ -1090,13 +993,13 @@ PARALLEL_FOR_LOOP | |||||||
| 	    lock_num++; | 	    lock_num++; | ||||||
| 	  } | 	  } | ||||||
| 	  converged++; | 	  converged++; | ||||||
| 	  std::cout<<GridLogMessage << " converged on eval " << converged << " of " << Nk << std::endl; | 	  std::cout << " converged on eval " << converged << " of " << Nk << std::endl; | ||||||
| 	} else { | 	} else { | ||||||
| 	  break; | 	  break; | ||||||
| 	} | 	} | ||||||
|       } |       } | ||||||
| #endif | #endif | ||||||
|       std::cout<<GridLogMessage << "Got " << converged << " so far " <<std::endl;	 |       std::cout << "Got " << converged << " so far " <<std::endl;	 | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     ///Check |     ///Check | ||||||
| @@ -1105,9 +1008,7 @@ PARALLEL_FOR_LOOP | |||||||
|  |  | ||||||
|       DenseVector<RealD> goodval(this->get); |       DenseVector<RealD> goodval(this->get); | ||||||
|  |  | ||||||
| #ifndef USE_LAPACK |  | ||||||
|       EigenSort(evals,evecs); |       EigenSort(evals,evecs); | ||||||
| #endif |  | ||||||
|  |  | ||||||
|       int NM = Nm; |       int NM = Nm; | ||||||
|  |  | ||||||
| @@ -1179,10 +1080,10 @@ say con = 2 | |||||||
| **/ | **/ | ||||||
|  |  | ||||||
| template<class T> | template<class T> | ||||||
| static void Lock(DenseMatrix<T> &H, 	///Hess mtx	 | static void Lock(DenseMatrix<T> &H, 	// Hess mtx	 | ||||||
| 		 DenseMatrix<T> &Q, 	///Lock Transform | 		 DenseMatrix<T> &Q, 	// Lock Transform | ||||||
| 		 T val, 		///value to be locked | 		 T val, 		// value to be locked | ||||||
| 		 int con, 	///number already locked | 		 int con, 	// number already locked | ||||||
| 		 RealD small, | 		 RealD small, | ||||||
| 		 int dfg, | 		 int dfg, | ||||||
| 		 bool herm) | 		 bool herm) | ||||||
|   | |||||||
| @@ -36,7 +36,7 @@ Author: Peter Boyle <paboyle@ph.ed.ac.uk> | |||||||
| #include <iomanip> | #include <iomanip> | ||||||
| #include <complex> | #include <complex> | ||||||
| #include <typeinfo> | #include <typeinfo> | ||||||
| #include <Grid/Grid.h> | #include <Grid.h> | ||||||
|  |  | ||||||
|  |  | ||||||
| /** Sign function **/ | /** Sign function **/ | ||||||
|   | |||||||
| @@ -141,85 +141,5 @@ namespace Grid { | |||||||
|     }      |     }      | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   /////////////////////////////////////////////////////////////////////////////////////////////////////// |  | ||||||
|   // Take a matrix and form a Red Black solver calling a Herm solver |  | ||||||
|   // Use of RB info prevents making SchurRedBlackSolve conform to standard interface |  | ||||||
|   /////////////////////////////////////////////////////////////////////////////////////////////////////// |  | ||||||
|   template<class Field> class SchurRedBlackDiagTwoSolve { |  | ||||||
|   private: |  | ||||||
|     OperatorFunction<Field> & _HermitianRBSolver; |  | ||||||
|     int CBfactorise; |  | ||||||
|   public: |  | ||||||
|  |  | ||||||
|     ///////////////////////////////////////////////////// |  | ||||||
|     // Wrap the usual normal equations Schur trick |  | ||||||
|     ///////////////////////////////////////////////////// |  | ||||||
|   SchurRedBlackDiagTwoSolve(OperatorFunction<Field> &HermitianRBSolver)  : |  | ||||||
|      _HermitianRBSolver(HermitianRBSolver)  |  | ||||||
|     {  |  | ||||||
|       CBfactorise=0; |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     template<class Matrix> |  | ||||||
|       void operator() (Matrix & _Matrix,const Field &in, Field &out){ |  | ||||||
|  |  | ||||||
|       // FIXME CGdiagonalMee not implemented virtual function |  | ||||||
|       // FIXME use CBfactorise to control schur decomp |  | ||||||
|       GridBase *grid = _Matrix.RedBlackGrid(); |  | ||||||
|       GridBase *fgrid= _Matrix.Grid(); |  | ||||||
|  |  | ||||||
|       SchurDiagTwoOperator<Matrix,Field> _HermOpEO(_Matrix); |  | ||||||
|   |  | ||||||
|       Field src_e(grid); |  | ||||||
|       Field src_o(grid); |  | ||||||
|       Field sol_e(grid); |  | ||||||
|       Field sol_o(grid); |  | ||||||
|       Field   tmp(grid); |  | ||||||
|       Field  Mtmp(grid); |  | ||||||
|       Field resid(fgrid); |  | ||||||
|  |  | ||||||
|       pickCheckerboard(Even,src_e,in); |  | ||||||
|       pickCheckerboard(Odd ,src_o,in); |  | ||||||
|       pickCheckerboard(Even,sol_e,out); |  | ||||||
|       pickCheckerboard(Odd ,sol_o,out); |  | ||||||
|      |  | ||||||
|       ///////////////////////////////////////////////////// |  | ||||||
|       // src_o = Mdag * (source_o - Moe MeeInv source_e) |  | ||||||
|       ///////////////////////////////////////////////////// |  | ||||||
|       _Matrix.MooeeInv(src_e,tmp);     assert(  tmp.checkerboard ==Even); |  | ||||||
|       _Matrix.Meooe   (tmp,Mtmp);      assert( Mtmp.checkerboard ==Odd);      |  | ||||||
|       tmp=src_o-Mtmp;                  assert(  tmp.checkerboard ==Odd);      |  | ||||||
|  |  | ||||||
|       // get the right MpcDag |  | ||||||
|       _HermOpEO.MpcDag(tmp,src_o);     assert(src_o.checkerboard ==Odd);        |  | ||||||
|  |  | ||||||
|       ////////////////////////////////////////////////////////////// |  | ||||||
|       // Call the red-black solver |  | ||||||
|       ////////////////////////////////////////////////////////////// |  | ||||||
|       std::cout<<GridLogMessage << "SchurRedBlack solver calling the MpcDagMp solver" <<std::endl; |  | ||||||
| //      _HermitianRBSolver(_HermOpEO,src_o,sol_o);  assert(sol_o.checkerboard==Odd); |  | ||||||
|       _HermitianRBSolver(_HermOpEO,src_o,tmp);  assert(tmp.checkerboard==Odd); |  | ||||||
|       _Matrix.MooeeInv(tmp,sol_o);        assert(  sol_o.checkerboard   ==Odd); |  | ||||||
|  |  | ||||||
|       /////////////////////////////////////////////////// |  | ||||||
|       // sol_e = M_ee^-1 * ( src_e - Meo sol_o )... |  | ||||||
|       /////////////////////////////////////////////////// |  | ||||||
|       _Matrix.Meooe(sol_o,tmp);        assert(  tmp.checkerboard   ==Even); |  | ||||||
|       src_e = src_e-tmp;               assert(  src_e.checkerboard ==Even); |  | ||||||
|       _Matrix.MooeeInv(src_e,sol_e);   assert(  sol_e.checkerboard ==Even); |  | ||||||
|       |  | ||||||
|       setCheckerboard(out,sol_e); assert(  sol_e.checkerboard ==Even); |  | ||||||
|       setCheckerboard(out,sol_o); assert(  sol_o.checkerboard ==Odd ); |  | ||||||
|  |  | ||||||
|       // Verify the unprec residual |  | ||||||
|       _Matrix.M(out,resid);  |  | ||||||
|       resid = resid-in; |  | ||||||
|       RealD ns = norm2(in); |  | ||||||
|       RealD nr = norm2(resid); |  | ||||||
|  |  | ||||||
|       std::cout<<GridLogMessage << "SchurRedBlackDiagTwo solver true unprec resid "<< std::sqrt(nr/ns) <<" nr "<< nr <<" ns "<<ns << std::endl; |  | ||||||
|     }      |  | ||||||
|   }; |  | ||||||
|  |  | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -1,66 +0,0 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #include <Grid/GridCore.h> |  | ||||||
|  |  | ||||||
| namespace Grid { |  | ||||||
|  |  | ||||||
| int PointerCache::victim; |  | ||||||
|  |  | ||||||
|   PointerCache::PointerCacheEntry PointerCache::Entries[PointerCache::Ncache]; |  | ||||||
|  |  | ||||||
| void *PointerCache::Insert(void *ptr,size_t bytes) { |  | ||||||
|  |  | ||||||
|   if (bytes < 4096 ) return NULL; |  | ||||||
|  |  | ||||||
| #ifdef GRID_OMP |  | ||||||
|   assert(omp_in_parallel()==0); |  | ||||||
| #endif  |  | ||||||
|  |  | ||||||
|   void * ret = NULL; |  | ||||||
|   int v = -1; |  | ||||||
|  |  | ||||||
|   for(int e=0;e<Ncache;e++) { |  | ||||||
|     if ( Entries[e].valid==0 ) { |  | ||||||
|       v=e;  |  | ||||||
|       break; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   if ( v==-1 ) { |  | ||||||
|     v=victim; |  | ||||||
|     victim = (victim+1)%Ncache; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   if ( Entries[v].valid ) { |  | ||||||
|     ret = Entries[v].address; |  | ||||||
|     Entries[v].valid = 0; |  | ||||||
|     Entries[v].address = NULL; |  | ||||||
|     Entries[v].bytes = 0; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   Entries[v].address=ptr; |  | ||||||
|   Entries[v].bytes  =bytes; |  | ||||||
|   Entries[v].valid  =1; |  | ||||||
|  |  | ||||||
|   return ret; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void *PointerCache::Lookup(size_t bytes) { |  | ||||||
|  |  | ||||||
|  if (bytes < 4096 ) return NULL; |  | ||||||
|  |  | ||||||
| #ifdef _OPENMP |  | ||||||
|   assert(omp_in_parallel()==0); |  | ||||||
| #endif  |  | ||||||
|  |  | ||||||
|   for(int e=0;e<Ncache;e++){ |  | ||||||
|     if ( Entries[e].valid && ( Entries[e].bytes == bytes ) ) { |  | ||||||
|       Entries[e].valid = 0; |  | ||||||
|       return Entries[e].address; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   return NULL; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| } |  | ||||||
| @@ -52,7 +52,7 @@ public: | |||||||
|  |  | ||||||
|     // Physics Grid information. |     // Physics Grid information. | ||||||
|     std::vector<int> _simd_layout;// Which dimensions get relayed out over simd lanes. |     std::vector<int> _simd_layout;// Which dimensions get relayed out over simd lanes. | ||||||
|     std::vector<int> _fdimensions;// (full) Global dimensions of array prior to cb removal |     std::vector<int> _fdimensions;// Global dimensions of array prior to cb removal | ||||||
|     std::vector<int> _gdimensions;// Global dimensions of array after cb removal |     std::vector<int> _gdimensions;// Global dimensions of array after cb removal | ||||||
|     std::vector<int> _ldimensions;// local dimensions of array with processor images removed |     std::vector<int> _ldimensions;// local dimensions of array with processor images removed | ||||||
|     std::vector<int> _rdimensions;// Reduced local dimensions with simd lane images and processor images removed  |     std::vector<int> _rdimensions;// Reduced local dimensions with simd lane images and processor images removed  | ||||||
| @@ -77,7 +77,7 @@ public: | |||||||
|     // GridCartesian / GridRedBlackCartesian |     // GridCartesian / GridRedBlackCartesian | ||||||
|     //////////////////////////////////////////////////////////////// |     //////////////////////////////////////////////////////////////// | ||||||
|     virtual int CheckerBoarded(int dim)=0; |     virtual int CheckerBoarded(int dim)=0; | ||||||
|     virtual int CheckerBoard(const std::vector<int> &site)=0; |     virtual int CheckerBoard(std::vector<int> &site)=0; | ||||||
|     virtual int CheckerBoardDestination(int source_cb,int shift,int dim)=0; |     virtual int CheckerBoardDestination(int source_cb,int shift,int dim)=0; | ||||||
|     virtual int CheckerBoardShift(int source_cb,int dim,int shift,int osite)=0; |     virtual int CheckerBoardShift(int source_cb,int dim,int shift,int osite)=0; | ||||||
|     virtual int CheckerBoardShiftForCB(int source_cb,int dim,int shift,int cb)=0; |     virtual int CheckerBoardShiftForCB(int source_cb,int dim,int shift,int cb)=0; | ||||||
| @@ -121,6 +121,7 @@ public: | |||||||
|       Lexicographic::CoorFromIndex(coor,Oindex,_rdimensions); |       Lexicographic::CoorFromIndex(coor,Oindex,_rdimensions); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     ////////////////////////////////////////////////////////// |     ////////////////////////////////////////////////////////// | ||||||
|     // SIMD lane addressing |     // SIMD lane addressing | ||||||
|     ////////////////////////////////////////////////////////// |     ////////////////////////////////////////////////////////// | ||||||
| @@ -177,11 +178,9 @@ public: | |||||||
|     // Global addressing |     // Global addressing | ||||||
|     //////////////////////////////////////////////////////////////// |     //////////////////////////////////////////////////////////////// | ||||||
|     void GlobalIndexToGlobalCoor(int gidx,std::vector<int> &gcoor){ |     void GlobalIndexToGlobalCoor(int gidx,std::vector<int> &gcoor){ | ||||||
|       assert(gidx< gSites()); |  | ||||||
|       Lexicographic::CoorFromIndex(gcoor,gidx,_gdimensions); |       Lexicographic::CoorFromIndex(gcoor,gidx,_gdimensions); | ||||||
|     } |     } | ||||||
|     void LocalIndexToLocalCoor(int lidx,std::vector<int> &lcoor){ |     void LocalIndexToLocalCoor(int lidx,std::vector<int> &lcoor){ | ||||||
|       assert(lidx<lSites()); |  | ||||||
|       Lexicographic::CoorFromIndex(lcoor,lidx,_ldimensions); |       Lexicographic::CoorFromIndex(lcoor,lidx,_ldimensions); | ||||||
|     } |     } | ||||||
|     void GlobalCoorToGlobalIndex(const std::vector<int> & gcoor,int & gidx){ |     void GlobalCoorToGlobalIndex(const std::vector<int> & gcoor,int & gidx){ | ||||||
| @@ -208,16 +207,16 @@ public: | |||||||
|       std::vector<int> lcoor; |       std::vector<int> lcoor; | ||||||
|       GlobalCoorToProcessorCoorLocalCoor(pcoor,lcoor,gcoor); |       GlobalCoorToProcessorCoorLocalCoor(pcoor,lcoor,gcoor); | ||||||
|       rank = RankFromProcessorCoor(pcoor); |       rank = RankFromProcessorCoor(pcoor); | ||||||
|       /* |  | ||||||
|       std::vector<int> cblcoor(lcoor); |       std::vector<int> cblcoor(lcoor); | ||||||
|       for(int d=0;d<cblcoor.size();d++){ |       for(int d=0;d<cblcoor.size();d++){ | ||||||
| 	if( this->CheckerBoarded(d) ) { | 	if( this->CheckerBoarded(d) ) { | ||||||
| 	  cblcoor[d] = lcoor[d]/2; | 	  cblcoor[d] = lcoor[d]/2; | ||||||
| 	} | 	} | ||||||
|       } |       } | ||||||
|       */ |  | ||||||
|       i_idx= iIndex(lcoor); |       i_idx= iIndex(cblcoor);// this does not imply divide by 2 on checker dim | ||||||
|       o_idx= oIndex(lcoor); |       o_idx= oIndex(lcoor);  // this implies divide by 2 on checkerdim | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     void RankIndexToGlobalCoor(int rank, int o_idx, int i_idx , std::vector<int> &gcoor) |     void RankIndexToGlobalCoor(int rank, int o_idx, int i_idx , std::vector<int> &gcoor) | ||||||
|   | |||||||
| @@ -49,7 +49,7 @@ public: | |||||||
|     virtual int CheckerBoarded(int dim){ |     virtual int CheckerBoarded(int dim){ | ||||||
|       return 0; |       return 0; | ||||||
|     } |     } | ||||||
|     virtual int CheckerBoard(const std::vector<int> &site){ |     virtual int CheckerBoard(std::vector<int> &site){ | ||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
|     virtual int CheckerBoardDestination(int cb,int shift,int dim){ |     virtual int CheckerBoardDestination(int cb,int shift,int dim){ | ||||||
|   | |||||||
| @@ -49,7 +49,7 @@ public: | |||||||
|       if( dim==_checker_dim) return 1; |       if( dim==_checker_dim) return 1; | ||||||
|       else return 0; |       else return 0; | ||||||
|     } |     } | ||||||
|     virtual int CheckerBoard(const std::vector<int> &site){ |     virtual int CheckerBoard(std::vector<int> &site){ | ||||||
|       int linear=0; |       int linear=0; | ||||||
|       assert(site.size()==_ndimension); |       assert(site.size()==_ndimension); | ||||||
|       for(int d=0;d<_ndimension;d++){  |       for(int d=0;d<_ndimension;d++){  | ||||||
|   | |||||||
| @@ -25,8 +25,7 @@ Author: Peter Boyle <paboyle@ph.ed.ac.uk> | |||||||
|     See the full license in the file "LICENSE" in the top level distribution directory |     See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|     *************************************************************************************/ |     *************************************************************************************/ | ||||||
|     /*  END LEGAL */ |     /*  END LEGAL */ | ||||||
| #include <Grid/GridCore.h> | #include "Grid.h" | ||||||
|  |  | ||||||
| namespace Grid { | namespace Grid { | ||||||
|  |  | ||||||
| /////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////// | ||||||
| @@ -34,7 +33,6 @@ namespace Grid { | |||||||
| /////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////// | ||||||
| void *              CartesianCommunicator::ShmCommBuf; | void *              CartesianCommunicator::ShmCommBuf; | ||||||
| uint64_t            CartesianCommunicator::MAX_MPI_SHM_BYTES   = 128*1024*1024;  | uint64_t            CartesianCommunicator::MAX_MPI_SHM_BYTES   = 128*1024*1024;  | ||||||
| CartesianCommunicator::CommunicatorPolicy_t  CartesianCommunicator::CommunicatorPolicy= CartesianCommunicator::CommunicatorPolicyConcurrent; |  | ||||||
|  |  | ||||||
| ///////////////////////////////// | ///////////////////////////////// | ||||||
| // Alloc, free shmem region | // Alloc, free shmem region | ||||||
| @@ -67,6 +65,7 @@ const std::vector<int> & CartesianCommunicator::ThisProcessorCoor(void) { return | |||||||
| const std::vector<int> & CartesianCommunicator::ProcessorGrid(void)     { return _processors; }; | const std::vector<int> & CartesianCommunicator::ProcessorGrid(void)     { return _processors; }; | ||||||
| int                      CartesianCommunicator::ProcessorCount(void)    { return _Nprocessors; }; | int                      CartesianCommunicator::ProcessorCount(void)    { return _Nprocessors; }; | ||||||
|  |  | ||||||
|  |  | ||||||
| //////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////// | ||||||
| // very VERY rarely (Log, serial RNG) we need world without a grid | // very VERY rarely (Log, serial RNG) we need world without a grid | ||||||
| //////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////// | ||||||
| @@ -90,9 +89,7 @@ void CartesianCommunicator::GlobalSumVector(ComplexD *c,int N) | |||||||
|  |  | ||||||
| #if !defined( GRID_COMMS_MPI3) && !defined (GRID_COMMS_MPI3L) | #if !defined( GRID_COMMS_MPI3) && !defined (GRID_COMMS_MPI3L) | ||||||
|  |  | ||||||
| int                      CartesianCommunicator::NodeCount(void)    { return ProcessorCount();}; | void CartesianCommunicator::StencilSendToRecvFromBegin(std::vector<CommsRequest_t> &list, | ||||||
|  |  | ||||||
| double CartesianCommunicator::StencilSendToRecvFromBegin(std::vector<CommsRequest_t> &list, |  | ||||||
|                                                        void *xmit, |                                                        void *xmit, | ||||||
|                                                        int xmit_to_rank, |                                                        int xmit_to_rank, | ||||||
|                                                        void *recv, |                                                        void *recv, | ||||||
| @@ -100,7 +97,6 @@ double CartesianCommunicator::StencilSendToRecvFromBegin(std::vector<CommsReques | |||||||
|                                                        int bytes) |                                                        int bytes) | ||||||
| { | { | ||||||
|   SendToRecvFromBegin(list,xmit,xmit_to_rank,recv,recv_from_rank,bytes); |   SendToRecvFromBegin(list,xmit,xmit_to_rank,recv,recv_from_rank,bytes); | ||||||
|   return 2.0*bytes; |  | ||||||
| } | } | ||||||
| void CartesianCommunicator::StencilSendToRecvFromComplete(std::vector<CommsRequest_t> &waitall) | void CartesianCommunicator::StencilSendToRecvFromComplete(std::vector<CommsRequest_t> &waitall) | ||||||
| { | { | ||||||
|   | |||||||
| @@ -68,6 +68,8 @@ class CartesianCommunicator { | |||||||
|   static MPI_Comm communicator_world; |   static MPI_Comm communicator_world; | ||||||
|          MPI_Comm communicator; |          MPI_Comm communicator; | ||||||
|   typedef MPI_Request CommsRequest_t; |   typedef MPI_Request CommsRequest_t; | ||||||
|  |   static char name[MPI_MAX_PROCESSOR_NAME]; // processing node physical name | ||||||
|  |   static int length;  | ||||||
| #else  | #else  | ||||||
|   typedef int CommsRequest_t; |   typedef int CommsRequest_t; | ||||||
| #endif | #endif | ||||||
| @@ -116,12 +118,6 @@ class CartesianCommunicator { | |||||||
|   // Implemented in Communicator_base.C |   // Implemented in Communicator_base.C | ||||||
|   ///////////////////////////////// |   ///////////////////////////////// | ||||||
|   static void * ShmCommBuf; |   static void * ShmCommBuf; | ||||||
|  |  | ||||||
|   // Isend/Irecv/Wait, or Sendrecv blocking |  | ||||||
|   enum CommunicatorPolicy_t { CommunicatorPolicyConcurrent, CommunicatorPolicySequential }; |  | ||||||
|   static CommunicatorPolicy_t CommunicatorPolicy; |  | ||||||
|   static void SetCommunicatorPolicy(CommunicatorPolicy_t policy ) { CommunicatorPolicy = policy; } |  | ||||||
|  |  | ||||||
|   size_t heap_top; |   size_t heap_top; | ||||||
|   size_t heap_bytes; |   size_t heap_bytes; | ||||||
|  |  | ||||||
| @@ -154,8 +150,8 @@ class CartesianCommunicator { | |||||||
|   const std::vector<int> & ThisProcessorCoor(void) ; |   const std::vector<int> & ThisProcessorCoor(void) ; | ||||||
|   const std::vector<int> & ProcessorGrid(void)     ; |   const std::vector<int> & ProcessorGrid(void)     ; | ||||||
|   int                      ProcessorCount(void)    ; |   int                      ProcessorCount(void)    ; | ||||||
|   int                      NodeCount(void)    ; |  | ||||||
|  |  | ||||||
|  |   void        		 PrintRankInfo(void)     ; | ||||||
|   //////////////////////////////////////////////////////////////////////////////// |   //////////////////////////////////////////////////////////////////////////////// | ||||||
|   // very VERY rarely (Log, serial RNG) we need world without a grid |   // very VERY rarely (Log, serial RNG) we need world without a grid | ||||||
|   //////////////////////////////////////////////////////////////////////////////// |   //////////////////////////////////////////////////////////////////////////////// | ||||||
| @@ -207,7 +203,7 @@ class CartesianCommunicator { | |||||||
|    |    | ||||||
|   void SendToRecvFromComplete(std::vector<CommsRequest_t> &waitall); |   void SendToRecvFromComplete(std::vector<CommsRequest_t> &waitall); | ||||||
|  |  | ||||||
|   double StencilSendToRecvFromBegin(std::vector<CommsRequest_t> &list, |   void StencilSendToRecvFromBegin(std::vector<CommsRequest_t> &list, | ||||||
| 				  void *xmit, | 				  void *xmit, | ||||||
| 				  int xmit_to_rank, | 				  int xmit_to_rank, | ||||||
| 				  void *recv, | 				  void *recv, | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user