mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-10-31 20:14:32 +00:00 
			
		
		
		
	Merge branch 'feature/hadrons' into develop
This commit is contained in:
		
							
								
								
									
										27
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -83,6 +83,7 @@ ltmain.sh | ||||
| .Trashes | ||||
| ehthumbs.db | ||||
| Thumbs.db | ||||
| .dirstamp | ||||
|  | ||||
| # build directory # | ||||
| ################### | ||||
| @@ -97,11 +98,8 @@ build.sh | ||||
|  | ||||
| # Eigen source # | ||||
| ################ | ||||
| lib/Eigen/* | ||||
|  | ||||
| # FFTW source # | ||||
| ################ | ||||
| lib/fftw/* | ||||
| Grid/Eigen | ||||
| Eigen/* | ||||
|  | ||||
| # libtool macros # | ||||
| ################## | ||||
| @@ -112,21 +110,8 @@ m4/libtool.m4 | ||||
| ################ | ||||
| gh-pages/ | ||||
|  | ||||
| # Buck files # | ||||
| ############## | ||||
| .buck* | ||||
| buck-out | ||||
| BUCK | ||||
| make-bin-BUCK.sh | ||||
|  | ||||
| # generated sources # | ||||
| ##################### | ||||
| lib/qcd/spin/gamma-gen/*.h | ||||
| lib/qcd/spin/gamma-gen/*.cc | ||||
| lib/version.h | ||||
|  | ||||
| # vs code editor files # | ||||
| ######################## | ||||
| .vscode/ | ||||
| .vscode/settings.json | ||||
| settings.json | ||||
| Grid/qcd/spin/gamma-gen/*.h | ||||
| Grid/qcd/spin/gamma-gen/*.cc | ||||
| Grid/version.h | ||||
|   | ||||
| @@ -16,7 +16,7 @@ before_install: | ||||
|     - if [[ "$TRAVIS_OS_NAME" == "linux" ]] && [[ "$CC" == "clang" ]]; then export PATH="${GRIDDIR}/clang/bin:${PATH}"; fi | ||||
|     - if [[ "$TRAVIS_OS_NAME" == "linux" ]] && [[ "$CC" == "clang" ]]; then export LD_LIBRARY_PATH="${GRIDDIR}/clang/lib:${LD_LIBRARY_PATH}"; fi | ||||
|     - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi | ||||
|     - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install libmpc; fi | ||||
|     - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install libmpc openssl; fi | ||||
|      | ||||
| install: | ||||
|     - export CWD=`pwd` | ||||
| @@ -33,6 +33,7 @@ install: | ||||
|     - which $CXX | ||||
|     - $CXX --version | ||||
|     - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export LDFLAGS='-L/usr/local/lib'; fi | ||||
|     - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export EXTRACONF='--with-openssl=/usr/local/opt/openssl'; fi | ||||
|      | ||||
| script: | ||||
|     - ./bootstrap.sh | ||||
| @@ -49,11 +50,11 @@ script: | ||||
|     - make -j4 | ||||
|     - make install | ||||
|     - cd $CWD/build | ||||
|     - ../configure --enable-precision=single --enable-simd=SSE4 --enable-comms=none --with-lime=$CWD/build/lime/install | ||||
|     - ../configure --enable-precision=single --enable-simd=SSE4 --enable-comms=none --with-lime=$CWD/build/lime/install ${EXTRACONF} | ||||
|     - make -j4  | ||||
|     - ./benchmarks/Benchmark_dwf --threads 1 --debug-signals | ||||
|     - echo make clean | ||||
|     - ../configure --enable-precision=double --enable-simd=SSE4 --enable-comms=none --with-lime=$CWD/build/lime/install | ||||
|     - ../configure --enable-precision=double --enable-simd=SSE4 --enable-comms=none --with-lime=$CWD/build/lime/install ${EXTRACONF} | ||||
|     - make -j4 | ||||
|     - ./benchmarks/Benchmark_dwf --threads 1 --debug-signals | ||||
|     - make check | ||||
|   | ||||
| @@ -33,5 +33,5 @@ CCFILES += $(extra_sources) | ||||
| HFILES  += $(extra_headers) | ||||
| 
 | ||||
| libGrid_a_SOURCES              = $(CCFILES) | ||||
| libGrid_adir                   = $(pkgincludedir) | ||||
| nobase_dist_pkginclude_HEADERS = $(HFILES) $(eigen_files) Config.h | ||||
| libGrid_adir                   = $(includedir)/Grid | ||||
| nobase_dist_pkginclude_HEADERS = $(HFILES) $(eigen_files) $(eigen_unsupp_files) Config.h | ||||
| @@ -30,22 +30,31 @@ Author: Peter Boyle <paboyle@ph.ed.ac.uk> | ||||
| 
 | ||||
| namespace Grid {  | ||||
| 
 | ||||
| struct ZeroGuesser { | ||||
| public: | ||||
| template<class Field> | ||||
|   void operator()(const Field &src,Field &guess) { guess = Zero(); }; | ||||
| class Guesser { | ||||
| public: | ||||
|   Guesser(void) = default; | ||||
|   virtual ~Guesser(void) = default; | ||||
|   virtual void operator()(const Field &src, Field &guess) = 0; | ||||
| }; | ||||
| struct SourceGuesser { | ||||
| public: | ||||
| 
 | ||||
| template<class Field> | ||||
|   void operator()(const Field &src,Field &guess) { guess = src; }; | ||||
| class ZeroGuesser: public Guesser<Field> { | ||||
| public: | ||||
|   virtual void operator()(const Field &src, Field &guess) { guess = zero; }; | ||||
| }; | ||||
| 
 | ||||
| template<class Field> | ||||
| class SourceGuesser: public Guesser<Field> { | ||||
| public: | ||||
|   virtual void operator()(const Field &src, Field &guess) { guess = src; }; | ||||
| }; | ||||
| 
 | ||||
| ////////////////////////////////
 | ||||
| // Fine grid deflation
 | ||||
| ////////////////////////////////
 | ||||
| template<class Field> | ||||
| struct DeflatedGuesser { | ||||
| class DeflatedGuesser: public Guesser<Field> { | ||||
| private: | ||||
|   const std::vector<Field> &evec; | ||||
|   const std::vector<RealD> &eval; | ||||
| @@ -54,7 +63,7 @@ public: | ||||
| 
 | ||||
|   DeflatedGuesser(const std::vector<Field> & _evec,const std::vector<RealD> & _eval) : evec(_evec), eval(_eval) {}; | ||||
| 
 | ||||
|   void operator()(const Field &src,Field &guess) {  | ||||
|   virtual void operator()(const Field &src,Field &guess) { | ||||
|     guess = zero; | ||||
|     assert(evec.size()==eval.size()); | ||||
|     auto N = evec.size(); | ||||
| @@ -62,11 +71,12 @@ public: | ||||
|       const Field& tmp = evec[i]; | ||||
|       axpy(guess,TensorRemove(innerProduct(tmp,src)) / eval[i],tmp,guess); | ||||
|     } | ||||
|     guess.checkerboard = src.checkerboard; | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| template<class FineField, class CoarseField> | ||||
| class LocalCoherenceDeflatedGuesser { | ||||
| class LocalCoherenceDeflatedGuesser: public Guesser<FineField> { | ||||
| private: | ||||
|   const std::vector<FineField>   &subspace; | ||||
|   const std::vector<CoarseField> &evec_coarse; | ||||
| @@ -92,6 +102,7 @@ public: | ||||
|       axpy(guess_coarse,TensorRemove(innerProduct(tmp,src_coarse)) / eval_coarse[i],tmp,guess_coarse); | ||||
|     } | ||||
|     blockPromote(guess_coarse,guess,subspace); | ||||
|     guess.checkerboard = src.checkerboard; | ||||
|   }; | ||||
| }; | ||||
| 
 | ||||
| @@ -286,8 +286,10 @@ public: | ||||
| 
 | ||||
|   void Orthogonalise(void ) { | ||||
|     CoarseScalar InnerProd(_CoarseGrid); | ||||
|     blockOrthogonalise(InnerProd,subspace);std::cout << GridLogMessage <<" Gramm-Schmidt pass 1"<<std::endl; | ||||
|     blockOrthogonalise(InnerProd,subspace);std::cout << GridLogMessage <<" Gramm-Schmidt pass 2"<<std::endl; | ||||
|     std::cout << GridLogMessage <<" Gramm-Schmidt pass 1"<<std::endl; | ||||
|     blockOrthogonalise(InnerProd,subspace); | ||||
|     std::cout << GridLogMessage <<" Gramm-Schmidt pass 2"<<std::endl; | ||||
|     blockOrthogonalise(InnerProd,subspace); | ||||
|   }; | ||||
| 
 | ||||
|   template<typename T>  static RealD normalise(T& v)  | ||||
| @@ -333,7 +335,7 @@ public: | ||||
|     // create a smoother and see if we can get a cheap convergence test and smooth inside the IRL
 | ||||
|     //////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
|     Chebyshev<FineField>                          ChebySmooth(cheby_smooth); | ||||
|     ProjectedFunctionHermOp<Fobj,CComplex,nbasis> ChebyOp (ChebySmooth,_FineOp,_subspace); | ||||
|     ProjectedFunctionHermOp<Fobj,CComplex,nbasis> ChebyOp (ChebySmooth,_FineOp,subspace); | ||||
|     ImplicitlyRestartedLanczosSmoothedTester<Fobj,CComplex,nbasis> ChebySmoothTester(ChebyOp,ChebySmooth,_FineOp,subspace,relax); | ||||
| 
 | ||||
|     for(int k=0;k<evec_coarse.size();k++){ | ||||
| @@ -374,14 +376,14 @@ public: | ||||
| 		  RealD MaxIt, RealD betastp, int MinRes) | ||||
|   { | ||||
|     Chebyshev<FineField>                          Cheby(cheby_op); | ||||
|     ProjectedHermOp<Fobj,CComplex,nbasis>         Op(_FineOp,_subspace); | ||||
|     ProjectedFunctionHermOp<Fobj,CComplex,nbasis> ChebyOp (Cheby,_FineOp,_subspace); | ||||
|     ProjectedHermOp<Fobj,CComplex,nbasis>         Op(_FineOp,subspace); | ||||
|     ProjectedFunctionHermOp<Fobj,CComplex,nbasis> ChebyOp (Cheby,_FineOp,subspace); | ||||
|     //////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
|     // create a smoother and see if we can get a cheap convergence test and smooth inside the IRL
 | ||||
|     //////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
|     Chebyshev<FineField>                                           ChebySmooth(cheby_smooth); | ||||
|     ImplicitlyRestartedLanczosSmoothedTester<Fobj,CComplex,nbasis> ChebySmoothTester(ChebyOp,ChebySmooth,_FineOp,_subspace,relax); | ||||
|     ImplicitlyRestartedLanczosSmoothedTester<Fobj,CComplex,nbasis> ChebySmoothTester(ChebyOp,ChebySmooth,_FineOp,subspace,relax); | ||||
| 
 | ||||
|     evals_coarse.resize(Nm); | ||||
|     evec_coarse.resize(Nm,_CoarseGrid); | ||||
| @@ -95,20 +95,30 @@ namespace Grid { | ||||
|   private: | ||||
|     OperatorFunction<Field> & _HermitianRBSolver; | ||||
|     int CBfactorise; | ||||
|     bool subGuess; | ||||
|   public: | ||||
| 
 | ||||
|     /////////////////////////////////////////////////////
 | ||||
|     // Wrap the usual normal equations Schur trick
 | ||||
|     /////////////////////////////////////////////////////
 | ||||
|   SchurRedBlackStaggeredSolve(OperatorFunction<Field> &HermitianRBSolver)  : | ||||
|   SchurRedBlackStaggeredSolve(OperatorFunction<Field> &HermitianRBSolver, const bool initSubGuess = false)  : | ||||
|      _HermitianRBSolver(HermitianRBSolver)  | ||||
|     {  | ||||
|       CBfactorise=0; | ||||
|       subtractGuess(initSubGuess); | ||||
|     }; | ||||
|     void subtractGuess(const bool initSubGuess) | ||||
|     { | ||||
|       subGuess = initSubGuess; | ||||
|     } | ||||
|     bool isSubtractGuess(void) | ||||
|     { | ||||
|       return subGuess; | ||||
|     } | ||||
| 
 | ||||
|     template<class Matrix> | ||||
|     void operator() (Matrix & _Matrix,const Field &in, Field &out){ | ||||
|       ZeroGuesser guess; | ||||
|       ZeroGuesser<Field> guess; | ||||
|       (*this)(_Matrix,in,out,guess); | ||||
|     } | ||||
|     template<class Matrix, class Guesser> | ||||
| @@ -151,8 +161,11 @@ namespace Grid { | ||||
|       //////////////////////////////////////////////////////////////
 | ||||
|       std::cout<<GridLogMessage << "SchurRedBlackStaggeredSolver calling the Mpc solver" <<std::endl; | ||||
|       guess(src_o, sol_o); | ||||
|       Mtmp = sol_o; | ||||
|       _HermitianRBSolver(_HermOpEO,src_o,sol_o);  assert(sol_o.checkerboard==Odd); | ||||
|       std::cout<<GridLogMessage << "SchurRedBlackStaggeredSolver called  the Mpc solver" <<std::endl; | ||||
|       // Fionn A2A boolean behavioural control
 | ||||
|       if (subGuess)        sol_o = sol_o-Mtmp; | ||||
| 
 | ||||
|       ///////////////////////////////////////////////////
 | ||||
|       // sol_e = M_ee^-1 * ( src_e - Meo sol_o )...
 | ||||
| @@ -167,11 +180,15 @@ namespace Grid { | ||||
|       std::cout<<GridLogMessage << "SchurRedBlackStaggeredSolver inserted solution" <<std::endl; | ||||
| 
 | ||||
|       // Verify the unprec residual
 | ||||
|       if ( ! subGuess ) { | ||||
|         _Matrix.M(out,resid);  | ||||
|         resid = resid-in; | ||||
|         RealD ns = norm2(in); | ||||
|         RealD nr = norm2(resid); | ||||
|         std::cout<<GridLogMessage << "SchurRedBlackStaggered solver true unprec resid "<< std::sqrt(nr/ns) <<" nr "<< nr <<" ns "<<ns << std::endl; | ||||
|       } else { | ||||
|         std::cout << GridLogMessage << "Guess subtracted after solve." << std::endl; | ||||
|       } | ||||
|     }      | ||||
|   }; | ||||
|   template<class Field> using SchurRedBlackStagSolve = SchurRedBlackStaggeredSolve<Field>; | ||||
| @@ -184,18 +201,28 @@ namespace Grid { | ||||
|   private: | ||||
|     OperatorFunction<Field> & _HermitianRBSolver; | ||||
|     int CBfactorise; | ||||
|     bool subGuess; | ||||
|   public: | ||||
| 
 | ||||
|     /////////////////////////////////////////////////////
 | ||||
|     // Wrap the usual normal equations Schur trick
 | ||||
|     /////////////////////////////////////////////////////
 | ||||
|   SchurRedBlackDiagMooeeSolve(OperatorFunction<Field> &HermitianRBSolver,int cb=0)  :  _HermitianRBSolver(HermitianRBSolver)  | ||||
|   SchurRedBlackDiagMooeeSolve(OperatorFunction<Field> &HermitianRBSolver,int cb=0, const bool initSubGuess = false)  :  _HermitianRBSolver(HermitianRBSolver)  | ||||
|   {  | ||||
|     CBfactorise=cb; | ||||
|     subtractGuess(initSubGuess); | ||||
|   }; | ||||
|     void subtractGuess(const bool initSubGuess) | ||||
|     { | ||||
|       subGuess = initSubGuess; | ||||
|     } | ||||
|     bool isSubtractGuess(void) | ||||
|     { | ||||
|       return subGuess; | ||||
|     } | ||||
|     template<class Matrix> | ||||
|     void operator() (Matrix & _Matrix,const Field &in, Field &out){ | ||||
|       ZeroGuesser guess; | ||||
|       ZeroGuesser<Field> guess; | ||||
|       (*this)(_Matrix,in,out,guess); | ||||
|     } | ||||
|     template<class Matrix, class Guesser> | ||||
| @@ -236,7 +263,10 @@ namespace Grid { | ||||
|       //////////////////////////////////////////////////////////////
 | ||||
|       std::cout<<GridLogMessage << "SchurRedBlack solver calling the MpcDagMp solver" <<std::endl; | ||||
|       guess(src_o,sol_o); | ||||
|       Mtmp = sol_o; | ||||
|       _HermitianRBSolver(_HermOpEO,src_o,sol_o);  assert(sol_o.checkerboard==Odd); | ||||
|       // Fionn A2A boolean behavioural control
 | ||||
|       if (subGuess)        sol_o = sol_o-Mtmp; | ||||
| 
 | ||||
|       ///////////////////////////////////////////////////
 | ||||
|       // sol_e = M_ee^-1 * ( src_e - Meo sol_o )...
 | ||||
| @@ -249,12 +279,16 @@ namespace Grid { | ||||
|       setCheckerboard(out,sol_o); assert(  sol_o.checkerboard ==Odd ); | ||||
| 
 | ||||
|       // Verify the unprec residual
 | ||||
|       if ( ! subGuess ) { | ||||
|         _Matrix.M(out,resid);  | ||||
|         resid = resid-in; | ||||
|         RealD ns = norm2(in); | ||||
|         RealD nr = norm2(resid); | ||||
| 
 | ||||
|         std::cout<<GridLogMessage << "SchurRedBlackDiagMooee solver true unprec resid "<< std::sqrt(nr/ns) <<" nr "<< nr <<" ns "<<ns << std::endl; | ||||
|       } else { | ||||
|         std::cout << GridLogMessage << "Guess subtracted after solve." << std::endl; | ||||
|       } | ||||
|     }      | ||||
|   }; | ||||
| 
 | ||||
| @@ -267,20 +301,30 @@ namespace Grid { | ||||
|   private: | ||||
|     OperatorFunction<Field> & _HermitianRBSolver; | ||||
|     int CBfactorise; | ||||
|     bool subGuess; | ||||
|   public: | ||||
| 
 | ||||
|     /////////////////////////////////////////////////////
 | ||||
|     // Wrap the usual normal equations Schur trick
 | ||||
|     /////////////////////////////////////////////////////
 | ||||
|   SchurRedBlackDiagTwoSolve(OperatorFunction<Field> &HermitianRBSolver)  : | ||||
|   SchurRedBlackDiagTwoSolve(OperatorFunction<Field> &HermitianRBSolver, const bool initSubGuess = false)  : | ||||
|      _HermitianRBSolver(HermitianRBSolver)  | ||||
|     {  | ||||
|       CBfactorise = 0; | ||||
|       subtractGuess(initSubGuess); | ||||
|     }; | ||||
|     void subtractGuess(const bool initSubGuess) | ||||
|     { | ||||
|       subGuess = initSubGuess; | ||||
|     } | ||||
|     bool isSubtractGuess(void) | ||||
|     { | ||||
|       return subGuess; | ||||
|     } | ||||
| 
 | ||||
|     template<class Matrix> | ||||
|     void operator() (Matrix & _Matrix,const Field &in, Field &out){ | ||||
|       ZeroGuesser guess; | ||||
|       ZeroGuesser<Field> guess; | ||||
|       (*this)(_Matrix,in,out,guess); | ||||
|     } | ||||
|     template<class Matrix,class Guesser> | ||||
| @@ -322,7 +366,10 @@ namespace Grid { | ||||
|       std::cout<<GridLogMessage << "SchurRedBlack solver calling the MpcDagMp solver" <<std::endl; | ||||
| //      _HermitianRBSolver(_HermOpEO,src_o,sol_o);  assert(sol_o.checkerboard==Odd);
 | ||||
|       guess(src_o,tmp); | ||||
|       Mtmp = tmp; | ||||
|       _HermitianRBSolver(_HermOpEO,src_o,tmp);  assert(tmp.checkerboard==Odd); | ||||
|       // Fionn A2A boolean behavioural control
 | ||||
|       if (subGuess)      tmp = tmp-Mtmp; | ||||
|       _Matrix.MooeeInv(tmp,sol_o);       assert(  sol_o.checkerboard   ==Odd); | ||||
| 
 | ||||
|       ///////////////////////////////////////////////////
 | ||||
| @@ -336,12 +383,16 @@ namespace Grid { | ||||
|       setCheckerboard(out,sol_o); assert(  sol_o.checkerboard ==Odd ); | ||||
| 
 | ||||
|       // Verify the unprec residual
 | ||||
|       if ( ! subGuess ) { | ||||
|         _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; | ||||
|       } else { | ||||
|         std::cout << GridLogMessage << "Guess subtracted after solve." << std::endl; | ||||
|       } | ||||
|     }      | ||||
|   }; | ||||
|   ///////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| @@ -352,20 +403,30 @@ namespace Grid { | ||||
|   private: | ||||
|     LinearFunction<Field> & _HermitianRBSolver; | ||||
|     int CBfactorise; | ||||
|     bool subGuess; | ||||
|   public: | ||||
| 
 | ||||
|     /////////////////////////////////////////////////////
 | ||||
|     // Wrap the usual normal equations Schur trick
 | ||||
|     /////////////////////////////////////////////////////
 | ||||
|   SchurRedBlackDiagTwoMixed(LinearFunction<Field> &HermitianRBSolver)  : | ||||
|   SchurRedBlackDiagTwoMixed(LinearFunction<Field> &HermitianRBSolver, const bool initSubGuess = false)  : | ||||
|      _HermitianRBSolver(HermitianRBSolver)  | ||||
|     {  | ||||
|       CBfactorise=0; | ||||
|       subtractGuess(initSubGuess); | ||||
|     }; | ||||
|     void subtractGuess(const bool initSubGuess) | ||||
|     { | ||||
|       subGuess = initSubGuess; | ||||
|     } | ||||
|     bool isSubtractGuess(void) | ||||
|     { | ||||
|       return subGuess; | ||||
|     } | ||||
| 
 | ||||
|     template<class Matrix> | ||||
|     void operator() (Matrix & _Matrix,const Field &in, Field &out){ | ||||
|       ZeroGuesser guess; | ||||
|       ZeroGuesser<Field> guess; | ||||
|       (*this)(_Matrix,in,out,guess); | ||||
|     } | ||||
|     template<class Matrix, class Guesser> | ||||
| @@ -408,7 +469,10 @@ namespace Grid { | ||||
| //      _HermitianRBSolver(_HermOpEO,src_o,sol_o);  assert(sol_o.checkerboard==Odd);
 | ||||
| //      _HermitianRBSolver(_HermOpEO,src_o,tmp);  assert(tmp.checkerboard==Odd);
 | ||||
|       guess(src_o,tmp); | ||||
|       _HermitianRBSolver(src_o,tmp);  assert(tmp.checkerboard==Odd); | ||||
|       Mtmp = tmp; | ||||
|       _HermitianRBSolver(_HermOpEO,src_o,tmp);  assert(tmp.checkerboard==Odd); | ||||
|       // Fionn A2A boolean behavioural control
 | ||||
|       if (subGuess)      tmp = tmp-Mtmp; | ||||
|       _Matrix.MooeeInv(tmp,sol_o);        assert(  sol_o.checkerboard   ==Odd); | ||||
| 
 | ||||
|       ///////////////////////////////////////////////////
 | ||||
| @@ -422,12 +486,16 @@ namespace Grid { | ||||
|       setCheckerboard(out,sol_o); assert(  sol_o.checkerboard ==Odd ); | ||||
| 
 | ||||
|       // Verify the unprec residual
 | ||||
|       if ( ! subGuess ) { | ||||
|         _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; | ||||
|       } else { | ||||
|         std::cout << GridLogMessage << "Guess subtracted after solve." << std::endl; | ||||
|       } | ||||
|     }      | ||||
|   }; | ||||
| 
 | ||||
| @@ -274,6 +274,115 @@ template<class vobj> inline void sliceSum(const Lattice<vobj> &Data,std::vector< | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| template<class vobj> | ||||
| static void mySliceInnerProductVector( std::vector<ComplexD> & result, const Lattice<vobj> &lhs,const Lattice<vobj> &rhs,int orthogdim) | ||||
| { | ||||
|   // std::cout << GridLogMessage << "Start mySliceInnerProductVector" << std::endl;
 | ||||
| 
 | ||||
|   typedef typename vobj::scalar_type scalar_type; | ||||
|   std::vector<scalar_type> lsSum; | ||||
|   localSliceInnerProductVector(result, lhs, rhs, lsSum, orthogdim); | ||||
|   globalSliceInnerProductVector(result, lhs, lsSum, orthogdim); | ||||
|   // std::cout << GridLogMessage << "End mySliceInnerProductVector" << std::endl;
 | ||||
| } | ||||
| 
 | ||||
| template <class vobj> | ||||
| static void localSliceInnerProductVector(std::vector<ComplexD> &result, const Lattice<vobj> &lhs, const Lattice<vobj> &rhs, std::vector<typename vobj::scalar_type> &lsSum, int orthogdim) | ||||
| { | ||||
|   // std::cout << GridLogMessage << "Start prep" << std::endl;
 | ||||
|   typedef typename vobj::vector_type   vector_type; | ||||
|   typedef typename vobj::scalar_type   scalar_type; | ||||
|   GridBase  *grid = lhs._grid; | ||||
|   assert(grid!=NULL); | ||||
|   conformable(grid,rhs._grid); | ||||
| 
 | ||||
|   const int    Nd = grid->_ndimension; | ||||
|   const int Nsimd = grid->Nsimd(); | ||||
| 
 | ||||
|   assert(orthogdim >= 0); | ||||
|   assert(orthogdim < Nd); | ||||
| 
 | ||||
|   int fd=grid->_fdimensions[orthogdim]; | ||||
|   int ld=grid->_ldimensions[orthogdim]; | ||||
|   int rd=grid->_rdimensions[orthogdim]; | ||||
|   // std::cout << GridLogMessage << "Start alloc" << std::endl;
 | ||||
| 
 | ||||
|   std::vector<vector_type,alignedAllocator<vector_type> > lvSum(rd); // will locally sum vectors first
 | ||||
|   lsSum.resize(ld,scalar_type(0.0));                    // sum across these down to scalars
 | ||||
|   std::vector<iScalar<scalar_type>> extracted(Nsimd);   // splitting the SIMD  
 | ||||
|   // std::cout << GridLogMessage << "End alloc" << std::endl;
 | ||||
| 
 | ||||
|   result.resize(fd); // And then global sum to return the same vector to every node for IO to file
 | ||||
|   for(int r=0;r<rd;r++){ | ||||
|     lvSum[r]=zero; | ||||
|   } | ||||
| 
 | ||||
|   int e1=    grid->_slice_nblock[orthogdim]; | ||||
|   int e2=    grid->_slice_block [orthogdim]; | ||||
|   int stride=grid->_slice_stride[orthogdim]; | ||||
|   // std::cout << GridLogMessage << "End prep" << std::endl;
 | ||||
|   // std::cout << GridLogMessage << "Start parallel inner product, _rd = " << rd << std::endl;
 | ||||
|   vector_type vv; | ||||
|   parallel_for(int r=0;r<rd;r++) | ||||
|   { | ||||
| 
 | ||||
|     int so=r*grid->_ostride[orthogdim]; // base offset for start of plane 
 | ||||
| 
 | ||||
|     for(int n=0;n<e1;n++){ | ||||
|       for(int b=0;b<e2;b++){ | ||||
|         int ss = so + n * stride + b; | ||||
|         vv = TensorRemove(innerProduct(lhs._odata[ss], rhs._odata[ss])); | ||||
|         lvSum[r] = lvSum[r] + vv; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   // std::cout << GridLogMessage << "End parallel inner product" << std::endl;
 | ||||
| 
 | ||||
|   // Sum across simd lanes in the plane, breaking out orthog dir.
 | ||||
|   std::vector<int> icoor(Nd); | ||||
|   for(int rt=0;rt<rd;rt++){ | ||||
| 
 | ||||
|     iScalar<vector_type> temp;  | ||||
|     temp._internal = lvSum[rt]; | ||||
|     extract(temp,extracted); | ||||
| 
 | ||||
|     for(int idx=0;idx<Nsimd;idx++){ | ||||
| 
 | ||||
|       grid->iCoorFromIindex(icoor,idx); | ||||
| 
 | ||||
|       int ldx =rt+icoor[orthogdim]*rd; | ||||
| 
 | ||||
|       lsSum[ldx]=lsSum[ldx]+extracted[idx]._internal; | ||||
| 
 | ||||
|     } | ||||
|   } | ||||
|   // std::cout << GridLogMessage << "End sum over simd lanes" << std::endl;
 | ||||
| } | ||||
| template <class vobj> | ||||
| static void globalSliceInnerProductVector(std::vector<ComplexD> &result, const Lattice<vobj> &lhs, std::vector<typename vobj::scalar_type> &lsSum, int orthogdim) | ||||
| { | ||||
|   typedef typename vobj::scalar_type scalar_type; | ||||
|   GridBase *grid = lhs._grid; | ||||
|   int fd = result.size(); | ||||
|   int ld = lsSum.size(); | ||||
|   // sum over nodes.
 | ||||
|   std::vector<scalar_type> gsum; | ||||
|   gsum.resize(fd, scalar_type(0.0)); | ||||
|   // std::cout << GridLogMessage << "Start of gsum[t] creation:" << std::endl;
 | ||||
|   for(int t=0;t<fd;t++){ | ||||
|     int pt = t/ld; // processor plane
 | ||||
|     int lt = t%ld; | ||||
|     if ( pt == grid->_processor_coor[orthogdim] ) { | ||||
|       gsum[t]=lsSum[lt]; | ||||
|     } | ||||
|   } | ||||
|   // std::cout << GridLogMessage << "End of gsum[t] creation:" << std::endl;
 | ||||
|   // std::cout << GridLogMessage << "Start of GlobalSumVector:" << std::endl;
 | ||||
|   grid->GlobalSumVector(&gsum[0], fd); | ||||
|   // std::cout << GridLogMessage << "End of GlobalSumVector:" << std::endl;
 | ||||
| 
 | ||||
|   result = gsum; | ||||
| } | ||||
| template<class vobj> | ||||
| static void sliceInnerProductVector( std::vector<ComplexD> & result, const Lattice<vobj> &lhs,const Lattice<vobj> &rhs,int orthogdim)  | ||||
| { | ||||
| @@ -320,12 +320,14 @@ namespace Grid { | ||||
| 
 | ||||
|     void SeedUniqueString(const std::string &s){ | ||||
|       std::vector<int> seeds; | ||||
|       std::stringstream sha; | ||||
|       seeds = GridChecksum::sha256_seeds(s); | ||||
|       std::cout << GridLogMessage << "Intialising Serial RNG with unique string " <<s<< std::endl; | ||||
|       std::cout << GridLogMessage << "SHA seeds are: " <<s<< std::endl; | ||||
|       for(int i=0;i<seeds.size();i++) {  | ||||
| 	std::cout << GridLogMessage << "\t " <<seeds[i]<< std::endl; | ||||
|         sha << std::hex << seeds[i]; | ||||
|       } | ||||
|       std::cout << GridLogMessage << "Intialising serial RNG with unique string '"  | ||||
|                 << s << "'" << std::endl; | ||||
|       std::cout << GridLogMessage << "Seed SHA256: " << sha.str() << std::endl; | ||||
|       SeedFixedIntegers(seeds); | ||||
|     } | ||||
|   }; | ||||
| @@ -390,12 +392,14 @@ namespace Grid { | ||||
| 
 | ||||
|     void SeedUniqueString(const std::string &s){ | ||||
|       std::vector<int> seeds; | ||||
|       std::stringstream sha; | ||||
|       seeds = GridChecksum::sha256_seeds(s); | ||||
|       std::cout << GridLogMessage << "Intialising Parallel RNG with unique string " <<s<< std::endl; | ||||
|       std::cout << GridLogMessage << "SHA seeds are: " <<s<< std::endl; | ||||
|       for(int i=0;i<seeds.size();i++) {  | ||||
| 	std::cout << GridLogMessage << "\t " <<seeds[i]<< std::endl; | ||||
|         sha << std::hex << seeds[i]; | ||||
|       } | ||||
|       std::cout << GridLogMessage << "Intialising parallel RNG with unique string '"  | ||||
|                 << s << "'" << std::endl; | ||||
|       std::cout << GridLogMessage << "Seed SHA256: " << sha.str() << std::endl; | ||||
|       SeedFixedIntegers(seeds); | ||||
|     } | ||||
|     void SeedFixedIntegers(const std::vector<int> &seeds){ | ||||
| @@ -86,7 +86,7 @@ protected: | ||||
|   Colours &Painter; | ||||
|   int active; | ||||
|   int timing_mode; | ||||
|   int topWidth{-1}; | ||||
|   int topWidth{-1}, chanWidth{-1}; | ||||
|   static int timestamp; | ||||
|   std::string name, topName; | ||||
|   std::string COLOUR; | ||||
| @@ -126,6 +126,7 @@ public: | ||||
|     } | ||||
|   } | ||||
|   void setTopWidth(const int w) {topWidth = w;} | ||||
|   void setChanWidth(const int w) {chanWidth = w;} | ||||
| 
 | ||||
|   friend std::ostream& operator<< (std::ostream& stream, Logger& log){ | ||||
| 
 | ||||
| @@ -136,7 +137,12 @@ public: | ||||
|         stream << std::setw(log.topWidth); | ||||
|       } | ||||
|       stream << log.topName << log.background()<< " : "; | ||||
|       stream << log.colour() <<  std::left << log.name << log.background() << " : "; | ||||
|       stream << log.colour() <<  std::left; | ||||
|       if (log.chanWidth > 0) | ||||
|       { | ||||
|         stream << std::setw(log.chanWidth); | ||||
|       } | ||||
|       stream << log.name << log.background() << " : "; | ||||
|       if ( log.timestamp ) { | ||||
| 	log.StopWatch->Stop(); | ||||
| 	GridTime now = log.StopWatch->Elapsed(); | ||||
| @@ -325,16 +325,11 @@ class GridLimeWriter : public BinaryIO | ||||
|   ////////////////////////////////////////////
 | ||||
|   // Write a generic serialisable object
 | ||||
|   ////////////////////////////////////////////
 | ||||
|   template<class serialisable_object> | ||||
|   void writeLimeObject(int MB,int ME,serialisable_object &object,std::string object_name,std::string record_name) | ||||
|   void writeLimeObject(int MB,int ME,XmlWriter &writer,std::string object_name,std::string record_name) | ||||
|   { | ||||
|     if ( boss_node ) { | ||||
|       std::string xmlstring; | ||||
|       { | ||||
| 	XmlWriter WR("",""); | ||||
| 	write(WR,object_name,object); | ||||
| 	xmlstring = WR.XmlString(); | ||||
|       } | ||||
|       std::string xmlstring = writer.docString(); | ||||
| 
 | ||||
|       //    std::cout << "WriteLimeObject" << record_name <<std::endl;
 | ||||
|       uint64_t nbytes = xmlstring.size(); | ||||
|       //    std::cout << " xmlstring "<< nbytes<< " " << xmlstring <<std::endl;
 | ||||
| @@ -348,6 +343,20 @@ class GridLimeWriter : public BinaryIO | ||||
|       limeDestroyHeader(h); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   template<class serialisable_object> | ||||
|   void writeLimeObject(int MB,int ME,serialisable_object &object,std::string object_name,std::string record_name, const unsigned int scientificPrec = 0) | ||||
|   { | ||||
|     XmlWriter WR("",""); | ||||
| 
 | ||||
|     if (scientificPrec) | ||||
|     { | ||||
|       WR.scientificFormat(true); | ||||
|       WR.setPrecision(scientificPrec); | ||||
|     } | ||||
|     write(WR,object_name,object); | ||||
|     writeLimeObject(MB, ME, WR, object_name, record_name); | ||||
|   } | ||||
|   ////////////////////////////////////////////////////
 | ||||
|   // Write a generic lattice field and csum
 | ||||
|   // This routine is Collectively called by all nodes
 | ||||
| @@ -454,7 +463,8 @@ class ScidacWriter : public GridLimeWriter { | ||||
|   // Write generic lattice field in scidac format
 | ||||
|   ////////////////////////////////////////////////
 | ||||
|   template <class vobj, class userRecord> | ||||
|   void writeScidacFieldRecord(Lattice<vobj> &field,userRecord _userRecord)  | ||||
|   void writeScidacFieldRecord(Lattice<vobj> &field,userRecord _userRecord, | ||||
|                               const unsigned int recordScientificPrec = 0)  | ||||
|   { | ||||
|     GridBase * grid = field._grid; | ||||
| 
 | ||||
| @@ -472,7 +482,7 @@ class ScidacWriter : public GridLimeWriter { | ||||
|     //////////////////////////////////////////////
 | ||||
|     if ( this->boss_node ) { | ||||
|       writeLimeObject(1,0,header ,std::string("FieldMetaData"),std::string(GRID_FORMAT)); // Open message 
 | ||||
|       writeLimeObject(0,0,_userRecord,_userRecord.SerialisableClassName(),std::string(SCIDAC_RECORD_XML)); | ||||
|       writeLimeObject(0,0,_userRecord,_userRecord.SerialisableClassName(),std::string(SCIDAC_RECORD_XML), recordScientificPrec); | ||||
|       writeLimeObject(0,0,_scidacRecord,_scidacRecord.SerialisableClassName(),std::string(SCIDAC_PRIVATE_RECORD_XML)); | ||||
|     } | ||||
|     // Collective call
 | ||||
| @@ -102,6 +102,9 @@ public: | ||||
|     assert(running == false); | ||||
|     return (uint64_t) accumulator.count(); | ||||
|   } | ||||
|   bool isRunning(void){ | ||||
|     return running; | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user